Skip to content

Instantly share code, notes, and snippets.

@gogogarrett
Created June 26, 2014 01:40
Show Gist options
  • Save gogogarrett/9f1f2313a4771cede537 to your computer and use it in GitHub Desktop.
Save gogogarrett/9f1f2313a4771cede537 to your computer and use it in GitHub Desktop.
yay for services.
module Api
module V1
class AnswerController < ApplicationController
respond_to :json
def create
lesson_session.process_attempts(params[:attempts].values)
API::ProcessAnswer.new(lesson_session, current_student).call if lesson_session.completed?
render json: {}
end
private
def lesson_session
unless session = LessonSession.find_for(current_student, lesson_id)
session = LessonSession.create(current_student, lesson_id)
end
session
end
def lesson_id
params[:lesson_id]
end
end
end
end
module Api
module V1
class AnswerController < ApplicationController
respond_to :json
def create
lesson_session.process_attempts(params[:attempts].values)
# [g] make a service
if lesson_session.completed?
score = Score::LessonSession.build(lesson_session).to_i
lessons_users = LessonsUser.find_by(student_id: current_student.id, lesson_id: lesson_id)
if lessons_users
count = lessons_users.count
if score > lessons_users.score
lessons_users.update(score: score, count: count + 1)
else
lessons_users.update(count: count + 1)
end
else
LessonsUser.create(student_id: current_student.id, lesson_id: lesson_id, score: score, count: 1)
end
end
render json: {}
end
private
def lesson_session
unless session = LessonSession.find_for(current_student, lesson_id)
session = LessonSession.create(current_student, lesson_id)
end
session
end
def lesson_id
params[:lesson_id]
end
end
end
end
module API
class ProcessAnswer
def initialize(lesson_session, student)
@session, @student = lesson_session, student
end
def call
if lessons_user
update_score_and_count
else
LessonsUser.create(student_id: student.id, lesson_id: lesson_id, score: score, count: 1)
end
end
private
attr_reader :session, :student
def update_score_and_count
update_hash = { count: increment_count }
update_hash[:score] = score if higher_score?
lessons_user.update(update_hash)
end
def higher_score?
score > lessons_user.score
end
def increment_count
count + 1
end
def score
Score::LessonSession.build(session).to_i
end
def lessons_user
@lessons_user ||= LessonsUser.find_by(student_id: student.id, lesson_id: lesson_id)
end
def count
lessons_user.count
end
def lesson_id
session.lesson.id
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment