@rebasepro/server-mongodb 0.0.1-canary.09e5ec5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +6 -0
- package/dist/ensure-collections-CNrcwVgY.js +74 -0
- package/dist/ensure-collections-CNrcwVgY.js.map +1 -0
- package/dist/ensure-history-collection-DBIiwmCm.js +15 -0
- package/dist/ensure-history-collection-DBIiwmCm.js.map +1 -0
- package/dist/index.es.js +1734 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +2043 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/server-core/src/api/ast-schema-editor.d.ts +22 -0
- package/dist/server-core/src/api/ast-schema-editor.d.ts.map +1 -0
- package/dist/server-core/src/api/errors.d.ts +36 -0
- package/dist/server-core/src/api/errors.d.ts.map +1 -0
- package/dist/server-core/src/api/graphql/graphql-schema-generator.d.ts +36 -0
- package/dist/server-core/src/api/graphql/graphql-schema-generator.d.ts.map +1 -0
- package/dist/server-core/src/api/graphql/index.d.ts +2 -0
- package/dist/server-core/src/api/graphql/index.d.ts.map +1 -0
- package/dist/server-core/src/api/index.d.ts +10 -0
- package/dist/server-core/src/api/index.d.ts.map +1 -0
- package/dist/server-core/src/api/openapi-generator.d.ts +17 -0
- package/dist/server-core/src/api/openapi-generator.d.ts.map +1 -0
- package/dist/server-core/src/api/rest/api-generator.d.ts +65 -0
- package/dist/server-core/src/api/rest/api-generator.d.ts.map +1 -0
- package/dist/server-core/src/api/rest/index.d.ts +2 -0
- package/dist/server-core/src/api/rest/index.d.ts.map +1 -0
- package/dist/server-core/src/api/rest/query-parser.d.ts +10 -0
- package/dist/server-core/src/api/rest/query-parser.d.ts.map +1 -0
- package/dist/server-core/src/api/schema-editor-routes.d.ts +4 -0
- package/dist/server-core/src/api/schema-editor-routes.d.ts.map +1 -0
- package/dist/server-core/src/api/server.d.ts +41 -0
- package/dist/server-core/src/api/server.d.ts.map +1 -0
- package/dist/server-core/src/api/types.d.ts +91 -0
- package/dist/server-core/src/api/types.d.ts.map +1 -0
- package/dist/server-core/src/auth/admin-routes.d.ts +17 -0
- package/dist/server-core/src/auth/admin-routes.d.ts.map +1 -0
- package/dist/server-core/src/auth/apple-oauth.d.ts +31 -0
- package/dist/server-core/src/auth/apple-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/bitbucket-oauth.d.ts +12 -0
- package/dist/server-core/src/auth/bitbucket-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/discord-oauth.d.ts +15 -0
- package/dist/server-core/src/auth/discord-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/facebook-oauth.d.ts +15 -0
- package/dist/server-core/src/auth/facebook-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/github-oauth.d.ts +16 -0
- package/dist/server-core/src/auth/github-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/gitlab-oauth.d.ts +14 -0
- package/dist/server-core/src/auth/gitlab-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/google-oauth.d.ts +15 -0
- package/dist/server-core/src/auth/google-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/index.d.ts +24 -0
- package/dist/server-core/src/auth/index.d.ts.map +1 -0
- package/dist/server-core/src/auth/interfaces.d.ts +310 -0
- package/dist/server-core/src/auth/interfaces.d.ts.map +1 -0
- package/dist/server-core/src/auth/jwt.d.ts +44 -0
- package/dist/server-core/src/auth/jwt.d.ts.map +1 -0
- package/dist/server-core/src/auth/linkedin-oauth.d.ts +19 -0
- package/dist/server-core/src/auth/linkedin-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/microsoft-oauth.d.ts +17 -0
- package/dist/server-core/src/auth/microsoft-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/middleware.d.ts +82 -0
- package/dist/server-core/src/auth/middleware.d.ts.map +1 -0
- package/dist/server-core/src/auth/password.d.ts +23 -0
- package/dist/server-core/src/auth/password.d.ts.map +1 -0
- package/dist/server-core/src/auth/rate-limiter.d.ts +32 -0
- package/dist/server-core/src/auth/rate-limiter.d.ts.map +1 -0
- package/dist/server-core/src/auth/routes.d.ts +28 -0
- package/dist/server-core/src/auth/routes.d.ts.map +1 -0
- package/dist/server-core/src/auth/slack-oauth.d.ts +13 -0
- package/dist/server-core/src/auth/slack-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/spotify-oauth.d.ts +13 -0
- package/dist/server-core/src/auth/spotify-oauth.d.ts.map +1 -0
- package/dist/server-core/src/auth/twitter-oauth.d.ts +19 -0
- package/dist/server-core/src/auth/twitter-oauth.d.ts.map +1 -0
- package/dist/server-core/src/collections/BackendCollectionRegistry.d.ts +14 -0
- package/dist/server-core/src/collections/BackendCollectionRegistry.d.ts.map +1 -0
- package/dist/server-core/src/collections/loader.d.ts +6 -0
- package/dist/server-core/src/collections/loader.d.ts.map +1 -0
- package/dist/server-core/src/cron/cron-loader.d.ts +18 -0
- package/dist/server-core/src/cron/cron-loader.d.ts.map +1 -0
- package/dist/server-core/src/cron/cron-routes.d.ts +15 -0
- package/dist/server-core/src/cron/cron-routes.d.ts.map +1 -0
- package/dist/server-core/src/cron/cron-scheduler.d.ts +62 -0
- package/dist/server-core/src/cron/cron-scheduler.d.ts.map +1 -0
- package/dist/server-core/src/cron/cron-store.d.ts +33 -0
- package/dist/server-core/src/cron/cron-store.d.ts.map +1 -0
- package/dist/server-core/src/cron/index.d.ts +7 -0
- package/dist/server-core/src/cron/index.d.ts.map +1 -0
- package/dist/server-core/src/db/interfaces.d.ts +19 -0
- package/dist/server-core/src/db/interfaces.d.ts.map +1 -0
- package/dist/server-core/src/email/index.d.ts +7 -0
- package/dist/server-core/src/email/index.d.ts.map +1 -0
- package/dist/server-core/src/email/smtp-email-service.d.ts +26 -0
- package/dist/server-core/src/email/smtp-email-service.d.ts.map +1 -0
- package/dist/server-core/src/email/templates.d.ts +43 -0
- package/dist/server-core/src/email/templates.d.ts.map +1 -0
- package/dist/server-core/src/email/types.d.ts +108 -0
- package/dist/server-core/src/email/types.d.ts.map +1 -0
- package/dist/server-core/src/functions/function-loader.d.ts +18 -0
- package/dist/server-core/src/functions/function-loader.d.ts.map +1 -0
- package/dist/server-core/src/functions/function-routes.d.ts +11 -0
- package/dist/server-core/src/functions/function-routes.d.ts.map +1 -0
- package/dist/server-core/src/functions/index.d.ts +4 -0
- package/dist/server-core/src/functions/index.d.ts.map +1 -0
- package/dist/server-core/src/history/history-routes.d.ts +24 -0
- package/dist/server-core/src/history/history-routes.d.ts.map +1 -0
- package/dist/server-core/src/history/index.d.ts +2 -0
- package/dist/server-core/src/history/index.d.ts.map +1 -0
- package/dist/server-core/src/index.d.ts +30 -0
- package/dist/server-core/src/index.d.ts.map +1 -0
- package/dist/server-core/src/init.d.ts +160 -0
- package/dist/server-core/src/init.d.ts.map +1 -0
- package/dist/server-core/src/serve-spa.d.ts +31 -0
- package/dist/server-core/src/serve-spa.d.ts.map +1 -0
- package/dist/server-core/src/services/driver-registry.d.ts +79 -0
- package/dist/server-core/src/services/driver-registry.d.ts.map +1 -0
- package/dist/server-core/src/singleton.d.ts +36 -0
- package/dist/server-core/src/singleton.d.ts.map +1 -0
- package/dist/server-core/src/storage/LocalStorageController.d.ts +47 -0
- package/dist/server-core/src/storage/LocalStorageController.d.ts.map +1 -0
- package/dist/server-core/src/storage/S3StorageController.d.ts +37 -0
- package/dist/server-core/src/storage/S3StorageController.d.ts.map +1 -0
- package/dist/server-core/src/storage/index.d.ts +26 -0
- package/dist/server-core/src/storage/index.d.ts.map +1 -0
- package/dist/server-core/src/storage/routes.d.ts +39 -0
- package/dist/server-core/src/storage/routes.d.ts.map +1 -0
- package/dist/server-core/src/storage/storage-registry.d.ts +79 -0
- package/dist/server-core/src/storage/storage-registry.d.ts.map +1 -0
- package/dist/server-core/src/storage/types.d.ts +104 -0
- package/dist/server-core/src/storage/types.d.ts.map +1 -0
- package/dist/server-core/src/types/index.d.ts +12 -0
- package/dist/server-core/src/types/index.d.ts.map +1 -0
- package/dist/server-core/src/utils/dev-port.d.ts +36 -0
- package/dist/server-core/src/utils/dev-port.d.ts.map +1 -0
- package/dist/server-core/src/utils/logger.d.ts +32 -0
- package/dist/server-core/src/utils/logger.d.ts.map +1 -0
- package/dist/server-core/src/utils/logging.d.ts +10 -0
- package/dist/server-core/src/utils/logging.d.ts.map +1 -0
- package/dist/server-core/src/utils/request-logger.d.ts +20 -0
- package/dist/server-core/src/utils/request-logger.d.ts.map +1 -0
- package/dist/server-core/src/utils/sql.d.ts +28 -0
- package/dist/server-core/src/utils/sql.d.ts.map +1 -0
- package/dist/server-mongodb/src/MongoBootstrapper.d.ts +18 -0
- package/dist/server-mongodb/src/MongoBootstrapper.d.ts.map +1 -0
- package/dist/server-mongodb/src/auth/ensure-collections.d.ts +3 -0
- package/dist/server-mongodb/src/auth/ensure-collections.d.ts.map +1 -0
- package/dist/server-mongodb/src/auth/services.d.ts +135 -0
- package/dist/server-mongodb/src/auth/services.d.ts.map +1 -0
- package/dist/server-mongodb/src/connection.d.ts +35 -0
- package/dist/server-mongodb/src/connection.d.ts.map +1 -0
- package/dist/server-mongodb/src/db/MongoConditionBuilder.d.ts +64 -0
- package/dist/server-mongodb/src/db/MongoConditionBuilder.d.ts.map +1 -0
- package/dist/server-mongodb/src/db/MongoEntityService.d.ts +98 -0
- package/dist/server-mongodb/src/db/MongoEntityService.d.ts.map +1 -0
- package/dist/server-mongodb/src/factory.d.ts +142 -0
- package/dist/server-mongodb/src/factory.d.ts.map +1 -0
- package/dist/server-mongodb/src/history/ensure-history-collection.d.ts +3 -0
- package/dist/server-mongodb/src/history/ensure-history-collection.d.ts.map +1 -0
- package/dist/server-mongodb/src/index.d.ts +18 -0
- package/dist/server-mongodb/src/index.d.ts.map +1 -0
- package/dist/server-mongodb/src/services/MongoDriver.d.ts +83 -0
- package/dist/server-mongodb/src/services/MongoDriver.d.ts.map +1 -0
- package/dist/server-mongodb/src/services/MongoHistoryService.d.ts +37 -0
- package/dist/server-mongodb/src/services/MongoHistoryService.d.ts.map +1 -0
- package/dist/server-mongodb/src/services/MongoRealtimeService.d.ts +86 -0
- package/dist/server-mongodb/src/services/MongoRealtimeService.d.ts.map +1 -0
- package/dist/server-mongodb/src/useMongoDriver.d.ts +18 -0
- package/dist/server-mongodb/src/useMongoDriver.d.ts.map +1 -0
- package/dist/server-mongodb/src/utils.d.ts +10 -0
- package/dist/server-mongodb/src/utils.d.ts.map +1 -0
- package/dist/server-mongodb/src/websocket.d.ts +7 -0
- package/dist/server-mongodb/src/websocket.d.ts.map +1 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +8 -0
- package/dist/types/src/controllers/analytics_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/auth.d.ts +120 -0
- package/dist/types/src/controllers/auth.d.ts.map +1 -0
- package/dist/types/src/controllers/client.d.ts +171 -0
- package/dist/types/src/controllers/client.d.ts.map +1 -0
- package/dist/types/src/controllers/collection_registry.d.ts +46 -0
- package/dist/types/src/controllers/collection_registry.d.ts.map +1 -0
- package/dist/types/src/controllers/customization_controller.d.ts +61 -0
- package/dist/types/src/controllers/customization_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/data.d.ts +169 -0
- package/dist/types/src/controllers/data.d.ts.map +1 -0
- package/dist/types/src/controllers/data_driver.d.ts +161 -0
- package/dist/types/src/controllers/data_driver.d.ts.map +1 -0
- package/dist/types/src/controllers/database_admin.d.ts +12 -0
- package/dist/types/src/controllers/database_admin.d.ts.map +1 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts +37 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/effective_role.d.ts +5 -0
- package/dist/types/src/controllers/effective_role.d.ts.map +1 -0
- package/dist/types/src/controllers/email.d.ts +35 -0
- package/dist/types/src/controllers/email.d.ts.map +1 -0
- package/dist/types/src/controllers/index.d.ts +19 -0
- package/dist/types/src/controllers/index.d.ts.map +1 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts +21 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts.map +1 -0
- package/dist/types/src/controllers/navigation.d.ts +214 -0
- package/dist/types/src/controllers/navigation.d.ts.map +1 -0
- package/dist/types/src/controllers/registry.d.ts +55 -0
- package/dist/types/src/controllers/registry.d.ts.map +1 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +68 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts +91 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/snackbar.d.ts +25 -0
- package/dist/types/src/controllers/snackbar.d.ts.map +1 -0
- package/dist/types/src/controllers/storage.d.ts +172 -0
- package/dist/types/src/controllers/storage.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +5 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/rebase_context.d.ts +106 -0
- package/dist/types/src/rebase_context.d.ts.map +1 -0
- package/dist/types/src/types/backend.d.ts +537 -0
- package/dist/types/src/types/backend.d.ts.map +1 -0
- package/dist/types/src/types/builders.d.ts +16 -0
- package/dist/types/src/types/builders.d.ts.map +1 -0
- package/dist/types/src/types/chips.d.ts +6 -0
- package/dist/types/src/types/chips.d.ts.map +1 -0
- package/dist/types/src/types/collections.d.ts +857 -0
- package/dist/types/src/types/collections.d.ts.map +1 -0
- package/dist/types/src/types/cron.d.ts +103 -0
- package/dist/types/src/types/cron.d.ts.map +1 -0
- package/dist/types/src/types/data_source.d.ts +65 -0
- package/dist/types/src/types/data_source.d.ts.map +1 -0
- package/dist/types/src/types/entities.d.ts +146 -0
- package/dist/types/src/types/entities.d.ts.map +1 -0
- package/dist/types/src/types/entity_actions.d.ts +99 -0
- package/dist/types/src/types/entity_actions.d.ts.map +1 -0
- package/dist/types/src/types/entity_callbacks.d.ts +174 -0
- package/dist/types/src/types/entity_callbacks.d.ts.map +1 -0
- package/dist/types/src/types/entity_link_builder.d.ts +8 -0
- package/dist/types/src/types/entity_link_builder.d.ts.map +1 -0
- package/dist/types/src/types/entity_overrides.d.ts +11 -0
- package/dist/types/src/types/entity_overrides.d.ts.map +1 -0
- package/dist/types/src/types/entity_views.d.ts +62 -0
- package/dist/types/src/types/entity_views.d.ts.map +1 -0
- package/dist/types/src/types/export_import.d.ts +22 -0
- package/dist/types/src/types/export_import.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +24 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/types/locales.d.ts +5 -0
- package/dist/types/src/types/locales.d.ts.map +1 -0
- package/dist/types/src/types/modify_collections.d.ts +6 -0
- package/dist/types/src/types/modify_collections.d.ts.map +1 -0
- package/dist/types/src/types/plugins.d.ts +280 -0
- package/dist/types/src/types/plugins.d.ts.map +1 -0
- package/dist/types/src/types/properties.d.ts +1177 -0
- package/dist/types/src/types/properties.d.ts.map +1 -0
- package/dist/types/src/types/property_config.d.ts +71 -0
- package/dist/types/src/types/property_config.d.ts.map +1 -0
- package/dist/types/src/types/relations.d.ts +337 -0
- package/dist/types/src/types/relations.d.ts.map +1 -0
- package/dist/types/src/types/slots.d.ts +253 -0
- package/dist/types/src/types/slots.d.ts.map +1 -0
- package/dist/types/src/types/translations.d.ts +871 -0
- package/dist/types/src/types/translations.d.ts.map +1 -0
- package/dist/types/src/types/user_management_delegate.d.ts +122 -0
- package/dist/types/src/types/user_management_delegate.d.ts.map +1 -0
- package/dist/types/src/types/websockets.d.ts +79 -0
- package/dist/types/src/types/websockets.d.ts.map +1 -0
- package/dist/types/src/users/index.d.ts +3 -0
- package/dist/types/src/users/index.d.ts.map +1 -0
- package/dist/types/src/users/roles.d.ts +23 -0
- package/dist/types/src/users/roles.d.ts.map +1 -0
- package/dist/types/src/users/user.d.ts +47 -0
- package/dist/types/src/users/user.d.ts.map +1 -0
- package/dist/websocket-BZlPuJrt.js +220 -0
- package/dist/websocket-BZlPuJrt.js.map +1 -0
- package/package.json +79 -0
- package/src/MongoBootstrapper.ts +177 -0
- package/src/auth/ensure-collections.ts +94 -0
- package/src/auth/services.ts +638 -0
- package/src/connection.ts +60 -0
- package/src/db/MongoConditionBuilder.ts +181 -0
- package/src/db/MongoEntityService.ts +350 -0
- package/src/factory.ts +289 -0
- package/src/history/ensure-history-collection.ts +19 -0
- package/src/index.ts +25 -0
- package/src/services/MongoDriver.ts +297 -0
- package/src/services/MongoDriver.ts.backup +266 -0
- package/src/services/MongoHistoryService.ts +154 -0
- package/src/services/MongoRealtimeService.ts +394 -0
- package/src/useMongoDriver.ts +519 -0
- package/src/utils.ts +28 -0
- package/src/websocket.ts +257 -0
package/src/factory.ts
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB Backend Factory
|
|
3
|
+
*
|
|
4
|
+
* This module provides factory functions for creating MongoDB backend instances.
|
|
5
|
+
* It abstracts the creation of drivers, realtime services, and entity services.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Db, MongoClient } from "mongodb";
|
|
9
|
+
import { DataDriver, EntityCollection } from "@rebasepro/types";
|
|
10
|
+
|
|
11
|
+
import { MongoEntityService } from "./db/MongoEntityService";
|
|
12
|
+
import { MongoRealtimeService } from "./services/MongoRealtimeService";
|
|
13
|
+
import { MongoDriver } from "./services/MongoDriver";
|
|
14
|
+
import { MongoHistoryService, HistoryRetentionConfig } from "./services/MongoHistoryService";
|
|
15
|
+
import { MongoDBConnection } from "./connection";
|
|
16
|
+
import { BackendConfig, BackendInstance, CollectionRegistryInterface, EntityRepository, RealtimeProvider, DatabaseConnection, DatabaseAdmin, DocumentAdmin, SchemaAdmin, HealthCheckResult } from "@rebasepro/types";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Configuration for creating a MongoDB backend.
|
|
20
|
+
*/
|
|
21
|
+
export interface MongoBackendConfig extends BackendConfig {
|
|
22
|
+
type: "mongodb";
|
|
23
|
+
/** MongoDB database instance */
|
|
24
|
+
connection: Db;
|
|
25
|
+
/** MongoDB client (for connection management) */
|
|
26
|
+
client: MongoClient;
|
|
27
|
+
/** Collections to register (optional, can be registered later) */
|
|
28
|
+
collections?: EntityCollection[];
|
|
29
|
+
/** History retention configuration */
|
|
30
|
+
historyRetention?: Partial<HistoryRetentionConfig>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* MongoDB-specific backend instance with additional MongoDB types.
|
|
35
|
+
*/
|
|
36
|
+
export interface MongoBackendInstance extends BackendInstance {
|
|
37
|
+
/** The MongoDB database instance */
|
|
38
|
+
db: Db;
|
|
39
|
+
/** The MongoDB client */
|
|
40
|
+
client: MongoClient;
|
|
41
|
+
/** MongoDB DataDriver for use with Rebase */
|
|
42
|
+
driver: DataDriver;
|
|
43
|
+
/** Entity service for direct database operations */
|
|
44
|
+
entityService: MongoEntityService;
|
|
45
|
+
/** Realtime service for subscriptions */
|
|
46
|
+
realtimeService: MongoRealtimeService;
|
|
47
|
+
/** Admin capabilities (DocumentAdmin + SchemaAdmin) */
|
|
48
|
+
admin: DatabaseAdmin;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// =============================================================================
|
|
52
|
+
// Simple Collection Registry
|
|
53
|
+
// =============================================================================
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Simple in-memory collection registry for MongoDB.
|
|
57
|
+
*/
|
|
58
|
+
export class MongoCollectionRegistry implements CollectionRegistryInterface {
|
|
59
|
+
private collections = new Map<string, EntityCollection>();
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Register a collection
|
|
63
|
+
*/
|
|
64
|
+
register(collection: EntityCollection): void {
|
|
65
|
+
this.collections.set(collection.name, collection);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Get a collection by its path
|
|
70
|
+
*/
|
|
71
|
+
getCollectionByPath(path: string): EntityCollection | undefined {
|
|
72
|
+
return this.collections.get(path);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Get all registered collections
|
|
77
|
+
*/
|
|
78
|
+
getCollections(): EntityCollection[] {
|
|
79
|
+
return Array.from(this.collections.values());
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// =============================================================================
|
|
84
|
+
// Factory Functions
|
|
85
|
+
// =============================================================================
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Create a complete MongoDB backend instance.
|
|
89
|
+
*
|
|
90
|
+
* This factory function creates all the necessary services for a MongoDB backend:
|
|
91
|
+
* - MongoDBConnection (database connection wrapper)
|
|
92
|
+
* - MongoEntityService (implements EntityRepository)
|
|
93
|
+
* - MongoRealtimeService (implements RealtimeProvider)
|
|
94
|
+
* - MongoCollectionRegistry (implements CollectionRegistryInterface)
|
|
95
|
+
* - MongoDriver (for Rebase integration)
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* import { createMongoBackend } from "@rebasepro/server-mongodb";
|
|
100
|
+
*
|
|
101
|
+
* const client = new MongoClient("mongodb://localhost:27017");
|
|
102
|
+
* await client.connect();
|
|
103
|
+
* const db = client.db("my_database");
|
|
104
|
+
*
|
|
105
|
+
* const backend = createMongoBackend({
|
|
106
|
+
* type: "mongodb",
|
|
107
|
+
* connection: db,
|
|
108
|
+
* client: client,
|
|
109
|
+
* collections: myCollections
|
|
110
|
+
* });
|
|
111
|
+
*
|
|
112
|
+
* // Use the backend
|
|
113
|
+
* const entities = await backend.entityRepository.fetchCollection("users", {});
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export function createMongoBackend(config: MongoBackendConfig): MongoBackendInstance {
|
|
117
|
+
const { connection: db, client, collections } = config;
|
|
118
|
+
|
|
119
|
+
// Create collection registry
|
|
120
|
+
const collectionRegistry = new MongoCollectionRegistry();
|
|
121
|
+
|
|
122
|
+
// Register collections if provided
|
|
123
|
+
if (collections) {
|
|
124
|
+
collections.forEach(collection => collectionRegistry.register(collection));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Create services
|
|
128
|
+
const entityService = new MongoEntityService(db);
|
|
129
|
+
const realtimeService = new MongoRealtimeService(db);
|
|
130
|
+
const historyService = new MongoHistoryService(db, config.historyRetention);
|
|
131
|
+
const driver = new MongoDriver(db, realtimeService, historyService);
|
|
132
|
+
const mongoConnection = new MongoDBConnection(db, client);
|
|
133
|
+
|
|
134
|
+
// Build admin capabilities for MongoDB
|
|
135
|
+
const admin: DatabaseAdmin = {
|
|
136
|
+
async executeAggregate(pipeline: Record<string, unknown>[]) {
|
|
137
|
+
// Run aggregation on a collection — requires a target collection
|
|
138
|
+
// from the pipeline's $match or $lookup stage:
|
|
139
|
+
const firstStage = pipeline[0];
|
|
140
|
+
const collName = typeof firstStage.$from === "string" ? firstStage.$from : "__admin__";
|
|
141
|
+
const cursor = db.collection(collName).aggregate(pipeline);
|
|
142
|
+
return await cursor.toArray() as Record<string, unknown>[];
|
|
143
|
+
},
|
|
144
|
+
async fetchCollectionStats(collectionName: string) {
|
|
145
|
+
const stats = await db.command({ collStats: collectionName }) as { count: number; size: number };
|
|
146
|
+
return { count: stats.count,
|
|
147
|
+
sizeBytes: stats.size };
|
|
148
|
+
},
|
|
149
|
+
async fetchUnmappedTables(mappedPaths?: string[]) {
|
|
150
|
+
const allCollections = await db.listCollections().toArray();
|
|
151
|
+
const names = allCollections.map(c => c.name).filter(n => !n.startsWith("system."));
|
|
152
|
+
if (!mappedPaths || mappedPaths.length === 0) return names;
|
|
153
|
+
const mappedSet = new Set(mappedPaths.map(p => p.toLowerCase()));
|
|
154
|
+
return names.filter(n => !mappedSet.has(n.toLowerCase()));
|
|
155
|
+
},
|
|
156
|
+
async fetchTableMetadata(collectionName: string) {
|
|
157
|
+
// Sample a document to infer fields
|
|
158
|
+
const sample = await db.collection(collectionName).findOne();
|
|
159
|
+
if (!sample) return { columns: [],
|
|
160
|
+
foreignKeys: [],
|
|
161
|
+
junctions: [],
|
|
162
|
+
policies: [] };
|
|
163
|
+
const columns = Object.entries(sample).map(([key, value]) => ({
|
|
164
|
+
column_name: key,
|
|
165
|
+
data_type: typeof value,
|
|
166
|
+
udt_name: typeof value,
|
|
167
|
+
is_nullable: "YES",
|
|
168
|
+
column_default: null,
|
|
169
|
+
character_maximum_length: null
|
|
170
|
+
}));
|
|
171
|
+
return { columns,
|
|
172
|
+
foreignKeys: [],
|
|
173
|
+
junctions: [],
|
|
174
|
+
policies: [] };
|
|
175
|
+
}
|
|
176
|
+
} satisfies DocumentAdmin & SchemaAdmin;
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
// Abstract interface implementations
|
|
180
|
+
connection: mongoConnection,
|
|
181
|
+
entityRepository: entityService,
|
|
182
|
+
realtimeProvider: realtimeService,
|
|
183
|
+
collectionRegistry: collectionRegistry,
|
|
184
|
+
admin,
|
|
185
|
+
|
|
186
|
+
// Lifecycle
|
|
187
|
+
async initialize() {
|
|
188
|
+
// Connection is already established via the MongoClient constructor
|
|
189
|
+
},
|
|
190
|
+
async healthCheck(): Promise<HealthCheckResult> {
|
|
191
|
+
const start = Date.now();
|
|
192
|
+
try {
|
|
193
|
+
await db.command({ ping: 1 });
|
|
194
|
+
return { healthy: true,
|
|
195
|
+
latencyMs: Date.now() - start };
|
|
196
|
+
} catch {
|
|
197
|
+
return { healthy: false,
|
|
198
|
+
latencyMs: Date.now() - start };
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
async destroy() {
|
|
202
|
+
await client.close();
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
// MongoDB-specific accessors
|
|
206
|
+
db,
|
|
207
|
+
client,
|
|
208
|
+
driver,
|
|
209
|
+
entityService,
|
|
210
|
+
realtimeService
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Create a MongoDB DataDriver.
|
|
216
|
+
*
|
|
217
|
+
* This is a convenience function when you only need the DataDriver
|
|
218
|
+
* without the full backend instance.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```typescript
|
|
222
|
+
* import { createMongoDelegate } from "@rebasepro/server-mongodb";
|
|
223
|
+
*
|
|
224
|
+
* const delegate = createMongoDelegate(db);
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export function createMongoDelegate(
|
|
228
|
+
db: Db,
|
|
229
|
+
realtimeService?: MongoRealtimeService,
|
|
230
|
+
historyService?: MongoHistoryService
|
|
231
|
+
): MongoDriver {
|
|
232
|
+
const realtime = realtimeService ?? new MongoRealtimeService(db);
|
|
233
|
+
const history = historyService ?? new MongoHistoryService(db);
|
|
234
|
+
return new MongoDriver(db, realtime, history);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Create a RealtimeService for MongoDB.
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* import { createMongoRealtimeService } from "@rebasepro/server-mongodb";
|
|
243
|
+
*
|
|
244
|
+
* const realtimeService = createMongoRealtimeService(db);
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
export function createMongoRealtimeService(db: Db): MongoRealtimeService {
|
|
248
|
+
return new MongoRealtimeService(db);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Create a MongoDB entity repository.
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* import { createMongoEntityRepository } from "@rebasepro/server-mongodb";
|
|
257
|
+
*
|
|
258
|
+
* const repository = createMongoEntityRepository(db);
|
|
259
|
+
* const users = await repository.fetchCollection("users", {});
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
export function createMongoEntityRepository(db: Db): EntityRepository {
|
|
263
|
+
return new MongoEntityService(db);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// =============================================================================
|
|
267
|
+
// Type Guards
|
|
268
|
+
// =============================================================================
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Check if a backend config is for MongoDB.
|
|
272
|
+
*/
|
|
273
|
+
export function isMongoBackendConfig(config: BackendConfig): config is MongoBackendConfig {
|
|
274
|
+
return config.type === "mongodb" &&
|
|
275
|
+
typeof (config as MongoBackendConfig).connection !== "undefined" &&
|
|
276
|
+
typeof (config as MongoBackendConfig).client !== "undefined";
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Check if a driver config is for MongoDB.
|
|
281
|
+
*/
|
|
282
|
+
export function isMongoDriverConfig(obj: unknown): obj is { type: "mongodb"; connection: Db; client: MongoClient } {
|
|
283
|
+
return typeof obj === "object" &&
|
|
284
|
+
obj !== null &&
|
|
285
|
+
"type" in obj &&
|
|
286
|
+
(obj as Record<string, unknown>).type === "mongodb" &&
|
|
287
|
+
"connection" in obj &&
|
|
288
|
+
"client" in obj;
|
|
289
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Db } from "mongodb";
|
|
2
|
+
|
|
3
|
+
export async function ensureHistoryCollectionExists(db: Db): Promise<void> {
|
|
4
|
+
console.log("🔍 Checking MongoDB history collection and indexes...");
|
|
5
|
+
|
|
6
|
+
try {
|
|
7
|
+
const history = db.collection("__rebase_history");
|
|
8
|
+
|
|
9
|
+
// Index for finding history entries for a specific entity
|
|
10
|
+
await history.createIndex({ entity_id: 1, table_name: 1, updated_at: -1 });
|
|
11
|
+
|
|
12
|
+
// Index for pruning by date
|
|
13
|
+
await history.createIndex({ updated_at: 1 });
|
|
14
|
+
|
|
15
|
+
console.log("✅ MongoDB History collection ready");
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.error("❌ Failed to set up MongoDB history collection:", error);
|
|
18
|
+
}
|
|
19
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rebasepro/server-mongodb
|
|
3
|
+
*
|
|
4
|
+
* MongoDB backend implementation for Rebase
|
|
5
|
+
* This package provides a complete backend solution for Rebase applications
|
|
6
|
+
* using MongoDB as the database.
|
|
7
|
+
*
|
|
8
|
+
* The package implements the abstract interfaces from @rebasepro/server-core
|
|
9
|
+
* (EntityRepository, RealtimeProvider, CollectionRegistryInterface, etc.)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// Connection
|
|
13
|
+
export * from "./connection";
|
|
14
|
+
|
|
15
|
+
// Factory functions
|
|
16
|
+
export * from "./factory";
|
|
17
|
+
|
|
18
|
+
// Database services
|
|
19
|
+
export * from "./db/MongoEntityService";
|
|
20
|
+
export * from "./db/MongoConditionBuilder";
|
|
21
|
+
|
|
22
|
+
// Services
|
|
23
|
+
export * from "./services/MongoRealtimeService";
|
|
24
|
+
export * from "./services/MongoDriver";
|
|
25
|
+
export * from "./MongoBootstrapper";
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB DataDriver Delegate
|
|
3
|
+
*
|
|
4
|
+
* Implements the DataDriver interface for Rebase frontend integration.
|
|
5
|
+
* This is the main entry point for Rebase to interact with MongoDB.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Db, ObjectId } from "mongodb";
|
|
9
|
+
import {
|
|
10
|
+
DataDriver,
|
|
11
|
+
DeleteEntityProps,
|
|
12
|
+
Entity,
|
|
13
|
+
EntityCollection,
|
|
14
|
+
FetchCollectionProps,
|
|
15
|
+
FetchEntityProps,
|
|
16
|
+
ListenCollectionProps,
|
|
17
|
+
ListenEntityProps,
|
|
18
|
+
SaveEntityProps
|
|
19
|
+
} from "@rebasepro/types";
|
|
20
|
+
import { MongoEntityService } from "../db/MongoEntityService";
|
|
21
|
+
import { MongoRealtimeService } from "./MongoRealtimeService";
|
|
22
|
+
import { MongoHistoryService } from "./MongoHistoryService";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* MongoDB DataDriver Delegate
|
|
26
|
+
*
|
|
27
|
+
* Implements the DataDriver interface for Rebase.
|
|
28
|
+
* Provides all data operations needed by the Rebase frontend.
|
|
29
|
+
*/
|
|
30
|
+
export class MongoDriver implements DataDriver {
|
|
31
|
+
key = "mongodb";
|
|
32
|
+
initialised = true;
|
|
33
|
+
|
|
34
|
+
private entityService: MongoEntityService;
|
|
35
|
+
private realtimeService: MongoRealtimeService;
|
|
36
|
+
public historyService: MongoHistoryService;
|
|
37
|
+
|
|
38
|
+
constructor(
|
|
39
|
+
private db: Db,
|
|
40
|
+
realtimeService?: MongoRealtimeService,
|
|
41
|
+
historyService?: MongoHistoryService
|
|
42
|
+
) {
|
|
43
|
+
this.entityService = new MongoEntityService(db);
|
|
44
|
+
this.realtimeService = realtimeService ?? new MongoRealtimeService(db);
|
|
45
|
+
this.historyService = historyService ?? new MongoHistoryService(db);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get the current timestamp
|
|
51
|
+
*/
|
|
52
|
+
currentTime(): Date {
|
|
53
|
+
return new Date();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Fetch a collection of entities
|
|
58
|
+
*/
|
|
59
|
+
async fetchCollection<M extends Record<string, any>>({
|
|
60
|
+
path,
|
|
61
|
+
collection,
|
|
62
|
+
filter,
|
|
63
|
+
limit,
|
|
64
|
+
startAfter,
|
|
65
|
+
orderBy,
|
|
66
|
+
searchString,
|
|
67
|
+
order
|
|
68
|
+
}: FetchCollectionProps<M>): Promise<Entity<M>[]> {
|
|
69
|
+
return this.entityService.fetchCollection<M>(path, {
|
|
70
|
+
filter,
|
|
71
|
+
limit,
|
|
72
|
+
startAfter,
|
|
73
|
+
orderBy,
|
|
74
|
+
order,
|
|
75
|
+
searchString,
|
|
76
|
+
collection: collection as unknown as EntityCollection
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Listen to collection changes
|
|
82
|
+
*/
|
|
83
|
+
listenCollection<M extends Record<string, any>>({
|
|
84
|
+
path,
|
|
85
|
+
collection,
|
|
86
|
+
filter,
|
|
87
|
+
limit,
|
|
88
|
+
startAfter,
|
|
89
|
+
orderBy,
|
|
90
|
+
searchString,
|
|
91
|
+
order,
|
|
92
|
+
onUpdate,
|
|
93
|
+
onError
|
|
94
|
+
}: ListenCollectionProps<M>): () => void {
|
|
95
|
+
const subscriptionId = this.generateSubscriptionId();
|
|
96
|
+
|
|
97
|
+
const callback = (entities: Entity<any>[]) => {
|
|
98
|
+
try {
|
|
99
|
+
onUpdate(entities as Entity<M>[]);
|
|
100
|
+
} catch (error) {
|
|
101
|
+
console.error("Error in collection update callback:", error);
|
|
102
|
+
if (onError) {
|
|
103
|
+
onError(error instanceof Error ? error : new Error(String(error)));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
this.realtimeService.subscribeToCollection(
|
|
109
|
+
subscriptionId,
|
|
110
|
+
{
|
|
111
|
+
clientId: "driver",
|
|
112
|
+
path,
|
|
113
|
+
filter,
|
|
114
|
+
orderBy,
|
|
115
|
+
order,
|
|
116
|
+
limit,
|
|
117
|
+
startAfter,
|
|
118
|
+
searchString
|
|
119
|
+
},
|
|
120
|
+
callback
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
// Return unsubscribe function
|
|
124
|
+
return () => {
|
|
125
|
+
this.realtimeService.unsubscribe(subscriptionId);
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Fetch a single entity
|
|
131
|
+
*/
|
|
132
|
+
async fetchEntity<M extends Record<string, any>>({
|
|
133
|
+
path,
|
|
134
|
+
entityId,
|
|
135
|
+
databaseId,
|
|
136
|
+
collection
|
|
137
|
+
}: FetchEntityProps<M>): Promise<Entity<M> | undefined> {
|
|
138
|
+
return this.entityService.fetchEntity<M>(path, entityId, databaseId);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Listen to entity changes
|
|
143
|
+
*/
|
|
144
|
+
listenEntity<M extends Record<string, any>>({
|
|
145
|
+
path,
|
|
146
|
+
entityId,
|
|
147
|
+
collection,
|
|
148
|
+
onUpdate,
|
|
149
|
+
onError
|
|
150
|
+
}: ListenEntityProps<M>): () => void {
|
|
151
|
+
const subscriptionId = this.generateSubscriptionId();
|
|
152
|
+
|
|
153
|
+
const callback = (entity: Entity<any> | null) => {
|
|
154
|
+
try {
|
|
155
|
+
onUpdate(entity as Entity<M>);
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error("Error in entity update callback:", error);
|
|
158
|
+
if (onError) {
|
|
159
|
+
onError(error instanceof Error ? error : new Error(String(error)));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
this.realtimeService.subscribeToEntity(
|
|
165
|
+
subscriptionId,
|
|
166
|
+
{
|
|
167
|
+
clientId: "driver",
|
|
168
|
+
path,
|
|
169
|
+
entityId
|
|
170
|
+
},
|
|
171
|
+
callback
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
// Return unsubscribe function
|
|
175
|
+
return () => {
|
|
176
|
+
this.realtimeService.unsubscribe(subscriptionId);
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Save an entity (create or update)
|
|
182
|
+
*/
|
|
183
|
+
async saveEntity<M extends Record<string, any>>({
|
|
184
|
+
path,
|
|
185
|
+
entityId,
|
|
186
|
+
values,
|
|
187
|
+
previousValues,
|
|
188
|
+
collection,
|
|
189
|
+
status
|
|
190
|
+
}: SaveEntityProps<M>): Promise<Entity<M>> {
|
|
191
|
+
const isNew = status === "new" || !previousValues;
|
|
192
|
+
|
|
193
|
+
const entity = await this.entityService.saveEntity<M>(path, values, entityId);
|
|
194
|
+
|
|
195
|
+
// Handle history recording
|
|
196
|
+
if (collection?.history) {
|
|
197
|
+
this.historyService.recordHistory({
|
|
198
|
+
action: isNew ? "create" : "update",
|
|
199
|
+
entityId: String(entity.id),
|
|
200
|
+
tableName: path,
|
|
201
|
+
values: entity.values,
|
|
202
|
+
previousValues: isNew ? undefined : previousValues,
|
|
203
|
+
}).catch(err => {
|
|
204
|
+
// Fire and forget, don't fail the save operation
|
|
205
|
+
console.error(`Failed to record history for ${path}/${entity.id}:`, err);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Notify subscribers of the update
|
|
210
|
+
await this.realtimeService.notifyEntityUpdate(path, String(entity.id), entity);
|
|
211
|
+
|
|
212
|
+
return entity;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Delete an entity
|
|
217
|
+
*/
|
|
218
|
+
async deleteEntity<M extends Record<string, any>>({
|
|
219
|
+
entity,
|
|
220
|
+
collection
|
|
221
|
+
}: DeleteEntityProps<M>): Promise<void> {
|
|
222
|
+
await this.entityService.deleteEntity(entity.path, entity.id);
|
|
223
|
+
|
|
224
|
+
if (collection?.history) {
|
|
225
|
+
this.historyService.recordHistory({
|
|
226
|
+
action: "delete",
|
|
227
|
+
entityId: String(entity.id),
|
|
228
|
+
tableName: entity.path,
|
|
229
|
+
previousValues: entity.values,
|
|
230
|
+
}).catch(err => {
|
|
231
|
+
console.error(`Failed to record history for ${entity.path}/${entity.id}:`, err);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Notify subscribers of the deletion
|
|
236
|
+
await this.realtimeService.notifyEntityUpdate(entity.path, String(entity.id), null);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Check if a field value is unique
|
|
241
|
+
*/
|
|
242
|
+
async checkUniqueField(
|
|
243
|
+
path: string,
|
|
244
|
+
name: string,
|
|
245
|
+
value: any,
|
|
246
|
+
entityId?: string,
|
|
247
|
+
collection?: EntityCollection
|
|
248
|
+
): Promise<boolean> {
|
|
249
|
+
return this.entityService.checkUniqueField(path, name, value, entityId);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Generate a new entity ID
|
|
254
|
+
*/
|
|
255
|
+
generateEntityId(path: string, collection?: EntityCollection): string {
|
|
256
|
+
return this.entityService.generateEntityId();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Count entities in a collection
|
|
261
|
+
*/
|
|
262
|
+
async countEntities<M extends Record<string, any>>({
|
|
263
|
+
path,
|
|
264
|
+
collection,
|
|
265
|
+
filter
|
|
266
|
+
}: FetchCollectionProps<M>): Promise<number> {
|
|
267
|
+
return this.entityService.countEntities<M>(path, { filter });
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Generate a unique subscription ID
|
|
272
|
+
*/
|
|
273
|
+
private generateSubscriptionId(): string {
|
|
274
|
+
return `mongo_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Check if the delegate is ready
|
|
279
|
+
*/
|
|
280
|
+
isReady(): boolean {
|
|
281
|
+
return this.initialised;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Get the underlying entity service for direct access
|
|
286
|
+
*/
|
|
287
|
+
getEntityService(): MongoEntityService {
|
|
288
|
+
return this.entityService;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Get the underlying realtime service for direct access
|
|
293
|
+
*/
|
|
294
|
+
getRealtimeService(): MongoRealtimeService {
|
|
295
|
+
return this.realtimeService;
|
|
296
|
+
}
|
|
297
|
+
}
|