module Bearcat class Client < Footrest::Client module Submissions extend ClientModule prefix "/api/v1/courses/:course/assignments/:assignment/submissions/" do get :get_course_submissions get :user_course_assignment_submission, ":user" end context_types %i[course section] do |ct| prefix "/api/v1/#{ct}s/:#{ct}/" do get :"#{ct}_submissions", "students/submissions" prefix "assignments/:assignment/submissions/" do post :"#{ct}_submission" put :"grade_#{ct}_submission", ":user" post :"#{ct}_update_grades", "update_grades" end end end def course_file_upload_submission(course, assignment, user, file_data, params={}) file_upload_submission(course, assignment, user, file_data, params, type: :course) end def section_file_upload_submission(section, assignment, user, file_data, params={}) file_upload_submission(section, assignment, user, file_data, params, type: :section) end protected # @param file_data One of an array of file_path strings or an array of Hashes, each being upload file params plus the file's path def file_upload_submission(type_id, assignment, user, file_data=nil, params={}, type:) raise ArgumentError, 'Invalid type' unless [:course, :section].include?(type) raise ArgumentError, 'Must provide either file paths or fully formed submission params' if params.dig(:submission, :file_ids).nil? && file_data.nil? params = params.with_indifferent_access sub_params = if params.dig(:submission, :file_ids).present? {} else file_data = Array.wrap(file_data) file_ids = file_data.map do |datum| if datum.is_a?(Hash) && datum[:file_path].present? # datum is a param hash for upload_file API plus the file_path path = datum[:file_path] upload_params = datum.except(:file_path) else # treat datum as a file_path string path = datum upload_params = params end response = upload_file("/api/v1/#{type}s/#{type_id}/assignments/#{assignment}/submissions/#{user}/files", path, upload_params) response['id'] end { submission_type: 'online_upload', file_ids: file_ids, } end sub_params.merge!(params[:submission]) if params[:submission].present? params[:submission] = sub_params send("#{type}_submission".to_sym, type_id, assignment, params) end end end end