From 19ab0fe108f913e597e49a4895b95b4e606df099 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Mon, 9 Mar 2020 23:27:10 +0530 Subject: [PATCH] Chore: Scope URLs with account_id (#601) * Chore: Enable Users to create multiple accounts Addresses: #402 - migrations to split roles and other attributes from users table - make changes in code to accommodate this change Co-authored-by: Pranav Raj Sreepuram --- .rubocop.yml | 55 +++++- .rubocop_todo.yml | 9 - .../v1/{ => accounts}/accounts_controller.rb | 6 +- .../actions/contact_merges_controller.rb | 2 +- .../v1/{ => accounts}/agents_controller.rb | 2 +- .../v1/{ => accounts}/callbacks_controller.rb | 11 +- .../canned_responses_controller.rb | 2 +- .../contacts/conversations_controller.rb | 2 +- .../v1/{ => accounts}/contacts_controller.rb | 2 +- .../conversations/assignments_controller.rb | 5 +- .../conversations/labels_controller.rb | 5 +- .../conversations/messages_controller.rb | 2 +- .../conversations_controller.rb | 6 +- .../facebook_indicators_controller.rb | 3 +- .../inbox_members_controller.rb | 2 +- .../v1/{ => accounts}/inboxes_controller.rb | 2 +- .../v1/{ => accounts}/labels_controller.rb | 5 +- .../notification_settings_controller.rb | 2 +- .../v1/{ => accounts}/reports_controller.rb | 24 ++- .../subscriptions_controller.rb | 2 +- .../webhooks_controller.rb | 2 +- .../devise_overrides/passwords_controller.rb | 4 +- .../devise_overrides/sessions_controller.rb | 2 +- app/javascript/dashboard/api/ApiClient.js | 20 ++- app/javascript/dashboard/api/agents.js | 2 +- .../dashboard/api/cannedResponse.js | 2 +- app/javascript/dashboard/api/contacts.js | 2 +- app/javascript/dashboard/api/conversations.js | 2 +- app/javascript/dashboard/api/endPoints.js | 15 +- .../dashboard/api/inbox/conversation.js | 2 +- app/javascript/dashboard/api/inbox/message.js | 2 +- app/javascript/dashboard/api/inboxMembers.js | 2 +- app/javascript/dashboard/api/inboxes.js | 2 +- app/javascript/dashboard/api/reports.js | 30 ++-- .../dashboard/api/userNotificationSettings.js | 2 +- app/javascript/dashboard/api/webhooks.js | 2 +- .../dashboard/components/layout/Sidebar.vue | 11 +- .../widgets/conversation/ConversationCard.vue | 7 +- app/javascript/dashboard/helper/URLHelper.js | 6 +- .../dashboard/helper/spec/URLHelper.spec.js | 8 +- .../dashboard/i18n/default-sidebar.js | 24 ++- .../dashboard/routes/auth/Confirmation.vue | 4 +- .../dashboard/routes/auth/PasswordEdit.vue | 2 +- .../dashboard/routes/auth/Signup.vue | 5 +- .../conversation/conversation.routes.js | 10 +- .../routes/dashboard/dashboard.routes.js | 2 +- .../dashboard/settings/agents/agent.routes.js | 2 +- .../settings/billing/billing.routes.js | 2 +- .../settings/canned/canned.routes.js | 2 +- .../routes/dashboard/settings/inbox/Index.vue | 10 +- .../dashboard/settings/inbox/inbox.routes.js | 2 +- .../dashboard/settings/integrations/Index.vue | 17 +- .../integrations/integrations.routes.js | 2 +- .../settings/profile/profile.routes.js | 2 +- .../settings/reports/reports.routes.js | 2 +- .../dashboard/settings/settings.routes.js | 6 +- app/javascript/dashboard/routes/index.js | 9 +- .../dashboard/store/modules/auth.js | 3 +- app/views/api/v1/account/index.json.jbuilder | 10 -- .../{ => accounts}/agents/index.json.jbuilder | 0 .../callbacks/facebook_pages.json.jbuilder} | 0 .../conversations/index.json.jbuilder | 0 .../contacts/index.json.jbuilder | 0 .../contacts/show.json.jbuilder | 0 .../contacts/update.json.jbuilder | 0 .../assignments/create.json.jbuilder | 0 .../conversations/index.json.jbuilder | 0 .../conversations/labels/create.json.jbuilder | 0 .../conversations/labels/index.json.jbuilder | 0 .../messages/create.json.jbuilder | 0 .../messages/index.json.jbuilder | 0 .../conversations/show.json.jbuilder | 0 .../conversations/toggle_status.json.jbuilder | 0 .../inbox_members/show.json.jbuilder | 0 .../inboxes/index.json.jbuilder | 0 .../{ => accounts}/labels/index.json.jbuilder | 0 .../labels/most_used.json.jbuilder | 0 .../notification_settings/show.json.jbuilder | 0 .../webhooks/_webhook.json.jbuilder | 0 .../webhooks/create.json.jbuilder | 0 .../webhooks/index.json.jbuilder | 0 .../webhooks/update.json.jbuilder | 0 app/views/devise/auth.json.jbuilder | 24 +-- config/routes.rb | 158 +++++++++--------- ...te_active_storage_tables.active_storage.rb | 4 +- .../20200225160650_rename_urls_to_url.rb | 2 +- .../20200225162150_add_type_to_webhook.rb | 2 +- .../actions/contact_merges_controller_spec.rb | 6 +- .../{ => accounts}/agents_controller_spec.rb | 26 +-- .../callbacks_controller_spec.rb | 24 +-- .../canned_responses_controller_spec.rb | 26 +-- .../contacts/conversations_controller_spec.rb | 12 +- .../contacts_controller_spec.rb | 29 ++-- .../assignments_controller_spec.rb | 6 +- .../conversations/labels_controller_spec.rb | 12 +- .../conversations/messages_controller_spec.rb | 12 +- .../conversations_controller_spec.rb | 24 +-- .../facebook_indicators_controller_spec.rb | 24 +-- .../inbox_members_controller_spec.rb | 16 +- .../{ => accounts}/inboxes_controller_spec.rb | 26 +-- .../{ => accounts}/labels_controller_spec.rb | 12 +- .../notification_settings_controller_spec.rb | 12 +- .../subscriptions_controller_spec.rb | 8 +- .../webhook_controller_spec.rb | 24 +-- .../api/v1/accounts_controller_spec.rb | 3 +- 105 files changed, 480 insertions(+), 402 deletions(-) rename app/controllers/api/v1/{ => accounts}/accounts_controller.rb (88%) rename app/controllers/api/v1/{ => accounts}/actions/contact_merges_controller.rb (88%) rename app/controllers/api/v1/{ => accounts}/agents_controller.rb (95%) rename app/controllers/api/v1/{ => accounts}/callbacks_controller.rb (90%) rename app/controllers/api/v1/{ => accounts}/canned_responses_controller.rb (92%) rename app/controllers/api/v1/{ => accounts}/contacts/conversations_controller.rb (85%) rename app/controllers/api/v1/{ => accounts}/contacts_controller.rb (93%) rename app/controllers/api/v1/{ => accounts}/conversations/assignments_controller.rb (69%) rename app/controllers/api/v1/{ => accounts}/conversations/labels_controller.rb (61%) rename app/controllers/api/v1/{ => accounts}/conversations/messages_controller.rb (81%) rename app/controllers/api/v1/{ => accounts}/conversations_controller.rb (82%) rename app/controllers/api/v1/{ => accounts}/facebook_indicators_controller.rb (89%) rename app/controllers/api/v1/{ => accounts}/inbox_members_controller.rb (94%) rename app/controllers/api/v1/{ => accounts}/inboxes_controller.rb (88%) rename app/controllers/api/v1/{ => accounts}/labels_controller.rb (58%) rename app/controllers/api/v1/{user => accounts}/notification_settings_controller.rb (88%) rename app/controllers/api/v1/{ => accounts}/reports_controller.rb (82%) rename app/controllers/api/v1/{ => accounts}/subscriptions_controller.rb (76%) rename app/controllers/api/v1/{account => accounts}/webhooks_controller.rb (90%) delete mode 100644 app/views/api/v1/account/index.json.jbuilder rename app/views/api/v1/{ => accounts}/agents/index.json.jbuilder (100%) rename app/views/api/v1/{callbacks/get_facebook_pages.json.jbuilder => accounts/callbacks/facebook_pages.json.jbuilder} (100%) rename app/views/api/v1/{ => accounts}/contacts/conversations/index.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/contacts/index.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/contacts/show.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/contacts/update.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/conversations/assignments/create.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/conversations/index.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/conversations/labels/create.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/conversations/labels/index.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/conversations/messages/create.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/conversations/messages/index.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/conversations/show.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/conversations/toggle_status.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/inbox_members/show.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/inboxes/index.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/labels/index.json.jbuilder (100%) rename app/views/api/v1/{ => accounts}/labels/most_used.json.jbuilder (100%) rename app/views/api/v1/{user => accounts}/notification_settings/show.json.jbuilder (100%) rename app/views/api/v1/{account => accounts}/webhooks/_webhook.json.jbuilder (100%) rename app/views/api/v1/{account => accounts}/webhooks/create.json.jbuilder (100%) rename app/views/api/v1/{account => accounts}/webhooks/index.json.jbuilder (100%) rename app/views/api/v1/{account => accounts}/webhooks/update.json.jbuilder (100%) rename spec/controllers/api/v1/{ => accounts}/actions/contact_merges_controller_spec.rb (86%) rename spec/controllers/api/v1/{ => accounts}/agents_controller_spec.rb (76%) rename spec/controllers/api/v1/{ => accounts}/callbacks_controller_spec.rb (81%) rename spec/controllers/api/v1/{ => accounts}/canned_responses_controller_spec.rb (76%) rename spec/controllers/api/v1/{ => accounts}/contacts/conversations_controller_spec.rb (76%) rename spec/controllers/api/v1/{ => accounts}/contacts_controller_spec.rb (72%) rename spec/controllers/api/v1/{ => accounts}/conversations/assignments_controller_spec.rb (71%) rename spec/controllers/api/v1/{ => accounts}/conversations/labels_controller_spec.rb (73%) rename spec/controllers/api/v1/{ => accounts}/conversations/messages_controller_spec.rb (72%) rename spec/controllers/api/v1/{ => accounts}/conversations_controller_spec.rb (74%) rename spec/controllers/api/v1/{ => accounts}/facebook_indicators_controller_spec.rb (81%) rename spec/controllers/api/v1/{ => accounts}/inbox_members_controller_spec.rb (80%) rename spec/controllers/api/v1/{ => accounts}/inboxes_controller_spec.rb (80%) rename spec/controllers/api/v1/{ => accounts}/labels_controller_spec.rb (80%) rename spec/controllers/api/v1/{user => accounts}/notification_settings_controller_spec.rb (80%) rename spec/controllers/api/v1/{ => accounts}/subscriptions_controller_spec.rb (81%) rename spec/controllers/api/v1/{account => accounts}/webhook_controller_spec.rb (79%) diff --git a/.rubocop.yml b/.rubocop.yml index 6d6ec1f13..da3bf7cd2 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -41,17 +41,54 @@ RSpec/NestedGroups: Max: 4 RSpec/MessageSpies: Enabled: false +Metrics/MethodLength: + Exclude: + - 'db/migrate/20161123131628_devise_token_auth_create_users.rb' +Rails/CreateTableWithTimestamps: + Exclude: + - 'db/migrate/20170207092002_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb' +Style/GuardClause: + Exclude: + - 'app/builders/account_builder.rb' + - 'app/models/attachment.rb' + - 'app/models/message.rb' + - 'lib/webhooks/chargebee.rb' + - 'db/migrate/20190819005836_add_missing_indexes_on_taggings.acts_as_taggable_on_engine.rb' +Metrics/AbcSize: + Exclude: + - 'db/migrate/20190819005836_add_missing_indexes_on_taggings.acts_as_taggable_on_engine.rb' +Metrics/CyclomaticComplexity: + Exclude: + - 'db/migrate/20190819005836_add_missing_indexes_on_taggings.acts_as_taggable_on_engine.rb' +Rails/ReversibleMigration: + Exclude: + - 'db/migrate/20161025070152_removechannelsfrommodels.rb' + - 'db/migrate/20161025070645_remchannel.rb' + - 'db/migrate/20161025070645_remchannel.rb' + - 'db/migrate/20161110102609_removeinboxid.rb' + - 'db/migrate/20170519091539_add_avatar_to_fb.rb' + - 'db/migrate/20191020085608_rename_old_tables.rb' + - 'db/migrate/20191126185833_update_user_invite_foreign_key.rb' + - 'db/migrate/20191130164019_add_template_type_to_messages.rb' Rails/BulkChangeTable: Exclude: + - 'db/migrate/20161025070152_removechannelsfrommodels.rb' - 'db/migrate/20200121190901_create_account_users.rb' + - 'db/migrate/20170211092540_notnullableusers.rb' + - 'db/migrate/20170403095203_contactadder.rb' + - 'db/migrate/20170406104018_add_default_status_conv.rb' + - 'db/migrate/20170511134418_latlong.rb' + - 'db/migrate/20191027054756_create_contact_inboxes.rb' + - 'db/migrate/20191130164019_add_template_type_to_messages.rb' AllCops: Exclude: - - db/* - - bin/**/* - - db/**/* - - config/**/* - - public/**/* - - vendor/**/* - - node_modules/**/* - - lib/tasks/auto_annotate_models.rake - - config/environments/**/* + - 'bin/**/*' + - 'db/schema.rb' + - 'config/**/*' + - 'public/**/*' + - 'vendor/**/*' + - 'node_modules/**/*' + - 'lib/tasks/auto_annotate_models.rake' + - 'config/environments/**/*' + - 'tmp/**/*' + - 'storage/**/*' diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 17dfb84f9..06a287ae1 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -282,15 +282,6 @@ Style/GlobalVars: Exclude: - 'lib/redis/alfred.rb' -# Offense count: 7 -# Configuration parameters: MinBodyLength. -Style/GuardClause: - Exclude: - - 'app/builders/account_builder.rb' - - 'app/models/attachment.rb' - - 'app/models/message.rb' - - 'lib/webhooks/chargebee.rb' - # Offense count: 4 Style/IdenticalConditionalBranches: Exclude: diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts/accounts_controller.rb similarity index 88% rename from app/controllers/api/v1/accounts_controller.rb rename to app/controllers/api/v1/accounts/accounts_controller.rb index 96e488231..da5c0e77b 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts/accounts_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::AccountsController < Api::BaseController +class Api::V1::Accounts::AccountsController < Api::BaseController include AuthHelper skip_before_action :verify_authenticity_token, only: [:create] @@ -18,9 +18,7 @@ class Api::V1::AccountsController < Api::BaseController ).perform if @user send_auth_headers(@user) - render json: { - data: @user.token_validation_response - } + render 'devise/auth.json', locals: { resource: @user } else render_error_response(CustomExceptions::Account::SignupFailed.new({})) end diff --git a/app/controllers/api/v1/actions/contact_merges_controller.rb b/app/controllers/api/v1/accounts/actions/contact_merges_controller.rb similarity index 88% rename from app/controllers/api/v1/actions/contact_merges_controller.rb rename to app/controllers/api/v1/accounts/actions/contact_merges_controller.rb index 2eead4869..1296b6a55 100644 --- a/app/controllers/api/v1/actions/contact_merges_controller.rb +++ b/app/controllers/api/v1/accounts/actions/contact_merges_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::Actions::ContactMergesController < Api::BaseController +class Api::V1::Accounts::Actions::ContactMergesController < Api::BaseController before_action :set_base_contact, only: [:create] before_action :set_mergee_contact, only: [:create] diff --git a/app/controllers/api/v1/agents_controller.rb b/app/controllers/api/v1/accounts/agents_controller.rb similarity index 95% rename from app/controllers/api/v1/agents_controller.rb rename to app/controllers/api/v1/accounts/agents_controller.rb index aa0c665cd..ca796ceef 100644 --- a/app/controllers/api/v1/agents_controller.rb +++ b/app/controllers/api/v1/accounts/agents_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::AgentsController < Api::BaseController +class Api::V1::Accounts::AgentsController < Api::BaseController before_action :fetch_agent, except: [:create, :index] before_action :check_authorization before_action :find_user, only: [:create] diff --git a/app/controllers/api/v1/callbacks_controller.rb b/app/controllers/api/v1/accounts/callbacks_controller.rb similarity index 90% rename from app/controllers/api/v1/callbacks_controller.rb rename to app/controllers/api/v1/accounts/callbacks_controller.rb index 031d5accc..bb0e0ca0b 100644 --- a/app/controllers/api/v1/callbacks_controller.rb +++ b/app/controllers/api/v1/accounts/callbacks_controller.rb @@ -1,6 +1,4 @@ -require 'rest-client' -require 'telegram/bot' -class Api::V1::CallbacksController < Api::BaseController +class Api::V1::Accounts::CallbacksController < Api::BaseController before_action :inbox, only: [:reauthorize_page] def register_facebook_page @@ -18,7 +16,7 @@ class Api::V1::CallbacksController < Api::BaseController render json: inbox end - def get_facebook_pages + def facebook_pages @page_details = mark_already_existing_facebook_pages(fb_object.get_connections('me', 'accounts')) end @@ -67,7 +65,7 @@ class Api::V1::CallbacksController < Api::BaseController return [] if data.empty? data.inject([]) do |result, page_detail| - current_account.facebook_pages.exists?(page_id: page_detail['id']) ? page_detail.merge!(exists: true) : page_detail.merge!(exists: false) + page_detail[:exists] = current_account.facebook_pages.exists?(page_id: page_detail['id']) ? true : false result << page_detail end end @@ -90,11 +88,12 @@ class Api::V1::CallbacksController < Api::BaseController response = uri.open(redirect: false) rescue OpenURI::HTTPRedirect => e uri = e.uri # assigned from the "Location" response header - retry if (tries -= 1) > 0 + retry if (tries -= 1).positive? raise end pic_url = response.base_uri.to_s rescue StandardError => e + Rails.logger.debug "Rescued: #{e.inspect}" pic_url = nil end pic_url diff --git a/app/controllers/api/v1/canned_responses_controller.rb b/app/controllers/api/v1/accounts/canned_responses_controller.rb similarity index 92% rename from app/controllers/api/v1/canned_responses_controller.rb rename to app/controllers/api/v1/accounts/canned_responses_controller.rb index aa82ea3c4..b76da5f8c 100644 --- a/app/controllers/api/v1/canned_responses_controller.rb +++ b/app/controllers/api/v1/accounts/canned_responses_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::CannedResponsesController < Api::BaseController +class Api::V1::Accounts::CannedResponsesController < Api::BaseController before_action :fetch_canned_response, only: [:update, :destroy] def index diff --git a/app/controllers/api/v1/contacts/conversations_controller.rb b/app/controllers/api/v1/accounts/contacts/conversations_controller.rb similarity index 85% rename from app/controllers/api/v1/contacts/conversations_controller.rb rename to app/controllers/api/v1/accounts/contacts/conversations_controller.rb index bce503ad6..8fcb4df13 100644 --- a/app/controllers/api/v1/contacts/conversations_controller.rb +++ b/app/controllers/api/v1/accounts/contacts/conversations_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::Contacts::ConversationsController < Api::BaseController +class Api::V1::Accounts::Contacts::ConversationsController < Api::BaseController def index @conversations = current_account.conversations.includes( :assignee, :contact, :inbox diff --git a/app/controllers/api/v1/contacts_controller.rb b/app/controllers/api/v1/accounts/contacts_controller.rb similarity index 93% rename from app/controllers/api/v1/contacts_controller.rb rename to app/controllers/api/v1/accounts/contacts_controller.rb index b5885d708..9d95f69aa 100644 --- a/app/controllers/api/v1/contacts_controller.rb +++ b/app/controllers/api/v1/accounts/contacts_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::ContactsController < Api::BaseController +class Api::V1::Accounts::ContactsController < Api::BaseController protect_from_forgery with: :null_session before_action :check_authorization diff --git a/app/controllers/api/v1/conversations/assignments_controller.rb b/app/controllers/api/v1/accounts/conversations/assignments_controller.rb similarity index 69% rename from app/controllers/api/v1/conversations/assignments_controller.rb rename to app/controllers/api/v1/accounts/conversations/assignments_controller.rb index e411022fe..6da3c05da 100644 --- a/app/controllers/api/v1/conversations/assignments_controller.rb +++ b/app/controllers/api/v1/accounts/conversations/assignments_controller.rb @@ -1,7 +1,8 @@ -class Api::V1::Conversations::AssignmentsController < Api::BaseController +class Api::V1::Accounts::Conversations::AssignmentsController < Api::BaseController before_action :set_conversation, only: [:create] - def create # assign agent to a conversation + # assign agent to a conversation + def create # if params[:assignee_id] is not a valid id, it will set to nil, hence unassigning the conversation assignee = current_account.users.find_by(id: params[:assignee_id]) @conversation.update_assignee(assignee) diff --git a/app/controllers/api/v1/conversations/labels_controller.rb b/app/controllers/api/v1/accounts/conversations/labels_controller.rb similarity index 61% rename from app/controllers/api/v1/conversations/labels_controller.rb rename to app/controllers/api/v1/accounts/conversations/labels_controller.rb index e9074ac03..3e80e2825 100644 --- a/app/controllers/api/v1/conversations/labels_controller.rb +++ b/app/controllers/api/v1/accounts/conversations/labels_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::Conversations::LabelsController < Api::BaseController +class Api::V1::Accounts::Conversations::LabelsController < Api::BaseController before_action :set_conversation, only: [:create, :index] def create @@ -6,7 +6,8 @@ class Api::V1::Conversations::LabelsController < Api::BaseController @labels = @conversation.label_list end - def index # all labels of the current conversation + # all labels of the current conversation + def index @labels = @conversation.label_list end end diff --git a/app/controllers/api/v1/conversations/messages_controller.rb b/app/controllers/api/v1/accounts/conversations/messages_controller.rb similarity index 81% rename from app/controllers/api/v1/conversations/messages_controller.rb rename to app/controllers/api/v1/accounts/conversations/messages_controller.rb index 793b3d054..d0ed39edb 100644 --- a/app/controllers/api/v1/conversations/messages_controller.rb +++ b/app/controllers/api/v1/accounts/conversations/messages_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::Conversations::MessagesController < Api::BaseController +class Api::V1::Accounts::Conversations::MessagesController < Api::BaseController before_action :set_conversation, only: [:index, :create] def index diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/accounts/conversations_controller.rb similarity index 82% rename from app/controllers/api/v1/conversations_controller.rb rename to app/controllers/api/v1/accounts/conversations_controller.rb index cf0d55779..895091cca 100644 --- a/app/controllers/api/v1/conversations_controller.rb +++ b/app/controllers/api/v1/accounts/conversations_controller.rb @@ -1,5 +1,5 @@ -class Api::V1::ConversationsController < Api::BaseController - before_action :set_conversation, except: [:index] +class Api::V1::Accounts::ConversationsController < Api::BaseController + before_action :conversation, except: [:index] def index result = conversation_finder.perform @@ -25,7 +25,7 @@ class Api::V1::ConversationsController < Api::BaseController DateTime.strptime(params[:agent_last_seen_at].to_s, '%s') end - def set_conversation + def conversation @conversation ||= current_account.conversations.find_by(display_id: params[:id]) end diff --git a/app/controllers/api/v1/facebook_indicators_controller.rb b/app/controllers/api/v1/accounts/facebook_indicators_controller.rb similarity index 89% rename from app/controllers/api/v1/facebook_indicators_controller.rb rename to app/controllers/api/v1/accounts/facebook_indicators_controller.rb index dccf508c9..7cea774cf 100644 --- a/app/controllers/api/v1/facebook_indicators_controller.rb +++ b/app/controllers/api/v1/accounts/facebook_indicators_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::FacebookIndicatorsController < Api::BaseController +class Api::V1::Accounts::FacebookIndicatorsController < Api::BaseController before_action :set_access_token around_action :handle_with_exception @@ -26,6 +26,7 @@ class Api::V1::FacebookIndicatorsController < Api::BaseController def handle_with_exception yield rescue Facebook::Messenger::Error => e + Rails.logger.debug "Rescued: #{e.inspect}" true end diff --git a/app/controllers/api/v1/inbox_members_controller.rb b/app/controllers/api/v1/accounts/inbox_members_controller.rb similarity index 94% rename from app/controllers/api/v1/inbox_members_controller.rb rename to app/controllers/api/v1/accounts/inbox_members_controller.rb index 982ad00ba..f71b3869d 100644 --- a/app/controllers/api/v1/inbox_members_controller.rb +++ b/app/controllers/api/v1/accounts/inbox_members_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::InboxMembersController < Api::BaseController +class Api::V1::Accounts::InboxMembersController < Api::BaseController before_action :fetch_inbox, only: [:create, :show] before_action :current_agents_ids, only: [:create] diff --git a/app/controllers/api/v1/inboxes_controller.rb b/app/controllers/api/v1/accounts/inboxes_controller.rb similarity index 88% rename from app/controllers/api/v1/inboxes_controller.rb rename to app/controllers/api/v1/accounts/inboxes_controller.rb index e9005a0c7..d99180588 100644 --- a/app/controllers/api/v1/inboxes_controller.rb +++ b/app/controllers/api/v1/accounts/inboxes_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::InboxesController < Api::BaseController +class Api::V1::Accounts::InboxesController < Api::BaseController before_action :check_authorization before_action :fetch_inbox, only: [:destroy, :update] diff --git a/app/controllers/api/v1/labels_controller.rb b/app/controllers/api/v1/accounts/labels_controller.rb similarity index 58% rename from app/controllers/api/v1/labels_controller.rb rename to app/controllers/api/v1/accounts/labels_controller.rb index 4426b7018..c9f15bdae 100644 --- a/app/controllers/api/v1/labels_controller.rb +++ b/app/controllers/api/v1/accounts/labels_controller.rb @@ -1,5 +1,6 @@ -class Api::V1::LabelsController < Api::BaseController - def index # list all labels in account +class Api::V1::Accounts::LabelsController < Api::BaseController + # list all labels in account + def index @labels = current_account.all_conversation_tags end diff --git a/app/controllers/api/v1/user/notification_settings_controller.rb b/app/controllers/api/v1/accounts/notification_settings_controller.rb similarity index 88% rename from app/controllers/api/v1/user/notification_settings_controller.rb rename to app/controllers/api/v1/accounts/notification_settings_controller.rb index 78c5dc720..ba6e43804 100644 --- a/app/controllers/api/v1/user/notification_settings_controller.rb +++ b/app/controllers/api/v1/accounts/notification_settings_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::User::NotificationSettingsController < Api::BaseController +class Api::V1::Accounts::NotificationSettingsController < Api::BaseController before_action :set_user, :load_notification_setting def show; end diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/accounts/reports_controller.rb similarity index 82% rename from app/controllers/api/v1/reports_controller.rb rename to app/controllers/api/v1/accounts/reports_controller.rb index e155d3af7..c93574b6c 100644 --- a/app/controllers/api/v1/reports_controller.rb +++ b/app/controllers/api/v1/accounts/reports_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::ReportsController < Api::BaseController +class Api::V1::Accounts::ReportsController < Api::BaseController include CustomExceptions::Report include Constants::Report @@ -36,10 +36,6 @@ class Api::V1::ReportsController < Api::BaseController current_user.account end - def agent - @agent ||= current_account.users.find(params[:agent_id]) - end - def account_summary_metrics summary_metrics(ACCOUNT_METRICS, :account_summary_params, AVG_ACCOUNT_METRICS) end @@ -51,18 +47,18 @@ class Api::V1::ReportsController < Api::BaseController def summary_metrics(metrics, calc_function, avg_metrics) metrics.each_with_object({}) do |metric, result| data = ReportBuilder.new(current_account, send(calc_function, metric)).build - - if avg_metrics.include?(metric) - sum = data.inject(0) { |sum, hash| sum + hash[:value].to_i } - sum /= data.length unless sum.zero? - else - sum = data.inject(0) { |sum, hash| sum + hash[:value].to_i } - end - - result[metric] = sum + result[metric] = calculate_metric(data, metric, avg_metrics) end end + def calculate_metric(data, metric, avg_metrics) + sum = data.inject(0) { |val, hash| val + hash[:value].to_i } + if avg_metrics.include?(metric) + sum /= data.length unless sum.zero? + end + sum + end + def account_summary_params(metric) { metric: metric.to_s, diff --git a/app/controllers/api/v1/subscriptions_controller.rb b/app/controllers/api/v1/accounts/subscriptions_controller.rb similarity index 76% rename from app/controllers/api/v1/subscriptions_controller.rb rename to app/controllers/api/v1/accounts/subscriptions_controller.rb index 92e4f7f13..f9b3141d6 100644 --- a/app/controllers/api/v1/subscriptions_controller.rb +++ b/app/controllers/api/v1/accounts/subscriptions_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::SubscriptionsController < Api::BaseController +class Api::V1::Accounts::SubscriptionsController < Api::BaseController skip_before_action :check_subscription before_action :check_billing_enabled diff --git a/app/controllers/api/v1/account/webhooks_controller.rb b/app/controllers/api/v1/accounts/webhooks_controller.rb similarity index 90% rename from app/controllers/api/v1/account/webhooks_controller.rb rename to app/controllers/api/v1/accounts/webhooks_controller.rb index 730e7b9b1..dbdd953ed 100644 --- a/app/controllers/api/v1/account/webhooks_controller.rb +++ b/app/controllers/api/v1/accounts/webhooks_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::Account::WebhooksController < Api::BaseController +class Api::V1::Accounts::WebhooksController < Api::BaseController before_action :check_authorization before_action :fetch_webhook, only: [:update, :destroy] diff --git a/app/controllers/devise_overrides/passwords_controller.rb b/app/controllers/devise_overrides/passwords_controller.rb index adea8687d..4289d5af2 100644 --- a/app/controllers/devise_overrides/passwords_controller.rb +++ b/app/controllers/devise_overrides/passwords_controller.rb @@ -11,9 +11,7 @@ class DeviseOverrides::PasswordsController < Devise::PasswordsController @recoverable = User.find_by(reset_password_token: reset_password_token) if @recoverable && reset_password_and_confirmation(@recoverable) send_auth_headers(@recoverable) - render json: { - data: @recoverable.token_validation_response - } + render 'devise/auth.json', locals: { resource: @recoverable } else render json: { "message": 'Invalid token', "redirect_url": '/' }, status: 422 end diff --git a/app/controllers/devise_overrides/sessions_controller.rb b/app/controllers/devise_overrides/sessions_controller.rb index 3a6614074..b9cec5447 100644 --- a/app/controllers/devise_overrides/sessions_controller.rb +++ b/app/controllers/devise_overrides/sessions_controller.rb @@ -4,6 +4,6 @@ class DeviseOverrides::SessionsController < ::DeviseTokenAuth::SessionsControlle wrap_parameters format: [] def render_create_success - render 'devise/auth.json' + render 'devise/auth.json', locals: { resource: @resource } end end diff --git a/app/javascript/dashboard/api/ApiClient.js b/app/javascript/dashboard/api/ApiClient.js index a3b87dae1..0b2ed28d0 100644 --- a/app/javascript/dashboard/api/ApiClient.js +++ b/app/javascript/dashboard/api/ApiClient.js @@ -3,9 +3,25 @@ const API_VERSION = `/api/v1`; class ApiClient { - constructor(url) { + constructor(resource, options = {}) { this.apiVersion = API_VERSION; - this.url = `${this.apiVersion}/${url}`; + this.options = options; + this.resource = resource; + } + + get url() { + let url = this.apiVersion; + if (this.options.accountScoped) { + const isInsideAccountScopedURLs = window.location.pathname.includes( + '/app/accounts' + ); + + if (isInsideAccountScopedURLs) { + const accountId = window.location.pathname.split('/')[3]; + url = `${url}/accounts/${accountId}`; + } + } + return `${url}/${this.resource}`; } get() { diff --git a/app/javascript/dashboard/api/agents.js b/app/javascript/dashboard/api/agents.js index 62d8e6623..7cc5e6d0c 100644 --- a/app/javascript/dashboard/api/agents.js +++ b/app/javascript/dashboard/api/agents.js @@ -2,7 +2,7 @@ import ApiClient from './ApiClient'; class Agents extends ApiClient { constructor() { - super('agents'); + super('agents', { accountScoped: true }); } } diff --git a/app/javascript/dashboard/api/cannedResponse.js b/app/javascript/dashboard/api/cannedResponse.js index 3a17d2735..f558dcaca 100644 --- a/app/javascript/dashboard/api/cannedResponse.js +++ b/app/javascript/dashboard/api/cannedResponse.js @@ -4,7 +4,7 @@ import ApiClient from './ApiClient'; class CannedResponse extends ApiClient { constructor() { - super('canned_responses'); + super('canned_responses', { accountScoped: true }); } get({ searchKey }) { diff --git a/app/javascript/dashboard/api/contacts.js b/app/javascript/dashboard/api/contacts.js index bad89b182..0988141d3 100644 --- a/app/javascript/dashboard/api/contacts.js +++ b/app/javascript/dashboard/api/contacts.js @@ -3,7 +3,7 @@ import ApiClient from './ApiClient'; class ContactAPI extends ApiClient { constructor() { - super('contacts'); + super('contacts', { accountScoped: true }); } getConversations(contactId) { diff --git a/app/javascript/dashboard/api/conversations.js b/app/javascript/dashboard/api/conversations.js index fd36f8db3..876103694 100644 --- a/app/javascript/dashboard/api/conversations.js +++ b/app/javascript/dashboard/api/conversations.js @@ -3,7 +3,7 @@ import ApiClient from './ApiClient'; class ConversationApi extends ApiClient { constructor() { - super('conversations'); + super('conversations', { accountScoped: true }); } getLabels(conversationID) { diff --git a/app/javascript/dashboard/api/endPoints.js b/app/javascript/dashboard/api/endPoints.js index 10a0608bd..e5640af2b 100644 --- a/app/javascript/dashboard/api/endPoints.js +++ b/app/javascript/dashboard/api/endPoints.js @@ -28,23 +28,10 @@ const endPoints = { }, fetchFacebookPages: { - url: 'api/v1/callbacks/get_facebook_pages.json', + url: 'api/v1/callbacks/facebook_pages.json', params: { omniauth_token: '' }, }, - reports: { - account(metric, from, to) { - return { - url: `/api/v1/reports/account?metric=${metric}&since=${from}&to=${to}`, - }; - }, - accountSummary(accountId, from, to) { - return { - url: `/api/v1/reports/${accountId}/account_summary?since=${from}&to=${to}`, - }; - }, - }, - subscriptions: { get() { return { diff --git a/app/javascript/dashboard/api/inbox/conversation.js b/app/javascript/dashboard/api/inbox/conversation.js index 6a86cff7f..d5212957a 100644 --- a/app/javascript/dashboard/api/inbox/conversation.js +++ b/app/javascript/dashboard/api/inbox/conversation.js @@ -3,7 +3,7 @@ import ApiClient from '../ApiClient'; class ConversationApi extends ApiClient { constructor() { - super('conversations'); + super('conversations', { accountScoped: true }); } get({ inboxId, status, assigneeType, page }) { diff --git a/app/javascript/dashboard/api/inbox/message.js b/app/javascript/dashboard/api/inbox/message.js index 00dda8a63..3cea5f7a8 100644 --- a/app/javascript/dashboard/api/inbox/message.js +++ b/app/javascript/dashboard/api/inbox/message.js @@ -4,7 +4,7 @@ import ApiClient from '../ApiClient'; class MessageApi extends ApiClient { constructor() { - super('conversations'); + super('conversations', { accountScoped: true }); } create({ conversationId, message, private: isPrivate }) { diff --git a/app/javascript/dashboard/api/inboxMembers.js b/app/javascript/dashboard/api/inboxMembers.js index 2d7001562..3716f89ab 100644 --- a/app/javascript/dashboard/api/inboxMembers.js +++ b/app/javascript/dashboard/api/inboxMembers.js @@ -3,7 +3,7 @@ import ApiClient from './ApiClient'; class InboxMembers extends ApiClient { constructor() { - super('inbox_members'); + super('inbox_members', { accountScoped: true }); } create({ inboxId, agentList }) { diff --git a/app/javascript/dashboard/api/inboxes.js b/app/javascript/dashboard/api/inboxes.js index fb3e63dfd..b5cea1d01 100644 --- a/app/javascript/dashboard/api/inboxes.js +++ b/app/javascript/dashboard/api/inboxes.js @@ -2,7 +2,7 @@ import ApiClient from './ApiClient'; class Inboxes extends ApiClient { constructor() { - super('inboxes'); + super('inboxes', { accountScoped: true }); } } diff --git a/app/javascript/dashboard/api/reports.js b/app/javascript/dashboard/api/reports.js index 94d6ac726..d2a96cda8 100644 --- a/app/javascript/dashboard/api/reports.js +++ b/app/javascript/dashboard/api/reports.js @@ -1,14 +1,22 @@ /* global axios */ +import ApiClient from './ApiClient'; -import endPoints from './endPoints'; +class ReportsAPI extends ApiClient { + constructor() { + super('reports', { accountScoped: true }); + } -export default { - getAccountReports(metric, from, to) { - const { url } = endPoints('reports').account(metric, from, to); - return axios.get(url); - }, - getAccountSummary(accountId, from, to) { - const urlData = endPoints('reports').accountSummary(accountId, from, to); - return axios.get(urlData.url); - }, -}; + getAccountReports(metric, since, until) { + return axios.get(`${this.url}/account`, { + params: { metric, since, until }, + }); + } + + getAccountSummary(accountId, since, until) { + return axios.get(`${this.url}/${accountId}/account_summary`, { + params: { since, until }, + }); + } +} + +export default new ReportsAPI(); diff --git a/app/javascript/dashboard/api/userNotificationSettings.js b/app/javascript/dashboard/api/userNotificationSettings.js index 15cea8942..33829a6bd 100644 --- a/app/javascript/dashboard/api/userNotificationSettings.js +++ b/app/javascript/dashboard/api/userNotificationSettings.js @@ -3,7 +3,7 @@ import ApiClient from './ApiClient'; class UserNotificationSettings extends ApiClient { constructor() { - super('user/notification_settings'); + super('notification_settings', { accountScoped: true }); } update(params) { diff --git a/app/javascript/dashboard/api/webhooks.js b/app/javascript/dashboard/api/webhooks.js index 229519dd7..1e03f25f7 100644 --- a/app/javascript/dashboard/api/webhooks.js +++ b/app/javascript/dashboard/api/webhooks.js @@ -2,7 +2,7 @@ import ApiClient from './ApiClient'; class WebHooks extends ApiClient { constructor() { - super('account/webhooks'); + super('webhooks', { accountScoped: true }); } } diff --git a/app/javascript/dashboard/components/layout/Sidebar.vue b/app/javascript/dashboard/components/layout/Sidebar.vue index 52838fa3f..10c395818 100644 --- a/app/javascript/dashboard/components/layout/Sidebar.vue +++ b/app/javascript/dashboard/components/layout/Sidebar.vue @@ -43,7 +43,7 @@ >