pupilfirst/pupilfirst

View on GitHub
app/graphql/mutations/undo_grading.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
96%
module Mutations
  class UndoGrading < ApplicationQuery
    class MustBeGraded < GraphQL::Schema::Validator
      def validate(_object, _context, value)
        submission = TimelineEvent.find_by(id: value[:submission_id])

        unless submission&.evaluated_at?
          return I18n.t("mutations.undo_grading.must_be_graded")
        end
      end
    end

    include QueryAuthorizeReviewSubmissions
    include ValidateSubmissionGradable

    validates MustBeGraded => {}

    description "Delete grading for the submission."

    field :success, Boolean, null: false

    def resolve(_params)
      notify(
        :success,
        I18n.t("mutations.undo_grading.success_notification.title"),
        I18n.t("mutations.undo_grading.success_notification.description")
      )

      { success: undo_grading }
    end

    def undo_grading
      TimelineEvent.transaction do
        # Clear existing grades
        TimelineEventGrade.where(timeline_event: submission).destroy_all

        if submission.target.assignments.not_archived.first.milestone
          submission.students.find_each do |student|
            student.update!(completed_at: nil)
          end
        end

        # Clear evaluation info
        submission.update!(
          passed_at: nil,
          evaluator_id: nil,
          evaluated_at: nil,
          checklist: checklist
        )
      end
    end

    def checklist
      submission.checklist.map do |c|
        c["status"] = TimelineEvent::CHECKLIST_STATUS_NO_ANSWER
        c
      end
    end

    def submission
      @submission = TimelineEvent.find_by(id: @params[:submission_id])
    end

    def course
      @course ||= submission&.course
    end
  end
end