add submitters api

This commit is contained in:
Alex Turchyn
2023-08-04 00:40:13 +03:00
parent 63e1246a11
commit 7912c9a1ee
16 changed files with 177 additions and 35 deletions
@@ -0,0 +1,38 @@
# frozen_string_literal: true
module Api
class SubmissionsController < ApiBaseController
def create
template = current_account.templates.find(params[:template_id])
submissions =
if params[:emails].present?
Submissions.create_from_emails(template:,
user: current_user,
send_email: params[:send_email] != 'false',
emails: params[:emails])
else
Submissions.create_from_submitters(template:,
user: current_user,
send_email: params[:send_email] != 'false',
submissions_attrs: submissions_params[:submission])
end
submitters = submissions.flat_map(&:submitters)
if params[:send_email] != 'false'
submitters.each do |submitter|
SubmitterMailer.invitation_email(submitter, message: params[:message]).deliver_later!
end
end
render json: submitters
end
private
def submissions_params
params.permit(submission: [{ submitters: [%i[uuid name email]] }])
end
end
end
@@ -2,6 +2,10 @@
module Api
class TemplatesController < ApiBaseController
def index
render json: current_account.templates
end
def update
@template = current_account.templates.find(params[:id])
+8 -26
View File
@@ -17,9 +17,15 @@ class SubmissionsController < ApplicationController
def create
submissions =
if params[:emails].present?
create_submissions_from_emails
Submissions.create_from_emails(template: @template,
user: current_user,
send_email: params[:send_email] == '1',
emails: params[:emails])
else
create_submissions_from_submitters
Submissions.create_from_submitters(template: @template,
user: current_user,
send_email: params[:send_email] == '1',
submissions_attrs: submissions_params[:submission].to_h.values)
end
submitters = submissions.flat_map(&:submitters)
@@ -45,30 +51,6 @@ class SubmissionsController < ApplicationController
private
def create_submissions_from_emails
emails = params[:emails].to_s.scan(User::EMAIL_REGEXP)
emails.map do |email|
submission = @template.submissions.new(created_by_user: current_user)
submission.submitters.new(email:, uuid: @template.submitters.first['uuid'],
sent_at: params[:send_email] == '1' ? Time.current : nil)
submission.tap(&:save!)
end
end
def create_submissions_from_submitters
submissions_params[:submission].to_h.map do |_, attrs|
submission = @template.submissions.new(created_by_user: current_user)
attrs[:submitters].each do |submitter_attrs|
submission.submitters.new(**submitter_attrs, sent_at: params[:send_email] == '1' ? Time.current : nil)
end
submission.tap(&:save!)
end
end
def submissions_params
params.permit(submission: { submitters: [%i[uuid email]] })
end
+2 -2
View File
@@ -3,9 +3,9 @@
class SubmitterMailer < ApplicationMailer
DEFAULT_MESSAGE = %(You have been invited to submit the "%<name>s" form:)
def invitation_email(submitter, message: format(DEFAULT_MESSAGE, name: submitter.submission.template.name))
def invitation_email(submitter, message: '')
@submitter = submitter
@message = message
@message = message.presence || format(DEFAULT_MESSAGE, name: submitter.submission.template.name)
mail(to: @submitter.email,
subject: 'You have been invited to submit a form',
+3
View File
@@ -22,6 +22,7 @@
# role :string not null
# sign_in_count :integer default(0), not null
# unlock_token :string
# uuid :text not null
# created_at :datetime not null
# updated_at :datetime not null
# account_id :bigint not null
@@ -32,6 +33,7 @@
# index_users_on_email (email) UNIQUE
# index_users_on_reset_password_token (reset_password_token) UNIQUE
# index_users_on_unlock_token (unlock_token) UNIQUE
# index_users_on_uuid (uuid) UNIQUE
#
# Foreign Keys
#
@@ -49,6 +51,7 @@ class User < ApplicationRecord
devise :registerable, :omniauthable, omniauth_providers: [:google_oauth2] if Docuseal.multitenant?
attribute :role, :string, default: 'admin'
attribute :uuid, :string, default: -> { SecureRandom.uuid }
scope :active, -> { where(deleted_at: nil) }