diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb index ce8334fc..7080c722 100644 --- a/app/controllers/api/submissions_controller.rb +++ b/app/controllers/api/submissions_controller.rb @@ -2,6 +2,9 @@ module Api class SubmissionsController < ApiBaseController + UnknownFieldName = Class.new(StandardError) + UnknownSubmitterName = Class.new(StandardError) + def create template = current_account.templates.find(params[:template_id]) @@ -13,28 +16,65 @@ module Api send_email: params[:send_email] != 'false', emails: params[:emails] || params[:email]) else + submissions_attrs = normalize_submissions_params!(submissions_params[:submission], template) + Submissions.create_from_submitters(template:, user: current_user, source: :api, send_email: params[:send_email] != 'false', - submissions_attrs: submissions_params[:submission]) + submissions_attrs:) end submitters = submissions.flat_map(&:submitters) - if params[:send_email] != 'false' - submitters.each do |submitter| - SubmitterMailer.invitation_email(submitter, message: params[:message]).deliver_later! - end - end + send_invitation_emails(submitters) if params[:send_email] != 'false' render json: submitters + rescue UnknownFieldName, UnknownSubmitterName => e + render json: { error: e.message }, status: :unprocessable_entity end private + def send_invitation_emails(submitters) + submitters.each do |submitter| + SubmitterMailer.invitation_email(submitter, message: params[:message]).deliver_later! + end + end + def submissions_params - params.permit(submission: [{ submitters: [%i[uuid name email]] }]) + params.permit(submission: [{ submitters: [[:uuid, :name, :email, { values: {} }]] }]) + end + + def normalize_submissions_params!(submissions_params, template) + submissions_params.each do |submission| + submission[:submitters].each_with_index do |submitter, index| + next if submitter[:values].blank? + + submitter[:values] = + normalize_submitter_values(template, + submitter[:values], submitter[:name] || template.submitters[index]['name']) + end + end + + submissions_params + end + + def normalize_submitter_values(template, values, submitter_name) + submitter = + template.submitters.find { |e| e['name'] == submitter_name } || + raise(UnknownSubmitterName, "Unknown submitter: #{submitter_name}") + + fields = template.fields.select { |e| e['submitter_uuid'] == submitter['uuid'] } + + fields_uuid_index = fields.index_by { |e| e['uuid'] } + fields_name_index = fields.index_by { |e| e['name'] } + + values.transform_keys do |key| + next key if fields_uuid_index[key].present? + + fields_name_index[key]&.dig('uuid') || raise(UnknownFieldName, "Unknown field: #{key}") + end end end end diff --git a/app/controllers/api/templates_controller.rb b/app/controllers/api/templates_controller.rb index af7ae691..0412a14a 100644 --- a/app/controllers/api/templates_controller.rb +++ b/app/controllers/api/templates_controller.rb @@ -2,13 +2,17 @@ module Api class TemplatesController < ApiBaseController + before_action :load_template, only: %i[show update] + def index render json: current_account.templates end - def update - @template = current_account.templates.find(params[:id]) + def show + render json: @template.as_json(include: { author: { only: %i[id email first_name last_name] } }) + end + def update @template.update!(template_params) render :ok @@ -23,5 +27,9 @@ module Api fields: [[:uuid, :submitter_uuid, :name, :type, :required, { options: [], areas: [%i[x y w h cell_w attachment_uuid page]] }]]) end + + def load_template + @template = current_account.templates.find(params[:id]) + end end end diff --git a/app/views/api_settings/index.html.erb b/app/views/api_settings/index.html.erb index 459b2eb2..a07b6962 100644 --- a/app/views/api_settings/index.html.erb +++ b/app/views/api_settings/index.html.erb @@ -42,7 +42,7 @@
<%= text %>
+