mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 19:17:48 +00:00 
			
		
		
		
	chore: Adds API for agent bot avatar upload (#8533)
Adds API for agent bot avatar upload - accounts/agent_bot - platform/agent_bot
This commit is contained in:
		| @@ -10,11 +10,18 @@ class Api::V1::Accounts::AgentBotsController < Api::V1::Accounts::BaseController | |||||||
|   def show; end |   def show; end | ||||||
|  |  | ||||||
|   def create |   def create | ||||||
|     @agent_bot = Current.account.agent_bots.create!(permitted_params) |     @agent_bot = Current.account.agent_bots.create!(permitted_params.except(:avatar_url)) | ||||||
|  |     process_avatar_from_url | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def update |   def update | ||||||
|     @agent_bot.update!(permitted_params) |     @agent_bot.update!(permitted_params.except(:avatar_url)) | ||||||
|  |     process_avatar_from_url | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def avatar | ||||||
|  |     @agent_bot.avatar.purge if @agent_bot.avatar.attached? | ||||||
|  |     @agent_bot | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def destroy |   def destroy | ||||||
| @@ -30,6 +37,10 @@ class Api::V1::Accounts::AgentBotsController < Api::V1::Accounts::BaseController | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   def permitted_params |   def permitted_params | ||||||
|     params.permit(:name, :description, :outgoing_url, :bot_type, bot_config: [:csml_content]) |     params.permit(:name, :description, :outgoing_url, :avatar, :avatar_url, :bot_type, bot_config: [:csml_content]) | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def process_avatar_from_url | ||||||
|  |     ::Avatar::AvatarFromUrlJob.perform_later(@agent_bot, params[:avatar_url]) if params[:avatar_url].present? | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -83,14 +83,14 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController | |||||||
|       @contact = Current.account.contacts.new(permitted_params.except(:avatar_url)) |       @contact = Current.account.contacts.new(permitted_params.except(:avatar_url)) | ||||||
|       @contact.save! |       @contact.save! | ||||||
|       @contact_inbox = build_contact_inbox |       @contact_inbox = build_contact_inbox | ||||||
|       process_avatar |       process_avatar_from_url | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def update |   def update | ||||||
|     @contact.assign_attributes(contact_update_params) |     @contact.assign_attributes(contact_update_params) | ||||||
|     @contact.save! |     @contact.save! | ||||||
|     process_avatar if permitted_params[:avatar].present? || permitted_params[:avatar_url].present? |     process_avatar_from_url | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def destroy |   def destroy | ||||||
| @@ -174,7 +174,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController | |||||||
|     @contact = Current.account.contacts.includes(contact_inboxes: [:inbox]).find(params[:id]) |     @contact = Current.account.contacts.includes(contact_inboxes: [:inbox]).find(params[:id]) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def process_avatar |   def process_avatar_from_url | ||||||
|     ::Avatar::AvatarFromUrlJob.perform_later(@contact, params[:avatar_url]) if params[:avatar_url].present? |     ::Avatar::AvatarFromUrlJob.perform_later(@contact, params[:avatar_url]) if params[:avatar_url].present? | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,13 +9,15 @@ class Platform::Api::V1::AgentBotsController < PlatformController | |||||||
|   def show; end |   def show; end | ||||||
|  |  | ||||||
|   def create |   def create | ||||||
|     @resource = AgentBot.new(agent_bot_params) |     @resource = AgentBot.new(agent_bot_params.except(:avatar_url)) | ||||||
|     @resource.save! |     @resource.save! | ||||||
|  |     process_avatar_from_url | ||||||
|     @platform_app.platform_app_permissibles.find_or_create_by(permissible: @resource) |     @platform_app.platform_app_permissibles.find_or_create_by(permissible: @resource) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def update |   def update | ||||||
|     @resource.update!(agent_bot_params) |     @resource.update!(agent_bot_params.except(:avatar_url)) | ||||||
|  |     process_avatar_from_url | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def destroy |   def destroy | ||||||
| @@ -23,6 +25,11 @@ class Platform::Api::V1::AgentBotsController < PlatformController | |||||||
|     head :ok |     head :ok | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   def avatar | ||||||
|  |     @resource.avatar.purge if @resource.avatar.attached? | ||||||
|  |     @resource | ||||||
|  |   end | ||||||
|  |  | ||||||
|   private |   private | ||||||
|  |  | ||||||
|   def set_resource |   def set_resource | ||||||
| @@ -30,6 +37,10 @@ class Platform::Api::V1::AgentBotsController < PlatformController | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   def agent_bot_params |   def agent_bot_params | ||||||
|     params.permit(:name, :description, :account_id, :outgoing_url) |     params.permit(:name, :description, :account_id, :outgoing_url, :avatar, :avatar_url) | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def process_avatar_from_url | ||||||
|  |     ::Avatar::AvatarFromUrlJob.perform_later(@resource, params[:avatar_url]) if params[:avatar_url].present? | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -18,4 +18,8 @@ class AgentBotPolicy < ApplicationPolicy | |||||||
|   def destroy? |   def destroy? | ||||||
|     @account_user.administrator? |     @account_user.administrator? | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   def avatar? | ||||||
|  |     @account_user.administrator? | ||||||
|  |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -0,0 +1 @@ | |||||||
|  | json.partial! 'api/v1/models/agent_bot', formats: [:json], resource: AgentBotPresenter.new(@agent_bot) | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | json.partial! 'platform/api/v1/models/agent_bot', formats: [:json], resource: @resource | ||||||
| @@ -45,7 +45,9 @@ Rails.application.routes.draw do | |||||||
|           end |           end | ||||||
|           resource :bulk_actions, only: [:create] |           resource :bulk_actions, only: [:create] | ||||||
|           resources :agents, only: [:index, :create, :update, :destroy] |           resources :agents, only: [:index, :create, :update, :destroy] | ||||||
|           resources :agent_bots, only: [:index, :create, :show, :update, :destroy] |           resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do | ||||||
|  |             delete :avatar, on: :member | ||||||
|  |           end | ||||||
|           resources :contact_inboxes, only: [] do |           resources :contact_inboxes, only: [] do | ||||||
|             collection do |             collection do | ||||||
|               post :filter |               post :filter | ||||||
| @@ -329,7 +331,9 @@ Rails.application.routes.draw do | |||||||
|             get :login |             get :login | ||||||
|           end |           end | ||||||
|         end |         end | ||||||
|         resources :agent_bots, only: [:index, :create, :show, :update, :destroy] |         resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do | ||||||
|  |           delete :avatar, on: :member | ||||||
|  |         end | ||||||
|         resources :accounts, only: [:create, :show, :update, :destroy] do |         resources :accounts, only: [:create, :show, :update, :destroy] do | ||||||
|           resources :account_users, only: [:index, :create] do |           resources :account_users, only: [:index, :create] do | ||||||
|             collection do |             collection do | ||||||
|   | |||||||
| @@ -141,6 +141,28 @@ RSpec.describe 'Agent Bot API', type: :request do | |||||||
|         expect(agent_bot.reload.name).not_to eq('test_updated') |         expect(agent_bot.reload.name).not_to eq('test_updated') | ||||||
|         expect(response.body).not_to include(global_bot.access_token.token) |         expect(response.body).not_to include(global_bot.access_token.token) | ||||||
|       end |       end | ||||||
|  |  | ||||||
|  |       it 'updates avatar' do | ||||||
|  |         # no avatar before upload | ||||||
|  |         expect(agent_bot.avatar.attached?).to be(false) | ||||||
|  |         file = fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png') | ||||||
|  |         patch "/api/v1/accounts/#{account.id}/agent_bots/#{agent_bot.id}", | ||||||
|  |               headers: admin.create_new_auth_token, | ||||||
|  |               params: valid_params.merge(avatar: file) | ||||||
|  |  | ||||||
|  |         expect(response).to have_http_status(:success) | ||||||
|  |         agent_bot.reload | ||||||
|  |         expect(agent_bot.avatar.attached?).to be(true) | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       it 'updated avatar with avatar_url' do | ||||||
|  |         patch "/api/v1/accounts/#{account.id}/agent_bots/#{agent_bot.id}", | ||||||
|  |               headers: admin.create_new_auth_token, | ||||||
|  |               params: valid_params.merge(avatar_url: 'http://example.com/avatar.png'), | ||||||
|  |               as: :json | ||||||
|  |         expect(response).to have_http_status(:success) | ||||||
|  |         expect(Avatar::AvatarFromUrlJob).to have_been_enqueued.with(agent_bot, 'http://example.com/avatar.png') | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @@ -183,4 +205,29 @@ RSpec.describe 'Agent Bot API', type: :request do | |||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   describe 'DELETE /api/v1/accounts/{account.id}/agent_bots/:id/avatar' do | ||||||
|  |     context 'when it is an unauthenticated user' do | ||||||
|  |       it 'returns unauthorized' do | ||||||
|  |         delete "/api/v1/accounts/#{account.id}/agent_bots/#{agent_bot.id}" | ||||||
|  |  | ||||||
|  |         expect(response).to have_http_status(:unauthorized) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     context 'when it is an authenticated user' do | ||||||
|  |       before do | ||||||
|  |         agent_bot.avatar.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png') | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       it 'delete agent_bot avatar' do | ||||||
|  |         delete "/api/v1/accounts/#{account.id}/agent_bots/#{agent_bot.id}/avatar", | ||||||
|  |                headers: admin.create_new_auth_token, | ||||||
|  |                as: :json | ||||||
|  |  | ||||||
|  |         expect { agent_bot.avatar.attachment.reload }.to raise_error(ActiveRecord::RecordNotFound) | ||||||
|  |         expect(response).to have_http_status(:success) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -140,6 +140,26 @@ RSpec.describe 'Platform Agent Bot API', type: :request do | |||||||
|         data = response.parsed_body |         data = response.parsed_body | ||||||
|         expect(data['name']).to eq('test123') |         expect(data['name']).to eq('test123') | ||||||
|       end |       end | ||||||
|  |  | ||||||
|  |       it 'updates avatar' do | ||||||
|  |         # no avatar before upload | ||||||
|  |         create(:platform_app_permissible, platform_app: platform_app, permissible: agent_bot) | ||||||
|  |         expect(agent_bot.avatar.attached?).to be(false) | ||||||
|  |         file = fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png') | ||||||
|  |         patch "/platform/api/v1/agent_bots/#{agent_bot.id}", params: { name: 'test123' }.merge(avatar: file), | ||||||
|  |                                                              headers: { api_access_token: platform_app.access_token.token } | ||||||
|  |         expect(response).to have_http_status(:success) | ||||||
|  |         agent_bot.reload | ||||||
|  |         expect(agent_bot.avatar.attached?).to be(true) | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       it 'updated avatar with avatar_url' do | ||||||
|  |         create(:platform_app_permissible, platform_app: platform_app, permissible: agent_bot) | ||||||
|  |         patch "/platform/api/v1/agent_bots/#{agent_bot.id}", params: { name: 'test123' }.merge(avatar_url: 'http://example.com/avatar.png'), | ||||||
|  |                                                              headers: { api_access_token: platform_app.access_token.token } | ||||||
|  |         expect(response).to have_http_status(:success) | ||||||
|  |         expect(Avatar::AvatarFromUrlJob).to have_been_enqueued.with(agent_bot, 'http://example.com/avatar.png') | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @@ -169,4 +189,32 @@ RSpec.describe 'Platform Agent Bot API', type: :request do | |||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   describe 'DELETE /platform/api/v1/agent_bots/{agent_bot_id}/avatar' do | ||||||
|  |     context 'when it is an unauthenticated user' do | ||||||
|  |       it 'returns unauthorized' do | ||||||
|  |         delete "/platform/api/v1/agent_bots/#{agent_bot.id}/avatar" | ||||||
|  |  | ||||||
|  |         expect(response).to have_http_status(:unauthorized) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     context 'when it is an authenticated user' do | ||||||
|  |       let(:platform_app) { create(:platform_app) } | ||||||
|  |  | ||||||
|  |       before do | ||||||
|  |         agent_bot.avatar.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png') | ||||||
|  |         create(:platform_app_permissible, platform_app: platform_app, permissible: agent_bot) | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       it 'delete agent_bot avatar' do | ||||||
|  |         delete "/platform/api/v1/agent_bots/#{agent_bot.id}/avatar", | ||||||
|  |                headers: { api_access_token: platform_app.access_token.token }, | ||||||
|  |                as: :json | ||||||
|  |  | ||||||
|  |         expect { agent_bot.avatar.attachment.reload }.to raise_error(ActiveRecord::RecordNotFound) | ||||||
|  |         expect(response).to have_http_status(:success) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
| end | end | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sojan Jose
					Sojan Jose