@plyaz/core 1.2.0 → 1.2.1
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/dist/adapters/index.d.ts +16 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/nestjs.d.ts +79 -0
- package/dist/adapters/nestjs.d.ts.map +1 -0
- package/dist/adapters/nextjs.d.ts +28 -0
- package/dist/adapters/nextjs.d.ts.map +1 -0
- package/dist/backend/example/example.controller.d.ts +121 -0
- package/dist/backend/example/example.controller.d.ts.map +1 -0
- package/dist/backend/example/example.module.d.ts +29 -0
- package/dist/backend/example/example.module.d.ts.map +1 -0
- package/dist/backend/example/index.d.ts +8 -0
- package/dist/backend/example/index.d.ts.map +1 -0
- package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts +150 -0
- package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts.map +1 -0
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts +28 -50
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -1
- package/dist/backend/featureFlags/config/validation.d.ts +6 -6
- package/dist/backend/featureFlags/config/validation.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.controller.d.ts +14 -55
- package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -43
- package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +16 -2
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -1
- package/dist/backend/featureFlags/index.d.ts +6 -7
- package/dist/backend/featureFlags/index.d.ts.map +1 -1
- package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -1
- package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -1
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +6 -11
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -1
- package/dist/backend/index.d.ts +5 -0
- package/dist/backend/index.d.ts.map +1 -1
- package/dist/base/cache/CacheKeyBuilder.d.ts +115 -0
- package/dist/base/cache/CacheKeyBuilder.d.ts.map +1 -0
- package/dist/base/cache/index.d.ts +1 -0
- package/dist/base/cache/index.d.ts.map +1 -1
- package/dist/base/cache/strategies/redis.d.ts.map +1 -1
- package/dist/base/observability/BaseAdapter.d.ts +79 -0
- package/dist/base/observability/BaseAdapter.d.ts.map +1 -0
- package/dist/base/observability/CompositeAdapter.d.ts +72 -0
- package/dist/base/observability/CompositeAdapter.d.ts.map +1 -0
- package/dist/base/observability/DatadogAdapter.d.ts +117 -0
- package/dist/base/observability/DatadogAdapter.d.ts.map +1 -0
- package/dist/base/observability/LoggerAdapter.d.ts +54 -0
- package/dist/base/observability/LoggerAdapter.d.ts.map +1 -0
- package/dist/base/observability/ObservabilityService.d.ts +160 -0
- package/dist/base/observability/ObservabilityService.d.ts.map +1 -0
- package/dist/base/observability/index.d.ts +17 -0
- package/dist/base/observability/index.d.ts.map +1 -0
- package/dist/domain/base/BaseBackendDomainService.d.ts +528 -0
- package/dist/domain/base/BaseBackendDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseDomainService.d.ts +284 -0
- package/dist/domain/base/BaseDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseFrontendDomainService.d.ts +493 -0
- package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseMapper.d.ts +100 -0
- package/dist/domain/base/BaseMapper.d.ts.map +1 -0
- package/dist/domain/base/BaseValidator.d.ts +105 -0
- package/dist/domain/base/BaseValidator.d.ts.map +1 -0
- package/dist/domain/base/index.d.ts +10 -0
- package/dist/domain/base/index.d.ts.map +1 -0
- package/dist/domain/example/BackendExampleDomainService.d.ts +257 -0
- package/dist/domain/example/BackendExampleDomainService.d.ts.map +1 -0
- package/dist/domain/example/FrontendExampleDomainService.d.ts +164 -0
- package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -0
- package/dist/domain/example/index.d.ts +10 -0
- package/dist/domain/example/index.d.ts.map +1 -0
- package/dist/domain/example/mappers/ExampleMapper.d.ts +67 -0
- package/dist/domain/example/mappers/ExampleMapper.d.ts.map +1 -0
- package/dist/domain/example/validators/ExampleValidator.d.ts +33 -0
- package/dist/domain/example/validators/ExampleValidator.d.ts.map +1 -0
- package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts +86 -0
- package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts.map +1 -0
- package/dist/domain/featureFlags/index.d.ts +10 -5
- package/dist/domain/featureFlags/index.d.ts.map +1 -1
- package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts +72 -0
- package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts.map +1 -0
- package/dist/domain/featureFlags/mappers/index.d.ts +8 -0
- package/dist/domain/featureFlags/mappers/index.d.ts.map +1 -0
- package/dist/domain/featureFlags/module.d.ts +20 -0
- package/dist/domain/featureFlags/module.d.ts.map +1 -0
- package/dist/domain/featureFlags/provider.d.ts +40 -1
- package/dist/domain/featureFlags/provider.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/api.d.ts +59 -34
- package/dist/domain/featureFlags/providers/api.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/database.d.ts +48 -46
- package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/factory.d.ts +50 -33
- package/dist/domain/featureFlags/providers/factory.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/file.d.ts +48 -1
- package/dist/domain/featureFlags/providers/file.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/memory.d.ts +32 -6
- package/dist/domain/featureFlags/providers/memory.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/redis.d.ts +6 -1
- package/dist/domain/featureFlags/providers/redis.d.ts.map +1 -1
- package/dist/domain/featureFlags/service.d.ts +112 -0
- package/dist/domain/featureFlags/service.d.ts.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/engine/featureFlags/engine.d.ts +8 -0
- package/dist/engine/featureFlags/engine.d.ts.map +1 -1
- package/dist/entry-backend.d.ts +24 -0
- package/dist/entry-backend.d.ts.map +1 -0
- package/dist/entry-backend.js +15635 -0
- package/dist/entry-backend.js.map +1 -0
- package/dist/entry-backend.mjs +15506 -0
- package/dist/entry-backend.mjs.map +1 -0
- package/dist/entry-frontend.d.ts +23 -0
- package/dist/entry-frontend.d.ts.map +1 -0
- package/dist/entry-frontend.js +11152 -0
- package/dist/entry-frontend.js.map +1 -0
- package/dist/entry-frontend.mjs +11089 -0
- package/dist/entry-frontend.mjs.map +1 -0
- package/dist/events/CoreEventManager.d.ts +116 -0
- package/dist/events/CoreEventManager.d.ts.map +1 -0
- package/dist/events/index.d.ts +27 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/frontend/base/index.d.ts +8 -0
- package/dist/frontend/base/index.d.ts.map +1 -0
- package/dist/frontend/components/InitializationError.d.ts +25 -0
- package/dist/frontend/components/InitializationError.d.ts.map +1 -0
- package/dist/frontend/components/InitializationLoading.d.ts +22 -0
- package/dist/frontend/components/InitializationLoading.d.ts.map +1 -0
- package/dist/frontend/components/index.d.ts +9 -0
- package/dist/frontend/components/index.d.ts.map +1 -0
- package/dist/frontend/example/index.d.ts +9 -0
- package/dist/frontend/example/index.d.ts.map +1 -0
- package/dist/frontend/featureFlags/index.d.ts +28 -7
- package/dist/frontend/featureFlags/index.d.ts.map +1 -1
- package/dist/frontend/index.d.ts +4 -0
- package/dist/frontend/index.d.ts.map +1 -1
- package/dist/frontend/providers/ApiProvider.d.ts +2 -2
- package/dist/frontend/providers/ApiProvider.d.ts.map +1 -1
- package/dist/frontend/providers/PlyazProvider.d.ts +305 -0
- package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -0
- package/dist/frontend/providers/index.d.ts +1 -0
- package/dist/frontend/providers/index.d.ts.map +1 -1
- package/dist/frontend/store/feature-flags.d.ts +63 -0
- package/dist/frontend/store/feature-flags.d.ts.map +1 -0
- package/dist/frontend/store/index.d.ts +14 -0
- package/dist/frontend/store/index.d.ts.map +1 -0
- package/dist/frontend/store/integrations.d.ts +36 -0
- package/dist/frontend/store/integrations.d.ts.map +1 -0
- package/dist/frontend/store/service-accessors.d.ts +78 -0
- package/dist/frontend/store/service-accessors.d.ts.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15450 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +13678 -4697
- package/dist/index.mjs.map +1 -1
- package/dist/init/CoreInitializer.d.ts +582 -0
- package/dist/init/CoreInitializer.d.ts.map +1 -0
- package/dist/init/ServiceRegistry.d.ts +256 -0
- package/dist/init/ServiceRegistry.d.ts.map +1 -0
- package/dist/init/index.d.ts +14 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/nestjs/CoreModule.d.ts +63 -0
- package/dist/init/nestjs/CoreModule.d.ts.map +1 -0
- package/dist/init/nestjs/index.d.ts +5 -0
- package/dist/init/nestjs/index.d.ts.map +1 -0
- package/dist/init/nestjs/index.js +9059 -0
- package/dist/init/nestjs/index.js.map +1 -0
- package/dist/init/nestjs/index.mjs +9055 -0
- package/dist/init/nestjs/index.mjs.map +1 -0
- package/dist/init/react.d.ts +33 -0
- package/dist/init/react.d.ts.map +1 -0
- package/dist/models/example/ExampleRepository.d.ts +124 -0
- package/dist/models/example/ExampleRepository.d.ts.map +1 -0
- package/dist/models/example/index.d.ts +7 -0
- package/dist/models/example/index.d.ts.map +1 -0
- package/dist/{backend/featureFlags/database/repository.d.ts → models/featureFlags/FeatureFlagRepository.d.ts} +47 -5
- package/dist/models/featureFlags/FeatureFlagRepository.d.ts.map +1 -0
- package/dist/models/featureFlags/index.d.ts +7 -0
- package/dist/models/featureFlags/index.d.ts.map +1 -0
- package/dist/models/index.d.ts +9 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/services/ApiClientService.d.ts +92 -4
- package/dist/services/ApiClientService.d.ts.map +1 -1
- package/dist/services/CacheService.d.ts +176 -0
- package/dist/services/CacheService.d.ts.map +1 -0
- package/dist/services/DbService.d.ts +391 -0
- package/dist/services/DbService.d.ts.map +1 -0
- package/dist/services/NotificationService.d.ts +151 -0
- package/dist/services/NotificationService.d.ts.map +1 -0
- package/dist/services/StorageService.d.ts +144 -0
- package/dist/services/StorageService.d.ts.map +1 -0
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/utils/common/id.d.ts +83 -0
- package/dist/utils/common/id.d.ts.map +1 -0
- package/dist/utils/common/index.d.ts +2 -0
- package/dist/utils/common/index.d.ts.map +1 -1
- package/dist/utils/common/object.d.ts +70 -0
- package/dist/utils/common/object.d.ts.map +1 -0
- package/dist/utils/featureFlags/conditions.d.ts.map +1 -1
- package/dist/utils/featureFlags/context.d.ts +0 -1
- package/dist/utils/featureFlags/context.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/mapperUtils.d.ts +38 -0
- package/dist/utils/mapperUtils.d.ts.map +1 -0
- package/dist/utils/runtime.d.ts +15 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/version.d.ts +24 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/web_app/auth/add_user.d.ts +2 -2
- package/dist/web_app/auth/add_user.d.ts.map +1 -1
- package/dist/web_app/auth/update_user.d.ts +1 -1
- package/dist/web_app/auth/update_user.d.ts.map +1 -1
- package/package.json +89 -15
- package/dist/backend/featureFlags/database/connection.d.ts +0 -321
- package/dist/backend/featureFlags/database/connection.d.ts.map +0 -1
- package/dist/backend/featureFlags/database/repository.d.ts.map +0 -1
- package/dist/backend/featureFlags/feature-flag.repository.d.ts +0 -85
- package/dist/backend/featureFlags/feature-flag.repository.d.ts.map +0 -1
- package/dist/backend/featureFlags/feature-flag.service.d.ts +0 -264
- package/dist/backend/featureFlags/feature-flag.service.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts +0 -103
- package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts +0 -35
- package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts +0 -55
- package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +0 -57
- package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts +0 -99
- package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +0 -31
- package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/types.d.ts +0 -21
- package/dist/frontend/featureFlags/providers/types.d.ts.map +0 -1
- package/dist/index.cjs +0 -6435
- package/dist/index.cjs.map +0 -1
- package/dist/utils/db/databaseService.d.ts +0 -6
- package/dist/utils/db/databaseService.d.ts.map +0 -1
- package/dist/utils/db/index.d.ts +0 -2
- package/dist/utils/db/index.d.ts.map +0 -1
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Frontend Domain Service
|
|
3
|
+
*
|
|
4
|
+
* Extends BaseDomainService with common frontend patterns:
|
|
5
|
+
* - **Primary/Read Store Pattern**: Services have ONE primary store (mutate) + multiple read stores (read-only)
|
|
6
|
+
* - **Automatic Store Injection**: Stores injected by ServiceRegistry from root store
|
|
7
|
+
* - **Automatic Loading State**: Managed via setStoresLoading() on primary store
|
|
8
|
+
* - **Generic CRUD Operations**: With fetchers from @plyaz/api
|
|
9
|
+
* - **Event Emission**: Typed event payloads via CoreEventManager
|
|
10
|
+
* - **Automatic DTO Mapping**: Via mapper classes
|
|
11
|
+
*
|
|
12
|
+
* ## Store Architecture (NEW)
|
|
13
|
+
*
|
|
14
|
+
* ### Primary Store (Mutate)
|
|
15
|
+
* - Service has ONE primary store defined by `store: 'campaigns'` config
|
|
16
|
+
* - Can call: setData(), updateData(), setLoading()
|
|
17
|
+
* - syncToStores() syncs ONLY to primary store
|
|
18
|
+
* - Access via: this.primaryStore
|
|
19
|
+
*
|
|
20
|
+
* ### Read Stores (Read-Only)
|
|
21
|
+
* - Service can read from multiple stores: `readStores: ['users', 'error', 'featureFlags']`
|
|
22
|
+
* - Can read state but should NOT call mutation methods
|
|
23
|
+
* - Used for cross-domain data access (e.g., campaign service reading user data)
|
|
24
|
+
* - Access via: this.getReadStore('users')
|
|
25
|
+
*
|
|
26
|
+
* ### All Stores from Root Store
|
|
27
|
+
* - All stores (domain + global) are slices of ONE root Zustand store
|
|
28
|
+
* - Automatically reactive - changes propagate to subscribers (React components)
|
|
29
|
+
* - Error/featureFlags are built-in, domain stores added dynamically
|
|
30
|
+
*
|
|
31
|
+
* Frontend domain services should extend this class instead of BaseDomainService
|
|
32
|
+
* to get automatic store integration and CRUD capabilities.
|
|
33
|
+
*
|
|
34
|
+
* All generic type parameters for full type safety:
|
|
35
|
+
* - TConfig: Service configuration type
|
|
36
|
+
* - TStore: Store interface type
|
|
37
|
+
* - TData: Data type for store sync
|
|
38
|
+
* - TEntity: Domain entity type
|
|
39
|
+
* - TResponseDTO: API response DTO type (snake_case)
|
|
40
|
+
* - TCreateDTO: Create request DTO type
|
|
41
|
+
* - TPatchDTO: Patch request DTO type (partial update)
|
|
42
|
+
* - TQueryDTO: Query/filter DTO type for fetchAll
|
|
43
|
+
* - TStoreState: Serializable store state type
|
|
44
|
+
* - TMapper: Mapper instance type
|
|
45
|
+
* - TValidator: Optional validator type
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* class MyFrontendService extends BaseFrontendDomainService<
|
|
50
|
+
* MyConfig,
|
|
51
|
+
* MyStore,
|
|
52
|
+
* MyStoreData,
|
|
53
|
+
* MyEntity,
|
|
54
|
+
* MyResponseDTO,
|
|
55
|
+
* CreateMyDTO,
|
|
56
|
+
* PatchMyDTO,
|
|
57
|
+
* QueryMyDTO,
|
|
58
|
+
* MyStoreState,
|
|
59
|
+
* MyMapper
|
|
60
|
+
* > {
|
|
61
|
+
* protected eventPrefix = 'myDomain';
|
|
62
|
+
* protected mapper: MyMapper;
|
|
63
|
+
*
|
|
64
|
+
* constructor(config: MyConfig) {
|
|
65
|
+
* super({ ... mapperClass: MyMapperClass });
|
|
66
|
+
* this.mapper = new MyMapperClass();
|
|
67
|
+
* }
|
|
68
|
+
*
|
|
69
|
+
* // All CRUD methods inherited!
|
|
70
|
+
* // - fetchAll(query?)
|
|
71
|
+
* // - fetchById(id)
|
|
72
|
+
* // - create(data)
|
|
73
|
+
* // - update(id, data)
|
|
74
|
+
* // - delete(id)
|
|
75
|
+
* }
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
import { BaseDomainService } from '../../domain/base';
|
|
79
|
+
import { CorePackageError } from '@plyaz/errors';
|
|
80
|
+
import type { RootStoreSlice } from '@plyaz/types/store';
|
|
81
|
+
import type { CoreEntityCreatingPayload, CoreEntityCreatedPayload, CoreEntityPatchingPayload, CoreEntityPatchedPayload, CoreEntityDeletingPayload, CoreEntityDeletedPayload, CoreEntityErrorPayload, CoreEntityCompletePayload } from '@plyaz/types/core';
|
|
82
|
+
export type { CoreBaseFrontendStore, CoreBaseFrontendServiceConfig, CoreBaseFrontendServiceConstructorConfig, CoreStoreHandlers, } from '@plyaz/types/core';
|
|
83
|
+
import type { CoreBaseFrontendStore, CoreBaseFrontendServiceConfig, CoreBaseFrontendServiceConstructorConfig, CoreBaseMapperInstance, CoreBaseValidatorInstance, CoreStoreHandlers, CoreOptimisticUpdateConfig } from '@plyaz/types/core';
|
|
84
|
+
/**
|
|
85
|
+
* Base type for frontend event payloads
|
|
86
|
+
* All frontend event payloads should extend this
|
|
87
|
+
*/
|
|
88
|
+
type BaseFrontendEventPayload = CoreEntityCreatingPayload<unknown> | CoreEntityCreatedPayload<unknown, unknown> | CoreEntityPatchingPayload<unknown> | CoreEntityPatchedPayload<unknown, unknown> | CoreEntityDeletingPayload | CoreEntityDeletedPayload | CoreEntityErrorPayload | CoreEntityCompletePayload | Record<string, unknown>;
|
|
89
|
+
/**
|
|
90
|
+
* Abstract base class for frontend domain services with store integration and CRUD operations.
|
|
91
|
+
*
|
|
92
|
+
* Extends BaseDomainService with:
|
|
93
|
+
* - Multi-store connection management
|
|
94
|
+
* - Automatic sync to connected stores
|
|
95
|
+
* - Loading/error state propagation
|
|
96
|
+
* - Generic CRUD operations (fetchAll, fetchById, create, update, delete)
|
|
97
|
+
* - Event emission with typed payloads
|
|
98
|
+
* - Automatic DTO mapping via mapper
|
|
99
|
+
*
|
|
100
|
+
* @typeParam TConfig - Service configuration type
|
|
101
|
+
* @typeParam TStore - Store interface type
|
|
102
|
+
* @typeParam TData - Data type for store sync
|
|
103
|
+
* @typeParam TEntity - Domain entity type
|
|
104
|
+
* @typeParam TResponseDTO - API response DTO type
|
|
105
|
+
* @typeParam TCreateDTO - Create request DTO type
|
|
106
|
+
* @typeParam TPatchDTO - Patch request DTO type
|
|
107
|
+
* @typeParam TQueryDTO - Query/filter DTO type for fetchAll (default: unknown)
|
|
108
|
+
* @typeParam TStoreState - Serializable store state type
|
|
109
|
+
* @typeParam TMapper - Mapper instance type
|
|
110
|
+
* @typeParam TValidator - Optional validator type
|
|
111
|
+
* @typeParam TDeleteResult - Delete operation result type (default: void for backwards compatibility)
|
|
112
|
+
*/
|
|
113
|
+
export declare abstract class BaseFrontendDomainService<TConfig extends CoreBaseFrontendServiceConfig<TData, TStore>, TStore extends CoreBaseFrontendStore<TData>, TData = Record<string, unknown>, TEntity = unknown, TResponseDTO = unknown, TCreateDTO = unknown, TPatchDTO extends Partial<unknown> = Partial<TCreateDTO>, TQueryDTO = unknown, TStoreState = TEntity, TMapper extends CoreBaseMapperInstance<TEntity, TResponseDTO, TCreateDTO, TCreateDTO, TPatchDTO, unknown, TStoreState> = CoreBaseMapperInstance<TEntity, TResponseDTO, TCreateDTO, TCreateDTO, TPatchDTO, unknown, TStoreState>, TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance, TDeleteResult = void> extends BaseDomainService<TConfig, TMapper, TValidator> {
|
|
114
|
+
/**
|
|
115
|
+
* Event prefix for all events emitted by this service
|
|
116
|
+
* E.g., 'example' → emits 'example:creating', 'example:created', etc.
|
|
117
|
+
*
|
|
118
|
+
* Required by subclasses
|
|
119
|
+
*/
|
|
120
|
+
protected abstract eventPrefix: string;
|
|
121
|
+
/** Primary store - the main store this service can mutate */
|
|
122
|
+
private _primaryStore;
|
|
123
|
+
/**
|
|
124
|
+
* Primary store key - override in subclass to set default
|
|
125
|
+
* @example protected primaryStoreKey = STORE_KEYS.EXAMPLE;
|
|
126
|
+
*/
|
|
127
|
+
protected primaryStoreKey?: string;
|
|
128
|
+
/** Read-only stores - can read but not mutate */
|
|
129
|
+
private readonly _readStores;
|
|
130
|
+
/**
|
|
131
|
+
* Read-only store keys - always includes error and featureFlags by default
|
|
132
|
+
* Override in subclass to add additional read stores
|
|
133
|
+
* @example protected readStoreKeys = [...super.readStoreKeys, STORE_KEYS.CAMPAIGNS];
|
|
134
|
+
*/
|
|
135
|
+
protected readStoreKeys: string[];
|
|
136
|
+
/** Store handlers for custom store synchronization */
|
|
137
|
+
protected readonly storeHandlers?: CoreStoreHandlers<TData, TStore>;
|
|
138
|
+
/** Optimistic update configuration */
|
|
139
|
+
protected readonly optimisticConfig?: CoreOptimisticUpdateConfig;
|
|
140
|
+
/** Stack of previous states for rollback (LIFO) */
|
|
141
|
+
private readonly _rollbackStack;
|
|
142
|
+
/** Maximum rollback stack size */
|
|
143
|
+
private readonly _maxRollbackStackSize;
|
|
144
|
+
constructor(config: CoreBaseFrontendServiceConstructorConfig<TConfig, TStore, TData, TMapper, TValidator>);
|
|
145
|
+
/**
|
|
146
|
+
* Get the number of connected stores (primary + read stores).
|
|
147
|
+
*/
|
|
148
|
+
get connectedStoreCount(): number;
|
|
149
|
+
/**
|
|
150
|
+
* Check if any stores are connected (primary or read).
|
|
151
|
+
*/
|
|
152
|
+
get hasConnectedStores(): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* Get primary store (protected).
|
|
155
|
+
* This is the store the service can mutate.
|
|
156
|
+
*/
|
|
157
|
+
protected get primaryStore(): TStore | null;
|
|
158
|
+
/**
|
|
159
|
+
* Get a read-only store by key (protected).
|
|
160
|
+
* Can read state but should not call mutation methods.
|
|
161
|
+
*
|
|
162
|
+
* @param key - Store key (type-safe)
|
|
163
|
+
* @returns Store slice or undefined (auto-typed based on key)
|
|
164
|
+
*/
|
|
165
|
+
protected getReadStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;
|
|
166
|
+
/**
|
|
167
|
+
* Get a specific store slice by key (protected).
|
|
168
|
+
*
|
|
169
|
+
* **Namespaced Root Store Architecture:**
|
|
170
|
+
* - All stores are slices merged into ONE Zustand root store
|
|
171
|
+
* - Each slice is namespaced (e.g., store.example, store.errors)
|
|
172
|
+
* - This returns the SPECIFIC slice for the given key
|
|
173
|
+
* - Type-safe: only valid store keys allowed
|
|
174
|
+
*
|
|
175
|
+
* **Usage Guidelines:**
|
|
176
|
+
* - Can mutate stores that are NOT in readStoreKeys
|
|
177
|
+
* - Should NOT mutate stores in readStoreKeys (errors, featureFlags by default)
|
|
178
|
+
* - Useful for cross-domain updates (e.g., campaign service updating user stats)
|
|
179
|
+
*
|
|
180
|
+
* @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')
|
|
181
|
+
* @returns Specific store slice (fully typed based on key)
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* // In CampaignService
|
|
186
|
+
* protected async afterCreate(id: string, campaign: Campaign) {
|
|
187
|
+
* // Update primary store (campaigns)
|
|
188
|
+
* this.primaryStore.addItem(campaign);
|
|
189
|
+
*
|
|
190
|
+
* // Check feature flag (read-only) - auto-typed as FeatureFlagStoreSlice
|
|
191
|
+
* const flagsSlice = this.getStore('featureFlags'); // ✅ Type-safe!
|
|
192
|
+
* if (flagsSlice?.flags?.['update-user-stats']) {
|
|
193
|
+
* // Update user store (cross-domain mutation - OK since not read-only)
|
|
194
|
+
* const userSlice = this.getStore('users'); // ✅ Auto-typed!
|
|
195
|
+
* userSlice?.incrementCampaignCount(campaign.userId);
|
|
196
|
+
* }
|
|
197
|
+
* }
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
protected getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;
|
|
201
|
+
/**
|
|
202
|
+
* Sync data to primary store only (read stores are NOT updated).
|
|
203
|
+
* Uses setData (replace) or updateData (merge) based on `replace` parameter.
|
|
204
|
+
* If custom store handlers are configured, uses those instead of default behavior.
|
|
205
|
+
*
|
|
206
|
+
* @param data - Data to sync to primary store
|
|
207
|
+
* @param replace - If true, calls setData; if false, calls updateData
|
|
208
|
+
*/
|
|
209
|
+
protected syncToStores(data: TData, replace?: boolean): void;
|
|
210
|
+
/**
|
|
211
|
+
* Set loading state on primary store only.
|
|
212
|
+
* Read stores are NOT affected.
|
|
213
|
+
*
|
|
214
|
+
* Automatically called by CRUD methods before and after API calls.
|
|
215
|
+
*
|
|
216
|
+
* @param isLoading - Loading state
|
|
217
|
+
*/
|
|
218
|
+
protected setStoresLoading(isLoading: boolean): void;
|
|
219
|
+
/**
|
|
220
|
+
* Add entity to store (for create operations).
|
|
221
|
+
* Priority: storeHandlers.addData > store.addData
|
|
222
|
+
*
|
|
223
|
+
* @param entity - Entity to add
|
|
224
|
+
* @returns The converted store state (for reuse in event payloads)
|
|
225
|
+
*/
|
|
226
|
+
protected addEntityToStore(entity: TEntity): TStoreState;
|
|
227
|
+
/**
|
|
228
|
+
* Update entity in store (for update operations).
|
|
229
|
+
* Priority: storeHandlers.updateDataById > store.updateDataById
|
|
230
|
+
*
|
|
231
|
+
* @param id - Entity ID
|
|
232
|
+
* @param entity - Updated entity
|
|
233
|
+
* @returns The converted store state (for reuse in event payloads)
|
|
234
|
+
*/
|
|
235
|
+
protected updateEntityInStore(id: string, entity: TEntity): TStoreState;
|
|
236
|
+
/**
|
|
237
|
+
* Sync multiple entities to store using mapper.toStoreStateList.
|
|
238
|
+
* Converts entities to store format and syncs via setData (full replacement).
|
|
239
|
+
*
|
|
240
|
+
* @param entities - Entities to sync
|
|
241
|
+
* @returns Array of converted store states
|
|
242
|
+
*/
|
|
243
|
+
protected syncEntitiesToStore(entities: TEntity[]): TStoreState[];
|
|
244
|
+
/**
|
|
245
|
+
* Remove entity from store by ID.
|
|
246
|
+
* Priority: storeHandlers.removeData > store.removeData
|
|
247
|
+
*
|
|
248
|
+
* @param id - Entity ID to remove
|
|
249
|
+
*/
|
|
250
|
+
protected removeEntityFromStore(id: string): void;
|
|
251
|
+
/**
|
|
252
|
+
* Check if optimistic updates are enabled for an operation.
|
|
253
|
+
*/
|
|
254
|
+
protected isOptimisticEnabled(operation: 'create' | 'update' | 'delete'): boolean;
|
|
255
|
+
/**
|
|
256
|
+
* Save current store state for potential rollback.
|
|
257
|
+
* Call this BEFORE making optimistic changes.
|
|
258
|
+
*/
|
|
259
|
+
protected saveStateForRollback(operation: string): void;
|
|
260
|
+
/**
|
|
261
|
+
* Rollback to previous state on error.
|
|
262
|
+
* Call this when an optimistic update fails.
|
|
263
|
+
*/
|
|
264
|
+
protected rollbackState(operation: string, error: Error): void;
|
|
265
|
+
/**
|
|
266
|
+
* Clear rollback state after successful operation.
|
|
267
|
+
* Call this when API succeeds.
|
|
268
|
+
*/
|
|
269
|
+
protected clearRollbackState(operation: string): void;
|
|
270
|
+
/**
|
|
271
|
+
* Resolve conflict between optimistic and server state.
|
|
272
|
+
*/
|
|
273
|
+
protected resolveConflict<T>(optimistic: T, server: T): T;
|
|
274
|
+
/**
|
|
275
|
+
* Fetch all entities from API
|
|
276
|
+
*
|
|
277
|
+
* Flow:
|
|
278
|
+
* 1. Assert service is ready
|
|
279
|
+
* 2. Check fetcher is available
|
|
280
|
+
* 3. Set stores loading
|
|
281
|
+
* 4. Emit 'fetching' event
|
|
282
|
+
* 5. Lifecycle hook: beforeFetchAll
|
|
283
|
+
* 6. Call fetcher (from @plyaz/api)
|
|
284
|
+
* 7. Map response DTOs to domain entities
|
|
285
|
+
* 8. Lifecycle hook: afterFetchAll
|
|
286
|
+
* 9. Emit 'fetched' event
|
|
287
|
+
* 10. Return entities
|
|
288
|
+
*
|
|
289
|
+
* Error Handling:
|
|
290
|
+
* - On API error: wrap and emit error event
|
|
291
|
+
* - Set error on all stores
|
|
292
|
+
* - Re-throw wrapped error
|
|
293
|
+
*
|
|
294
|
+
* @param query - Optional query/filter parameters (e.g., { status: 'active' })
|
|
295
|
+
* @param options - Optional service options for fetcher
|
|
296
|
+
* @returns Promise resolving to array of entities
|
|
297
|
+
* @throws CorePackageError if fetcher not configured or API call fails
|
|
298
|
+
*
|
|
299
|
+
* @example
|
|
300
|
+
* ```typescript
|
|
301
|
+
* // Fetch all entities
|
|
302
|
+
* const allItems = await service.fetchAll();
|
|
303
|
+
*
|
|
304
|
+
* // Fetch with filters
|
|
305
|
+
* const activeItems = await service.fetchAll({ status: 'active' });
|
|
306
|
+
*
|
|
307
|
+
* // Fetch with pagination
|
|
308
|
+
* const pagedItems = await service.fetchAll({ page: 2, limit: 10 });
|
|
309
|
+
* ```
|
|
310
|
+
*/
|
|
311
|
+
fetchAll(query?: Partial<TQueryDTO>, options?: unknown): Promise<TEntity[]>;
|
|
312
|
+
/**
|
|
313
|
+
* Fetch single entity by ID from API
|
|
314
|
+
*
|
|
315
|
+
* @param id - Entity ID
|
|
316
|
+
* @param options - Optional service options for fetcher
|
|
317
|
+
* @returns Entity or null if not found
|
|
318
|
+
* @throws CorePackageError if fetcher not configured or API call fails
|
|
319
|
+
*/
|
|
320
|
+
fetchById<TInput = string, TOptions = unknown>(id: TInput, options?: TOptions): Promise<TEntity | null>;
|
|
321
|
+
/**
|
|
322
|
+
* Create new entity
|
|
323
|
+
*
|
|
324
|
+
* Flow:
|
|
325
|
+
* 1. Assert service is ready
|
|
326
|
+
* 2. Check fetcher is available
|
|
327
|
+
* 3. Set stores loading
|
|
328
|
+
* 4. Emit 'creating' event
|
|
329
|
+
* 5. Lifecycle hook: beforeCreate
|
|
330
|
+
* 6. Map input data to create DTO (if mapper available)
|
|
331
|
+
* 7. [Optimistic] Save state and add to store BEFORE API call
|
|
332
|
+
* 8. Call create fetcher (from @plyaz/api)
|
|
333
|
+
* 9. Map response DTO to domain entity
|
|
334
|
+
* 10. [Optimistic] Resolve conflicts if needed
|
|
335
|
+
* 11. Lifecycle hook: afterCreate
|
|
336
|
+
* 12. Emit 'created' event
|
|
337
|
+
* 13. Return entity
|
|
338
|
+
*
|
|
339
|
+
* @param data - Create data (can be partial domain entity or DTO)
|
|
340
|
+
* @param options - Optional service options for fetcher
|
|
341
|
+
* @returns Created entity
|
|
342
|
+
* @throws CorePackageError if fetcher not configured or creation fails
|
|
343
|
+
*/
|
|
344
|
+
create<TInput = unknown, TOptions = unknown>(data: TInput, options?: TOptions): Promise<TEntity>;
|
|
345
|
+
/**
|
|
346
|
+
* Update entity (partial update - PATCH)
|
|
347
|
+
*
|
|
348
|
+
* @param id - Entity ID
|
|
349
|
+
* @param data - Partial update data
|
|
350
|
+
* @param options - Optional service options for fetcher
|
|
351
|
+
* @returns Updated entity
|
|
352
|
+
* @throws CorePackageError if fetcher not configured or update fails
|
|
353
|
+
*/
|
|
354
|
+
update<TInput = unknown, TOptions = unknown>(id: string, data: TInput, options?: TOptions): Promise<TEntity>;
|
|
355
|
+
/**
|
|
356
|
+
* Delete entity
|
|
357
|
+
*
|
|
358
|
+
* @param id - Entity ID
|
|
359
|
+
* @param options - Optional service options for fetcher
|
|
360
|
+
* @returns Delete operation result (type specified by TDeleteResult generic)
|
|
361
|
+
* @throws CorePackageError if fetcher not configured or deletion fails
|
|
362
|
+
*/
|
|
363
|
+
delete<TInput = string, TOptions = unknown>(id: TInput, options?: TOptions): Promise<TDeleteResult>;
|
|
364
|
+
/**
|
|
365
|
+
* Emit event with automatic prefix
|
|
366
|
+
* Uses CoreEventManager under the hood
|
|
367
|
+
*
|
|
368
|
+
* @param event - Event name (without prefix)
|
|
369
|
+
* @param payload - Event payload
|
|
370
|
+
*
|
|
371
|
+
* @example
|
|
372
|
+
* ```typescript
|
|
373
|
+
* // If eventPrefix is 'example', this emits 'example:created'
|
|
374
|
+
* this.emitEvent('created', { entity, storeState });
|
|
375
|
+
* ```
|
|
376
|
+
*/
|
|
377
|
+
protected emitEvent<TPayload extends BaseFrontendEventPayload>(event: string, payload: TPayload): void;
|
|
378
|
+
/**
|
|
379
|
+
* Called before fetchAll API call
|
|
380
|
+
* Override to add custom logic (e.g., cache check, validate query)
|
|
381
|
+
*
|
|
382
|
+
* @param query - Optional query/filter parameters
|
|
383
|
+
*/
|
|
384
|
+
protected beforeFetchAll?(query?: Partial<TQueryDTO>): Promise<void>;
|
|
385
|
+
/**
|
|
386
|
+
* Called after fetchAll success
|
|
387
|
+
* Override to add custom logic (e.g., cache set, transform entities)
|
|
388
|
+
*
|
|
389
|
+
* @param entities - Fetched entities
|
|
390
|
+
* @param query - Optional query/filter parameters that were used
|
|
391
|
+
*/
|
|
392
|
+
protected afterFetchAll?(entities: TEntity[], query?: Partial<TQueryDTO>): Promise<void>;
|
|
393
|
+
/**
|
|
394
|
+
* Called before fetchById API call
|
|
395
|
+
*/
|
|
396
|
+
protected beforeFetchById?<TInput>(id: TInput): Promise<void>;
|
|
397
|
+
/**
|
|
398
|
+
* Called after fetchById success
|
|
399
|
+
*/
|
|
400
|
+
protected afterFetchById?(entity: TEntity): Promise<void>;
|
|
401
|
+
/**
|
|
402
|
+
* Called before create API call
|
|
403
|
+
* Use this to modify data or validate before sending to API
|
|
404
|
+
*/
|
|
405
|
+
protected beforeCreate?<TInput>(data: TInput): Promise<void>;
|
|
406
|
+
/**
|
|
407
|
+
* Called after create success
|
|
408
|
+
* Use this to update stores, show notifications, etc.
|
|
409
|
+
*/
|
|
410
|
+
protected afterCreate?(entity: TEntity): Promise<void>;
|
|
411
|
+
/**
|
|
412
|
+
* Called before update API call
|
|
413
|
+
*/
|
|
414
|
+
protected beforeUpdate?<TInput>(id: string, data: TInput): Promise<void>;
|
|
415
|
+
/**
|
|
416
|
+
* Called after update success
|
|
417
|
+
*/
|
|
418
|
+
protected afterUpdate?(id: string, entity: TEntity): Promise<void>;
|
|
419
|
+
/**
|
|
420
|
+
* Called before delete API call
|
|
421
|
+
*/
|
|
422
|
+
protected beforeDelete?<TInput>(id: TInput): Promise<void>;
|
|
423
|
+
/**
|
|
424
|
+
* Called after delete success
|
|
425
|
+
*/
|
|
426
|
+
protected afterDelete?<TInput>(id: TInput): Promise<void>;
|
|
427
|
+
/**
|
|
428
|
+
* Called before OPTIONS request
|
|
429
|
+
*
|
|
430
|
+
* Use for custom logic before checking allowed methods/CORS headers.
|
|
431
|
+
*
|
|
432
|
+
* @param resource - Optional resource identifier or URL
|
|
433
|
+
*/
|
|
434
|
+
protected beforeOptions?<TInput>(resource?: TInput): Promise<void>;
|
|
435
|
+
/**
|
|
436
|
+
* Called after OPTIONS request success
|
|
437
|
+
*
|
|
438
|
+
* Use for processing allowed methods/headers or logging.
|
|
439
|
+
*
|
|
440
|
+
* @param resource - Optional resource identifier or URL
|
|
441
|
+
* @param result - The OPTIONS response (allowed methods, CORS headers, etc.)
|
|
442
|
+
*/
|
|
443
|
+
protected afterOptions?<TInput>(resource: TInput | undefined, result: unknown): Promise<void>;
|
|
444
|
+
/**
|
|
445
|
+
* Called before HEAD request
|
|
446
|
+
*
|
|
447
|
+
* Use for custom logic before checking resource existence/headers.
|
|
448
|
+
*
|
|
449
|
+
* @param resource - Optional resource identifier or URL
|
|
450
|
+
*/
|
|
451
|
+
protected beforeHead?<TInput>(resource?: TInput): Promise<void>;
|
|
452
|
+
/**
|
|
453
|
+
* Called after HEAD request success
|
|
454
|
+
*
|
|
455
|
+
* Use for processing response headers or logging.
|
|
456
|
+
* Note: HEAD requests return no body, only headers.
|
|
457
|
+
*
|
|
458
|
+
* @param resource - Optional resource identifier or URL
|
|
459
|
+
* @param headers - Response headers (if available)
|
|
460
|
+
*/
|
|
461
|
+
protected afterHead?<TInput>(resource: TInput | undefined, headers?: unknown): Promise<void>;
|
|
462
|
+
/**
|
|
463
|
+
* Wrap error in CorePackageError with context
|
|
464
|
+
*
|
|
465
|
+
* @param error - Original error
|
|
466
|
+
* @param operation - Operation that failed
|
|
467
|
+
* @param context - Additional context
|
|
468
|
+
* @returns Wrapped error
|
|
469
|
+
*/
|
|
470
|
+
protected wrapError(error: unknown, operation: string, context?: Record<string, unknown>): CorePackageError;
|
|
471
|
+
/**
|
|
472
|
+
* Track a frontend operation with observability (span + metrics).
|
|
473
|
+
* Wraps an operation with automatic span creation, duration recording, and error tracking.
|
|
474
|
+
*
|
|
475
|
+
* @param operation - Operation name (fetchAll, fetchById, create, delete)
|
|
476
|
+
* @param entityId - Optional entity ID for context
|
|
477
|
+
* @param fn - The operation function to execute
|
|
478
|
+
* @returns Result of the operation
|
|
479
|
+
*
|
|
480
|
+
* @example
|
|
481
|
+
* ```typescript
|
|
482
|
+
* const entity = await this.trackOperation('create', undefined, async () => {
|
|
483
|
+
* return await this.config.fetchers.create(data);
|
|
484
|
+
* });
|
|
485
|
+
* ```
|
|
486
|
+
*/
|
|
487
|
+
protected trackOperation<T>(operation: 'fetchAll' | 'fetchById' | 'create' | 'patch' | 'delete', entityId: string | undefined, fn: () => Promise<T>): Promise<T>;
|
|
488
|
+
/**
|
|
489
|
+
* Record operation metrics (duration and count).
|
|
490
|
+
*/
|
|
491
|
+
private recordOperationMetrics;
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=BaseFrontendDomainService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseFrontendDomainService.d.ts","sourceRoot":"","sources":["../../../src/domain/base/BaseFrontendDomainService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Mapper
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for domain mappers handling data transformation.
|
|
5
|
+
* Supports all HTTP operations with corresponding mapping methods.
|
|
6
|
+
*
|
|
7
|
+
* Mapping concerns:
|
|
8
|
+
* - Request mapping (domain → API DTO for POST, PUT, PATCH, DELETE)
|
|
9
|
+
* - Response mapping (API DTO → domain)
|
|
10
|
+
* - Store mapping (domain ↔ Zustand state)
|
|
11
|
+
* - Query mapping (filters → query params)
|
|
12
|
+
*
|
|
13
|
+
* Note: Validation is handled by BaseValidator, not here.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* class ExampleMapper extends BaseMapper<
|
|
18
|
+
* ExampleEntity, // Domain model
|
|
19
|
+
* ExampleResponseDTO, // API response
|
|
20
|
+
* CreateExampleDTO, // POST body
|
|
21
|
+
* UpdateExampleDTO, // PUT body
|
|
22
|
+
* PatchExampleDTO, // PATCH body
|
|
23
|
+
* QueryExampleDTO, // GET params
|
|
24
|
+
* ExampleStoreItem // Store state
|
|
25
|
+
* > {
|
|
26
|
+
* toDomain(dto) { ... }
|
|
27
|
+
* toCreateDTO(data) { ... }
|
|
28
|
+
* // ... implement needed methods
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
import type { CoreBaseMapperInstance } from '@plyaz/types/core';
|
|
33
|
+
/**
|
|
34
|
+
* Abstract base mapper with default implementations
|
|
35
|
+
*
|
|
36
|
+
* Required to implement:
|
|
37
|
+
* - toDomain(dto): Convert API response to domain model
|
|
38
|
+
*
|
|
39
|
+
* Optional to implement (based on your needs):
|
|
40
|
+
* - toCreateDTO(data): For POST requests
|
|
41
|
+
* - toUpdateDTO(data): For PUT requests
|
|
42
|
+
* - toPatchDTO(data): For PATCH requests
|
|
43
|
+
* - toQueryDTO(filters): For GET query params
|
|
44
|
+
* - toStoreState(domain): Custom store state shape
|
|
45
|
+
* - fromStoreState(state): Restore domain from store
|
|
46
|
+
*/
|
|
47
|
+
export declare abstract class BaseMapper<TDomain, TResponseDTO, TCreateDTO = unknown, TUpdateDTO = TCreateDTO, TPatchDTO = Partial<TCreateDTO>, TQueryDTO = unknown, TStoreState = TDomain> implements CoreBaseMapperInstance<TDomain, TResponseDTO, TCreateDTO, TUpdateDTO, TPatchDTO, TQueryDTO, TStoreState> {
|
|
48
|
+
/**
|
|
49
|
+
* Convert API response DTO to domain model
|
|
50
|
+
* Handle snake_case → camelCase, add computed properties
|
|
51
|
+
*/
|
|
52
|
+
abstract toDomain(dto: TResponseDTO): TDomain;
|
|
53
|
+
/**
|
|
54
|
+
* Convert domain data to create DTO (POST body)
|
|
55
|
+
* Handle camelCase → snake_case, pick required fields
|
|
56
|
+
*/
|
|
57
|
+
toCreateDTO?(data: Partial<TDomain>): TCreateDTO;
|
|
58
|
+
/**
|
|
59
|
+
* Convert domain data to update DTO (PUT body - full replacement)
|
|
60
|
+
* Default: same as toCreateDTO
|
|
61
|
+
*/
|
|
62
|
+
toUpdateDTO?(data: Partial<TDomain>): TUpdateDTO;
|
|
63
|
+
/**
|
|
64
|
+
* Convert domain data to patch DTO (PATCH body - partial)
|
|
65
|
+
* Default: picks only defined fields
|
|
66
|
+
*/
|
|
67
|
+
toPatchDTO?(data: Partial<TDomain>): TPatchDTO;
|
|
68
|
+
/**
|
|
69
|
+
* Convert filter object to query params DTO (GET)
|
|
70
|
+
* Handle pagination, sorting, filtering
|
|
71
|
+
*/
|
|
72
|
+
toQueryDTO?(filters: Partial<TQueryDTO>): TQueryDTO;
|
|
73
|
+
/**
|
|
74
|
+
* Convert database row/repository result to response DTO
|
|
75
|
+
* Override to map repository output to API response format
|
|
76
|
+
* Useful when repository returns different format than API expects
|
|
77
|
+
*/
|
|
78
|
+
toResponseDTO?(row: unknown): TResponseDTO;
|
|
79
|
+
/**
|
|
80
|
+
* Map array of DTOs to domain models
|
|
81
|
+
*/
|
|
82
|
+
toDomainList(dtos: TResponseDTO[]): TDomain[];
|
|
83
|
+
/**
|
|
84
|
+
* Convert domain model to store state (serializable)
|
|
85
|
+
* Default: strips functions, keeps data
|
|
86
|
+
*/
|
|
87
|
+
toStoreState(domain: TDomain): TStoreState;
|
|
88
|
+
/**
|
|
89
|
+
* Convert array of domain models to aggregated store state
|
|
90
|
+
* Override to customize how multiple items map to store
|
|
91
|
+
* Default: returns array of individual store states (as Partial since shape may differ)
|
|
92
|
+
*/
|
|
93
|
+
toStoreStateList?(domains: TDomain[]): Partial<TStoreState>;
|
|
94
|
+
/**
|
|
95
|
+
* Restore domain model from store state
|
|
96
|
+
* Override to restore computed properties/methods
|
|
97
|
+
*/
|
|
98
|
+
fromStoreState(state: TStoreState): TDomain;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=BaseMapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseMapper.d.ts","sourceRoot":"","sources":["../../../src/domain/base/BaseMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,8BAAsB,UAAU,CAC9B,OAAO,EACP,YAAY,EACZ,UAAU,GAAG,OAAO,EACpB,UAAU,GAAG,UAAU,EACvB,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,EAC/B,SAAS,GAAG,OAAO,EACnB,WAAW,GAAG,OAAO,CACrB,YACE,sBAAsB,CACpB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,CACZ;IAMH;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO;IAM7C;;;OAGG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU;IAEhD;;;OAGG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU;IAEhD;;;OAGG;IACH,UAAU,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS;IAE9C;;;OAGG;IACH,UAAU,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS;IAMnD;;;;OAIG;IACH,aAAa,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY;IAE1C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE;IAQ7C;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW;IAe1C;;;;OAIG;IACH,gBAAgB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAM3D;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;CAG5C"}
|