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

168 lines
5.9 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: {
2024-05-17 13:28:10 +03:00
data: submissions.as_json(Submissions::SerializeForApi::SERIALIZE_PARAMS),
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-05-17 13:28:10 +03:00
render json: Submissions::SerializeForApi.call(@submission, submitters)
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-05-17 13:28:10 +03:00
submissions.each do |submission|
2024-06-18 16:51:42 +03:00
SendSubmissionCreatedWebhookRequestJob.perform_async({ 'submission_id' => submission.id })
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|
if submission.submitters.all?(&:completed_at?) && submission.submitters.last
2024-06-18 16:51:42 +03:00
ProcessSubmitterCompletionJob.perform_async({ 'submitter_id' => submission.submitters.last.id })
2024-02-10 19:38:03 +02:00
end
end
2024-04-27 22:43:12 +03:00
json = submissions.flat_map do |submission|
submission.submitters.map do |s|
Submitters::SerializeForApi.call(s, with_documents: false, with_urls: true)
end
end
render json:
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
2024-06-18 16:45:07 +03:00
if params[:permanently] == 'true'
@submission.destroy!
else
@submission.update!(archived_at: Time.current)
2023-10-01 01:57:47 +03:00
2024-06-18 16:51:42 +03:00
SendSubmissionArchivedWebhookRequestJob.perform_async('submission_id' => @submission.id)
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
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-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-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(
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