Last active
September 17, 2019 19:14
-
-
Save Haegin/d1879871d836e4618d61e78ed3d52c5f to your computer and use it in GitHub Desktop.
Loading a quote, passing it to the revision creation service and calling save errors with "ArgumentError: A copy of Revision::CreationService has been removed from the module tree but is still active!" when it tries to instantiate the mailer and I have no idea why.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
class ApplicationMailer < ActionMailer::Base | |
helper :app_url | |
helper :formatting | |
default from: "Relay <app@#{Rails.configuration.incoming_mail_domain}>" | |
layout "mailer" | |
MAX_ATTACHMENT_SIZE = 20 * 1024 * 1024 | |
def reply_address(discussion) | |
"Relay Platform <reply-#{discussion.id}@#{Rails.configuration.incoming_mail_domain}>" | |
end | |
def quote_address(quote) | |
"Relay Platform <quote-#{quote.id}@#{Rails.configuration.incoming_mail_domain}>" | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
class QuoteMailer < ApplicationMailer | |
def invite_reinsurer | |
@quote = params[:quote] | |
@message = params[:message] | |
@recipient = @quote.reinsurer | |
attach(@quote.worksheet.documents) | |
mail( | |
to: @recipient.email, | |
from: quote_address(@quote), | |
subject: "#{@quote.worksheet.cedent.full_name} requested a quote from you", | |
) | |
end | |
def quote_uploaded | |
@quote = params[:quote] | |
@message = params[:message] | |
@recipient = @quote.worksheet.cedent | |
attach(@quote.revisions.last&.documents) | |
mail( | |
to: @recipient.email, | |
from: reply_address(@quote.discussion), | |
subject: "#{@quote.reinsurer.full_name} uploaded a quote", | |
) | |
end | |
def quote_confirmation | |
@quote = params[:quote] | |
@recipient = @quote.reinsurer | |
mail( | |
to: @recipient.email, | |
from: reply_address(@quote.discussion), | |
subject: "Your quote has been sent to #{@quote.worksheet.cedent.full_name}", | |
) | |
end | |
def quote_accepted | |
@quote = params[:quote] | |
@recipient = @quote.reinsurer | |
@message = params[:message] | |
mail( | |
to: @recipient.email, | |
from: reply_address(@quote.discussion), | |
subject: "#{@quote.worksheet.cedent.full_name} accepted your quote", | |
) | |
end | |
def quote_rejected | |
@quote = params[:quote] | |
@recipient = @quote.reinsurer | |
@message = params[:message] | |
mail( | |
to: @recipient.email, | |
from: reply_address(@quote.discussion), | |
subject: "#{@quote.worksheet.cedent.full_name} requested a new quote", | |
) | |
end | |
private | |
def attach(file_or_files) | |
attachment_limit = MAX_ATTACHMENT_SIZE | |
[file_or_files].flatten.compact.each do |attachment| | |
if attachment.byte_size < attachment_limit | |
attachment_limit -= attachment.byte_size | |
attachments[attachment.blob.filename.to_s] = attachment.download | |
else | |
@attachments_excluded = true | |
end | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
class Revision | |
class CreationService | |
MESSAGE_SUBJECT = "Quote Submitted" | |
include ActiveModel::Validations | |
attr_reader :quote, :params, :message, :files, :files_to_attach, | |
:key_perils | |
delegate :reinsurer, :worksheet, to: :quote | |
validates :quote, presence: true | |
validate :quote_can_transition | |
validate :revision_is_valid | |
def initialize(quote:, files:, files_to_attach: [], message: nil, **params) | |
@quote = quote | |
@files = files | |
@params = params | |
@files_to_attach = files_to_attach | |
@key_perils = params[:key_perils] | |
if message | |
@message = quote.discussion.messages.build( | |
author: reinsurer, | |
subject: MESSAGE_SUBJECT, | |
body: message, | |
) | |
end | |
end | |
def revision | |
return if quote.blank? | |
@revision ||= quote.revisions.build(documents: documents, **params) | |
end | |
def save | |
if valid? | |
ActiveRecord::Base.transaction do | |
revision.save | |
message&.save | |
quote.receive_quote | |
ZipRevisionDocumentsJob.perform_later(revision.id) | |
QuoteMailer.with(quote: quote, message: message).quote_uploaded.deliver_later | |
QuoteMailer.with(quote: quote).quote_confirmation.deliver_later | |
worksheet.cedent.notification_events.create( | |
event: quote.revisions.count == 1 ? "Quote.Created" : "Quote.Modified", | |
triggered_by: reinsurer, | |
relates_to: quote, | |
) | |
end | |
end | |
end | |
private | |
def documents | |
files + documents_to_copy | |
end | |
def documents_to_copy | |
existing_attachments = ActiveStorage::Attachment | |
.includes(:blob) | |
.where(id: files_to_attach.map { |f| f[:id] }) | |
existing_attachments.map(&:blob) | |
end | |
def revision_is_valid | |
return if revision.blank? | |
unless revision.valid? | |
revision.errors.each do |key, error| | |
errors.add(key, error) | |
end | |
end | |
end | |
def quote_can_transition | |
return if quote.blank? | |
errors.add(:quote, "must be ready to receive quote") unless quote.can_receive_quote? | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment