diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb b/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb index 872d74799..4e32b2940 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb @@ -26,6 +26,10 @@ def add_datasource(datasource, options = {}) self end + def remove_collection(names) + @customizer.remove_collection(names) + end + def add_chart(name, &definition) @customizer.add_chart(name, &definition) diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/http/router.rb b/packages/forest_admin_agent/lib/forest_admin_agent/http/router.rb index 10cb385bd..4bb101651 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/http/router.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/http/router.rb @@ -9,6 +9,7 @@ def self.routes api_charts_routes, System::HealthCheck.new.routes, Security::Authentication.new.routes, + Security::ScopeInvalidation.new.routes, Charts::Charts.new.routes, Resources::Count.new.routes, Resources::Delete.new.routes, diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/routes/security/scope_invalidation.rb b/packages/forest_admin_agent/lib/forest_admin_agent/routes/security/scope_invalidation.rb new file mode 100644 index 000000000..7eb1cc5df --- /dev/null +++ b/packages/forest_admin_agent/lib/forest_admin_agent/routes/security/scope_invalidation.rb @@ -0,0 +1,28 @@ +module ForestAdminAgent + module Routes + module Security + class ScopeInvalidation < AbstractRoute + include ForestAdminAgent::Builder + include ForestAdminAgent::Services + def setup_routes + add_route( + 'forest_scope_invalidation', + 'POST', + '/scope-cache-invalidation', + ->(args) { handle_request(args) } + ) + + self + end + + def handle_request(args) + # Check if user is logged + Utils::QueryStringParser.parse_caller(args) + Permissions.invalidate_cache('forest.scopes') + + { content: nil, status: 204 } + end + end + end + end +end diff --git a/packages/forest_admin_agent/spec/lib/forest_admin_agent/routes/security/scope_invalidation_spec.rb b/packages/forest_admin_agent/spec/lib/forest_admin_agent/routes/security/scope_invalidation_spec.rb new file mode 100644 index 000000000..a65fbcdbf --- /dev/null +++ b/packages/forest_admin_agent/spec/lib/forest_admin_agent/routes/security/scope_invalidation_spec.rb @@ -0,0 +1,50 @@ +require 'spec_helper' +require 'shared/caller' + +module ForestAdminAgent + module Routes + module Security + describe ScopeInvalidation do + include_context 'with caller' + subject(:scope_invalidation) { described_class.new } + + context 'when setup the routes' do + it 'adds the route forest_scope_invalidation' do + scope_invalidation.setup_routes + expect(scope_invalidation.routes.include?('forest_scope_invalidation')).to be true + expect(scope_invalidation.routes.length).to eq 1 + end + end + + context 'when handle the scope invalidation' do + let(:args) do + { + headers: { 'HTTP_AUTHORIZATION' => bearer }, + params: { + 'collection_name' => 'user', + 'timezone' => 'Europe/Paris' + } + } + end + let(:permissions) { class_double(ForestAdminAgent::Services::Permissions).as_stubbed_const } + + before do + allow(permissions).to receive(:invalidate_cache).with(any_args).and_return(nil) + end + + it 'return 204 response' do + result = scope_invalidation.handle_request(args) + expect(result[:content]).to be_nil + expect(result[:status]).to eq 204 + end + + it 'call the invalidate_cache method' do + scope_invalidation.handle_request(args) + + expect(permissions).to have_received(:invalidate_cache).with('forest.scopes') + end + end + end + end + end +end