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

201 lines
7.3 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
2025-01-03 20:27:55 +02:00
submissions = Submissions::Filter.call(submissions, current_user, params)
2024-04-11 16:36:53 +03:00
submissions = paginate(submissions.preload(:created_by_user, :submitters,
template: :folder,
2024-08-23 23:46:22 +03:00
combined_document_attachment: :blob,
2023-11-01 12:17:35 +02:00
audit_trail_attachment: :blob))
2023-10-01 01:57:47 +03:00
render json: {
2024-08-27 01:50:26 +03:00
data: submissions.map do |s|
Submissions::SerializeForApi.call(s, s.submitters, params,
with_events: false, with_documents: false, with_values: false)
end,
2023-10-01 01:57:47 +03:00
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-07-01 12:06:05 +03:00
render json: Submissions::SerializeForApi.call(@submission, submitters, params)
2023-10-01 01:57:47 +03:00
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)
2024-11-01 15:35:02 +02:00
WebhookUrls.for_account_id(@template.account_id, 'submission.created').each do |webhook_url|
submissions.each do |submission|
2024-11-01 15:35:02 +02:00
SendSubmissionCreatedWebhookRequestJob.perform_async('submission_id' => submission.id,
'webhook_url_id' => webhook_url.id)
end
2024-05-17 13:28:10 +03:00
end
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|
2024-10-26 19:42:16 +03:00
submission.submitters.each do |submitter|
2024-12-09 01:06:57 +02:00
next unless submitter.completed_at?
ProcessSubmitterCompletionJob.perform_async('submitter_id' => submitter.id, 'send_invitation_email' => false)
2024-02-10 19:38:03 +02:00
end
end
2024-07-18 23:59:27 +03:00
render json: build_create_json(submissions)
2024-10-22 22:26:08 +03:00
rescue Submitters::NormalizeValues::BaseError, Submissions::CreateFromSubmitters::BaseError,
DownloadUtils::UnableToDownload => 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
2024-12-13 13:31:54 +02:00
if params[:permanently].in?(['true', true])
2024-06-18 16:45:07 +03:00
@submission.destroy!
else
@submission.update!(archived_at: Time.current)
2023-10-01 01:57:47 +03:00
2024-11-01 15:35:02 +02:00
WebhookUrls.for_account_id(@submission.account_id, 'submission.archived').each do |webhook_url|
SendSubmissionArchivedWebhookRequestJob.perform_async('submission_id' => @submission.id,
'webhook_url_id' => webhook_url.id)
end
2024-06-18 16:45:07 +03:00
end
2024-04-09 18:11:58 +03:00
2024-06-18 16:45:07 +03:00
render json: @submission.as_json(only: %i[id archived_at])
2023-10-01 01:57:47 +03:00
end
2023-08-04 00:40:13 +03:00
private
2024-07-18 23:59:27 +03:00
def build_create_json(submissions)
json = submissions.flat_map do |submission|
submission.submitters.map do |s|
Submitters::SerializeForApi.call(s, with_documents: false, with_urls: true, params:)
end
end
2025-01-02 13:18:17 +02:00
if request.path.ends_with?('/init')
json =
if submissions.size == 1
{
id: submissions.first.id,
submitters: json,
expire_at: submissions.first.expire_at,
created_at: submissions.first.created_at
}
else
{ submitters: json }
end
end
2024-07-18 23:59:27 +03:00
json
end
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,
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-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-08-01 16:43:55 +03:00
:expire_at,
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-09-10 13:09:46 +03:00
:readonly, :validation_pattern, :invalid_message,
2024-06-09 20:25:19 +03:00
{ default_value: [], value: [], preferences: {} }] }]]
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(
2024-12-24 00:29:25 +02:00
{ key => [permitted_attrs] }, { key => permitted_attrs }
2024-01-28 14:31:16 +02:00
).fetch(key, [])
end
2023-08-11 18:32:33 +03:00
end
2023-08-04 00:40:13 +03:00
end
end