Agents can review recurring FAQ suggestions when they can access at least one supporting conversation. The detail view returns only source conversations the agent can access. Administrators can review every suggestion and can edit, approve, or dismiss it. Approval creates one approved Captain FAQ and removes the stored source observations. This is the third PR in the CW-7495 stack. It is built on [#14978](https://github.com/chatwoot/chatwoot/pull/14978), which adds the FAQ suggestion models and generation flow. ## Closes Closes [CW-7495](https://linear.app/chatwoot/issue/CW-7495/backend-llm-changes-to-make-conversation-faqs-as-signalssuggestions). ## What changed 1. Added a paginated suggestion list with assistant, status, and search filters. 2. Limited agents to suggestions that have at least one source conversation they can access. 3. Limited the detail response to the 50 most recent source conversations the current user can access. 4. Allowed administrators to edit, approve, and dismiss open suggestions. 5. Added approval that creates one approved Captain FAQ, closes the suggestion, and removes its source observations. 6. Rejected approval when the suggestion language does not match the account language. 7. Added row locking so an edit or dismissal cannot overwrite an approval. 8. Prevented FAQ generation from attaching a new observation after a suggestion has closed. ## How to test 1. Sign in as an agent who has access to one inbox but not another. 2. Confirm the agent sees only suggestions with at least one source conversation from an accessible inbox. 3. Open a suggestion and confirm the source list does not contain conversations from restricted inboxes. 4. Sign in as an administrator and confirm all account suggestions are available. 5. Edit an open suggestion and approve it. Confirm one approved FAQ is created and the suggestion no longer has source observations. 6. Try to approve a suggestion in a different language from the account language. Confirm the request is rejected. 7. Dismiss another open suggestion and confirm it leaves the open review queue. --------- Co-authored-by: Sony Mathew <sony@chatwoot.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
752 lines
27 KiB
Ruby
752 lines
27 KiB
Ruby
Rails.application.routes.draw do
|
|
# AUTH STARTS
|
|
mount_devise_token_auth_for 'User', at: 'auth', controllers: {
|
|
confirmations: 'devise_overrides/confirmations',
|
|
passwords: 'devise_overrides/passwords',
|
|
sessions: 'devise_overrides/sessions',
|
|
token_validations: 'devise_overrides/token_validations',
|
|
omniauth_callbacks: 'devise_overrides/omniauth_callbacks'
|
|
}, via: [:get, :post]
|
|
|
|
post 'resend_confirmation', to: 'auth/resend_confirmations#create'
|
|
|
|
## renders the frontend paths only if its not an api only server
|
|
if ActiveModel::Type::Boolean.new.cast(ENV.fetch('CW_API_ONLY_SERVER', false))
|
|
root to: 'api#index'
|
|
else
|
|
root to: 'dashboard#index'
|
|
|
|
get '/app', to: 'dashboard#index'
|
|
get '/app/*params', to: 'dashboard#index'
|
|
get '/app/accounts/:account_id/settings/inboxes/new/twitter', to: 'dashboard#index', as: 'app_new_twitter_inbox'
|
|
get '/app/accounts/:account_id/settings/inboxes/new/microsoft', to: 'dashboard#index', as: 'app_new_microsoft_inbox'
|
|
get '/app/accounts/:account_id/settings/inboxes/new/instagram', to: 'dashboard#index', as: 'app_new_instagram_inbox'
|
|
get '/app/accounts/:account_id/settings/inboxes/new/tiktok', to: 'dashboard#index', as: 'app_new_tiktok_inbox'
|
|
get '/app/accounts/:account_id/settings/inboxes/new/:inbox_id/agents', to: 'dashboard#index', as: 'app_twitter_inbox_agents'
|
|
get '/app/accounts/:account_id/settings/inboxes/new/:inbox_id/agents', to: 'dashboard#index', as: 'app_email_inbox_agents'
|
|
get '/app/accounts/:account_id/settings/inboxes/new/:inbox_id/agents', to: 'dashboard#index', as: 'app_instagram_inbox_agents'
|
|
get '/app/accounts/:account_id/settings/inboxes/new/:inbox_id/agents', to: 'dashboard#index', as: 'app_tiktok_inbox_agents'
|
|
get '/app/accounts/:account_id/settings/inboxes/:inbox_id', to: 'dashboard#index', as: 'app_instagram_inbox_settings'
|
|
get '/app/accounts/:account_id/settings/inboxes/:inbox_id', to: 'dashboard#index', as: 'app_tiktok_inbox_settings'
|
|
get '/app/accounts/:account_id/settings/inboxes/:inbox_id', to: 'dashboard#index', as: 'app_email_inbox_settings'
|
|
get '/app/accounts/:account_id/onboarding/inbox-setup', to: 'dashboard#index', as: 'app_onboarding_inbox_setup'
|
|
|
|
resource :widget, only: [:show]
|
|
namespace :survey do
|
|
resources :responses, only: [:show]
|
|
end
|
|
resource :slack_uploads, only: [:show]
|
|
end
|
|
|
|
get '/health', to: 'health#show'
|
|
get '/api', to: 'api#index'
|
|
namespace :api, defaults: { format: 'json' } do
|
|
namespace :v1 do
|
|
# ----------------------------------
|
|
# start of account scoped api routes
|
|
resources :accounts, only: [:create, :show, :update] do
|
|
member do
|
|
post :update_active_at
|
|
get :cache_keys
|
|
end
|
|
|
|
scope module: :accounts do
|
|
namespace :actions do
|
|
resource :contact_merge, only: [:create]
|
|
end
|
|
resource :bulk_actions, only: [:create]
|
|
resource :onboarding, only: [:update] do
|
|
get :help_center_generation
|
|
end
|
|
resources :agents, only: [:index, :create, :update, :destroy] do
|
|
post :bulk_create, on: :collection
|
|
end
|
|
namespace :captain do
|
|
resource :preferences, only: [:show, :update]
|
|
resources :assistants do
|
|
member do
|
|
post :playground
|
|
get :metrics
|
|
get :faq_stats
|
|
get :summary
|
|
get :drilldown
|
|
end
|
|
collection do
|
|
get :tools
|
|
end
|
|
resources :inboxes, only: [:index, :create, :destroy], param: :inbox_id
|
|
resources :scenarios
|
|
end
|
|
resources :agent_sessions, only: [:show]
|
|
resources :assistant_responses
|
|
resources :faq_suggestions, only: [:index, :show, :update] do
|
|
post :approve, on: :member
|
|
post :dismiss, on: :member
|
|
end
|
|
resources :message_reports, only: [:create]
|
|
resources :bulk_actions, only: [:create]
|
|
resources :copilot_threads, only: [:index, :create] do
|
|
resources :copilot_messages, only: [:index, :create]
|
|
end
|
|
resources :custom_tools do
|
|
post :test, on: :collection
|
|
end
|
|
resources :documents, only: [:index, :show, :create, :destroy] do
|
|
post :sync, on: :member
|
|
end
|
|
resource :tasks, only: [], controller: 'tasks' do
|
|
post :rewrite
|
|
post :summarize
|
|
post :reply_suggestion
|
|
post :label_suggestion
|
|
post :follow_up
|
|
end
|
|
end
|
|
resource :saml_settings, only: [:show, :create, :update, :destroy]
|
|
resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do
|
|
delete :avatar, on: :member
|
|
post :reset_access_token, on: :member
|
|
post :reset_secret, on: :member
|
|
end
|
|
resources :contact_inboxes, only: [] do
|
|
collection do
|
|
post :filter
|
|
end
|
|
end
|
|
resources :assignable_agents, only: [:index]
|
|
resource :audit_logs, only: [:show]
|
|
resources :callbacks, only: [] do
|
|
collection do
|
|
post :register_facebook_page
|
|
get :register_facebook_page
|
|
post :facebook_pages
|
|
post :reauthorize_page
|
|
end
|
|
end
|
|
resources :canned_responses, only: [:index, :create, :update, :destroy]
|
|
resources :automation_rules, only: [:index, :create, :show, :update, :destroy] do
|
|
post :clone
|
|
end
|
|
resources :macros, only: [:index, :create, :show, :update, :destroy] do
|
|
post :execute, on: :member
|
|
end
|
|
resources :sla_policies, only: [:index, :create, :show, :update, :destroy]
|
|
resources :custom_roles, only: [:index, :create, :show, :update, :destroy]
|
|
resources :agent_capacity_policies, only: [:index, :create, :show, :update, :destroy] do
|
|
scope module: :agent_capacity_policies do
|
|
resources :users, only: [:index, :create, :destroy]
|
|
resources :inbox_limits, only: [:create, :update, :destroy]
|
|
end
|
|
end
|
|
resources :campaigns, only: [:index, :create, :show, :update, :destroy]
|
|
resources :dashboard_apps, only: [:index, :show, :create, :update, :destroy]
|
|
namespace :channels do
|
|
resource :twilio_channel, only: [:create]
|
|
end
|
|
resources :conversations, only: [:index, :create, :show, :update, :destroy] do
|
|
collection do
|
|
get :meta
|
|
get :search
|
|
get :unread_counts, to: 'conversations/unread_counts#index'
|
|
post :filter
|
|
end
|
|
scope module: :conversations do
|
|
resources :messages, only: [:index, :create, :destroy, :update] do
|
|
member do
|
|
post :translate
|
|
post :retry
|
|
end
|
|
end
|
|
resources :assignments, only: [:create]
|
|
resources :labels, only: [:create, :index]
|
|
resource :participants, only: [:show, :create, :update, :destroy]
|
|
resource :direct_uploads, only: [:create]
|
|
resource :draft_messages, only: [:show, :update, :destroy]
|
|
end
|
|
member do
|
|
post :mute
|
|
post :unmute
|
|
post :transcript
|
|
post :toggle_status
|
|
post :toggle_priority
|
|
post :toggle_typing_status
|
|
post :update_last_seen
|
|
post :unread
|
|
post :custom_attributes
|
|
get :attachments
|
|
get :inbox_assistant
|
|
get :reporting_events if ChatwootApp.enterprise?
|
|
end
|
|
end
|
|
|
|
resources :search, only: [:index] do
|
|
collection do
|
|
get :conversations
|
|
get :messages
|
|
get :contacts
|
|
get :articles
|
|
end
|
|
end
|
|
|
|
resources :companies, only: [:index, :show, :create, :update, :destroy] do
|
|
collection do
|
|
get :search
|
|
end
|
|
member do
|
|
post :destroy_custom_attributes
|
|
delete :avatar
|
|
end
|
|
scope module: :companies do
|
|
resources :contacts, only: [:index, :create, :destroy] do
|
|
collection do
|
|
get :search
|
|
end
|
|
end
|
|
resources :conversations, only: [:index]
|
|
resources :notes, only: [:index]
|
|
end
|
|
end
|
|
resources :contacts, only: [:index, :show, :update, :create, :destroy] do
|
|
collection do
|
|
get :active
|
|
get :search
|
|
post :filter
|
|
post :import
|
|
post :export
|
|
end
|
|
member do
|
|
get :contactable_inboxes
|
|
post :destroy_custom_attributes
|
|
delete :avatar
|
|
end
|
|
scope module: :contacts do
|
|
resources :conversations, only: [:index]
|
|
resources :contact_inboxes, only: [:create]
|
|
resources :labels, only: [:create, :index]
|
|
resources :notes
|
|
get :attachments, to: 'attachments#index'
|
|
post :call, on: :member, to: 'calls#create' if ChatwootApp.enterprise?
|
|
end
|
|
end
|
|
resources :data_imports, only: [:index, :show, :create] do
|
|
collection do
|
|
post :validate_source
|
|
end
|
|
member do
|
|
post :start
|
|
post :abandon
|
|
get :error_logs
|
|
get :skip_logs
|
|
end
|
|
end
|
|
resources :csat_survey_responses, only: [:index] do
|
|
collection do
|
|
get :metrics
|
|
get :download
|
|
end
|
|
member do
|
|
patch :update if ChatwootApp.enterprise?
|
|
end
|
|
end
|
|
resources :applied_slas, only: [:index] do
|
|
collection do
|
|
get :metrics
|
|
get :download
|
|
end
|
|
end
|
|
resources :reporting_events, only: [:index] if ChatwootApp.enterprise?
|
|
|
|
if ChatwootApp.enterprise?
|
|
resources :calls, only: [:index]
|
|
resources :whatsapp_calls, only: [:show] do
|
|
member do
|
|
post :accept
|
|
post :reject
|
|
post :terminate
|
|
post :upload_recording
|
|
end
|
|
collection do
|
|
post :initiate
|
|
end
|
|
end
|
|
end
|
|
|
|
resources :custom_attribute_definitions, only: [:index, :show, :create, :update, :destroy]
|
|
resources :custom_filters, only: [:index, :show, :create, :update, :destroy]
|
|
resource :branded_email_layout, only: [:show, :update]
|
|
resources :inboxes, only: [:index, :show, :create, :update, :destroy] do
|
|
get :assignable_agents, on: :member
|
|
get :campaigns, on: :member
|
|
get :agent_bot, on: :member
|
|
post :set_agent_bot, on: :member
|
|
delete :avatar, on: :member
|
|
post :sync_templates, on: :member
|
|
get :health, on: :member
|
|
post :register_webhook, on: :member
|
|
post :reset_secret, on: :member
|
|
if ChatwootApp.enterprise?
|
|
resource :conference, only: %i[create destroy], controller: 'conference' do
|
|
get :token, on: :member
|
|
end
|
|
post :enable_whatsapp_calling, on: :member
|
|
post :disable_whatsapp_calling, on: :member
|
|
post :set_inbound_calls, on: :member
|
|
end
|
|
|
|
resource :csat_template, only: [:show, :create], controller: 'inbox_csat_templates' do
|
|
post :analyze, on: :collection
|
|
end
|
|
end
|
|
|
|
resources :inbox_members, only: [:create, :show], param: :inbox_id do
|
|
collection do
|
|
delete :destroy
|
|
patch :update
|
|
end
|
|
end
|
|
resources :labels, only: [:index, :show, :create, :update, :destroy]
|
|
|
|
resources :notifications, only: [:index, :update, :destroy] do
|
|
collection do
|
|
post :read_all
|
|
get :unread_count
|
|
post :destroy_all
|
|
end
|
|
member do
|
|
post :snooze
|
|
post :unread
|
|
end
|
|
end
|
|
resource :notification_settings, only: [:show, :update]
|
|
|
|
resources :teams do
|
|
resources :team_members, only: [:index, :create] do
|
|
collection do
|
|
delete :destroy
|
|
patch :update
|
|
end
|
|
end
|
|
end
|
|
|
|
# Assignment V2 Routes
|
|
resources :assignment_policies do
|
|
resources :inboxes, only: [:index, :create, :destroy], module: :assignment_policies
|
|
end
|
|
|
|
resources :inboxes, only: [] do
|
|
resource :assignment_policy, only: [:show, :create, :destroy], module: :inboxes
|
|
end
|
|
|
|
namespace :twitter do
|
|
resource :authorization, only: [:create]
|
|
end
|
|
|
|
namespace :microsoft do
|
|
resource :authorization, only: [:create]
|
|
end
|
|
|
|
namespace :google do
|
|
resource :authorization, only: [:create]
|
|
end
|
|
|
|
namespace :instagram do
|
|
resource :authorization, only: [:create]
|
|
end
|
|
|
|
namespace :tiktok do
|
|
resource :authorization, only: [:create]
|
|
end
|
|
|
|
namespace :notion do
|
|
resource :authorization, only: [:create]
|
|
end
|
|
|
|
namespace :whatsapp do
|
|
resource :authorization, only: [:create]
|
|
end
|
|
|
|
resources :webhooks, only: [:index, :create, :update, :destroy]
|
|
namespace :integrations do
|
|
resources :apps, only: [:index, :show]
|
|
resources :hooks, only: [:show, :create, :update, :destroy] do
|
|
member do
|
|
post :process_event
|
|
end
|
|
end
|
|
resource :slack, only: [:create, :update, :destroy], controller: 'slack' do
|
|
member do
|
|
get :list_all_channels
|
|
end
|
|
end
|
|
resource :dyte, controller: 'dyte', only: [] do
|
|
collection do
|
|
post :create_a_meeting
|
|
post :add_participant_to_meeting
|
|
end
|
|
end
|
|
resource :shopify, controller: 'shopify', only: [:destroy] do
|
|
collection do
|
|
post :auth
|
|
get :orders
|
|
end
|
|
end
|
|
resource :linear, controller: 'linear', only: [] do
|
|
collection do
|
|
delete :destroy
|
|
get :teams
|
|
get :team_entities
|
|
post :create_issue
|
|
post :link_issue
|
|
post :unlink_issue
|
|
get :search_issue
|
|
get :linked_issues
|
|
end
|
|
end
|
|
resource :notion, controller: 'notion', only: [] do
|
|
collection do
|
|
delete :destroy
|
|
end
|
|
end
|
|
end
|
|
resources :portals do
|
|
member do
|
|
patch :archive
|
|
delete :logo
|
|
post :send_instructions
|
|
get :ssl_status
|
|
end
|
|
resources :categories do
|
|
post :reorder, on: :collection
|
|
end
|
|
namespace :articles do
|
|
resource :bulk_actions, only: [] do
|
|
post :translate
|
|
patch :update_status
|
|
patch :update_category
|
|
delete :delete_articles
|
|
end
|
|
end
|
|
resources :articles do
|
|
post :reorder, on: :collection
|
|
end
|
|
end
|
|
|
|
resources :upload, only: [:create]
|
|
end
|
|
end
|
|
# end of account scoped api routes
|
|
# ----------------------------------
|
|
|
|
namespace :integrations do
|
|
resources :webhooks, only: [:create]
|
|
end
|
|
|
|
# Frontend API endpoint to trigger SAML authentication flow
|
|
post 'auth/saml_login', to: 'auth#saml_login'
|
|
|
|
resource :profile, only: [:show, :update] do
|
|
delete :avatar, on: :collection
|
|
member do
|
|
post :availability
|
|
post :auto_offline
|
|
put :set_active_account
|
|
post :resend_confirmation
|
|
post :reset_access_token
|
|
end
|
|
|
|
# MFA routes
|
|
scope module: 'profile' do
|
|
resource :mfa, controller: 'mfa', only: [:show, :create, :destroy] do
|
|
post :verify
|
|
post :backup_codes
|
|
end
|
|
resources :sessions, only: [:index, :destroy]
|
|
end
|
|
end
|
|
|
|
resource :notification_subscriptions, only: [:create, :destroy]
|
|
|
|
namespace :widget do
|
|
resource :direct_uploads, only: [:create]
|
|
resource :config, only: [:create]
|
|
resources :campaigns, only: [:index]
|
|
resources :events, only: [:create]
|
|
resources :messages, only: [:index, :create, :update]
|
|
resources :conversations, only: [:index, :create] do
|
|
collection do
|
|
post :destroy_custom_attributes
|
|
post :set_custom_attributes
|
|
post :update_last_seen
|
|
post :toggle_typing
|
|
post :transcript
|
|
get :toggle_status
|
|
end
|
|
end
|
|
resource :contact, only: [:show, :update] do
|
|
collection do
|
|
post :destroy_custom_attributes
|
|
patch :set_user
|
|
end
|
|
end
|
|
resources :inbox_members, only: [:index]
|
|
resources :labels, only: [:create, :destroy]
|
|
namespace :integrations do
|
|
resource :dyte, controller: 'dyte', only: [] do
|
|
collection do
|
|
post :add_participant_to_meeting
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
namespace :v2 do
|
|
resources :accounts, only: [:create] do
|
|
scope module: :accounts do
|
|
resources :summary_reports, only: [] do
|
|
collection do
|
|
get :agent
|
|
get :team
|
|
get :inbox
|
|
get :label
|
|
get :channel
|
|
end
|
|
end
|
|
resources :reports, only: [:index] do
|
|
collection do
|
|
get :summary
|
|
get :bot_summary
|
|
get :agents
|
|
get :inboxes
|
|
get :labels
|
|
get :teams
|
|
get :conversations
|
|
get :conversations_summary
|
|
get :conversation_traffic
|
|
get :drilldown
|
|
get :bot_metrics
|
|
get :inbox_label_matrix
|
|
get :first_response_time_distribution
|
|
get :outgoing_messages_count
|
|
end
|
|
end
|
|
resource :year_in_review, only: [:show]
|
|
resources :live_reports, only: [] do
|
|
collection do
|
|
get :conversation_metrics
|
|
get :grouped_conversation_metrics
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if ChatwootApp.enterprise?
|
|
namespace :enterprise, defaults: { format: 'json' } do
|
|
namespace :api do
|
|
namespace :v1 do
|
|
resources :accounts do
|
|
member do
|
|
post :checkout
|
|
post :subscription
|
|
post :select_billing_currency
|
|
get :limits
|
|
post :toggle_deletion
|
|
post :topup_checkout
|
|
get :topup_options
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
post 'webhooks/stripe', to: 'webhooks/stripe#process_payload'
|
|
post 'webhooks/firecrawl', to: 'webhooks/firecrawl#process_payload'
|
|
end
|
|
end
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Routes for platform APIs
|
|
namespace :platform, defaults: { format: 'json' } do
|
|
namespace :api do
|
|
namespace :v1 do
|
|
resources :users, only: [:create, :show, :update, :destroy] do
|
|
member do
|
|
get :login
|
|
post :token
|
|
end
|
|
end
|
|
resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do
|
|
delete :avatar, on: :member
|
|
end
|
|
resources :accounts, only: [:index, :create, :show, :update, :destroy] do
|
|
resources :account_users, only: [:index, :create] do
|
|
collection do
|
|
delete :destroy
|
|
end
|
|
end
|
|
resources :email_channel_migrations, only: [:create]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Routes for inbox APIs Exposed to contacts
|
|
namespace :public, defaults: { format: 'json' } do
|
|
namespace :api do
|
|
namespace :v1 do
|
|
resources :inboxes do
|
|
scope module: :inboxes do
|
|
resources :contacts, only: [:create, :show, :update] do
|
|
resources :conversations, only: [:index, :create, :show] do
|
|
member do
|
|
post :toggle_status
|
|
post :toggle_typing
|
|
post :update_last_seen
|
|
end
|
|
|
|
resources :messages, only: [:index, :create, :update]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
resources :csat_survey, only: [:show, :update]
|
|
end
|
|
end
|
|
end
|
|
|
|
get 'hc/:slug', to: 'public/api/v1/portals#show'
|
|
get 'hc/:slug/sitemap.xml', to: 'public/api/v1/portals#sitemap'
|
|
get 'hc/:slug/:locale', to: 'public/api/v1/portals#show', as: :public_portal_locale
|
|
get 'hc/:slug/:locale/search', to: 'public/api/v1/portals/search#index', as: :portal_search
|
|
get 'hc/:slug/:locale/articles', to: 'public/api/v1/portals/articles#index'
|
|
get 'hc/:slug/:locale/categories', to: 'public/api/v1/portals/categories#index'
|
|
get 'hc/:slug/:locale/categories/:category_slug', to: 'public/api/v1/portals/categories#show', as: :public_portal_category
|
|
get 'hc/:slug/:locale/categories/:category_slug/articles', to: 'public/api/v1/portals/articles#index'
|
|
get 'hc/:slug/articles/:article_slug.png', to: 'public/api/v1/portals/articles#tracking_pixel'
|
|
get 'hc/:slug/articles/:article_slug.md', to: 'public/api/v1/portals/articles#show_markdown', as: :public_portal_article_markdown,
|
|
defaults: { format: :md }
|
|
get 'hc/:slug/articles/:article_slug', to: 'public/api/v1/portals/articles#show', as: :public_portal_article
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Used in mailer templates
|
|
resource :app, only: [:index] do
|
|
resources :accounts do
|
|
resources :conversations, only: [:show]
|
|
end
|
|
end
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Routes for channel integrations
|
|
mount Facebook::Messenger::Server, at: 'bot'
|
|
get 'webhooks/twitter', to: 'api/v1/webhooks#twitter_crc'
|
|
post 'webhooks/twitter', to: 'api/v1/webhooks#twitter_events'
|
|
post 'webhooks/line/:line_channel_id', to: 'webhooks/line#process_payload'
|
|
post 'webhooks/telegram/:bot_token', to: 'webhooks/telegram#process_payload'
|
|
post 'webhooks/sms/:phone_number', to: 'webhooks/sms#process_payload'
|
|
get 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#verify'
|
|
post 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#process_payload'
|
|
get 'webhooks/instagram', to: 'webhooks/instagram#verify'
|
|
post 'webhooks/instagram', to: 'webhooks/instagram#events'
|
|
post 'webhooks/tiktok', to: 'webhooks/tiktok#events'
|
|
post 'webhooks/shopify', to: 'webhooks/shopify#events'
|
|
|
|
namespace :twitter do
|
|
resource :callback, only: [:show]
|
|
end
|
|
|
|
namespace :linear do
|
|
resource :callback, only: [:show]
|
|
end
|
|
|
|
namespace :shopify do
|
|
resource :callback, only: [:show]
|
|
end
|
|
|
|
namespace :twilio do
|
|
resources :callback, only: [:create]
|
|
resources :delivery_status, only: [:create]
|
|
|
|
if ChatwootApp.enterprise?
|
|
post 'voice/call/:phone', to: 'voice#call_twiml', as: :voice_call
|
|
post 'voice/status/:phone', to: 'voice#status', as: :voice_status
|
|
post 'voice/conference_status/:phone', to: 'voice#conference_status', as: :voice_conference_status
|
|
post 'voice/recording_status/:phone', to: 'voice#recording_status', as: :voice_recording_status
|
|
end
|
|
end
|
|
|
|
get 'microsoft/callback', to: 'microsoft/callbacks#show'
|
|
get 'google/callback', to: 'google/callbacks#show'
|
|
get 'instagram/callback', to: 'instagram/callbacks#show'
|
|
get 'tiktok/callback', to: 'tiktok/callbacks#show'
|
|
get 'notion/callback', to: 'notion/callbacks#show'
|
|
# ----------------------------------------------------------------------
|
|
# Routes for external service verifications
|
|
get '.well-known/assetlinks.json' => 'android_app#assetlinks'
|
|
get '.well-known/apple-app-site-association' => 'apple_app#site_association'
|
|
get '.well-known/microsoft-identity-association.json' => 'microsoft#identity_association'
|
|
get '.well-known/cf-custom-hostname-challenge/:id', to: 'custom_domains#verify'
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Internal Monitoring Routes
|
|
require 'sidekiq/web'
|
|
require 'sidekiq/cron/web'
|
|
|
|
devise_for :super_admins, path: 'super_admin', controllers: { sessions: 'super_admin/devise/sessions' }
|
|
devise_scope :super_admin do
|
|
get 'super_admin/logout', to: 'super_admin/devise/sessions#destroy'
|
|
namespace :super_admin do
|
|
root to: 'dashboard#index'
|
|
|
|
resource :app_config, only: [:show, :create]
|
|
resource :push_diagnostics, only: [:show, :create] do
|
|
post :destroy_subscriptions, on: :collection
|
|
end
|
|
|
|
# order of resources affect the order of sidebar navigation in super admin
|
|
resources :accounts, only: [:index, :new, :create, :show, :edit, :update, :destroy] do
|
|
post :seed, on: :member
|
|
post :reset_cache, on: :member
|
|
end
|
|
resources :users, only: [:index, :new, :create, :show, :edit, :update, :destroy] do
|
|
delete :avatar, on: :member, action: :destroy_avatar
|
|
end
|
|
|
|
resources :access_tokens, only: [:index, :show]
|
|
resources :installation_configs, only: [:index, :new, :create, :show, :edit, :update]
|
|
resources :agent_bots, only: [:index, :new, :create, :show, :edit, :update, :destroy] do
|
|
delete :avatar, on: :member, action: :destroy_avatar
|
|
end
|
|
resources :platform_apps, only: [:index, :new, :create, :show, :edit, :update, :destroy]
|
|
resources :platform_banners
|
|
resource :instance_status, only: [:show]
|
|
|
|
resource :settings, only: [:show] do
|
|
get :refresh, on: :collection
|
|
end
|
|
|
|
# resources that doesn't appear in primary navigation in super admin
|
|
resources :account_users, only: [:new, :create, :show, :destroy]
|
|
end
|
|
authenticated :super_admin do
|
|
mount Sidekiq::Web => '/monitoring/sidekiq'
|
|
end
|
|
end
|
|
|
|
namespace :installation do
|
|
get 'onboarding', to: 'onboarding#index'
|
|
post 'onboarding', to: 'onboarding#create'
|
|
end
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Routes for swagger docs
|
|
get '/swagger/*path', to: 'swagger#respond'
|
|
get '/swagger', to: 'swagger#respond'
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Routes for testing
|
|
resources :widget_tests, only: [:index] unless Rails.env.production?
|
|
end
|