Skip to content

Commit 27ab2ff

Browse files
committed
Implement a endpoint for model solutions
1 parent 42f081b commit 27ab2ff

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# frozen_string_literal: true
2+
3+
module Api
4+
module V8
5+
module Exercises
6+
class ModelSolutionsController < Api::V8::BaseController
7+
def index
8+
unauthorize_guest!
9+
exercise = Exercise.find(params[:exercise_id])
10+
course = exercise.course
11+
authorize! :read, exercise
12+
solution = exercise.solution
13+
begin
14+
authorize! :read, solution
15+
rescue CanCan::AccessDenied
16+
model_solution_token_used_on_this_exercise = tokens_used = ModelSolutionTokenUsed.where(user: current_user, course: course, exercise_name: ex.name).count > 0
17+
grant_model_solution_token_every_nth_completed_exercise = course.grant_model_solution_token_every_nth_completed_exercise
18+
if grant_model_solution_token_every_nth_completed_exercise && grant_model_solution_token_every_nth_completed_exercise > 0
19+
completed_exercises_count = course.submissions.where(all_tests_passed: true, user: current_user).distinct.select(:exercise_name).count
20+
total_model_solution_tokens = completed_exercises_count / grant_model_solution_token_every_nth_completed_exercise
21+
22+
tokens_used = ModelSolutionTokenUsed.where(user: current_user, course: course).count
23+
available_model_solution_tokens = total_model_solution_tokens - tokens_used
24+
if available_model_solution_tokens > 0
25+
ModelSolutionTokenUsed.create!(user: current_user, course: course, exercise_name: exercise.name)
26+
else
27+
raise CanCan::AccessDenied
28+
end
29+
else
30+
raise CanCan::AccessDenied unless model_solution_token_used_on_this_exercise
31+
end
32+
end
33+
ModelSolutionAccessLog.create!(user: current_user, course: course, exercise_name: exercise.name)
34+
present(
35+
exercise: {
36+
id: exercise.id
37+
},
38+
solution: {
39+
files: solution.files
40+
}
41+
)
42+
end
43+
end
44+
end
45+
end
46+
end

config/routes.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@
9999
end
100100
end
101101

102+
resources :exercises, only: [] do
103+
resources :model_solutions, only: [:index], module: :exercises
104+
end
105+
102106
namespace :core, defaults: { format: 'json' } do
103107
resources :courses, only: [:show] do
104108
resource :unlock, module: :courses, only: [:create]

db/schema.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#
1212
# It's strongly recommended that you check this file into your version control system.
1313

14-
ActiveRecord::Schema.define(version: 20181213161532) do
14+
ActiveRecord::Schema.define(version: 20181213163959) do
1515

1616
# These are extensions that must be enabled in order to support this database
1717
enable_extension "plpgsql"
@@ -190,6 +190,17 @@
190190
t.datetime "updated_at"
191191
end
192192

193+
create_table "model_solution_token_useds", force: :cascade do |t|
194+
t.integer "user_id"
195+
t.integer "course_id"
196+
t.string "exercise_name"
197+
t.datetime "created_at", null: false
198+
t.datetime "updated_at", null: false
199+
end
200+
201+
add_index "model_solution_token_useds", ["course_id"], name: "index_model_solution_token_useds_on_course_id", using: :btree
202+
add_index "model_solution_token_useds", ["user_id"], name: "index_model_solution_token_useds_on_user_id", using: :btree
203+
193204
create_table "oauth_access_grants", force: :cascade do |t|
194205
t.integer "resource_owner_id", null: false
195206
t.integer "application_id", null: false
@@ -455,6 +466,8 @@
455466
add_foreign_key "feedback_answers", "feedback_questions", on_delete: :cascade
456467
add_foreign_key "feedback_answers", "submissions", on_delete: :nullify
457468
add_foreign_key "feedback_questions", "courses", on_delete: :cascade
469+
add_foreign_key "model_solution_token_useds", "courses"
470+
add_foreign_key "model_solution_token_useds", "users"
458471
add_foreign_key "reviews", "submissions", on_delete: :cascade
459472
add_foreign_key "reviews", "users", column: "reviewer_id"
460473
add_foreign_key "submission_data", "submissions", on_delete: :cascade

0 commit comments

Comments
 (0)