Class: Api::SpacesController
- Inherits:
-
ApplicationController
- Object
- ActionController::API
- ApplicationController
- Api::SpacesController
- Includes:
- Affiliated, ExternalLinks, Faq, Follow, Media, Members, Recommendations, Relations, Resources, Services, Upload, Utils
- Defined in:
- app/controllers/api/spaces_controller.rb
Instance Method Summary collapse
- #can_create ⇒ Object
- #create ⇒ Object
- #destroy ⇒ Object
- #email_members ⇒ Object
- #get_members_info ⇒ Object
- #index ⇒ Object
- #index_challenges ⇒ Object
-
#index_needs ⇒ Object
Return a list of needs for the Space via its Project(s).
-
#index_people ⇒ Object
Return a list of people (User) related to the Space.
-
#index_projects ⇒ Object
Return a list of Project(s) that are related to the Space.
- #my_spaces ⇒ Object
-
#remove ⇒ Object
The object relation is remove no status change.
- #show ⇒ Object
- #update ⇒ Object
Methods included from Utils
#get_id_from_short_title, #is_admin, #is_member, #is_reviewer, #nickname_exist, #short_title_exist
Methods included from Upload
#remove_avatar, #remove_banner, #remove_document, #upload_avatar, #upload_banner, #upload_document
Methods included from Services
#index_activity, #index_service
Methods included from Resources
#add_resource, #index_resource, #remove_resource, #update_resource
Methods included from Relations
#clap, #clappers, #follow, #review, #reviewed_object, #save, #saved_objects
Methods included from Recommendations
Methods included from Members
#get_current_role, #get_roles_list, #has_membership, #invite, #invite_as_admin, #join, #leave, #members_list, #remove_member, #update_member
Methods included from Media
#media_create, #media_destroy, #media_index, #media_show, #media_update, #media_upload
Methods included from Follow
Methods included from Faq
#faq_create, #faq_destroy, #faq_index, #faq_show, #faq_update
Methods included from ExternalLinks
#create_link, #destroy_link, #index_link, #update_link
Methods included from Affiliated
#affiliated_create, #affiliated_index, #affiliated_stats
Methods included from Response
Instance Method Details
#can_create ⇒ Object
54 55 56 57 58 59 60 |
# File 'app/controllers/api/spaces_controller.rb', line 54 def can_create if current_user.has_role? :space_creator render json: { data: 'Authorized' }, status: :ok else render json: { data: 'Forbidden' }, status: :forbidden end end |
#create ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'app/controllers/api/spaces_controller.rb', line 62 def create render(json: { data: 'Forbidden' }, status: :forbidden) && return unless current_user.has_role? :space_creator @space = Space.new(space_params) @space.status = 'draft' @space.creator_id = current_user.id @space.users << current_user if @space.save @space.create_faq current_user.add_role :owner, @space current_user.add_role :admin, @space current_user.add_role :member, @space render json: { id: @space.id, short_title: @space.short_title, data: 'Success' }, status: :created else render json: { data: 'Something went wrong' }, status: :unprocessable_entity end end |
#destroy ⇒ Object
93 94 95 96 97 98 99 100 101 102 |
# File 'app/controllers/api/spaces_controller.rb', line 93 def destroy # NOTE: a space with 1 user is considered a test space, and can be destroyed if @space.users.count == 1 && current_user.has_role?(:owner, @space) @space.destroy render json: { data: "Space id:#{@space.id} destroyed" }, status: :ok else @space.archived! render json: { data: "Space id:#{@space.id} archived" }, status: :ok end end |
#email_members ⇒ Object
104 105 106 107 108 109 110 |
# File 'app/controllers/api/spaces_controller.rb', line 104 def email_members params.permit(:content, :subject) User.with_role(:member, @space).each do |user| SpaceEmailWorker.perform_async(current_user.id, user.id, @space.id, params[:content], params[:subject]) end render status: :accepted end |
#get_members_info ⇒ Object
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'app/controllers/api/spaces_controller.rb', line 112 def get_members_info members = [] User.with_role(:member, @space).each do |user| members << user end respond_to do |format| format.csv do send_data User.to_csv(members.uniq(&:id)), filename: "members-info-#{Time.zone.today}.csv" end format.json do render json: { users: members.uniq(&:id).map { |user| Api::UserSerializer.new(user) } }, status: :ok end end end |
#index ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'app/controllers/api/spaces_controller.rb', line 26 def index if params[:simple].nil? records = Space .where.not(status: 'draft') .includes([ :avatar_attachment, { banner_attachment: :blob }, :feed, { challenges: :projects } ]) .all @pagy, @spaces = pagy(records) render json: @spaces else attrs = %w[id short_title title short_description status] records = Space .where.not(status: 'draft') .pluck(*attrs).map { |p| attrs.zip(p).to_h } render json: { spaces: records }, status: :ok end end |
#index_challenges ⇒ Object
131 132 133 134 135 136 137 138 |
# File 'app/controllers/api/spaces_controller.rb', line 131 def index_challenges challenges = Challenge .where(space: @space) .order(id: :desc) @pagy, records = pagy(challenges) render json: records, each_serializer: Api::ChallengeSerializer, root: 'challenges', adapter: :json end |
#index_needs ⇒ Object
Return a list of needs for the Space via its Project(s). Omit any needs where the Project affiliation to the Space is still 'pending'.
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
# File 'app/controllers/api/spaces_controller.rb', line 214 def index_needs affiliated = Need.where(project_id: ::Affiliation.where(parent: @space, affiliate_type: 'Project') .where.not(status: 'pending') .select(:affiliate_id)) associated = Need.where(project_id: ::Project.select("projects.*, 'associated' AS relation") .joins(:challenges) .where(challenges: { space: @space }) .pluck(:id)) needs = (affiliated + associated).uniq(&:id) pagy = Pagy.new(count: needs.count, items: params.key?(:items) ? params[:items] : 25, page: params.key?(:page) ? params[:page] : 1) render json: needs[pagy.offset, pagy.items], each_serializer: Api::NeedSerializer, root: 'needs', adapter: :json end |
#index_people ⇒ Object
Return a list of people (User) related to the Space. Core - affiliated peopled Members - owners, admins, members Participates - members of space owned challenges or projects
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'app/controllers/api/spaces_controller.rb', line 173 def index_people core = User .select("users.*, 'core' as relation") .where(id: ::Affiliation.where(parent: @space, affiliate_type: 'User', status: :accepted).select(:affiliate_id)) member = User .select("users.*, 'member' as relation") .joins('LEFT JOIN users_roles ON users.id = users_roles.user_id') .joins('LEFT JOIN roles ON roles.id = users_roles.role_id') .where("roles.name != 'pending' AND roles.resource_type = 'Space' AND roles.resource_id = :space_id", space_id: @space.id) challenge_participant = User .select("users.*, 'participant' as relation") .joins('LEFT JOIN users_roles ON users.id = users_roles.user_id') .joins('LEFT JOIN roles ON roles.id = users_roles.role_id') .where("roles.name != 'pending' AND roles.resource_type = 'Challenge' AND roles.resource_id IN (SELECT id FROM challenges WHERE space_id = :space_id)", space_id: @space.id) project_participant = User .select("users.*, 'participant' as relation") .joins('LEFT JOIN users_roles ON users.id = users_roles.user_id') .joins('LEFT JOIN roles ON roles.id = users_roles.role_id') .where("roles.name != 'pending' AND roles.resource_type = 'Project' AND roles.resource_id IN (SELECT id FROM projects WHERE space_id = :space_id)", space_id: @space.id) participant = if @space.show_associated_users? challenge_participant + project_participant else [] end people = (core + member + participant).uniq(&:id) pagy = Pagy.new(count: people.count, items: params.key?(:items) ? params[:items] : 25, page: params.key?(:page) ? params[:page] : 1) render json: people[pagy.offset, pagy.items], each_serializer: Api::UserSerializer, root: 'people', adapter: :json end |
#index_projects ⇒ Object
Return a list of Project(s) that are related to the Space. Core - affiliated projects Featureed - owned projects Associated - projects owned by owned challenges
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'app/controllers/api/spaces_controller.rb', line 144 def index_projects core = Project .select("projects.*, 'core' AS relation") .where(id: ::Affiliation.where(parent: @space, affiliate_type: 'Project').select(:affiliate_id)) featured = @space.projects.select("projects.*, 'featured' AS relation") associated = if @space.show_associated_projects? Project .select("projects.*, 'associated' AS relation") .joins(:challenges).where(challenges: { space: @space }) else [] end projects = (core + featured + associated).uniq(&:id) pagy = Pagy.new(count: projects.count, items: params.key?(:items) ? params[:items] : 25, page: params.key?(:page) ? params[:page] : 1) render json: projects[pagy.offset, pagy.items], each_serializer: Api::ProjectSerializer, root: 'projects', adapter: :json end |
#my_spaces ⇒ Object
48 49 50 51 52 |
# File 'app/controllers/api/spaces_controller.rb', line 48 def my_spaces @spaces = current_user.spaces @pagy, @spaces = pagy_array(@spaces.uniq) render json: @spaces end |
#remove ⇒ Object
The object relation is remove no status change
235 236 237 238 239 240 241 242 |
# File 'app/controllers/api/spaces_controller.rb', line 235 def remove if @space.challenges.include?(@challenge) @space.challenges.delete(@challenge) render json: { data: "Challenge id:#{@challenge.id} removed" }, status: :ok else render json: { data: "Challenge id:#{@challenge.id} is not attached" }, status: :not_found end end |
#show ⇒ Object
81 82 83 |
# File 'app/controllers/api/spaces_controller.rb', line 81 def show render json: @space, show_objects: true end |
#update ⇒ Object
85 86 87 88 89 90 91 |
# File 'app/controllers/api/spaces_controller.rb', line 85 def update if @space.update(space_params) render json: @space, status: :ok else render json: { data: 'Something went wrong :(' }, status: :unprocessable_entity end end |