diff --git a/.rubocop.yml b/.rubocop.yml index 1be7b1900..41ea6784f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -353,6 +353,7 @@ Metrics/ClassLength: - 'packages/forest_admin_datasource_rpc/lib/forest_admin_datasource_rpc/Utils/schema_polling_pool.rb' - 'packages/forest_admin_datasource_rpc/lib/forest_admin_datasource_rpc/Utils/sse_client.rb' - 'packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/routes/sse.rb' + - 'packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/agent.rb' Style/OpenStructUse: Exclude: diff --git a/packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/agent.rb b/packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/agent.rb index a99eccced..99883f0ba 100644 --- a/packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/agent.rb +++ b/packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/agent.rb @@ -12,6 +12,15 @@ def setup(options) @rpc_collections = [] @cached_schema = nil @cached_schema_hash = nil + @customizer = ForestAdminRpcAgent::DatasourceCustomizer.new + end + + def add_datasource(datasource, options = {}) + if options[:mark_collections_as_rpc] + options[:mark_collections_callback] = ->(ds) { mark_collections_as_rpc(*ds.collections.keys) } + end + + super end def send_schema(force: false) diff --git a/packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/datasource_customizer.rb b/packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/datasource_customizer.rb new file mode 100644 index 000000000..e11f6752f --- /dev/null +++ b/packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/datasource_customizer.rb @@ -0,0 +1,27 @@ +module ForestAdminRpcAgent + class DatasourceCustomizer < ForestAdminDatasourceCustomizer::DatasourceCustomizer + def add_datasource(datasource, options) + @stack.queue_customization(lambda { + if options[:include] || options[:exclude] + publication_decorator = Decorators::Publication::PublicationDatasourceDecorator.new(datasource) + publication_decorator.keep_collections_matching(options[:include], options[:exclude]) + datasource = publication_decorator + end + + if options[:rename] + rename_collection_decorator = Decorators::RenameCollection::RenameCollectionDatasourceDecorator.new( + datasource + ) + rename_collection_decorator.rename_collections(options[:rename]) + datasource = rename_collection_decorator + end + + options[:mark_collections_callback]&.call(datasource) + + @composite_datasource.add_data_source(datasource) + }) + + self + end + end +end