{"record":{"id":"d6fcd370a32aeb05","repo":"instructure/canvas-lms","slug":"submission-is-missing-for-peerreviewsubassignment-assignment","errorCode":null,"errorMessage":"Submission is missing for PeerReviewSubAssignment %{assignment_id} and user %{user_id}","messagePattern":"Submission is missing for PeerReviewSubAssignment %(.+?) and user %(.+?)","errorType":"exception","errorClass":"MissingPeerReviewSubmissionError","httpStatus":null,"severity":"error","filePath":"app/serializers/peer_review/peer_review_submission_serializer.rb","lineNumber":50,"sourceCode":"\n    {\n      has_peer_review_submission: submission.present?,\n      submission:\n    }\n  end\n\n  def self.find_peer_review_submission(peer_review_sub_assignment, user_id)\n    peer_review_submission = peer_review_sub_assignment.submissions.where(user_id:)\n                                                       .where(workflow_state: %w[submitted graded])\n                                                       .first\n\n    if peer_review_submission.present?\n      peer_review_submission\n    else\n      any_submission_ever = Submission.unscoped.find_by(assignment_id: peer_review_sub_assignment.id, user_id:)\n\n      if any_submission_ever.nil?\n        raise MissingPeerReviewSubmissionError, I18n.t(\"Submission is missing for PeerReviewSubAssignment %{assignment_id} and user %{user_id}\",\n                                                       assignment_id: peer_review_sub_assignment.id,\n                                                       user_id:)\n      else\n        nil\n      end\n    end\n  end\nend\n","sourceCodeStart":32,"sourceCodeEnd":59,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/serializers/peer_review/peer_review_submission_serializer.rb#L32-L59","documentation":"PeerReview::PeerReviewSubmissionSerializer resolves the submission for a peer-review sub-assignment and user. If the peer review submission is absent and no submission has ever existed for that sub_assignment/user, it raises MissingPeerReviewSubmissionError (I18n-formatted with assignment_id and user_id). Peer review workflows require a submission record for each reviewer/target user.","triggerScenarios":"Serialize a peer review sub-assignment submission for a user_id with zero Submission rows where assignment_id == peer_review_sub_assignment.id (peer review created before submissions were seeded, or reviewer never interacted).","commonSituations":"Peer review of a student who never submitted the parent assignment, so no submission was cloned for review; API/serialization calls for reviewers not assigned to the peer review; course copy/import dropping submission records.","solutions":["Ensure the target student has a submission on the parent assignment so the peer review sub-assignment submission gets created.","Create the missing submission shell for the user on the peer review sub-assignment before serializing.","Catch MissingPeerReviewSubmissionError and render an empty/default peer review payload.","Verify reviewer assignment/user_id correctness; only serialize for users actually assigned to the peer review."],"exampleFix":"// before\nPeerReview::PeerReviewSubmissionSerializer.new(peer_review_sub_assignment, user_id).as_json\n# => MissingPeerReviewSubmissionError\n\n// after\nunless Submission.unscoped.exists?(assignment_id: peer_review_sub_assignment.id, user_id: user_id)\n  peer_review_sub_assignment.submissions.create!(user_id: user_id)\nend\nPeerReview::PeerReviewSubmissionSerializer.new(peer_review_sub_assignment, user_id).as_json","handlingStrategy":"try-catch","validationCode":"unless Submission.unscoped.exists?(assignment_id: peer_review_sub_assignment.id, user_id: user_id)\n  peer_review_sub_assignment.submissions.create!(user_id: user_id)\nend","typeGuard":"def peer_review_submission_exists?(pr_sub_assignment, user_id)\n  Submission.unscoped.exists?(assignment_id: pr_sub_assignment.id, user_id: user_id)\nend","tryCatchPattern":"begin\n  serializer.as_json\nrescue Checkpoints::MissingPeerReviewSubmissionError => e\n  Rails.logger.info(e.message)\n  { peer_review_submission: nil }\nend","preventionTips":["Ensure the parent-assignment submission exists before creating peer reviews.","Verify reviewer assignments reference real submissions for the target student.","Backfill submissions lost during course copies before serializing peer reviews."],"tags":["peer-review","sub-assignment","serializer","submission"],"backgroundTag":"record-not-found","analyzedSha":"1c9f0bb8013ed69c4f2efe11fd483025469b7e6c","analyzedAt":"2026-09-15T20:33:18.891Z","contentChangedAt":"2026-09-15T20:33:18.891Z","schemaVersion":2},"datasetVersion":"2026-09-23T02:17:17.105Z"}