Files
docuseal/app/controllers/api/submissions_controller.rb
T

192 lines
6.8 KiB
Ruby
Raw Normal View History

2023-08-04 00:40:13 +03:00
# frozen_string_literal: true
module Api
class SubmissionsController < ApiBaseController
2023-10-01 01:57:47 +03:00
load_and_authorize_resource :template, only: :create
2023-11-16 01:55:57 +02:00
load_and_authorize_resource :submission, only: %i[show index destroy]
2023-09-17 00:45:57 +03:00
2023-10-01 01:57:47 +03:00
before_action only: :create do
2023-09-17 00:45:57 +03:00
authorize!(:create, Submission)
end
2023-08-04 00:40:13 +03:00
2023-10-01 01:57:47 +03:00
def index
submissions = Submissions.search(@submissions, params[:q])
submissions = submissions.where(template_id: params[:template_id]) if params[:template_id].present?
2023-11-29 20:23:35 +02:00
if params[:template_folder].present?
submissions = submissions.joins(template: :folder).where(folder: { name: params[:template_folder] })
end
2024-04-11 16:36:53 +03:00
submissions = paginate(submissions.preload(:created_by_user, :submitters,
template: :folder,
2023-11-01 12:17:35 +02:00
audit_trail_attachment: :blob))
2023-10-01 01:57:47 +03:00
render json: {
data: submissions.as_json(serialize_params),
pagination: {
count: submissions.size,
next: submissions.last&.id,
prev: submissions.first&.id
}
}
end
def show
submitters = @submission.submitters.preload(documents_attachments: :blob, attachments_attachments: :blob)
2023-10-01 01:57:47 +03:00
2024-02-10 19:38:03 +02:00
submitters.each do |submitter|
if submitter.completed_at? && submitter.documents_attachments.blank?
submitter.documents_attachments = Submissions::EnsureResultGenerated.call(submitter)
end
end
2024-02-10 19:38:03 +02:00
if @submission.audit_trail_attachment.blank? && submitters.all?(&:completed_at?)
@submission.audit_trail_attachment = Submissions::GenerateAuditTrail.call(@submission)
end
2023-10-01 01:57:47 +03:00
2024-02-10 19:38:03 +02:00
serialized_submitters = submitters.map { |submitter| Submitters::SerializeForApi.call(submitter) }
2023-10-01 01:57:47 +03:00
json = @submission.as_json(
serialize_params.deep_merge(
include: { submission_events: { only: %i[id submitter_id event_type event_timestamp] } }
2023-10-01 01:57:47 +03:00
)
)
if submitters.all?(&:completed_at?)
last_submitter = submitters.max_by(&:completed_at)
json[:documents] = serialized_submitters.find { |e| e['id'] == last_submitter.id }['documents']
json[:status] = 'completed'
json[:completed_at] = last_submitter.completed_at
else
json[:documents] = []
json[:status] = 'pending'
json[:completed_at] = nil
end
json[:submitters] = serialized_submitters
2023-10-01 01:57:47 +03:00
render json:
end
2023-09-17 00:45:57 +03:00
def create
2024-04-27 21:35:20 +03:00
Params::SubmissionCreateValidator.call(params)
2024-01-19 03:03:45 +02:00
2023-12-28 17:39:09 +02:00
return render json: { error: 'Template not found' }, status: :unprocessable_entity if @template.nil?
2024-01-14 00:49:07 +02:00
if @template.fields.blank?
2024-02-16 19:44:59 +02:00
Rollbar.warning("Template does not contain fields: #{@template.id}") if defined?(Rollbar)
2024-01-14 00:49:07 +02:00
return render json: { error: 'Template does not contain fields' }, status: :unprocessable_entity
end
2023-11-23 20:03:52 +02:00
params[:send_email] = true unless params.key?(:send_email)
params[:send_sms] = false unless params.key?(:send_sms)
2023-08-04 00:40:13 +03:00
2023-11-23 20:03:52 +02:00
submissions = create_submissions(@template, params)
2023-11-23 20:03:52 +02:00
Submissions.send_signature_requests(submissions)
2023-08-04 00:40:13 +03:00
2024-02-10 19:38:03 +02:00
submissions.each do |submission|
if submission.submitters.all?(&:completed_at?) && submission.submitters.last
ProcessSubmitterCompletionJob.perform_later(submission.submitters.last)
end
end
2023-11-23 20:03:52 +02:00
render json: submissions.flat_map(&:submitters)
rescue Submitters::NormalizeValues::BaseError => e
2024-02-16 19:44:59 +02:00
Rollbar.warning(e) if defined?(Rollbar)
2024-02-13 22:02:15 +02:00
2023-08-11 18:32:33 +03:00
render json: { error: e.message }, status: :unprocessable_entity
2023-08-04 00:40:13 +03:00
end
2023-10-01 01:57:47 +03:00
def destroy
2023-12-30 00:37:03 +02:00
@submission.update!(archived_at: Time.current)
2023-10-01 01:57:47 +03:00
2024-04-09 18:11:58 +03:00
SendSubmissionArchivedWebhookRequestJob.perform_later(@submission)
2023-12-23 17:47:58 +02:00
render json: @submission.as_json(only: %i[id], methods: %i[archived_at])
2023-10-01 01:57:47 +03:00
end
2023-08-04 00:40:13 +03:00
private
2023-11-23 20:03:52 +02:00
def create_submissions(template, params)
is_send_email = !params[:send_email].in?(['false', false])
2024-01-28 14:31:16 +02:00
if (emails = (params[:emails] || params[:email]).presence) &&
(params[:submission].blank? && params[:submitters].blank?)
2023-11-23 20:03:52 +02:00
Submissions.create_from_emails(template:,
user: current_user,
source: :api,
mark_as_sent: is_send_email,
emails:,
params:)
else
2023-12-17 18:39:10 +02:00
submissions_attrs, attachments =
Submissions::NormalizeParamUtils.normalize_submissions_params!(submissions_params, template)
2023-11-23 20:03:52 +02:00
submissions = Submissions.create_from_submitters(
template:,
user: current_user,
source: :api,
mark_as_sent: is_send_email,
submitters_order: params[:submitters_order] || params[:order] || 'preserved',
submissions_attrs:,
params:
)
2024-02-10 19:38:03 +02:00
submitters = submissions.flat_map(&:submitters)
Submissions::NormalizeParamUtils.save_default_value_attachments!(attachments, submitters)
submitters.each do |submitter|
SubmissionEvents.create_with_tracking_data(submitter, 'api_complete_form', request) if submitter.completed_at?
end
2023-11-23 20:03:52 +02:00
submissions
end
end
2023-10-01 01:57:47 +03:00
def serialize_params
{
2023-12-30 00:37:03 +02:00
only: %i[id source submitters_order created_at updated_at archived_at],
methods: %i[audit_log_url],
2023-10-01 01:57:47 +03:00
include: {
submitters: { only: %i[id slug uuid name email phone
completed_at opened_at sent_at
2024-02-01 23:29:27 +02:00
created_at updated_at external_id metadata],
2024-02-01 00:34:35 +02:00
methods: %i[status application_key] },
2024-04-11 16:36:53 +03:00
template: { only: %i[id name external_id created_at updated_at],
methods: %i[folder_name] },
2023-10-01 01:57:47 +03:00
created_by_user: { only: %i[id email first_name last_name] }
}
}
end
2023-08-04 00:40:13 +03:00
def submissions_params
2024-01-28 14:31:16 +02:00
permitted_attrs = [
2024-04-13 15:33:05 +03:00
:send_email, :send_sms, :bcc_completed, :completed_redirect_url, :reply_to, :go_to_last,
2024-01-28 14:31:16 +02:00
{
message: %i[subject body],
submitters: [[:send_email, :send_sms, :completed_redirect_url, :uuid, :name, :email, :role,
2024-04-13 15:33:05 +03:00
:completed, :phone, :application_key, :external_id, :reply_to, :go_to_last,
2024-02-01 23:29:27 +02:00
{ metadata: {}, values: {}, readonly_fields: [], message: %i[subject body],
2024-04-27 21:35:09 +03:00
fields: [:name, :uuid, :default_value, :value, :title, :description,
2024-04-10 19:56:35 +03:00
:readonly, :redacted, :validation_pattern, :invalid_message,
2024-04-27 21:35:09 +03:00
{ default_value: [], value: [] }] }]]
2024-01-28 14:31:16 +02:00
}
]
if params.key?(:submitters)
params.permit(*permitted_attrs)
else
key = params.key?(:submission) ? :submission : :submissions
params.permit(
key => [permitted_attrs]
).fetch(key, [])
end
2023-08-11 18:32:33 +03:00
end
2023-08-04 00:40:13 +03:00
end
end