Class: Api::PeerReviewsController

Inherits:
ApplicationController show all
Includes:
Faq, Members, Relations, Upload, Utils
Defined in:
app/controllers/api/peer_reviews_controller.rb

Instance Method Summary collapse

Methods included from Utils

#get_id_from_short_title, #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 Relations

#clap, #clappers, #follow, #review, #reviewed_object, #save, #saved_objects

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 Faq

#faq_create, #faq_destroy, #faq_index, #faq_show, #faq_update

Methods included from Response

#json_response

Instance Method Details

#createObject



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'app/controllers/api/peer_reviews_controller.rb', line 19

def create
  peer_review = PeerReview.new(peer_review_params)

  if peer_review.save
    peer_review.update_interests(params[:peer_review][:interests]) unless params[:peer_review][:interests].nil?
    peer_review.update_skills(params[:peer_review][:skills]) unless params[:peer_review][:skills].nil?

    current_user.add_role :owner, peer_review
    current_user.add_role :admin, peer_review

    render json: peer_review, status: :created
  else
    render json: peer_review.errors.full_messages, status: :unprocessable_entity
  end
end

#destroyObject



35
36
37
38
39
# File 'app/controllers/api/peer_reviews_controller.rb', line 35

def destroy
  @peer_review.destroy

  render status: :ok
end

#email_adminsObject



41
42
43
44
45
46
47
48
49
50
51
# File 'app/controllers/api/peer_reviews_controller.rb', line 41

def email_admins
  params.permit(:content, :subject)

  @peer_review.proposals.each do |proposal|
    User.with_role(:admin, proposal).each do |user|
      PeerReviewEmailWorker.perform_async(current_user.id, user.id, @peer_review.id, params[:content], params[:subject])
    end
  end

  render status: :accepted
end

#email_admins_singleObject



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'app/controllers/api/peer_reviews_controller.rb', line 53

def email_admins_single
  params.permit(:content, :subject, :proposal_ids)

  @peer_review.proposals.each do |proposal|
    if params[:proposal_ids].include?(proposal.id)
      User.with_role(:admin, proposal).each do |user|
        PeerReviewEmailWorker.perform_async(current_user.id, user.id, @peer_review.id, params[:content], params[:subject])
      end
    end
  end

  render status: :accepted
end

#email_reviewersObject



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'app/controllers/api/peer_reviews_controller.rb', line 77

def email_reviewers
  params.permit(:content, :subject)

  members = User.with_role(:member, @peer_review)

  @peer_review.proposals.each do |proposal|
    members += User.with_role(:admin, proposal)
    members += User.with_role(:member, proposal)
  end

  members.uniq(&:id).each do |user|
    PeerReviewEmailWorker.perform_async(current_user.id, user.id, @peer_review.id, params[:content], params[:subject])
  end

  render status: :accepted
end

#email_usersObject



67
68
69
70
71
72
73
74
75
# File 'app/controllers/api/peer_reviews_controller.rb', line 67

def email_users
  params.permit(:content, :subject, :user_ids)

  params[:user_ids].each do |user_id|
    PeerReviewEmailWorker.perform_async(current_user.id, user_id, @peer_review.id, params[:content], params[:subject])
  end

  render status: :accepted
end

#get_admins_infoObject



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/controllers/api/peer_reviews_controller.rb', line 94

def get_admins_info
  members = []
  @peer_review.proposals.each do |proposal|
    User.with_role(:admin, proposal).each do |user|
      members << user
    end
  end

  respond_to do |format|
    format.csv do
      send_data User.to_csv(members.uniq(&:id)), filename: "admins-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

#get_reviewers_infoObject



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'app/controllers/api/peer_reviews_controller.rb', line 115

def get_reviewers_info
  members = User.with_role(:member, @peer_review)

  @peer_review.proposals.each do |proposal|
    members += User.with_role(:admin, proposal)
    members += User.with_role(:member, proposal)
  end

  respond_to do |format|
    format.csv do
      send_data User.to_csv(members.uniq(&:id)), filename: "reviewers-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



136
137
138
139
140
141
142
143
144
145
146
# File 'app/controllers/api/peer_reviews_controller.rb', line 136

def index
  peer_reviews = if params[:program_id]
                   Program.find(params.require(:program_id)).peer_reviews
                 elsif params[:space_id]
                   Space.find(params.require(:space_id)).peer_reviews
                 else
                   PeerReview.all
                 end

  render json: peer_reviews.order(created_at: :desc), controller: true
end

#index_peopleObject



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

def index_people
  members = 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 = 'member' AND roles.resource_type = 'PeerReview' AND roles.resource_id = :peer_review_id", peer_review_id: @peer_review.id)

  proposal_participants = 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.resource_type = 'Proposal' AND roles.resource_id IN (SELECT id FROM proposals WHERE peer_review_id = :peer_review_id)", peer_review_id: @peer_review.id)

  people = (members + proposal_participants).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_proposalsObject



171
172
173
174
175
176
177
178
# File 'app/controllers/api/peer_reviews_controller.rb', line 171

def index_proposals
  proposals = Proposal
              .where(peer_review_id: @peer_review.id)
              .order(id: :desc)

  @pagy, records = pagy(proposals)
  render json: records, each_serializer: Api::ProposalSerializer, root: 'proposals', adapter: :json
end

#my_peer_reviewsObject



180
181
182
183
184
185
186
# File 'app/controllers/api/peer_reviews_controller.rb', line 180

def my_peer_reviews
  peer_reviews = PeerReview.with_role(:owner, current_user)
  peer_reviews += PeerReview.with_role(:admin, current_user)
  peer_reviews += PeerReview.with_role(:member, current_user)

  render json: peer_reviews.uniq.sort_by(&:id)
end

#remove_proposalObject

DELETE /proposals/:proposal_id



189
190
191
192
193
194
195
196
197
# File 'app/controllers/api/peer_reviews_controller.rb', line 189

def remove_proposal
  proposal = Proposal.find(params[:proposal_id])
  if @peer_review.proposals.include?(proposal)
    @peer_review.proposals.delete(proposal)
    render json: { data: "Proposal with id:#{proposal.id} was removed" }, status: :ok
  else
    render json: { data: "Proposal with id:#{proposal.id} is not attached" }, status: :not_found
  end
end

#showObject



199
200
201
# File 'app/controllers/api/peer_reviews_controller.rb', line 199

def show
  render json: @peer_review, status: :ok, controller: true
end

#updateObject

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/PerceivedComplexity



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'app/controllers/api/peer_reviews_controller.rb', line 206

def update
  if peer_review_params[:score_threshold] && @peer_review.score_threshold
    @peer_review.proposals.each do |proposal|
      project = Project.find(proposal.project_id)

      if proposal.score && proposal.score > @peer_review.score_threshold
        User.with_role(:reviewer).first.add_role(:reviewer, project)
      else
        User.with_role(:reviewer).first.remove_role(:reviewer, project)
      end
    end
  end

  if @peer_review.update(peer_review_params)
    @peer_review.update_interests(params[:peer_review][:interests]) unless params[:peer_review][:interests].nil?
    @peer_review.update_skills(params[:peer_review][:skills]) unless params[:peer_review][:skills].nil?

    render json: @peer_review, status: :ok, controller: true
  else
    render json: @peer_review.errors.full_messages, status: :unprocessable_entity
  end
end