feat(lifecycle): expose concierge config update on UnitsController
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
0b195781c5
commit
fa1dd8b6cb
@ -1,9 +1,10 @@
|
|||||||
class Api::V1::Accounts::Captain::UnitsController < Api::V1::Accounts::BaseController
|
class Api::V1::Accounts::Captain::UnitsController < Api::V1::Accounts::BaseController
|
||||||
before_action :ensure_captain_enabled
|
before_action :ensure_captain_enabled
|
||||||
before_action :set_unit, only: [:show, :update, :destroy]
|
before_action :set_unit, only: [:show, :update, :destroy, :update_concierge]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@units = Current.account.captain_units.includes(:inboxes)
|
@units = Current.account.captain_units.includes(:inboxes)
|
||||||
|
@units = filter_units_by_user_access(@units)
|
||||||
render json: @units.map { |u| format_unit(u) }
|
render json: @units.map { |u| format_unit(u) }
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -38,12 +39,32 @@ class Api::V1::Accounts::Captain::UnitsController < Api::V1::Accounts::BaseContr
|
|||||||
head :no_content
|
head :no_content
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_concierge
|
||||||
|
return render json: { error: 'Unauthorized' }, status: :unauthorized unless Current.user.administrator?
|
||||||
|
|
||||||
|
@unit.update!(concierge_params)
|
||||||
|
render json: format_unit(@unit)
|
||||||
|
rescue ActiveRecord::RecordInvalid
|
||||||
|
render json: { errors: @unit.errors.full_messages }, status: :unprocessable_entity
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def ensure_captain_enabled
|
def ensure_captain_enabled
|
||||||
# Dependendo da regra de negócio, pode-se verificar as features da conta aqui original
|
# Dependendo da regra de negócio, pode-se verificar as features da conta aqui original
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Administrador vê todas as unidades; agente só vê unidades vinculadas a
|
||||||
|
# alguma caixa de entrada a qual ele tem acesso.
|
||||||
|
def filter_units_by_user_access(scope)
|
||||||
|
return scope if Current.user.administrator?
|
||||||
|
|
||||||
|
accessible_inbox_ids = Current.user.assigned_inboxes.pluck(:id)
|
||||||
|
return scope.none if accessible_inbox_ids.empty?
|
||||||
|
|
||||||
|
scope.joins(:inboxes).where(inboxes: { id: accessible_inbox_ids }).distinct
|
||||||
|
end
|
||||||
|
|
||||||
def default_brand
|
def default_brand
|
||||||
@default_brand ||= Captain::Brand.where(account_id: Current.account.id).first ||
|
@default_brand ||= Captain::Brand.where(account_id: Current.account.id).first ||
|
||||||
Captain::Brand.create!(
|
Captain::Brand.create!(
|
||||||
@ -69,6 +90,13 @@ class Api::V1::Accounts::Captain::UnitsController < Api::V1::Accounts::BaseContr
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def concierge_params
|
||||||
|
params.require(:captain_unit).permit(
|
||||||
|
:concierge_inbox_id,
|
||||||
|
concierge_config: [:persona_name, :knowledge, { variables: {} }]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def inbox_ids_param
|
def inbox_ids_param
|
||||||
return [] unless params[:captain_unit].key?(:inbox_ids)
|
return [] unless params[:captain_unit].key?(:inbox_ids)
|
||||||
|
|
||||||
@ -90,7 +118,7 @@ class Api::V1::Accounts::Captain::UnitsController < Api::V1::Accounts::BaseContr
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def format_unit(unit)
|
def format_unit(unit) # rubocop:disable Metrics/AbcSize
|
||||||
inboxes = unit.inboxes.to_a
|
inboxes = unit.inboxes.to_a
|
||||||
{
|
{
|
||||||
id: unit.id,
|
id: unit.id,
|
||||||
@ -107,6 +135,13 @@ class Api::V1::Accounts::Captain::UnitsController < Api::V1::Accounts::BaseContr
|
|||||||
has_key: unit.inter_key_content.present? || unit.resolved_inter_key_path.present?,
|
has_key: unit.inter_key_content.present? || unit.resolved_inter_key_path.present?,
|
||||||
has_client_secret: unit.inter_client_secret.present?,
|
has_client_secret: unit.inter_client_secret.present?,
|
||||||
proactive_pix_polling_enabled: unit.proactive_pix_polling_enabled
|
proactive_pix_polling_enabled: unit.proactive_pix_polling_enabled
|
||||||
|
}.merge(format_concierge(unit))
|
||||||
|
end
|
||||||
|
|
||||||
|
def format_concierge(unit)
|
||||||
|
{
|
||||||
|
concierge_inbox_id: unit.concierge_inbox_id,
|
||||||
|
concierge_config: unit.concierge_config || {}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -80,4 +80,44 @@ RSpec.describe 'Api::V1::Accounts::Captain::Units', type: :request do
|
|||||||
expect(Captain::Unit.last.captain_brand_id).to eq(brands.first.id)
|
expect(Captain::Unit.last.captain_brand_id).to eq(brands.first.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'PATCH /api/v1/accounts/:account_id/captain/units/:id/concierge' do
|
||||||
|
let(:agent) { create(:user, account: account, role: :agent) }
|
||||||
|
let(:unit) do
|
||||||
|
Captain::Unit.create!(
|
||||||
|
account: account,
|
||||||
|
brand: Captain::Brand.where(account: account).first,
|
||||||
|
name: 'Unidade Teste'
|
||||||
|
)
|
||||||
|
end
|
||||||
|
let(:inbox) { create(:inbox, account: account) }
|
||||||
|
|
||||||
|
it 'blocks agents' do
|
||||||
|
patch "/api/v1/accounts/#{account.id}/captain/units/#{unit.id}/concierge",
|
||||||
|
params: { captain_unit: { concierge_inbox_id: inbox.id } },
|
||||||
|
headers: agent.create_new_auth_token, as: :json
|
||||||
|
expect(response).to have_http_status(:unauthorized)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'updates concierge fields for admin' do
|
||||||
|
patch "/api/v1/accounts/#{account.id}/captain/units/#{unit.id}/concierge",
|
||||||
|
params: {
|
||||||
|
captain_unit: {
|
||||||
|
concierge_inbox_id: inbox.id,
|
||||||
|
concierge_config: {
|
||||||
|
persona_name: 'Sofia',
|
||||||
|
knowledge: '# Hotel\n',
|
||||||
|
variables: { wifi_password: 'abc123' }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
headers: admin.create_new_auth_token, as: :json
|
||||||
|
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
unit.reload
|
||||||
|
expect(unit.concierge_inbox_id).to eq(inbox.id)
|
||||||
|
expect(unit.concierge_config['persona_name']).to eq('Sofia')
|
||||||
|
expect(unit.concierge_config.dig('variables', 'wifi_password')).to eq('abc123')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user