diff --git a/app/controllers/platform/api/v1/accounts_controller.rb b/app/controllers/platform/api/v1/accounts_controller.rb index 78143410f..2873cc22c 100644 --- a/app/controllers/platform/api/v1/accounts_controller.rb +++ b/app/controllers/platform/api/v1/accounts_controller.rb @@ -1,6 +1,7 @@ class Platform::Api::V1::AccountsController < PlatformController def create @resource = Account.new(account_params) + update_resource_features @resource.save! @platform_app.platform_app_permissibles.find_or_create_by(permissible: @resource) end @@ -8,7 +9,9 @@ class Platform::Api::V1::AccountsController < PlatformController def show; end def update - @resource.update!(account_params) + @resource.assign_attributes(account_params) + update_resource_features + @resource.save! end def destroy @@ -23,14 +26,18 @@ class Platform::Api::V1::AccountsController < PlatformController end def account_params - if permitted_params[:enabled_features] - return permitted_params.except(:enabled_features).merge(selected_feature_flags: permitted_params[:enabled_features].map(&:to_sym)) - end + permitted_params.except(:features) + end - permitted_params + def update_resource_features + return if permitted_params[:features].blank? + + permitted_params[:features].each do |key, value| + value.present? ? @resource.enable_features(key) : @resource.disable_features(key) + end end def permitted_params - params.permit(:name, :locale, enabled_features: [], limits: {}) + params.permit(:name, :locale, :domain, :support_email, :status, features: {}, limits: {}, custom_attributes: {}) end end diff --git a/app/models/concerns/featurable.rb b/app/models/concerns/featurable.rb index 5e6b8b8db..4b96f16b4 100644 --- a/app/models/concerns/featurable.rb +++ b/app/models/concerns/featurable.rb @@ -16,7 +16,7 @@ module Featurable include FlagShihTzu has_flags FEATURES.merge(column: 'feature_flags').merge(QUERY_MODE) - before_create :enable_default_features + after_initialize :enable_default_features end def enable_features(*names) diff --git a/spec/controllers/platform/api/v1/accounts_controller_spec.rb b/spec/controllers/platform/api/v1/accounts_controller_spec.rb index b854e44d4..7295c47c1 100644 --- a/spec/controllers/platform/api/v1/accounts_controller_spec.rb +++ b/spec/controllers/platform/api/v1/accounts_controller_spec.rb @@ -42,29 +42,28 @@ RSpec.describe 'Platform Accounts API', type: :request do json_response = JSON.parse(response.body) expect(json_response['name']).to eq('Test Account') expect(json_response['locale']).to eq('es') - expect(json_response['enabled_features']).to eq( - { - 'agent_management' => true - } - ) + expect(json_response['enabled_features']['agent_management']).to be(true) end it 'creates an account with feature flags' do InstallationConfig.where(name: 'ACCOUNT_LEVEL_FEATURE_DEFAULTS').first_or_create!(value: [{ 'name' => 'inbox_management', + 'enabled' => true }, + { 'name' => 'disable_branding', 'enabled' => true }]) - post '/platform/api/v1/accounts', params: { name: 'Test Account', enabled_features: %w[feature_ip_lookup feature_help_center] }, - headers: { api_access_token: platform_app.access_token.token }, as: :json + post '/platform/api/v1/accounts', params: { name: 'Test Account', features: { + ip_lookup: true, + help_center: true, + disable_branding: false + + } }, headers: { api_access_token: platform_app.access_token.token }, as: :json json_response = JSON.parse(response.body) expect(json_response['name']).to include('Test Account') - expect(json_response['enabled_features']).to eq( - { - 'inbox_management' => true, - 'ip_lookup' => true, - 'help_center' => true - } - ) + expect(json_response['enabled_features']['inbox_management']).to be(true) + expect(json_response['enabled_features']['ip_lookup']).to be(true) + expect(json_response['enabled_features']['help_center']).to be(true) + expect(json_response['enabled_features']['disable_branding']).to be_nil end it 'creates an account with limits settings' do @@ -141,19 +140,25 @@ RSpec.describe 'Platform Accounts API', type: :request do it 'updates an account when its permissible object' do create(:platform_app_permissible, platform_app: platform_app, permissible: account) + account.enable_features!('inbox_management', 'channel_facebook') patch "/platform/api/v1/accounts/#{account.id}", params: { name: 'Test Account', - enabled_features: %w[feature_ip_lookup feature_help_center], + features: { + ip_lookup: true, + help_center: true, + channel_facebook: false + }, limits: { agents: 5, inboxes: 10 } }, headers: { api_access_token: platform_app.access_token.token }, as: :json expect(response).to have_http_status(:success) - expect(account.reload.name).to eq('Test Account') - expect(account.reload.enabled_features['ip_lookup']).to be(true) - expect(account.reload.enabled_features['help_center']).to be(true) - expect(account.reload.limits['agents']).to eq(5) - expect(account.reload.limits['inboxes']).to eq(10) + account.reload + expect(account.name).to eq('Test Account') + expect(account.enabled_features.keys).to match_array(%w[inbox_management ip_lookup help_center]) + expect(account.enabled_features['channel_facebook']).to be_nil + expect(account.limits['agents']).to eq(5) + expect(account.limits['inboxes']).to eq(10) end end end