Skip to content

Commit 3db37d4

Browse files
committed
(feature) Submissions can be completed
This adds a new `POST /v1/submissions/:submission_id/complete` endpoint that changes a submission's status to `completed`. It does some basic checks that the submission is valid before allowing this to happen.
1 parent 050d3f4 commit 3db37d4

7 files changed

Lines changed: 105 additions & 0 deletions

File tree

app/controllers/v1/submissions_controller.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,23 @@ def calculate
4545
head :no_content
4646
end
4747

48+
def complete
49+
submission = Submission.find(params[:id])
50+
complete_submission!(submission)
51+
52+
if submission.save
53+
head :no_content
54+
else
55+
render jsonapi_errors: submission.errors, status: :bad_request
56+
end
57+
end
58+
4859
private
4960

61+
def complete_submission!(submission)
62+
SubmissionCompletion.new(submission).perform!
63+
end
64+
5065
def create_submission_params
5166
params.require(:submission).permit(:task_id)
5267
end

app/models/submission.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,9 @@ class Submission < ApplicationRecord
1818
event :ready_for_review do
1919
transitions from: %i[pending processing], to: :in_review
2020
end
21+
22+
event :reviewed_and_accepted do
23+
transitions from: :in_review, to: :completed
24+
end
2125
end
2226
end
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class SubmissionCompletion
2+
attr_reader :submission
3+
4+
def initialize(submission)
5+
@submission = submission
6+
end
7+
8+
def perform!
9+
return unless all_entries_valid?
10+
11+
Task.transaction do
12+
Submission.transaction do
13+
submission.reviewed_and_accepted!
14+
submission.task.completed!
15+
end
16+
end
17+
end
18+
19+
private
20+
21+
def all_entries_valid?
22+
submission.entries.validated.count == submission.entries.count
23+
end
24+
end

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
resources :submissions, only: %i[show create update] do
1111
member do
1212
post 'calculate', to: 'submissions#calculate'
13+
post 'complete', to: 'submissions#complete'
1314
end
1415

1516
resources :files, only: %i[create update show], controller: 'submission_files'

spec/factories/submission.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,14 @@
2424
create_list(:errored_submission_entry, 1, submission: submission)
2525
end
2626
end
27+
28+
factory :submission_with_unprocessed_entries do
29+
aasm_state :processing
30+
31+
after(:create) do |submission, _evaluator|
32+
create_list(:validated_submission_entry, 2, submission: submission)
33+
create_list(:submission_entry, 1, submission: submission)
34+
end
35+
end
2736
end
2837
end
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
require 'rails_helper'
2+
3+
RSpec.describe SubmissionCompletion do
4+
describe '#perform' do
5+
let(:complete_submission) { SubmissionCompletion.new(submission) }
6+
7+
context 'given an "in review" submission' do
8+
context 'with validated entries' do
9+
let(:submission) { FactoryBot.create(:submission_with_validated_entries, aasm_state: 'in_review') }
10+
11+
it 'transitions the submission to completed' do
12+
complete_submission.perform!
13+
14+
expect(submission).to be_completed
15+
end
16+
end
17+
18+
context 'with some invalid entries' do
19+
let(:submission) { FactoryBot.create(:submission_with_invalid_entries) }
20+
21+
it 'leaves the submission in the "in_review" state' do
22+
expect { complete_submission.perform! }.not_to change { submission.aasm_state }
23+
end
24+
end
25+
end
26+
27+
context 'given a "processing" submission' do
28+
let(:submission) { FactoryBot.create(:submission_with_unprocessed_entries, aasm_state: :processing) }
29+
30+
it 'leaves the submission in its current state' do
31+
expect { complete_submission.perform! }.not_to change { submission.aasm_state }
32+
end
33+
end
34+
end
35+
end

spec/requests/v1/submissions_spec.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,21 @@
241241
expect(response).to have_http_status(:no_content)
242242
end
243243
end
244+
245+
describe 'POST /submissions/:submission_id/complete' do
246+
it 'marks the submission as complete' do
247+
submission = FactoryBot.create(
248+
:submission_with_validated_entries,
249+
aasm_state: :in_review
250+
)
251+
252+
post "/v1/submissions/#{submission.id}/complete"
253+
254+
expect(response).to be_successful
255+
256+
submission.reload
257+
258+
expect(submission).to be_completed
259+
end
260+
end
244261
end

0 commit comments

Comments
 (0)