From 89867fdde380f1b901a1085d89b8fe84ae5f3de7 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Sun, 28 Jan 2024 14:31:16 +0200 Subject: [PATCH] simplify submissions api --- app/controllers/api/submissions_controller.rb | 38 +++++---- app/views/api_settings/index.html.erb | 22 +++-- lib/params/base_validator.rb | 2 - lib/params/submission_create_validator.rb | 81 ++++++++++++------- 4 files changed, 86 insertions(+), 57 deletions(-) diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb index cde69f6d..9251f691 100644 --- a/app/controllers/api/submissions_controller.rb +++ b/app/controllers/api/submissions_controller.rb @@ -96,7 +96,8 @@ module Api def create_submissions(template, params) is_send_email = !params[:send_email].in?(['false', false]) - if (emails = (params[:emails] || params[:email]).presence) && params[:submission].blank? + if (emails = (params[:emails] || params[:email]).presence) && + (params[:submission].blank? && params[:submitters].blank?) Submissions.create_from_emails(template:, user: current_user, source: :api, @@ -140,20 +141,27 @@ module Api end def submissions_params - key = params.key?(:submission) ? :submission : :submissions - - params.permit( - key => [ - [:send_email, :send_sms, :bcc_completed, :completed_redirect_url, { - message: %i[subject body], - submitters: [[:send_email, :send_sms, :completed_redirect_url, :uuid, :name, :email, :role, - :completed, :phone, :application_key, - { values: {}, readonly_fields: [], message: %i[subject body], - fields: [%i[name default_value title description - readonly validation_pattern invalid_message]] }]] - }] - ] - ).fetch(key, []) + permitted_attrs = [ + :send_email, :send_sms, :bcc_completed, :completed_redirect_url, + { + message: %i[subject body], + submitters: [[:send_email, :send_sms, :completed_redirect_url, :uuid, :name, :email, :role, + :completed, :phone, :application_key, + { values: {}, readonly_fields: [], message: %i[subject body], + fields: [%i[name default_value title description + readonly validation_pattern invalid_message]] }]] + } + ] + + if params.key?(:submitters) + params.permit(*permitted_attrs) + else + key = params.key?(:submission) ? :submission : :submissions + + params.permit( + key => [permitted_attrs] + ).fetch(key, []) + end end end end diff --git a/app/views/api_settings/index.html.erb b/app/views/api_settings/index.html.erb index 454db03b..0b9e1cfa 100644 --- a/app/views/api_settings/index.html.erb +++ b/app/views/api_settings/index.html.erb @@ -35,20 +35,16 @@ --header 'X-Auth-Token: <%= current_user.access_token.token %>' \ --data-raw '{ "template_id": <%= current_account.templates.last&.id || 1 %>, - "submission": [ + "submitters": [ { - "submitters": [ - { - "name": "John Doe", - "role": "<%= current_account.templates.last ? current_account.templates.last.submitters.first['name'] : 'First Party' %>", - "email": "<%= current_user.email.sub('@', '+test@') %>", - "values": { - "Form Text Field Name": "Default Value" - } - }, - { "role": "Second Submitter", "email": "<%= current_user.email.sub('@', '+test2@') %>" } - ] - } + "name": "John Doe", + "role": "<%= current_account.templates.last ? current_account.templates.last.submitters.first['name'] : 'First Party' %>", + "email": "<%= current_user.email.sub('@', '+test@') %>", + "values": { + "Form Text Field Name": "Default Value" + } + }, + { "role": "Second Submitter", "email": "<%= current_user.email.sub('@', '+test2@') %>" } ] }'<% end.to_str %> diff --git a/lib/params/base_validator.rb b/lib/params/base_validator.rb index db69a6a0..8bdf3a07 100644 --- a/lib/params/base_validator.rb +++ b/lib/params/base_validator.rb @@ -36,8 +36,6 @@ module Params message += " in `#{@current_path}`." if @current_path.present? raise InvalidParameterError, message unless dry_run? - - Rollbar.error(message) if defined?(Rollbar) end def required(params, keys, message: nil) diff --git a/lib/params/submission_create_validator.rb b/lib/params/submission_create_validator.rb index 4a6651b4..374ca3f8 100644 --- a/lib/params/submission_create_validator.rb +++ b/lib/params/submission_create_validator.rb @@ -2,13 +2,16 @@ module Params class SubmissionCreateValidator < BaseValidator - # rubocop:disable Metrics def call if params[:submission].blank? && (params[:emails].present? || params[:email].present?) validate_creation_from_emails(params) + elsif params[:submitters].present? + validate_creation_from_submitters(params) else validate_creation_from_submission(params) end + + true end def validate_creation_from_emails(params) @@ -25,8 +28,56 @@ module Params required(message_params, :body) end + end - true + def validate_creation_from_submitters(params) + required(params, :template_id) + required(params, :submitters) + + boolean(params, :send_email) + boolean(params, :send_sms) + type(params, :order, String) + type(params, :completed_redirect_url, String) + type(params, :bcc_completed, String) + type(params, :message, Hash) + + in_path(params, :message) do |message_params| + type(message_params, :subject, String) + type(message_params, :body, String) + + required(message_params, :body) + end + + value_in(params, :order, %w[preserved random], allow_nil: true) + + in_path_each(params, :submitters) do |submitter_params| + validate_submitter(submitter_params) + end + end + + def validate_submitter(submitter_params) + required(submitter_params, %i[email phone name]) + + type(submitter_params, :name, String) + type(submitter_params, :email, String) + format(submitter_params, :email, /@/, message: 'email is invalid') + type(submitter_params, :phone, String) + format(submitter_params, :phone, /\A\+\d+\z/, + message: 'phone should start with + and contain only digits') + type(submitter_params, :values, Hash) + boolean(submitter_params, :send_email) + boolean(submitter_params, :send_sms) + type(submitter_params, :completed_redirect_url, String) + type(submitter_params, :fields, Array) + + in_path_each(submitter_params, :fields) do |field_params| + required(field_params, :name) + + type(field_params, :name, String) + type(field_params, :validation_pattern, String) + type(field_params, :invalid_message, String) + boolean(field_params, :readonly) + end end def validate_creation_from_submission(params) @@ -56,32 +107,8 @@ module Params end in_path_each(params, %i[submission submitters]) do |submitter_params| - required(submitter_params, %i[email phone name]) - - type(submitter_params, :name, String) - type(submitter_params, :email, String) - format(submitter_params, :email, /@/, message: 'email is invalid') - type(submitter_params, :phone, String) - format(submitter_params, :phone, /\A\+\d+\z/, - message: 'phone should start with + and contain only digits') - type(submitter_params, :values, Hash) - boolean(submitter_params, :send_email) - boolean(submitter_params, :send_sms) - type(submitter_params, :completed_redirect_url, String) - type(submitter_params, :fields, Array) - - in_path_each(submitter_params, %i[fields]) do |field_params| - required(field_params, :name) - - type(field_params, :name, String) - type(field_params, :validation_pattern, String) - type(field_params, :invalid_message, String) - boolean(field_params, :readonly) - end + validate_submitter(submitter_params) end - - true end - # rubocop:enable Metrics end end