{"record":{"id":"255e83c867907774","repo":"instructure/canvas-lms","slug":"set-id-is-required","errorCode":null,"errorMessage":"Set id is required","messagePattern":"Set id is required","errorType":"validation","errorClass":"PeerReview::SetIdRequiredError","httpStatus":null,"severity":"error","filePath":"app/services/peer_review/validations.rb","lineNumber":199,"sourceCode":"    # Validate: child due_at <= parent lock_at\n    if child_due_at && parent_lock_at && child_due_at > parent_lock_at\n      raise PeerReview::InvalidDatesError,\n            is_override ? I18n.t(\"Peer review override due date cannot be after parent override until date\") : I18n.t(\"Peer review due date cannot be after assignment until date\")\n    end\n\n    # Validate: child lock_at <= parent lock_at\n    if child_lock_at && parent_lock_at && child_lock_at > parent_lock_at\n      raise PeerReview::InvalidDatesError,\n            is_override ? I18n.t(\"Peer review override until date cannot be after parent override until date\") : I18n.t(\"Peer review until date cannot be after assignment until date\")\n    end\n  end\n\n  def validate_set_type_required(set_type)\n    raise PeerReview::SetTypeRequiredError, I18n.t(\"Set type is required\") unless set_type.present?\n  end\n\n  def validate_set_id_required(set_id)\n    raise PeerReview::SetIdRequiredError, I18n.t(\"Set id is required\") unless set_id.present?\n  end\n\n  def validate_override_exists(override)\n    raise PeerReview::OverrideNotFoundError, I18n.t(\"Override does not exist\") unless override.present?\n  end\n\n  def validate_section_exists(section)\n    raise PeerReview::SectionNotFoundError, I18n.t(\"Section does not exist\") unless section.present?\n  end\n\n  def validate_course_exists(course)\n    raise PeerReview::CourseNotFoundError, I18n.t(\"Course does not exist\") unless course.present?\n  end\n\n  def validate_student_ids_required(student_ids)\n    if student_ids.nil? || student_ids == \"\" || student_ids.to_s.strip.empty? || (student_ids.is_a?(Array) && student_ids.empty?)\n      raise PeerReview::StudentIdsRequiredError, I18n.t(\"Student ids are required\")\n    end","sourceCodeStart":181,"sourceCodeEnd":217,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/services/peer_review/validations.rb#L181-L217","documentation":"PeerReview::SetIdRequiredError raised by validate_set_id_required when the set_id argument is blank. set_id identifies the specific set (group set, section set, etc.) from which peer review members are drawn.","triggerScenarios":"Calling a peer review service with set_type present but set_id nil, '' or otherwise not present; sending a payload that omits the id of the chosen set.","commonSituations":"UI lets user pick a set type but never a set; set was deleted so the client sends no id; API integrations copy set_type but not set_id between requests.","solutions":["Pass the numeric id of an existing set (e.g. group_category_id) as set_id","Ensure the frontend requires set selection when set_type is given","Look up the correct set id for the course before calling the service"],"exampleFix":"// before\nvalidate_set_id_required(nil) # => raises\nPeerReview::Service.call(set_type: 'group', set_id: nil)\n// after\nPeerReview::Service.call(set_type: 'group', set_id: group_category.id)","handlingStrategy":"validation","validationCode":"raise ArgumentError, 'set_id is required' if params[:set_id].blank?","typeGuard":null,"tryCatchPattern":"begin\n  service.call(set_type: st, set_id: sid)\nrescue PeerReview::SetIdRequiredError => e\n  render json: { error: e.message }, status: :bad_request\nend","preventionTips":["Require the user to select a concrete set when a set_type is chosen","Re-check that the referenced set still exists before submitting","Map API payloads field-by-field to service keyword args"],"tags":["ruby","peer-review","missing-parameter","canvas"],"backgroundTag":"missing-required-argument","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"}