Skip to content

Commit 2adf1c5

Browse files
mengyewgausibinhho99florentianayuwono
authored
Pagination (#369)
* Adds POST route for creating new assignments via API (#338) * Add API key and sample GET and POST * Implement POST API route for creating assignments * Add API key authentication handler * Run rubocop on assignments_controller * Reduce linter-flagged issues * Add API Phase 1 documentation (#336) * Add API Phase 1 documentation * Api/sub sim (#331) * Added API for GET all submission similarities of an assignment * Fix extra render when uploading invalid zip file (#342) * Fix extra render when uploading invalid zip file * Revert "Fix extra render when uploading invalid zip file (#342)" (#344) This reverts commit d6a720f. * Fix extra render when uploading invalid zip file * Add API route for GET Pair of flagged submission details (#341) * Add tests and bug fixes for api/v1/submission_similarities index and show * Add RSpec tests for POST /api/v1/courses/{course_id}/assignment/ * Update similarity percentage format it doc * Remove unused files and routes * Update/ Clarify API doc * added pagination * added to use the will_paginate gem * Added such that limit has higher precedence over pagination --------- Co-authored-by: sibinhho99 <sibinhho99@gmail.com> Co-authored-by: florentianayuwono <76247368+florentianayuwono@users.noreply.github.com>
1 parent e77b4e9 commit 2adf1c5

File tree

2 files changed

+49
-32
lines changed

2 files changed

+49
-32
lines changed

app/controllers/api/v1/submission_similarities_controller.rb

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,34 @@ def render_submission_similarities
5757
render json: { error: 'Assignment does not exist' }, status: :bad_request
5858
return
5959
end
60-
# Check if the assignment has associated submission files.
60+
61+
submission_similarities = assignment.submission_similarities
62+
6163
if assignment.submissions.empty?
6264
render json: { status: 'empty' }, status: :ok
6365
return
6466
end
6567

66-
# Determine process status of assignment
6768
submission_similarity_process = assignment.submission_similarity_process
69+
6870
case submission_similarity_process.status
6971
when SubmissionSimilarityProcess::STATUS_RUNNING, SubmissionSimilarityProcess::STATUS_WAITING
70-
render json: { status: 'processing' }, status: :ok
71-
return
72+
render_processing_status
7273
when SubmissionSimilarityProcess::STATUS_ERRONEOUS
73-
render json: { status: 'error', message: 'SSID is busy or under maintenance. Please try again later.' },
74-
status: :service_unavailable
75-
return
74+
render_error_status
75+
else
76+
submission_similarities = apply_filters(submission_similarities)
77+
render_paginated_or_limited_submission_similarities(submission_similarities)
7678
end
79+
end
7780

78-
submission_similarities = assignment.submission_similarities
81+
def render_filtered_submission_similarities(submission_similarities)
82+
submission_similarities = apply_filters(submission_similarities)
7983

80-
### Filtering Code
84+
render_paginated_submission_similarities(submission_similarities)
85+
end
86+
87+
def apply_filters(submission_similarities)
8188
# Apply the threshold filter
8289
if params[:threshold].present?
8390
threshold_value = params[:threshold].to_f
@@ -90,27 +97,36 @@ def render_submission_similarities
9097
submission_similarities = submission_similarities.limit(limit_value)
9198
end
9299

93-
# Apply the page filter
94-
if params[:page].present?
95-
per_page = params[:limit].present? ? limit_value : 20 # Default per page value is 20, limit to use a page size
96-
page_number = params[:page].to_i
97-
submission_similarities = submission_similarities.offset(per_page * (page_number - 1))
100+
submission_similarities
101+
end
102+
103+
def render_paginated_or_limited_submission_similarities(submission_similarities)
104+
if params[:limit].present?
105+
render_json_response(submission_similarities)
106+
else
107+
# Set the default per page value to 20 for pagination
108+
per_page = 20
109+
110+
# Sort the submission_similarities by similarity in descending order by default
111+
submission_similarities = submission_similarities.order(similarity: :desc)
112+
113+
submission_similarities = submission_similarities.paginate(page: params[:page], per_page: per_page)
114+
115+
render_json_response(submission_similarities)
98116
end
117+
end
99118

100-
# Process subnission similarities into readable format for returning via JSON
101-
result_submission_similarities = []
119+
def render_json_response(submission_similarities)
120+
render json: { status: 'processed', submissionSimilarities: submission_similarities }, status: :ok
121+
end
102122

103-
submission_similarities.each { |submission_similarity|
104-
result_submission_similarities.append( {
105-
submissionSimilarityID: submission_similarity.id,
106-
student1ID: submission_similarity.submission1.student_id,
107-
student2ID: submission_similarity.submission2.student_id,
108-
similarity: submission_similarity.similarity
109-
}
110-
)
111-
}
123+
def render_processing_status
124+
render json: { status: 'processing' }, status: :ok
125+
end
112126

113-
render json: { status: 'processed', submissionSimilarities: result_submission_similarities }, status: :ok
127+
def render_error_status
128+
render json: { status: 'error', message: 'SSID is busy or under maintenance. Please try again later.' },
129+
status: :service_unavailable
114130
end
115131

116132
def render_pair_of_flagged_submissions
@@ -124,22 +140,21 @@ def render_pair_of_flagged_submissions
124140
return
125141
end
126142

143+
max_similarity_percentage = submission_similarity.similarity
127144
matches = []
128145

129146
submission_similarity.similarity_mappings.each do |similarity|
130147
matches.append(
131148
{
132-
student1StartLine: similarity.start_line1 + 1,
133-
student1EndLine: similarity.end_line1 + 1,
134-
student2StartLine: similarity.start_line2 + 1,
135-
student2EndLine: similarity.end_line2 + 1,
136-
numOfMatchingStatements: similarity.statement_count
149+
student1: similarity.line_range1_string,
150+
student2: similarity.line_range2_string,
151+
statementCount: similarity.statement_count
137152
}
138153
)
139154
end
140155

141156
render json: {
142-
similarity: submission_similarity.similarity,
157+
maxSimilarityPercentage: max_similarity_percentage,
143158
matches: matches
144159
}, status: :ok
145160
end

db/schema.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
# This file is auto-generated from the current state of the database. Instead
24
# of editing this file, please use the migrations feature of Active Record to
35
# incrementally modify your database, and then regenerate this schema definition.

0 commit comments

Comments
 (0)