Files
docuseal/lib/submissions/serialize_for_api.rb
T

84 lines
2.9 KiB
Ruby
Raw Normal View History

2024-05-17 13:28:10 +03:00
# frozen_string_literal: true
module Submissions
module SerializeForApi
SERIALIZE_PARAMS = {
2025-05-31 15:15:25 +03:00
only: %i[id name slug source submitters_order expire_at created_at updated_at archived_at],
2024-05-17 13:28:10 +03:00
include: {
2024-08-27 01:50:26 +03:00
submitters: { only: %i[id] },
2024-05-17 13:28:10 +03:00
template: { only: %i[id name external_id created_at updated_at],
methods: %i[folder_name] },
created_by_user: { only: %i[id email first_name last_name] }
}
}.freeze
module_function
2025-08-31 16:40:18 +03:00
def call(submission, submitters = nil, params = {}, with_events: true, with_documents: true, with_values: true,
expires_at: Accounts.link_expires_at(Account.new(id: submission.account_id)))
2024-05-17 13:28:10 +03:00
submitters ||= submission.submitters.preload(documents_attachments: :blob, attachments_attachments: :blob)
2024-08-27 01:50:26 +03:00
serialized_submitters = submitters.map do |submitter|
2025-08-31 16:40:18 +03:00
Submitters::SerializeForApi.call(submitter, with_documents:, with_events: false, with_values:, params:,
expires_at:)
2024-08-27 01:50:26 +03:00
end
2024-05-17 13:28:10 +03:00
2024-08-21 18:09:27 +03:00
json = submission.as_json(SERIALIZE_PARAMS)
2025-09-12 12:17:26 +03:00
json['variables'] = (submission.variables || {}).as_json
2024-08-27 01:50:26 +03:00
json['created_by_user'] ||= nil
if with_events
json['submission_events'] = Submitters::SerializeForApi.serialize_events(submission.submission_events)
end
2024-05-17 13:28:10 +03:00
if submitters.all?(&:completed_at?)
last_submitter = submitters.max_by(&:completed_at)
2024-08-27 01:50:26 +03:00
if with_documents
2025-06-17 17:39:31 +03:00
json['documents'] = serialized_submitters.find { |e| e['id'] == last_submitter.id }['documents']
2024-08-27 01:50:26 +03:00
end
2025-08-31 16:40:18 +03:00
json['audit_log_url'] = submission.audit_log_url(expires_at:)
json['combined_document_url'] = submission.combined_document_url(expires_at:)
json['combined_document_url'] ||= maybe_build_combined_url(submitters, submission, params, expires_at:)
2025-06-17 17:39:31 +03:00
json['status'] = 'completed'
2025-08-23 11:28:26 +03:00
json['completed_at'] = last_submitter.completed_at.as_json
2024-05-17 13:28:10 +03:00
else
2025-06-17 17:39:31 +03:00
json['documents'] = [] if with_documents
2025-08-31 16:40:18 +03:00
json['audit_log_url'] = nil
json['combined_document_url'] = nil
2025-06-17 17:39:31 +03:00
json['status'] = build_status(submission, submitters)
json['completed_at'] = nil
2024-05-17 13:28:10 +03:00
end
2025-06-17 17:39:31 +03:00
json['submitters'] = serialized_submitters
2024-05-17 13:28:10 +03:00
json
end
2024-07-01 12:06:05 +03:00
2024-08-27 01:50:26 +03:00
def build_status(submission, submitters)
if submitters.any?(&:declined_at?)
'declined'
else
submission.expired? ? 'expired' : 'pending'
end
end
2025-08-31 16:40:18 +03:00
def maybe_build_combined_url(submitters, submission, params, expires_at: nil)
2024-08-23 23:46:22 +03:00
return unless submitters.all?(&:completed_at?)
2024-07-01 12:06:05 +03:00
attachment = submission.combined_document_attachment
2024-08-23 23:46:22 +03:00
if !attachment && params[:include].to_s.include?('combined_document_url')
submitter = submitters.max_by(&:completed_at)
attachment = Submissions::GenerateCombinedAttachment.call(submitter)
end
2025-08-31 16:40:18 +03:00
ActiveStorage::Blob.proxy_url(attachment.blob, expires_at:) if attachment
2024-07-01 12:06:05 +03:00
end
2024-05-17 13:28:10 +03:00
end
end