Class: Api::ProgramsController

Inherits:
ApplicationController show all
Includes:
Affiliation, ExternalLinks, Faq, Follow, Media, Members, Recommendations, Relations, Resources, Upload, Utils
Defined in:
app/controllers/api/programs_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 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 Affiliation

#affiliation_create, #affiliation_destroy, #affiliation_index, #affiliation_show, #affiliation_update

Methods included from Response

#json_response

Instance Method Details

#attachObject

This method add challenge to a program and changes its status



108
109
110
111
112
113
114
115
# File 'app/controllers/api/programs_controller.rb', line 108

def attach
  if @program.challenges.include?(@challenge)
    render json: { data: "Challenge id:#{@challenge.id} is already attached" }, status: :ok
  else
    @program.challenges << @challenge
    render json: { data: "Challenge id:#{@challenge.id} attached" }, status: :ok
  end
end

#can_createObject



60
61
62
63
64
65
66
# File 'app/controllers/api/programs_controller.rb', line 60

def can_create
  if current_user.has_role? :program_creator
    render json: { data: 'Authorized' }, status: :ok
  else
    render json: { data: 'Forbidden' }, status: :forbidden
  end
end

#createObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'app/controllers/api/programs_controller.rb', line 68

def create
  render(json: { data: 'Forbidden' }, status: :forbidden) && return unless current_user.has_role? :program_creator

  @program = Program.new(program_params)
  @program.status = 'draft'
  if @program.save
    @program.create_faq
    current_user.add_role :owner, @program
    current_user.add_role :admin, @program
    current_user.add_role :member, @program
    render json: { id: @program.id, short_title: @program.short_title, data: 'Success' }, status: :created
  else
    render json: { data: 'Something went wrong' }, status: :unprocessable_entity
  end
end

#destroyObject



96
97
98
99
100
101
102
103
104
105
# File 'app/controllers/api/programs_controller.rb', line 96

def destroy
  # NOTE: a program with 1 user is considered a test program, and can be destroyed
  if @program.users.count == 1 && current_user.has_role?(:owner, @program)
    @program.destroy
    render json: { data: "Program id:#{@program.id} destroyed" }, status: :ok
  else
    @program.archived!
    render json: { data: "Program id:#{@program.id} archived" }, status: :ok
  end
end

#indexObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'app/controllers/api/programs_controller.rb', line 30

def index
  if params[:simple].nil?
    records = Program
              .where.not(status: 'draft')
              .includes([
                          :avatar_attachment,
                          { banner_attachment: :blob },
                          :feed,
                          { challenges: :projects }
                        ])
              .all
    @pagy, @programs = pagy(records)
    render json: @programs
  else
    attrs = %w(id short_title title title_fr short_description short_description_fr status)
    records = Program
              .where.not(status: 'draft')
              .pluck(*attrs).map { |p| attrs.zip(p).to_h }
    render json: { programs: records }, status: :ok
  end
end

#index_challengesObject



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'app/controllers/api/programs_controller.rb', line 127

def index_challenges
  # render json: @program, serializer: Api::ProgramChallengeSerializer
  challenges = Challenge
               .includes(%i[program])
               .joins(:program)
               .select('challenges.*')
               .distinct
               .where('programs.id = ?', @program.id)
               .where.not(status: :archived)
               .order(id: :desc)

  @pagy, records = pagy(challenges)
  render json: Panko::Response.new(
    challenges: Panko::ArraySerializer.new(
      records,
      each_serializer: Api::SharedChallengeSerializer,
      context: { current_user: current_user, program_id: @program.id }
    )
  )
end

#index_needsObject



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'app/controllers/api/programs_controller.rb', line 168

def index_needs
  # Only take accepted projects into account
  needs = Need
          .includes(%i[relations])
          .joins(project: [{ challenges_projects: [{ challenge: :program }] }])
          .select('needs.*')
          .distinct
          .where('programs.id = ?', @program.id)
          .where(challenges_projects: { project_status: ChallengesProject.project_statuses[:accepted] })
          .order(id: :desc) # can't use created_at since some records don't have it

  @pagy, records = pagy(needs)
  render json: Panko::Response.new(
    needs: Panko::ArraySerializer.new(
      records,
      each_serializer: Api::SharedNeedSerializer,
      context: { current_user: current_user }
    )
  )
end

#index_projectsObject



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'app/controllers/api/programs_controller.rb', line 148

def index_projects
  # Don't take archived projects into account
  projects = Project
             .joins(challenges: :program)
             .select('projects.*')
             .distinct
             .where('programs.id = ?', @program.id)
             .where.not(status: :archived)
             .order(id: :desc) # can't use created_at since some records don't have it

  @pagy, records = pagy(projects)
  render json: Panko::Response.new(
    projects: Panko::ArraySerializer.new(
      records,
      each_serializer: Api::SharedProjectSerializer,
      context: { current_user: current_user, program_id: @program.id }
    )
  )
end

#members_shortObject



189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'app/controllers/api/programs_controller.rb', line 189

def members_short
  render json: @program.all_owners_admins_members.map { |m|

    # Map through member's projects, and return ids of those whose one of the challenges have program_id equals to current program id of route
    projects = m.projects.map do |project|
      !project.challenges.empty? && project.challenges.map { |challenge| challenge.program_id == @program.id && project.id}[0]
    end
    
    # Form the member json
    { id: m.id, first_name: m.first_name, last_name: m.last_name, email: m.email, projects: projects.select(&:itself) }
    
  }, status: :ok
end

#my_programsObject



52
53
54
55
56
57
58
# File 'app/controllers/api/programs_controller.rb', line 52

def my_programs
  @programs = Program.with_role(:owner, current_user)
  @programs += Program.with_role(:admin, current_user)
  @programs += Program.with_role(:member, current_user)
  @pagy, @programs = pagy_array(@programs.uniq)
  render json: @programs
end

#removeObject

The object relation is remove no status change



118
119
120
121
122
123
124
125
# File 'app/controllers/api/programs_controller.rb', line 118

def remove
  if @program.challenges.include?(@challenge)
    @program.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



84
85
86
# File 'app/controllers/api/programs_controller.rb', line 84

def show
  render json: @program, includes: %i[projects], show_objects: true
end

#updateObject



88
89
90
91
92
93
94
# File 'app/controllers/api/programs_controller.rb', line 88

def update
  if @program.update(program_params)
    render json: @program, status: :ok
  else
    render json: { data: 'Something went wrong :(' }, status: :unprocessable_entity
  end
end