Class: Api::SpacesController

Inherits:
ApplicationController show all
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

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

#recommended, #similar

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

#followers, #following

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

#json_response

Instance Method Details

#can_createObject



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

#createObject



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

#destroyObject



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_membersObject



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_infoObject



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

#indexObject



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_challengesObject



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_needsObject

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_peopleObject

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_projectsObject

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_spacesObject



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

#removeObject

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

#showObject



81
82
83
# File 'app/controllers/api/spaces_controller.rb', line 81

def show
  render json: @space, show_objects: true
end

#updateObject



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