@nest-yalc-2/omnikernel-module 1.1.0
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 +661 -0
- package/README.md +193 -0
- package/package.json +52 -0
- package/src/__tests__/omni-collection.entity.spec.ts +49 -0
- package/src/__tests__/omni-collection.service.spec.ts +83 -0
- package/src/__tests__/omni-document.entity.spec.ts +55 -0
- package/src/__tests__/omni-document.service.spec.ts +83 -0
- package/src/__tests__/omni-extension-projection-constraints.spec.ts +518 -0
- package/src/__tests__/omni-extension-projection.registration.spec.ts +946 -0
- package/src/__tests__/omni-extension-projection.service.spec.ts +806 -0
- package/src/__tests__/omni-external-ref.entity.spec.ts +36 -0
- package/src/__tests__/omni-external-ref.service.spec.ts +252 -0
- package/src/__tests__/omni-named.entity.spec.ts +33 -0
- package/src/__tests__/omni-record.entity.spec.ts +32 -0
- package/src/__tests__/omni-record.service.spec.ts +107 -0
- package/src/__tests__/omni-relation-semantics.spec.ts +102 -0
- package/src/__tests__/omni-relation.entity.spec.ts +38 -0
- package/src/__tests__/omni-scope-substrate.spec.ts +81 -0
- package/src/__tests__/omni-scoped.backend.spec.ts +115 -0
- package/src/__tests__/omni-scoped.service.spec.ts +354 -0
- package/src/__tests__/omnikernel.diagnostics.spec.ts +94 -0
- package/src/__tests__/omnikernel.module.spec.ts +40 -0
- package/src/__tests__/omnikernel.persistence.spec.ts +154 -0
- package/src/__tests__/omnikernel.public-api.spec.ts +238 -0
- package/src/__tests__/omnikernel.query.service.spec.ts +155 -0
- package/src/__tests__/tsconfig.json +6 -0
- package/src/base/omni-base.entity.d.ts +9 -0
- package/src/base/omni-base.entity.js +53 -0
- package/src/base/omni-base.entity.js.map +1 -0
- package/src/base/omni-base.entity.ts +41 -0
- package/src/base/omni-external-ref.entity.d.ts +13 -0
- package/src/base/omni-external-ref.entity.js +72 -0
- package/src/base/omni-external-ref.entity.js.map +1 -0
- package/src/base/omni-external-ref.entity.ts +53 -0
- package/src/base/omni-named.entity.d.ts +6 -0
- package/src/base/omni-named.entity.js +35 -0
- package/src/base/omni-named.entity.js.map +1 -0
- package/src/base/omni-named.entity.ts +16 -0
- package/src/base/omni-record.entity.d.ts +13 -0
- package/src/base/omni-record.entity.js +71 -0
- package/src/base/omni-record.entity.js.map +1 -0
- package/src/base/omni-record.entity.ts +51 -0
- package/src/base/omni-relation.entity.d.ts +15 -0
- package/src/base/omni-relation.entity.js +91 -0
- package/src/base/omni-relation.entity.js.map +1 -0
- package/src/base/omni-relation.entity.ts +72 -0
- package/src/index.d.ts +49 -0
- package/src/index.js +66 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +49 -0
- package/src/omni-collection-kind.enum.d.ts +4 -0
- package/src/omni-collection-kind.enum.js +13 -0
- package/src/omni-collection-kind.enum.js.map +1 -0
- package/src/omni-collection-kind.enum.ts +10 -0
- package/src/omni-collection.backend.d.ts +2 -0
- package/src/omni-collection.backend.js +15 -0
- package/src/omni-collection.backend.js.map +1 -0
- package/src/omni-collection.backend.ts +16 -0
- package/src/omni-collection.dto.d.ts +32 -0
- package/src/omni-collection.dto.js +184 -0
- package/src/omni-collection.dto.js.map +1 -0
- package/src/omni-collection.dto.ts +170 -0
- package/src/omni-collection.entity.d.ts +7 -0
- package/src/omni-collection.entity.js +41 -0
- package/src/omni-collection.entity.js.map +1 -0
- package/src/omni-collection.entity.ts +21 -0
- package/src/omni-collection.service.d.ts +14 -0
- package/src/omni-collection.service.js +24 -0
- package/src/omni-collection.service.js.map +1 -0
- package/src/omni-collection.service.ts +75 -0
- package/src/omni-document-kind.enum.d.ts +6 -0
- package/src/omni-document-kind.enum.js +15 -0
- package/src/omni-document-kind.enum.js.map +1 -0
- package/src/omni-document-kind.enum.ts +12 -0
- package/src/omni-document.backend.d.ts +2 -0
- package/src/omni-document.backend.js +15 -0
- package/src/omni-document.backend.js.map +1 -0
- package/src/omni-document.backend.ts +16 -0
- package/src/omni-document.dto.d.ts +35 -0
- package/src/omni-document.dto.js +213 -0
- package/src/omni-document.dto.js.map +1 -0
- package/src/omni-document.dto.ts +198 -0
- package/src/omni-document.entity.d.ts +10 -0
- package/src/omni-document.entity.js +53 -0
- package/src/omni-document.entity.js.map +1 -0
- package/src/omni-document.entity.ts +30 -0
- package/src/omni-document.service.d.ts +14 -0
- package/src/omni-document.service.js +24 -0
- package/src/omni-document.service.js.map +1 -0
- package/src/omni-document.service.ts +75 -0
- package/src/omni-dto.helpers.d.ts +1 -0
- package/src/omni-dto.helpers.js +10 -0
- package/src/omni-dto.helpers.js.map +1 -0
- package/src/omni-dto.helpers.ts +21 -0
- package/src/omni-extension-projection.definition.d.ts +17 -0
- package/src/omni-extension-projection.definition.js +160 -0
- package/src/omni-extension-projection.definition.js.map +1 -0
- package/src/omni-extension-projection.definition.ts +294 -0
- package/src/omni-extension-projection.resource.d.ts +42 -0
- package/src/omni-extension-projection.resource.js +127 -0
- package/src/omni-extension-projection.resource.js.map +1 -0
- package/src/omni-extension-projection.resource.ts +274 -0
- package/src/omni-extension-projection.service.d.ts +33 -0
- package/src/omni-extension-projection.service.js +332 -0
- package/src/omni-extension-projection.service.js.map +1 -0
- package/src/omni-extension-projection.service.ts +452 -0
- package/src/omni-external-ref-binding.validator.d.ts +14 -0
- package/src/omni-external-ref-binding.validator.js +34 -0
- package/src/omni-external-ref-binding.validator.js.map +1 -0
- package/src/omni-external-ref-binding.validator.ts +53 -0
- package/src/omni-external-ref-internal-type.enum.d.ts +5 -0
- package/src/omni-external-ref-internal-type.enum.js +14 -0
- package/src/omni-external-ref-internal-type.enum.js.map +1 -0
- package/src/omni-external-ref-internal-type.enum.ts +11 -0
- package/src/omni-external-ref.backend.d.ts +2 -0
- package/src/omni-external-ref.backend.js +19 -0
- package/src/omni-external-ref.backend.js.map +1 -0
- package/src/omni-external-ref.backend.ts +25 -0
- package/src/omni-external-ref.dto.d.ts +26 -0
- package/src/omni-external-ref.dto.js +140 -0
- package/src/omni-external-ref.dto.js.map +1 -0
- package/src/omni-external-ref.dto.ts +128 -0
- package/src/omni-external-ref.service.d.ts +33 -0
- package/src/omni-external-ref.service.js +133 -0
- package/src/omni-external-ref.service.js.map +1 -0
- package/src/omni-external-ref.service.ts +255 -0
- package/src/omni-migration.d.ts +28 -0
- package/src/omni-migration.js +239 -0
- package/src/omni-migration.js.map +1 -0
- package/src/omni-migration.ts +365 -0
- package/src/omni-named.backend.d.ts +2 -0
- package/src/omni-named.backend.js +13 -0
- package/src/omni-named.backend.js.map +1 -0
- package/src/omni-named.backend.ts +11 -0
- package/src/omni-named.dto.d.ts +19 -0
- package/src/omni-named.dto.js +94 -0
- package/src/omni-named.dto.js.map +1 -0
- package/src/omni-named.dto.ts +86 -0
- package/src/omni-projection.catalog.d.ts +49 -0
- package/src/omni-projection.catalog.js +177 -0
- package/src/omni-projection.catalog.js.map +1 -0
- package/src/omni-projection.catalog.ts +345 -0
- package/src/omni-projection.lifecycle.d.ts +20 -0
- package/src/omni-projection.lifecycle.js +3 -0
- package/src/omni-projection.lifecycle.js.map +1 -0
- package/src/omni-projection.lifecycle.ts +53 -0
- package/src/omni-record-status.enum.d.ts +5 -0
- package/src/omni-record-status.enum.js +14 -0
- package/src/omni-record-status.enum.js.map +1 -0
- package/src/omni-record-status.enum.ts +11 -0
- package/src/omni-record.backend.d.ts +2 -0
- package/src/omni-record.backend.js +13 -0
- package/src/omni-record.backend.js.map +1 -0
- package/src/omni-record.backend.ts +19 -0
- package/src/omni-record.dto.d.ts +29 -0
- package/src/omni-record.dto.js +169 -0
- package/src/omni-record.dto.js.map +1 -0
- package/src/omni-record.dto.ts +157 -0
- package/src/omni-record.service.d.ts +18 -0
- package/src/omni-record.service.js +45 -0
- package/src/omni-record.service.js.map +1 -0
- package/src/omni-record.service.ts +113 -0
- package/src/omni-relation-kind.contract.d.ts +9 -0
- package/src/omni-relation-kind.contract.js +33 -0
- package/src/omni-relation-kind.contract.js.map +1 -0
- package/src/omni-relation-kind.contract.ts +49 -0
- package/src/omni-relation-kind.enum.d.ts +6 -0
- package/src/omni-relation-kind.enum.js +15 -0
- package/src/omni-relation-kind.enum.js.map +1 -0
- package/src/omni-relation-kind.enum.ts +12 -0
- package/src/omni-relation-projection.definition.d.ts +25 -0
- package/src/omni-relation-projection.definition.js +83 -0
- package/src/omni-relation-projection.definition.js.map +1 -0
- package/src/omni-relation-projection.definition.ts +166 -0
- package/src/omni-relation-projection.resource.d.ts +51 -0
- package/src/omni-relation-projection.resource.js +203 -0
- package/src/omni-relation-projection.resource.js.map +1 -0
- package/src/omni-relation-projection.resource.ts +360 -0
- package/src/omni-relation-projection.service.d.ts +47 -0
- package/src/omni-relation-projection.service.js +385 -0
- package/src/omni-relation-projection.service.js.map +1 -0
- package/src/omni-relation-projection.service.ts +610 -0
- package/src/omni-relation-semantics.d.ts +11 -0
- package/src/omni-relation-semantics.js +34 -0
- package/src/omni-relation-semantics.js.map +1 -0
- package/src/omni-relation-semantics.ts +52 -0
- package/src/omni-relation-status.enum.d.ts +5 -0
- package/src/omni-relation-status.enum.js +14 -0
- package/src/omni-relation-status.enum.js.map +1 -0
- package/src/omni-relation-status.enum.ts +11 -0
- package/src/omni-relation.backend.d.ts +2 -0
- package/src/omni-relation.backend.js +17 -0
- package/src/omni-relation.backend.js.map +1 -0
- package/src/omni-relation.backend.ts +21 -0
- package/src/omni-relation.dto.d.ts +28 -0
- package/src/omni-relation.dto.js +153 -0
- package/src/omni-relation.dto.js.map +1 -0
- package/src/omni-relation.dto.ts +142 -0
- package/src/omni-relation.service.d.ts +19 -0
- package/src/omni-relation.service.js +76 -0
- package/src/omni-relation.service.js.map +1 -0
- package/src/omni-relation.service.ts +159 -0
- package/src/omni-scope.d.ts +33 -0
- package/src/omni-scope.js +91 -0
- package/src/omni-scope.js.map +1 -0
- package/src/omni-scope.ts +161 -0
- package/src/omni-scoped.backend.d.ts +21 -0
- package/src/omni-scoped.backend.js +47 -0
- package/src/omni-scoped.backend.js.map +1 -0
- package/src/omni-scoped.backend.ts +110 -0
- package/src/omni-scoped.repository.d.ts +10 -0
- package/src/omni-scoped.repository.js +26 -0
- package/src/omni-scoped.repository.js.map +1 -0
- package/src/omni-scoped.repository.ts +34 -0
- package/src/omni-scoped.service.d.ts +36 -0
- package/src/omni-scoped.service.js +171 -0
- package/src/omni-scoped.service.js.map +1 -0
- package/src/omni-scoped.service.ts +338 -0
- package/src/omnikernel.diagnostics.d.ts +16 -0
- package/src/omnikernel.diagnostics.js +50 -0
- package/src/omnikernel.diagnostics.js.map +1 -0
- package/src/omnikernel.diagnostics.ts +83 -0
- package/src/omnikernel.module.d.ts +5 -0
- package/src/omnikernel.module.js +87 -0
- package/src/omnikernel.module.js.map +1 -0
- package/src/omnikernel.module.ts +97 -0
- package/src/omnikernel.query.service.d.ts +17 -0
- package/src/omnikernel.query.service.js +85 -0
- package/src/omnikernel.query.service.js.map +1 -0
- package/src/omnikernel.query.service.ts +108 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { Scope, type InjectionToken, type Provider } from '@nestjs/common';
|
|
2
|
+
import { getDataSourceToken } from '@nestjs/typeorm';
|
|
3
|
+
import {
|
|
4
|
+
createProjectionDialect,
|
|
5
|
+
createProjectionGraphqlTypes,
|
|
6
|
+
CrudGenResourceFactory,
|
|
7
|
+
getServiceToken,
|
|
8
|
+
type ICrudGenResourceFactoryResult,
|
|
9
|
+
type ProjectionGraphqlTypes,
|
|
10
|
+
} from '@nest-yalc-2/crud-gen';
|
|
11
|
+
import {
|
|
12
|
+
GQLDataLoader,
|
|
13
|
+
getDataloaderToken,
|
|
14
|
+
getFn,
|
|
15
|
+
} from '@nest-yalc-2/data-loader';
|
|
16
|
+
import { YalcEventService } from '@nest-yalc-2/event-manager';
|
|
17
|
+
import type { ClassType } from '@nest-yalc-2/types/globals.d.js';
|
|
18
|
+
import type { DataSource, EntityTarget, ObjectLiteral } from 'typeorm';
|
|
19
|
+
import { OmniRecordEntity } from './base/omni-record.entity.js';
|
|
20
|
+
import type { OmniExtensionProjectionDefinition } from './omni-extension-projection.definition.js';
|
|
21
|
+
import { OmniExtensionProjectionService } from './omni-extension-projection.service.js';
|
|
22
|
+
import type {
|
|
23
|
+
OmniExtensionProjectionReaderRegistration,
|
|
24
|
+
OmniProjectionReaderCatalogProvider,
|
|
25
|
+
} from './omni-projection.catalog.js';
|
|
26
|
+
import type { OmniProjectionLifecycleProvider } from './omni-projection.lifecycle.js';
|
|
27
|
+
import { OmniScopeContext } from './omni-scope.js';
|
|
28
|
+
|
|
29
|
+
export interface OmniExtensionProjectionGraphqlNames {
|
|
30
|
+
object: string;
|
|
31
|
+
create: string;
|
|
32
|
+
patch: string;
|
|
33
|
+
conditions: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface OmniExtensionProjectionRegistrationOptions<
|
|
37
|
+
Extension extends ObjectLiteral,
|
|
38
|
+
Api extends ObjectLiteral,
|
|
39
|
+
> {
|
|
40
|
+
/** The dynamically created class from createOmniExtensionProjectionEntity. */
|
|
41
|
+
entity: EntityTarget<Extension>;
|
|
42
|
+
/** API-only model used by CrudGen to derive operation names and tokens. */
|
|
43
|
+
apiModel: ClassType<Api>;
|
|
44
|
+
definition: OmniExtensionProjectionDefinition;
|
|
45
|
+
/** Shared catalog provider, normally built from all returned registrations. */
|
|
46
|
+
catalog?: OmniProjectionReaderCatalogProvider;
|
|
47
|
+
/** Request-scoped app policy shared by generated REST and GraphQL. */
|
|
48
|
+
lifecycle?: OmniProjectionLifecycleProvider<
|
|
49
|
+
OmniExtensionProjectionDefinition,
|
|
50
|
+
Extension
|
|
51
|
+
>;
|
|
52
|
+
dbConnection: string;
|
|
53
|
+
rest?: {
|
|
54
|
+
path?: string;
|
|
55
|
+
};
|
|
56
|
+
graphql?: {
|
|
57
|
+
prefix?: string;
|
|
58
|
+
names?: OmniExtensionProjectionGraphqlNames;
|
|
59
|
+
};
|
|
60
|
+
/** Optional consumer-owned ModuleRef token for generated GraphQL DI. */
|
|
61
|
+
moduleRefToken?: InjectionToken;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface OmniExtensionProjectionRegistration<
|
|
65
|
+
Extension extends ObjectLiteral,
|
|
66
|
+
Api extends ObjectLiteral,
|
|
67
|
+
> {
|
|
68
|
+
/** Immutable source contract shared by service, transport, and migrations. */
|
|
69
|
+
definition: OmniExtensionProjectionDefinition;
|
|
70
|
+
/** Register these entities with TypeOrmModule.forFeature in the app module. */
|
|
71
|
+
entities: readonly EntityTarget<Extension>[];
|
|
72
|
+
/** Pass these into OmniKernelModule.register({ reservedRecordKinds }) . */
|
|
73
|
+
reservedRecordKinds: readonly string[];
|
|
74
|
+
/** Include this in createOmniProjectionReaderCatalog([...]). */
|
|
75
|
+
reader: OmniExtensionProjectionReaderRegistration<Extension>;
|
|
76
|
+
/** Generated GraphQL classes, useful when composing additional schema. */
|
|
77
|
+
graphqlTypes: ProjectionGraphqlTypes;
|
|
78
|
+
resource: ICrudGenResourceFactoryResult<Api>;
|
|
79
|
+
controllers: readonly ClassType[];
|
|
80
|
+
providers: readonly Provider[];
|
|
81
|
+
serviceToken: string;
|
|
82
|
+
dataLoaderToken: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function dialectFor(dataSource: DataSource) {
|
|
86
|
+
if (
|
|
87
|
+
dataSource.options.type !== 'sqlite' &&
|
|
88
|
+
dataSource.options.type !== 'postgres'
|
|
89
|
+
) {
|
|
90
|
+
throw new TypeError(
|
|
91
|
+
'Omni extension projections require a SQLite or PostgreSQL data source.',
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
return createProjectionDialect(dataSource.options.type);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function defaultGraphqlNames(
|
|
98
|
+
apiModel: ClassType,
|
|
99
|
+
): OmniExtensionProjectionGraphqlNames {
|
|
100
|
+
return {
|
|
101
|
+
object: apiModel.name,
|
|
102
|
+
create: `${apiModel.name}CreateInput`,
|
|
103
|
+
patch: `${apiModel.name}UpdateInput`,
|
|
104
|
+
conditions: `${apiModel.name}Condition`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Composes the standard CrudGen REST and GraphQL surfaces for one Omni-owned
|
|
110
|
+
* extension. It deliberately supplies no handwritten controller or resolver:
|
|
111
|
+
* consumers register the returned controllers/providers alongside their
|
|
112
|
+
* trusted OmniKernel scope module and TypeOrmModule.forFeature entities.
|
|
113
|
+
*/
|
|
114
|
+
export function createOmniExtensionProjectionRegistration<
|
|
115
|
+
Extension extends ObjectLiteral,
|
|
116
|
+
Api extends ObjectLiteral,
|
|
117
|
+
>(
|
|
118
|
+
options: OmniExtensionProjectionRegistrationOptions<Extension, Api>,
|
|
119
|
+
): OmniExtensionProjectionRegistration<Extension, Api> {
|
|
120
|
+
const graphqlTypes = createProjectionGraphqlTypes(
|
|
121
|
+
options.definition,
|
|
122
|
+
options.graphql?.names ?? defaultGraphqlNames(options.apiModel),
|
|
123
|
+
);
|
|
124
|
+
const serviceToken = getServiceToken(options.apiModel);
|
|
125
|
+
const dataLoaderToken = getDataloaderToken(options.apiModel);
|
|
126
|
+
const resource = CrudGenResourceFactory<Api>({
|
|
127
|
+
entityModel: options.apiModel,
|
|
128
|
+
backend: false,
|
|
129
|
+
graphql: {
|
|
130
|
+
resolver: {
|
|
131
|
+
dto: graphqlTypes.object as ClassType,
|
|
132
|
+
input: {
|
|
133
|
+
create: graphqlTypes.create as ClassType,
|
|
134
|
+
update: graphqlTypes.patch as ClassType,
|
|
135
|
+
conditions: graphqlTypes.conditions as ClassType,
|
|
136
|
+
},
|
|
137
|
+
...(options.graphql?.prefix ? { prefix: options.graphql.prefix } : {}),
|
|
138
|
+
...(options.moduleRefToken !== undefined
|
|
139
|
+
? { moduleRefToken: options.moduleRefToken }
|
|
140
|
+
: {}),
|
|
141
|
+
queries: {
|
|
142
|
+
getResource: { idName: options.definition.identity.column },
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
serviceToken,
|
|
146
|
+
dataLoaderToken,
|
|
147
|
+
},
|
|
148
|
+
rest: {
|
|
149
|
+
dto: graphqlTypes.object as ClassType,
|
|
150
|
+
serialize: true,
|
|
151
|
+
...(options.rest?.path ? { path: options.rest.path } : {}),
|
|
152
|
+
idField: options.definition.identity.column as keyof Api & string,
|
|
153
|
+
serviceToken,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
const reader = Object.freeze({
|
|
158
|
+
type: 'extension' as const,
|
|
159
|
+
id: options.definition.id,
|
|
160
|
+
entity: options.entity,
|
|
161
|
+
definition: options.definition,
|
|
162
|
+
}) as OmniExtensionProjectionReaderRegistration<Extension>;
|
|
163
|
+
const serviceProvider: Provider =
|
|
164
|
+
options.lifecycle && options.catalog
|
|
165
|
+
? {
|
|
166
|
+
provide: serviceToken,
|
|
167
|
+
scope: Scope.REQUEST,
|
|
168
|
+
useFactory: (
|
|
169
|
+
dataSource: DataSource,
|
|
170
|
+
scope: OmniScopeContext,
|
|
171
|
+
events: YalcEventService,
|
|
172
|
+
lifecycle: any,
|
|
173
|
+
catalog: any,
|
|
174
|
+
) =>
|
|
175
|
+
new OmniExtensionProjectionService(
|
|
176
|
+
dataSource.getRepository(options.entity),
|
|
177
|
+
dataSource.getRepository(OmniRecordEntity),
|
|
178
|
+
dataSource,
|
|
179
|
+
scope,
|
|
180
|
+
dialectFor(dataSource),
|
|
181
|
+
events,
|
|
182
|
+
options.definition,
|
|
183
|
+
lifecycle,
|
|
184
|
+
catalog,
|
|
185
|
+
),
|
|
186
|
+
inject: [
|
|
187
|
+
getDataSourceToken(options.dbConnection),
|
|
188
|
+
OmniScopeContext,
|
|
189
|
+
YalcEventService,
|
|
190
|
+
options.lifecycle.token,
|
|
191
|
+
options.catalog.token,
|
|
192
|
+
],
|
|
193
|
+
}
|
|
194
|
+
: options.lifecycle
|
|
195
|
+
? {
|
|
196
|
+
provide: serviceToken,
|
|
197
|
+
scope: Scope.REQUEST,
|
|
198
|
+
useFactory: (
|
|
199
|
+
dataSource: DataSource,
|
|
200
|
+
scope: OmniScopeContext,
|
|
201
|
+
events: YalcEventService,
|
|
202
|
+
lifecycle: any,
|
|
203
|
+
) =>
|
|
204
|
+
new OmniExtensionProjectionService(
|
|
205
|
+
dataSource.getRepository(options.entity),
|
|
206
|
+
dataSource.getRepository(OmniRecordEntity),
|
|
207
|
+
dataSource,
|
|
208
|
+
scope,
|
|
209
|
+
dialectFor(dataSource),
|
|
210
|
+
events,
|
|
211
|
+
options.definition,
|
|
212
|
+
lifecycle,
|
|
213
|
+
),
|
|
214
|
+
inject: [
|
|
215
|
+
getDataSourceToken(options.dbConnection),
|
|
216
|
+
OmniScopeContext,
|
|
217
|
+
YalcEventService,
|
|
218
|
+
options.lifecycle.token,
|
|
219
|
+
],
|
|
220
|
+
}
|
|
221
|
+
: {
|
|
222
|
+
provide: serviceToken,
|
|
223
|
+
scope: Scope.REQUEST,
|
|
224
|
+
useFactory: (
|
|
225
|
+
dataSource: DataSource,
|
|
226
|
+
scope: OmniScopeContext,
|
|
227
|
+
events: YalcEventService,
|
|
228
|
+
) =>
|
|
229
|
+
new OmniExtensionProjectionService(
|
|
230
|
+
dataSource.getRepository(options.entity),
|
|
231
|
+
dataSource.getRepository(OmniRecordEntity),
|
|
232
|
+
dataSource,
|
|
233
|
+
scope,
|
|
234
|
+
dialectFor(dataSource),
|
|
235
|
+
events,
|
|
236
|
+
options.definition,
|
|
237
|
+
undefined,
|
|
238
|
+
),
|
|
239
|
+
inject: [
|
|
240
|
+
getDataSourceToken(options.dbConnection),
|
|
241
|
+
OmniScopeContext,
|
|
242
|
+
YalcEventService,
|
|
243
|
+
],
|
|
244
|
+
};
|
|
245
|
+
const providers: Provider[] = [
|
|
246
|
+
serviceProvider,
|
|
247
|
+
{
|
|
248
|
+
provide: dataLoaderToken,
|
|
249
|
+
scope: Scope.REQUEST,
|
|
250
|
+
useFactory: (
|
|
251
|
+
service: OmniExtensionProjectionService<Extension>,
|
|
252
|
+
scope: OmniScopeContext,
|
|
253
|
+
) =>
|
|
254
|
+
new GQLDataLoader(getFn(service as never), 'guid', undefined, {
|
|
255
|
+
cacheKeyFn: (key) => scope.cacheKey(key),
|
|
256
|
+
}),
|
|
257
|
+
inject: [serviceToken, OmniScopeContext],
|
|
258
|
+
},
|
|
259
|
+
...resource.providers,
|
|
260
|
+
];
|
|
261
|
+
|
|
262
|
+
return Object.freeze({
|
|
263
|
+
definition: options.definition,
|
|
264
|
+
entities: Object.freeze([options.entity]),
|
|
265
|
+
reservedRecordKinds: Object.freeze([options.definition.owner.kind]),
|
|
266
|
+
reader,
|
|
267
|
+
graphqlTypes: Object.freeze(graphqlTypes),
|
|
268
|
+
resource,
|
|
269
|
+
controllers: Object.freeze([...resource.controllers]),
|
|
270
|
+
providers: Object.freeze(providers),
|
|
271
|
+
serviceToken,
|
|
272
|
+
dataLoaderToken,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { CrudGenFindManyOptions } from '@nest-yalc-2/crud-gen';
|
|
2
|
+
import { ProjectionResourceService, type ProjectionDialect } from '@nest-yalc-2/crud-gen';
|
|
3
|
+
import { YalcEventService } from '@nest-yalc-2/event-manager';
|
|
4
|
+
import { type DataSource, type ObjectLiteral, type Repository } from 'typeorm';
|
|
5
|
+
import { OmniRecordEntity } from './base/omni-record.entity.js';
|
|
6
|
+
import { type OmniProjectionReaderCatalog } from './omni-projection.catalog.js';
|
|
7
|
+
import type { OmniExtensionProjectionDefinition } from './omni-extension-projection.definition.js';
|
|
8
|
+
import type { OmniProjectionLifecycle } from './omni-projection.lifecycle.js';
|
|
9
|
+
import type { OmniScope } from './omni-scope.js';
|
|
10
|
+
export declare class OmniExtensionProjectionService<Extension extends ObjectLiteral> extends ProjectionResourceService<Extension> {
|
|
11
|
+
private readonly ownerRepository;
|
|
12
|
+
private readonly dataSource;
|
|
13
|
+
private readonly omniDefinition;
|
|
14
|
+
private readonly lifecycle?;
|
|
15
|
+
private readonly readerCatalog?;
|
|
16
|
+
constructor(extensionRepository: Repository<Extension>, ownerRepository: Repository<OmniRecordEntity>, dataSource: DataSource, scope: OmniScope, dialect: ProjectionDialect, events: YalcEventService, omniDefinition: OmniExtensionProjectionDefinition, lifecycle?: OmniProjectionLifecycle<OmniExtensionProjectionDefinition, Extension> | undefined, readerCatalog?: OmniProjectionReaderCatalog | undefined);
|
|
17
|
+
getEntity(conditions: Record<string, unknown>, _fields?: string[], _relations?: string[], _databaseName?: string, options?: {
|
|
18
|
+
failOnNull?: boolean;
|
|
19
|
+
}): Promise<Extension | null>;
|
|
20
|
+
getEntityListExtended(findOptions?: CrudGenFindManyOptions<Extension>, withCount?: boolean): Promise<Extension[] | [Extension[], number]>;
|
|
21
|
+
createEntity(input: Record<string, unknown>): Promise<Extension>;
|
|
22
|
+
updateEntity(conditions: Record<string, unknown>, input: Record<string, unknown>): Promise<Extension>;
|
|
23
|
+
deleteEntity(conditions: Record<string, unknown>): Promise<boolean>;
|
|
24
|
+
private createExtension;
|
|
25
|
+
private readers;
|
|
26
|
+
private mutate;
|
|
27
|
+
private createValuePatch;
|
|
28
|
+
private readOne;
|
|
29
|
+
private findOwner;
|
|
30
|
+
private merge;
|
|
31
|
+
private throwUpdateMiss;
|
|
32
|
+
private identityConflict;
|
|
33
|
+
}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OmniExtensionProjectionService = void 0;
|
|
4
|
+
const crud_gen_1 = require("@nest-yalc-2/crud-gen");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const omni_record_entity_js_1 = require("./base/omni-record.entity.js");
|
|
7
|
+
const omni_projection_catalog_js_1 = require("./omni-projection.catalog.js");
|
|
8
|
+
function hasOwn(input, field) {
|
|
9
|
+
return Object.prototype.hasOwnProperty.call(input, field);
|
|
10
|
+
}
|
|
11
|
+
function isUniqueConstraint(error) {
|
|
12
|
+
const candidate = error;
|
|
13
|
+
const code = candidate?.driverError?.code;
|
|
14
|
+
return code === 'SQLITE_CONSTRAINT' || code === '23505';
|
|
15
|
+
}
|
|
16
|
+
function isRetryableTransactionError(error) {
|
|
17
|
+
const candidate = error;
|
|
18
|
+
const code = candidate?.driverError?.code ?? candidate?.code;
|
|
19
|
+
return (code === '40001' ||
|
|
20
|
+
code === 'SQLITE_BUSY' ||
|
|
21
|
+
code === 'SQLITE_BUSY_SNAPSHOT');
|
|
22
|
+
}
|
|
23
|
+
class OmniExtensionProjectionService extends crud_gen_1.ProjectionResourceService {
|
|
24
|
+
constructor(extensionRepository, ownerRepository, dataSource, scope, dialect, events, omniDefinition, lifecycle, readerCatalog) {
|
|
25
|
+
super(extensionRepository, scope, dialect, events, omniDefinition);
|
|
26
|
+
this.ownerRepository = ownerRepository;
|
|
27
|
+
this.dataSource = dataSource;
|
|
28
|
+
this.omniDefinition = omniDefinition;
|
|
29
|
+
this.lifecycle = lifecycle;
|
|
30
|
+
this.readerCatalog = readerCatalog;
|
|
31
|
+
}
|
|
32
|
+
async getEntity(conditions, _fields, _relations, _databaseName, options) {
|
|
33
|
+
const guid = this.guidFromConditions(conditions);
|
|
34
|
+
const entity = await this.readOne(guid);
|
|
35
|
+
if (!entity && options?.failOnNull)
|
|
36
|
+
this.notFound();
|
|
37
|
+
return entity;
|
|
38
|
+
}
|
|
39
|
+
async getEntityListExtended(findOptions = {}, withCount = false) {
|
|
40
|
+
const [extensions, count] = await this.dialect.findMany(this.repository, this.definition, this.scope.scopeId, this.filtersFromFindOptions(findOptions), this.sortingFromFindOptions(findOptions), this.pageFromFindOptions(findOptions));
|
|
41
|
+
const guidColumn = this.definition.identity.column;
|
|
42
|
+
const guids = extensions.map((extension) => extension[guidColumn]);
|
|
43
|
+
if (guids.length === 0)
|
|
44
|
+
return withCount ? [[], count] : [];
|
|
45
|
+
const owners = await this.ownerRepository.find({
|
|
46
|
+
where: {
|
|
47
|
+
scopeId: this.scope.scopeId,
|
|
48
|
+
guid: (0, typeorm_1.In)(guids),
|
|
49
|
+
kind: this.omniDefinition.owner.kind,
|
|
50
|
+
payloadSchemaId: this.omniDefinition.owner.schema.id,
|
|
51
|
+
payloadSchemaVersion: this.omniDefinition.owner.schema.version,
|
|
52
|
+
deletedAt: (0, typeorm_1.IsNull)(),
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
const ownersByGuid = new Map(owners.map((owner) => [owner.guid, owner]));
|
|
56
|
+
if (ownersByGuid.size !== extensions.length) {
|
|
57
|
+
throw new Error('Omni extension projection invariant failed: an extension owner is unavailable.');
|
|
58
|
+
}
|
|
59
|
+
const projected = extensions.map((extension) => this.merge(extension, ownersByGuid.get(extension[guidColumn])));
|
|
60
|
+
return withCount ? [projected, count] : projected;
|
|
61
|
+
}
|
|
62
|
+
async createEntity(input) {
|
|
63
|
+
this.rejectUnknownInput(input, true);
|
|
64
|
+
const extension = this.createExtension(input);
|
|
65
|
+
const guid = extension[this.definition.identity.column];
|
|
66
|
+
const owner = this.ownerRepository.create({
|
|
67
|
+
scopeId: this.scope.scopeId,
|
|
68
|
+
guid,
|
|
69
|
+
title: this.omniDefinition.owner.title,
|
|
70
|
+
kind: this.omniDefinition.owner.kind,
|
|
71
|
+
status: this.omniDefinition.owner.status,
|
|
72
|
+
payload: null,
|
|
73
|
+
payloadSchemaId: this.omniDefinition.owner.schema.id,
|
|
74
|
+
payloadSchemaVersion: this.omniDefinition.owner.schema.version,
|
|
75
|
+
});
|
|
76
|
+
try {
|
|
77
|
+
return await this.mutate(async (manager) => {
|
|
78
|
+
await this.lifecycle?.beforeCreate?.({
|
|
79
|
+
definition: this.omniDefinition,
|
|
80
|
+
scope: this.scope,
|
|
81
|
+
manager,
|
|
82
|
+
readers: this.readers(manager),
|
|
83
|
+
input,
|
|
84
|
+
});
|
|
85
|
+
await manager.getRepository(omni_record_entity_js_1.OmniRecordEntity).save(owner);
|
|
86
|
+
const saved = await manager
|
|
87
|
+
.getRepository(this.repository.target)
|
|
88
|
+
.save(extension);
|
|
89
|
+
return this.merge(saved, owner);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (isUniqueConstraint(error))
|
|
94
|
+
this.identityConflict();
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async updateEntity(conditions, input) {
|
|
99
|
+
this.rejectUnknownInput(input, false);
|
|
100
|
+
const guid = this.guidFromConditions(conditions);
|
|
101
|
+
const expectedRevision = input.expectedRevision;
|
|
102
|
+
if (typeof expectedRevision !== 'number' ||
|
|
103
|
+
!Number.isInteger(expectedRevision) ||
|
|
104
|
+
expectedRevision < 1 ||
|
|
105
|
+
expectedRevision >= crud_gen_1.PROJECTION_INTEGER_MAX) {
|
|
106
|
+
this.invalid(`expectedRevision must be an integer between 1 and ${crud_gen_1.PROJECTION_INTEGER_MAX - 1}.`);
|
|
107
|
+
}
|
|
108
|
+
const patch = this.createValuePatch(guid, input);
|
|
109
|
+
return this.mutate(async (manager) => {
|
|
110
|
+
const owners = manager.getRepository(omni_record_entity_js_1.OmniRecordEntity);
|
|
111
|
+
const extensions = manager.getRepository(this.repository.target);
|
|
112
|
+
const currentOwner = await this.findOwner(guid, manager);
|
|
113
|
+
const currentExtension = await extensions.findOne({
|
|
114
|
+
where: {
|
|
115
|
+
[this.definition.scope.column]: this.scope.scopeId,
|
|
116
|
+
[this.definition.identity.column]: guid,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
if (!currentOwner)
|
|
120
|
+
this.notFound();
|
|
121
|
+
if (currentOwner.revision !== expectedRevision) {
|
|
122
|
+
await this.throwUpdateMiss(guid, manager);
|
|
123
|
+
}
|
|
124
|
+
if (!currentExtension) {
|
|
125
|
+
throw new Error('Omni extension projection invariant failed: extension row is unavailable.');
|
|
126
|
+
}
|
|
127
|
+
await this.lifecycle?.beforeUpdate?.({
|
|
128
|
+
definition: this.omniDefinition,
|
|
129
|
+
scope: this.scope,
|
|
130
|
+
manager,
|
|
131
|
+
readers: this.readers(manager),
|
|
132
|
+
input,
|
|
133
|
+
current: this.merge(currentExtension, currentOwner),
|
|
134
|
+
});
|
|
135
|
+
const result = await owners
|
|
136
|
+
.createQueryBuilder()
|
|
137
|
+
.update()
|
|
138
|
+
.set({ revision: () => '"revision" + 1' })
|
|
139
|
+
.where('"scopeId" = :scopeId AND "guid" = :guid AND "revision" = :expectedRevision AND "kind" = :kind AND "payloadSchemaId" = :schemaId AND "payloadSchemaVersion" = :schemaVersion AND "deletedAt" IS NULL', {
|
|
140
|
+
scopeId: this.scope.scopeId,
|
|
141
|
+
guid,
|
|
142
|
+
expectedRevision,
|
|
143
|
+
kind: this.omniDefinition.owner.kind,
|
|
144
|
+
schemaId: this.omniDefinition.owner.schema.id,
|
|
145
|
+
schemaVersion: this.omniDefinition.owner.schema.version,
|
|
146
|
+
})
|
|
147
|
+
.execute();
|
|
148
|
+
if (!result.affected)
|
|
149
|
+
await this.throwUpdateMiss(guid, manager);
|
|
150
|
+
const patched = await this.dialect.patchValues(extensions, this.definition, patch);
|
|
151
|
+
if (patched !== 1) {
|
|
152
|
+
throw new Error('Omni extension projection invariant failed: extension row is unavailable.');
|
|
153
|
+
}
|
|
154
|
+
const extension = await extensions.findOneOrFail({
|
|
155
|
+
where: {
|
|
156
|
+
[this.definition.scope.column]: this.scope.scopeId,
|
|
157
|
+
[this.definition.identity.column]: guid,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
const owner = await owners.findOneOrFail({
|
|
161
|
+
where: { scopeId: this.scope.scopeId, guid },
|
|
162
|
+
});
|
|
163
|
+
return this.merge(extension, owner);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async deleteEntity(conditions) {
|
|
167
|
+
const guid = this.guidFromConditions(conditions);
|
|
168
|
+
await this.mutate(async (manager) => {
|
|
169
|
+
const owner = await this.findOwner(guid, manager);
|
|
170
|
+
if (!owner)
|
|
171
|
+
this.notFound();
|
|
172
|
+
const extension = await manager
|
|
173
|
+
.getRepository(this.repository.target)
|
|
174
|
+
.findOne({
|
|
175
|
+
where: {
|
|
176
|
+
[this.definition.scope.column]: this.scope.scopeId,
|
|
177
|
+
[this.definition.identity.column]: guid,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
if (!extension) {
|
|
181
|
+
throw new Error('Omni extension projection invariant failed: extension row is unavailable.');
|
|
182
|
+
}
|
|
183
|
+
await this.lifecycle?.beforeDelete?.({
|
|
184
|
+
definition: this.omniDefinition,
|
|
185
|
+
scope: this.scope,
|
|
186
|
+
manager,
|
|
187
|
+
readers: this.readers(manager),
|
|
188
|
+
input: {},
|
|
189
|
+
current: this.merge(extension, owner),
|
|
190
|
+
});
|
|
191
|
+
const result = await manager.getRepository(omni_record_entity_js_1.OmniRecordEntity).delete({
|
|
192
|
+
scopeId: this.scope.scopeId,
|
|
193
|
+
guid,
|
|
194
|
+
kind: this.omniDefinition.owner.kind,
|
|
195
|
+
payloadSchemaId: this.omniDefinition.owner.schema.id,
|
|
196
|
+
payloadSchemaVersion: this.omniDefinition.owner.schema.version,
|
|
197
|
+
});
|
|
198
|
+
if (!result.affected)
|
|
199
|
+
this.notFound();
|
|
200
|
+
});
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
createExtension(input) {
|
|
204
|
+
const extension = {
|
|
205
|
+
[this.definition.scope.column]: this.scope.scopeId,
|
|
206
|
+
[this.definition.payload.column]: this.createPayload(input),
|
|
207
|
+
};
|
|
208
|
+
for (const field of this.definition.fields) {
|
|
209
|
+
const value = input[field.name];
|
|
210
|
+
if (field.requiredOnCreate && (value === undefined || value === null)) {
|
|
211
|
+
this.invalid(`Projection field ${field.name} is required on create.`);
|
|
212
|
+
}
|
|
213
|
+
if (value === null && !field.nullable) {
|
|
214
|
+
this.invalid(`Projection field ${field.name} cannot be null.`);
|
|
215
|
+
}
|
|
216
|
+
if (value !== undefined && field.storage === 'column') {
|
|
217
|
+
extension[field.column ?? field.name] = this.normalizeValue(field, value);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return extension;
|
|
221
|
+
}
|
|
222
|
+
readers(manager) {
|
|
223
|
+
return (this.readerCatalog ??
|
|
224
|
+
(0, omni_projection_catalog_js_1.createOmniProjectionReaderCatalog)([
|
|
225
|
+
{
|
|
226
|
+
type: 'extension',
|
|
227
|
+
id: this.omniDefinition.id,
|
|
228
|
+
entity: this.repository.target,
|
|
229
|
+
definition: this.omniDefinition,
|
|
230
|
+
},
|
|
231
|
+
])).bind(manager, this.scope);
|
|
232
|
+
}
|
|
233
|
+
async mutate(work) {
|
|
234
|
+
try {
|
|
235
|
+
if (this.lifecycle) {
|
|
236
|
+
return await this.dataSource.transaction('SERIALIZABLE', work);
|
|
237
|
+
}
|
|
238
|
+
return await this.dataSource.transaction(work);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
if (isRetryableTransactionError(error)) {
|
|
242
|
+
throw this.events.errorConflict('projection.concurrent.write.conflict', {
|
|
243
|
+
response: {
|
|
244
|
+
message: 'Omni projection concurrent write conflict; retry the mutation.',
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
createValuePatch(guid, input) {
|
|
252
|
+
const patch = {
|
|
253
|
+
scopeId: this.scope.scopeId,
|
|
254
|
+
guid,
|
|
255
|
+
columnValues: {},
|
|
256
|
+
jsonValues: [],
|
|
257
|
+
};
|
|
258
|
+
for (const field of this.definition.fields) {
|
|
259
|
+
if (field.name === this.definition.identity.column ||
|
|
260
|
+
!hasOwn(input, field.name)) {
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const value = input[field.name];
|
|
264
|
+
if (value === null && !field.nullable) {
|
|
265
|
+
this.invalid(`Projection field ${field.name} cannot be null.`);
|
|
266
|
+
}
|
|
267
|
+
const normalized = this.normalizeValue(field, value);
|
|
268
|
+
if (field.storage === 'column') {
|
|
269
|
+
patch.columnValues[field.column ?? field.name] = normalized;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
patch.jsonValues.push({ field, value: normalized });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (Object.keys(patch.columnValues).length === 0 &&
|
|
276
|
+
patch.jsonValues.length === 0) {
|
|
277
|
+
this.invalid('Projection update requires at least one writable field.');
|
|
278
|
+
}
|
|
279
|
+
return patch;
|
|
280
|
+
}
|
|
281
|
+
async readOne(guid) {
|
|
282
|
+
const extension = await this.repository.findOne({
|
|
283
|
+
where: {
|
|
284
|
+
[this.definition.scope.column]: this.scope.scopeId,
|
|
285
|
+
[this.definition.identity.column]: guid,
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
if (!extension)
|
|
289
|
+
return null;
|
|
290
|
+
const owner = await this.findOwner(guid);
|
|
291
|
+
return owner ? this.merge(extension, owner) : null;
|
|
292
|
+
}
|
|
293
|
+
async findOwner(guid, manager) {
|
|
294
|
+
return (manager?.getRepository(omni_record_entity_js_1.OmniRecordEntity) ?? this.ownerRepository).findOne({
|
|
295
|
+
where: {
|
|
296
|
+
scopeId: this.scope.scopeId,
|
|
297
|
+
guid,
|
|
298
|
+
kind: this.omniDefinition.owner.kind,
|
|
299
|
+
payloadSchemaId: this.omniDefinition.owner.schema.id,
|
|
300
|
+
payloadSchemaVersion: this.omniDefinition.owner.schema.version,
|
|
301
|
+
deletedAt: (0, typeorm_1.IsNull)(),
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
merge(extension, owner) {
|
|
306
|
+
return {
|
|
307
|
+
...this.project(extension),
|
|
308
|
+
scopeId: owner.scopeId,
|
|
309
|
+
guid: owner.guid,
|
|
310
|
+
[this.definition.revision.column]: owner.revision,
|
|
311
|
+
createdAt: owner.createdAt,
|
|
312
|
+
updatedAt: owner.updatedAt,
|
|
313
|
+
deletedAt: owner.deletedAt,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
async throwUpdateMiss(guid, manager) {
|
|
317
|
+
if (!(await this.findOwner(guid, manager)))
|
|
318
|
+
this.notFound();
|
|
319
|
+
throw this.events.errorConflict('projection.revision.conflict', {
|
|
320
|
+
response: { message: 'Projection resource revision is stale.' },
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
identityConflict() {
|
|
324
|
+
throw this.events.errorConflict('projection.identity.conflict', {
|
|
325
|
+
response: {
|
|
326
|
+
message: 'Projection identity already exists in this scope.',
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
exports.OmniExtensionProjectionService = OmniExtensionProjectionService;
|
|
332
|
+
//# sourceMappingURL=omni-extension-projection.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omni-extension-projection.service.js","sourceRoot":"","sources":["omni-extension-projection.service.ts"],"names":[],"mappings":"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"}
|