Skip to content

Commit

Permalink
Merge pull request #14 from DigitalTolk/staging-webflow
Browse files Browse the repository at this point in the history
feat: webflow webhook and ticket api
  • Loading branch information
jderecho authored Feb 6, 2024
2 parents 4d67b75 + b1e0bbe commit 6ee22a0
Show file tree
Hide file tree
Showing 11 changed files with 354 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
include DateRangeHelper
include HmacConcern

before_action :conversation, except: [:index, :meta, :search, :create, :filter]
before_action :conversation, except: [:index, :meta, :search, :create, :filter, :ticket]
before_action :inbox, :contact, :contact_inbox, only: [:create]

def index
Expand Down
17 changes: 17 additions & 0 deletions app/views/mailers/digitaltolk_mailer/send_email.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<p>You just got a form submission!</p>
<br>

<b>Form</b>
<div><%= @form_name %></div>

<br>
<b>Site</b>
<div>Digitaltolk</div>

<br>
<div><b>Submitted content</b></div>
<% if @content.present? %>
<% @content.each do |key, value| %>
<div><%= key %>: <%= value %></div>
<% end %>
<% end %>
10 changes: 10 additions & 0 deletions app/workers/digitaltolk_email_worker.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class DigitaltolkEmailWorker
include Sidekiq::Worker
sidekiq_options queue: :mailers, retry: 3

def perform(params)
data = JSON.parse(params).with_indifferent_access

Digitaltolk::DigitaltolkMailer.send_email(data).deliver_later
end
end
2 changes: 1 addition & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
get :meta
get :search
post :filter
post :ticket
end
scope module: :conversations do
resources :messages, only: [:index, :create, :destroy] do
Expand All @@ -106,7 +107,6 @@
post :unread
post :custom_attributes
get :attachments
post :ticket
end
end

Expand Down
69 changes: 69 additions & 0 deletions lib/digitaltolk/add_conversation_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
class Digitaltolk::AddConversationService
attr_accessor :inbox_id, :params

def initialize(inbox_id, params)
@inbox_id = inbox_id
@params = params
end

def perform
find_or_create_contact

ConversationBuilder.new(params: ActionController::Parameters.new(conversation_params), contact_inbox: @contact_inbox).perform
end

private

def inbox
@inbox ||= Inbox.find_by(id: @inbox_id)
end

def find_or_create_contact
@contact = inbox.contacts.find_by(email: email_address)

if @contact.present?
@contact_inbox = ContactInbox.find_by(inbox: @inbox, contact: @contact)
else
create_contact
end
end

def create_contact
@contact_inbox = ::ContactInboxWithContactBuilder.new(
source_id: email_address,
inbox: inbox,
contact_attributes: {
name: identify_contact_name,
email: email_address,
additional_attributes: {
source_id: "email:"
}
}
).perform
@contact = @contact_inbox.contact
end

def email_address
params.dig(:email)
end

def identify_contact_name
email_address.split('@').first
end

def conversation_params
{
account_id: params.dig(:account_id),
assignee_id: params.dig(:assignee_id),
contact_id: @contact.id,
inbox_id: params.dig(:inbox_id),
source_id: params.dig(:email),
additional_attributes: {
mail_subject: params.dig(:subject)
},
message: {
content: params.dig(:content)
}
}
end
end
35 changes: 35 additions & 0 deletions lib/digitaltolk/add_message_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
class Digitaltolk::AddMessageService
attr_accessor :sender, :conversation, :content, :is_incoming

def initialize(sender, conversation, content, is_incoming = false)
@conversation = conversation
@content = content
@sender = sender
@is_incoming = is_incoming
end

def perform
return unless @conversation.present?

create_message
end

private

def create_message
return unless content.present?

Messages::MessageBuilder.new(sender, @conversation, message_params).perform
end

def message_type
is_incoming ? 'incoming' : 'outgoing'
end

def message_params
{
message_type: message_type,
content: content
}
end
end
22 changes: 22 additions & 0 deletions lib/digitaltolk/digitaltolk_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class Digitaltolk::DigitaltolkMailer < ApplicationMailer
def send_email(params)
return unless smtp_config_set_or_development?
return unless params.dig(:to).present?
return unless params.dig(:from).present?

@form_name = params.dig(:form_name)
@content = params.dig(:data)

email_params = {
to: params.dig(:to),
reply_to: params.dig(:from),
subject: params.dig(:subject)
}

mail(email_params) do |format|
format.html do
render 'mailers/digitaltolk_mailer/send_email', layout: false
end
end
end
end
6 changes: 5 additions & 1 deletion lib/digitaltolk/fix_invalid_conversation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ def fix_conversation_contact

def fix_message_email
conversation.messages.incoming.where("content_attributes::text LIKE '%#{Digitaltolk::MailHelper::INVALID_LOOPIA_EMAIL}%'").each do |msg|
next if msg.blank?
next if msg.content_attributes.blank?
next if msg.content_attributes.dig(:email, :from).blank?

msg.content_attributes[:email][:from] = [email_from_body]
msg.save
end
Expand All @@ -51,7 +55,7 @@ def email_from_body
match = first_message.content.to_s.match(email_regex)
return if match.nil?

@email_from_body = match[0]
@email_from_body = match.first
end

def find_or_create_original_contact
Expand Down
2 changes: 1 addition & 1 deletion lib/digitaltolk/mail_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def self.email_from_body(html_content)
return if html_content.blank?

match = html_content.to_s.match(EMAIL_REGEX)
match[0]
match.first
rescue
nil
end
Expand Down
104 changes: 74 additions & 30 deletions lib/digitaltolk/send_email_ticket_service.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
class Digitaltolk::SendEmailTicketService
attr_accessor :account, :user, :params, :errors, :conversation

CUSTOMER_TYPE = 2
TRANSLATOR_TYPE = 3

def initialize(account, user, params)
@account = account
@user = user
Expand All @@ -9,9 +12,19 @@ def initialize(account, user, params)
end

def perform
find_conversation
validate
create_message
begin
ActiveRecord::Base.transaction do
validate_params
find_or_create_conversation if @errors.blank?
validate_data if @errors.blank?
create_message if @errors.blank?
end
rescue StandardError => e
Rails.logger.error e
Rails.logger.error e.backtrace.first
@errors << e.message
end

result_data
end

Expand All @@ -26,54 +39,85 @@ def result_data
def result_json(success, message)
{
success: success,
message: message
message: message,
conversation_id: @conversation&.id
}
end

def conversations
@account.where(conversation_id: account)
inbox.conversations
end

def conversation_params
{
subject: params.dig(:title),
content: params.dig(:body),
inbox_id: params.dig(:inbox_id),
email: params.dig(:requester, :email),
assignee_id: nil,
account_id: @account.id,
}
end

def find_or_create_conversation
if for_customer?
@conversation = conversations.where("custom_attributes ->> 'booking_id' = ?", booking_id).last
elsif for_translator?
@conversation = Digitaltolk::AddConversationService.new(inbox_id, conversation_params).perform
end
end

def for_customer?
recipient_type.to_i == CUSTOMER_TYPE
end

def for_translator?
recipient_type.to_i == TRANSLATOR_TYPE
end

def find_conversation
@conversation = Conversation.where("custom_attributes ->> 'booking_id' = ?", booking_id).last
def recipient_type
params.dig(:recipient_type)
end

def inbox
@inbox ||= @account.inboxes.find_by(id: inbox_id)
end

def inbox_id
params.dig(:inbox_id)
end

def booking_id
params.dig(:booking_id)
params.dig(:booking_id).to_s
end

def validate
def validate_params
if booking_id.blank?
@errors << "Parameter booking_id is required."
@errors << "Parameter booking_id is required"
end

#validate email address
if recipient_type.blank?
@errors << "Recipient Type is required"
elsif !for_customer? && !for_translator?
@errors << "Unknown recipient_type #{recipient_type}"
end

if @conversation.blank?
@errors << "Conversation with booking number #{booking_id} not found"
if inbox.blank?
@errors << "Inbox with id #{inbox_id} was not found"
end
end

def create_message
return if @errors.present?

@message = @conversation.messages.build(message_params)
@message.save!
def validate_data
@errors << invalid_booking_message if @conversation.blank?
end

def message_type
'outgoing'
def invalid_booking_message
"Conversation with booking ID #{booking_id} not found"
end

def message_params
{
account_id: @conversation.account_id,
inbox_id: @conversation.inbox_id,
message_type: message_type,
content: @params[:body],
private: false,
sender: user,
content_type: 'input_email',
}
def create_message
return if @errors.present?

@message = Digitaltolk::AddMessageService.new(@user, @conversation, @params.dig(:body), true).perform
end
end
Loading

0 comments on commit 6ee22a0

Please sign in to comment.