{"record":{"id":"44038e8c932368b7","repo":"instructure/canvas-lms","slug":"set-type-is-required","errorCode":null,"errorMessage":"Set type is required","messagePattern":"Set type is required","errorType":"validation","errorClass":"PeerReview::SetTypeRequiredError","httpStatus":null,"severity":"error","filePath":"app/services/peer_review/validations.rb","lineNumber":195,"sourceCode":"      raise PeerReview::InvalidDatesError,\n            is_override ? I18n.t(\"Peer review override due date cannot be before parent override due date\") : I18n.t(\"Peer review due date cannot be before assignment due date\")\n    end\n\n    # 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","sourceCodeStart":177,"sourceCodeEnd":213,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/services/peer_review/validations.rb#L177-L213","documentation":"PeerReview::SetTypeRequiredError raised by validate_set_type_required when the set_type argument is blank (nil or empty). set_type selects which peer review set service (e.g. group set / section set) will handle the request.","triggerScenarios":"Calling a PeerReview service that requires a set (e.g. create_peer_review with group/section based sets) without passing set_type, or passing set_type: '' / nil.","commonSituations":"Omitting set_type in an API payload; a frontend form field not wired up; refactors that renamed the parameter without updating callers.","solutions":["Pass a valid set_type (e.g. 'group' or the service key registered in the services hash) in the request","Ensure the caller reads set_type from params before invoking the service","Validate the payload client-side before submitting"],"exampleFix":"// before\nPeerReview::Service.call(course:, set_id: 42)   # set_type missing\n// after\nPeerReview::Service.call(course:, set_type: 'group', set_id: 42)","handlingStrategy":"validation","validationCode":"raise ArgumentError, 'set_type is required' if params[:set_type].blank?","typeGuard":null,"tryCatchPattern":"begin\n  service.call(set_type: params[:set_type], ...)\nrescue PeerReview::SetTypeRequiredError => e\n  render json: { error: e.message }, status: :bad_request\nend","preventionTips":["Always pass set_type together with set_id for set-based peer reviews","Validate required fields at the controller before calling services","Keep the frontend form field and the param key name in sync"],"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"}