Class: Api::ProgramsController
- Inherits:
-
ApplicationController
- Object
- ActionController::API
- ApplicationController
- Api::ProgramsController
- Includes:
- Affiliation, ExternalLinks, Faq, Follow, Media, Members, Recommendations, Relations, Resources, Upload, Utils
- Defined in:
- app/controllers/api/programs_controller.rb
Instance Method Summary collapse
-
#attach ⇒ Object
This method add challenge to a program and changes its status.
- #can_create ⇒ Object
- #create ⇒ Object
- #destroy ⇒ Object
- #index ⇒ Object
- #index_challenges ⇒ Object
- #index_needs ⇒ Object
- #index_projects ⇒ Object
- #members_short ⇒ Object
- #my_programs ⇒ 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 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 Affiliation
#affiliation_create, #affiliation_destroy, #affiliation_index, #affiliation_show, #affiliation_update
Methods included from Response
Instance Method Details
#attach ⇒ Object
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_create ⇒ Object
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 |
#create ⇒ Object
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 |
#destroy ⇒ Object
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 |
#index ⇒ Object
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_challenges ⇒ Object
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_needs ⇒ Object
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_projects ⇒ Object
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_short ⇒ Object
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_programs ⇒ Object
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 |
#remove ⇒ Object
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 |
#show ⇒ Object
84 85 86 |
# File 'app/controllers/api/programs_controller.rb', line 84 def show render json: @program, includes: %i[projects], show_objects: true end |
#update ⇒ Object
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 |