Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Contact model changes (#184)
* move source id from contacts

* Fix contactInbox model name

* rubocop fix

* Fix rspec
  • Loading branch information
sojan-official committed Oct 27, 2019
1 parent 3b6d58b commit c21c839
Show file tree
Hide file tree
Showing 12 changed files with 57 additions and 20 deletions.
8 changes: 5 additions & 3 deletions app/builders/messages/message_builder.rb
Expand Up @@ -30,11 +30,14 @@ def perform
private

def contact
@contact ||= @inbox.contacts.find_by(source_id: @sender_id)
@contact ||= @inbox.contact_inboxes.find_by(source_id: @sender_id)&.contact
end

def build_contact
@contact = @inbox.contacts.create!(contact_params) if contact.nil?
return if contact.present?

@contact = Contact.create!(contact_params)
ContactInbox.create(contact: contact, inbox: @inbox, source_id: @sender_id)
end

def build_message
Expand Down Expand Up @@ -120,7 +123,6 @@ def contact_params
{
name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}",
account_id: @inbox.account_id,
source_id: @sender_id,
remote_avatar_url: result['profile_pic'] || nil
}
end
Expand Down
Expand Up @@ -86,7 +86,7 @@ export default {
data() {
return {
message: '',
private: false,
isPrivate: false,
showEmojiPicker: false,
showCannedModal: false,
};
Expand All @@ -100,7 +100,7 @@ export default {
},
watch: {
message(val) {
if (this.private) {
if (this.isPrivate) {
return;
}
const isSlashCommand = val[0] === '/';
Expand Down
10 changes: 6 additions & 4 deletions app/models/contact.rb
@@ -1,20 +1,22 @@
class Contact < ApplicationRecord
include Pubsubable

validates :account_id, presence: true
validates :inbox_id, presence: true

belongs_to :account
belongs_to :inbox
has_many :conversations, dependent: :destroy
has_many :contact_inboxes, dependent: :destroy
has_many :inboxes, through: :contact_inboxes
mount_uploader :avatar, AvatarUploader

def get_source_id(inbox_id)
contact_inboxes.find_by!(inbox_id: inbox_id).source_id
end

def push_event_data
{
id: id,
name: name,
thumbnail: avatar.thumb.url,
channel: inbox.try(:channel).try(:name),
pubsub_token: pubsub_token
}
end
Expand Down
8 changes: 8 additions & 0 deletions app/models/contact_inbox.rb
@@ -0,0 +1,8 @@
class ContactInbox < ApplicationRecord
validates :inbox_id, presence: true
validates :contact_id, presence: true
validates :source_id, presence: true

belongs_to :contact
belongs_to :inbox
end
4 changes: 3 additions & 1 deletion app/models/inbox.rb
Expand Up @@ -6,11 +6,13 @@ class Inbox < ApplicationRecord
belongs_to :account
belongs_to :channel, polymorphic: true, dependent: :destroy

has_many :contact_inboxes, dependent: :destroy
has_many :contacts, through: :contact_inboxes

has_many :inbox_members, dependent: :destroy
has_many :members, through: :inbox_members, source: :user
has_many :conversations, dependent: :destroy
has_many :messages, through: :conversations
has_many :contacts, dependent: :destroy
after_create :subscribe_webhook, if: :facebook?
after_destroy :delete_round_robin_agents

Expand Down
2 changes: 1 addition & 1 deletion app/services/facebook/send_reply_service.rb
Expand Up @@ -35,7 +35,7 @@ def outgoing_message_from_chatwoot?

def fb_message_params
{
recipient: { id: contact.source_id },
recipient: { id: contact.get_source_id(inbox.id) },
message: { text: message.content }
}
end
Expand Down
2 changes: 1 addition & 1 deletion app/views/api/v1/conversations/index.json.jbuilder
Expand Up @@ -9,7 +9,7 @@ json.data do
json.array! @conversations do |conversation|
json.meta do
json.sender do
json.id conversation.contact.source_id
json.id conversation.contact.id
json.name conversation.contact.name
json.thumbnail conversation.contact.avatar.thumb.url
json.channel conversation.inbox.try(:channel).try(:name)
Expand Down
15 changes: 15 additions & 0 deletions db/migrate/20191027054756_create_contact_inboxes.rb
@@ -0,0 +1,15 @@
class CreateContactInboxes < ActiveRecord::Migration[6.1]
def change
create_table :contact_inboxes do |t|
t.references :contact, foreign_key: true, index: true
t.references :inbox, foreign_key: true, index: true
t.string :source_id, null: false

t.timestamps
end
add_index :contact_inboxes, [:inbox_id, :source_id], :unique => true
add_index :contact_inboxes, [:source_id]
remove_column :contacts, :inbox_id, :integer
remove_column :contacts, :source_id, :integer
end
end
18 changes: 15 additions & 3 deletions db/schema.rb
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2019_10_20_173522) do
ActiveRecord::Schema.define(version: 2019_10_27_054756) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand Down Expand Up @@ -63,15 +63,25 @@
t.datetime "updated_at", null: false
end

create_table "contact_inboxes", force: :cascade do |t|
t.bigint "contact_id"
t.bigint "inbox_id"
t.string "source_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["contact_id"], name: "index_contact_inboxes_on_contact_id"
t.index ["inbox_id", "source_id"], name: "index_contact_inboxes_on_inbox_id_and_source_id", unique: true
t.index ["inbox_id"], name: "index_contact_inboxes_on_inbox_id"
t.index ["source_id"], name: "index_contact_inboxes_on_source_id"
end

create_table "contacts", id: :serial, force: :cascade do |t|
t.string "name"
t.string "email"
t.string "phone_number"
t.integer "account_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "inbox_id", null: false
t.bigserial "source_id", null: false
t.string "avatar"
t.string "pubsub_token"
t.index ["account_id"], name: "index_contacts_on_account_id"
Expand Down Expand Up @@ -208,5 +218,7 @@
t.index ["uid", "provider"], name: "index_users_on_uid_and_provider", unique: true
end

add_foreign_key "contact_inboxes", "contacts"
add_foreign_key "contact_inboxes", "inboxes"
add_foreign_key "users", "users", column: "inviter_id"
end
2 changes: 1 addition & 1 deletion lib/integrations/facebook/delivery_status.rb
Expand Up @@ -18,7 +18,7 @@ def sender_id
end

def contact
Contact.find_by(source_id: sender_id)
::ContactInbox.find_by(source_id: sender_id).contact
end

def conversation
Expand Down
2 changes: 0 additions & 2 deletions spec/factories/contacts.rb
Expand Up @@ -5,8 +5,6 @@
sequence(:name) { |n| "Widget #{n}" }
sequence(:email) { |n| "widget-#{n}@example.com" }
phone_number { '+123456789011' }
source_id { rand(100) }
account
inbox
end
end
2 changes: 0 additions & 2 deletions spec/models/contact_spec.rb
Expand Up @@ -5,12 +5,10 @@
RSpec.describe Contact do
context 'validations' do
it { is_expected.to validate_presence_of(:account_id) }
it { is_expected.to validate_presence_of(:inbox_id) }
end

context 'associations' do
it { is_expected.to belong_to(:account) }
it { is_expected.to belong_to(:inbox) }
it { is_expected.to have_many(:conversations).dependent(:destroy) }
end

Expand Down

0 comments on commit c21c839

Please sign in to comment.