allow to set default field values via api

pull/105/head
Alex Turchyn 2 years ago
parent d875477ee6
commit c57148eada

@ -2,6 +2,9 @@
module Api module Api
class SubmissionsController < ApiBaseController class SubmissionsController < ApiBaseController
UnknownFieldName = Class.new(StandardError)
UnknownSubmitterName = Class.new(StandardError)
def create def create
template = current_account.templates.find(params[:template_id]) template = current_account.templates.find(params[:template_id])
@ -13,28 +16,65 @@ module Api
send_email: params[:send_email] != 'false', send_email: params[:send_email] != 'false',
emails: params[:emails] || params[:email]) emails: params[:emails] || params[:email])
else else
submissions_attrs = normalize_submissions_params!(submissions_params[:submission], template)
Submissions.create_from_submitters(template:, Submissions.create_from_submitters(template:,
user: current_user, user: current_user,
source: :api, source: :api,
send_email: params[:send_email] != 'false', send_email: params[:send_email] != 'false',
submissions_attrs: submissions_params[:submission]) submissions_attrs:)
end end
submitters = submissions.flat_map(&:submitters) submitters = submissions.flat_map(&:submitters)
if params[:send_email] != 'false' 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| submitters.each do |submitter|
SubmitterMailer.invitation_email(submitter, message: params[:message]).deliver_later! SubmitterMailer.invitation_email(submitter, message: params[:message]).deliver_later!
end end
end end
render json: submitters def submissions_params
params.permit(submission: [{ submitters: [[:uuid, :name, :email, { values: {} }]] }])
end end
private 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?
def submissions_params submitter[:values] =
params.permit(submission: [{ submitters: [%i[uuid name email]] }]) 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 end
end end

@ -2,13 +2,17 @@
module Api module Api
class TemplatesController < ApiBaseController class TemplatesController < ApiBaseController
before_action :load_template, only: %i[show update]
def index def index
render json: current_account.templates render json: current_account.templates
end end
def update def show
@template = current_account.templates.find(params[:id]) render json: @template.as_json(include: { author: { only: %i[id email first_name last_name] } })
end
def update
@template.update!(template_params) @template.update!(template_params)
render :ok render :ok
@ -23,5 +27,9 @@ module Api
fields: [[:uuid, :submitter_uuid, :name, :type, :required, fields: [[:uuid, :submitter_uuid, :name, :type, :required,
{ options: [], areas: [%i[x y w h cell_w attachment_uuid page]] }]]) { options: [], areas: [%i[x y w h cell_w attachment_uuid page]] }]])
end end
def load_template
@template = current_account.templates.find(params[:id])
end
end end
end end

@ -42,7 +42,7 @@
<input type="checkbox"> <input type="checkbox">
<div class="collapse-title text-xl font-medium"> <div class="collapse-title text-xl font-medium">
<div> <div>
Request signature, multiple submitters Request signature, multiple submitters with default values
</div> </div>
<div class="mt-1"> <div class="mt-1">
<div class="badge badge-warning badge-lg">POST</div> <div class="badge badge-warning badge-lg">POST</div>
@ -58,7 +58,13 @@
"submission": [ "submission": [
{ {
"submitters": [ "submitters": [
{ "name": "<%= current_account.templates.last ? current_account.templates.last.submitters.first['name'] : 'First Submitter' %>", "email": "<%= current_user.email.sub('@', '+test@') %>" }, {
"name": "<%= current_account.templates.last ? current_account.templates.last.submitters.first['name'] : 'First Submitter' %>",
"email": "<%= current_user.email.sub('@', '+test@') %>",
"values": {
"Form Text Field Name": "Default Value"
}
},
{ "name": "Second Submitter", "email": "<%= current_user.email.sub('@', '+test2@') %>" } { "name": "Second Submitter", "email": "<%= current_user.email.sub('@', '+test2@') %>" }
] ]
} }
@ -71,6 +77,28 @@
</div> </div>
</div> </div>
</div> </div>
<div class="collapse collapse-plus bg-base-200 px-1">
<input type="checkbox">
<div class="collapse-title text-xl font-medium">
<div>
Template details
</div>
<div class="mt-1">
<div class="badge badge-info badge-lg">GET</div>
<div class="badge badge-primary badge-lg"><%= api_template_path(':id') %></div>
</div>
</div>
<div class="collapse-content" style="display: inherit">
<div class="mockup-code overflow-hidden">
<% text = capture do %>curl '<%= api_template_url(current_account.templates.last) %>' \
--header 'X-Auth-Token: <%= current_user.access_token.token %>'<% end.to_str %>
<span class="top-0 right-0 absolute">
<%= render 'shared/clipboard_copy', icon: 'copy', text:, class: 'btn btn-ghost text-white', icon_class: 'w-6 h-6 text-white', copy_title: 'Copy', copied_title: 'Copied' %>
</span>
<pre data-prefix="$"><code class="overflow-hidden w-full"><%= text %></code></pre>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

@ -30,7 +30,7 @@ Rails.application.routes.draw do
namespace :api, defaults: { format: :json } do namespace :api, defaults: { format: :json } do
resources :attachments, only: %i[create] resources :attachments, only: %i[create]
resources :submissions, only: %i[create] resources :submissions, only: %i[create]
resources :templates, only: %i[update index] do resources :templates, only: %i[update show index] do
resources :submissions, only: %i[create] resources :submissions, only: %i[create]
resources :documents, only: %i[create destroy], controller: 'templates_documents' resources :documents, only: %i[create destroy], controller: 'templates_documents'
end end

@ -38,6 +38,7 @@ module Submissions
submission.submitters.new(email: submitter_attrs[:email], submission.submitters.new(email: submitter_attrs[:email],
sent_at: send_email ? Time.current : nil, sent_at: send_email ? Time.current : nil,
values: submitter_attrs[:values] || {},
uuid:) uuid:)
end end

Loading…
Cancel
Save