@mahmoud-auth/model-climbers 0.0.0-stage → 0.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 +21 -0
- package/README.md +8 -2
- package/dist/base-resource-field/compiler.d.ts +8 -0
- package/dist/base-resource-field/compiler.js +33 -0
- package/dist/base-resource-field/index.d.ts +3 -0
- package/dist/base-resource-field/index.js +19 -0
- package/dist/base-resource-field/registry.d.ts +10 -0
- package/dist/base-resource-field/registry.js +25 -0
- package/dist/base-resource-field/scanner.d.ts +8 -0
- package/dist/base-resource-field/scanner.js +14 -0
- package/dist/base-resource-field/type.d.ts +6 -0
- package/dist/base-resource-field/type.js +2 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.js +19 -0
- package/dist/errors/invalid-resource-provider.exception.d.ts +4 -0
- package/dist/errors/invalid-resource-provider.exception.js +11 -0
- package/dist/errors/missing-resource-provider.exception.d.ts +4 -0
- package/dist/errors/missing-resource-provider.exception.js +10 -0
- package/dist/errors/missing-transition.exception.d.ts +4 -0
- package/dist/errors/missing-transition.exception.js +10 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +20 -0
- package/dist/relations/index.d.ts +4 -0
- package/dist/relations/index.js +20 -0
- package/dist/relations/module.d.ts +4 -0
- package/dist/relations/module.js +33 -0
- package/dist/relations/resource-provider/compiler.d.ts +9 -0
- package/dist/relations/resource-provider/compiler.js +47 -0
- package/dist/relations/resource-provider/decorator.d.ts +9 -0
- package/dist/relations/resource-provider/decorator.js +12 -0
- package/dist/relations/resource-provider/index.d.ts +4 -0
- package/dist/relations/resource-provider/index.js +20 -0
- package/dist/relations/resource-provider/module.d.ts +7 -0
- package/dist/relations/resource-provider/module.js +39 -0
- package/dist/relations/resource-provider/registry.d.ts +8 -0
- package/dist/relations/resource-provider/registry.js +31 -0
- package/dist/relations/resource-provider/scanner.d.ts +9 -0
- package/dist/relations/resource-provider/scanner.js +52 -0
- package/dist/relations/resource-provider/type.d.ts +7 -0
- package/dist/relations/resource-provider/type.js +2 -0
- package/dist/relations/resource-reference/compiler.d.ts +9 -0
- package/dist/relations/resource-reference/compiler.js +34 -0
- package/dist/relations/resource-reference/decorator.d.ts +7 -0
- package/dist/relations/resource-reference/decorator.js +10 -0
- package/dist/relations/resource-reference/index.d.ts +4 -0
- package/dist/relations/resource-reference/index.js +20 -0
- package/dist/relations/resource-reference/module.d.ts +8 -0
- package/dist/relations/resource-reference/module.js +46 -0
- package/dist/relations/resource-reference/registry.d.ts +4 -0
- package/dist/relations/resource-reference/registry.js +24 -0
- package/dist/relations/resource-reference/scanner.d.ts +10 -0
- package/dist/relations/resource-reference/scanner.js +46 -0
- package/dist/relations/resource-reference/type.d.ts +6 -0
- package/dist/relations/resource-reference/type.js +2 -0
- package/dist/relations/resource-resolver.service.d.ts +20 -0
- package/dist/relations/resource-resolver.service.js +137 -0
- package/dist/resource/index.d.ts +1 -0
- package/dist/resource/index.js +17 -0
- package/dist/resource/token.d.ts +4 -0
- package/dist/resource/token.js +12 -0
- package/dist/resource-cascade/base/base-cascade-helper.repository.d.ts +17 -0
- package/dist/resource-cascade/base/base-cascade-helper.repository.js +2 -0
- package/dist/resource-cascade/base/base-model.d.ts +13 -0
- package/dist/resource-cascade/base/base-model.js +42 -0
- package/dist/resource-cascade/base/base-service.d.ts +12 -0
- package/dist/resource-cascade/base/base-service.js +82 -0
- package/dist/resource-cascade/base/repository-registry.d.ts +7 -0
- package/dist/resource-cascade/base/repository-registry.js +13 -0
- package/dist/resource-cascade/compiler.d.ts +9 -0
- package/dist/resource-cascade/compiler.js +34 -0
- package/dist/resource-cascade/decorator.d.ts +10 -0
- package/dist/resource-cascade/decorator.js +20 -0
- package/dist/resource-cascade/enum.d.ts +4 -0
- package/dist/resource-cascade/enum.js +8 -0
- package/dist/resource-cascade/index.d.ts +9 -0
- package/dist/resource-cascade/index.js +25 -0
- package/dist/resource-cascade/module.d.ts +13 -0
- package/dist/resource-cascade/module.js +102 -0
- package/dist/resource-cascade/mongo/mongo-cascade-helper.repository.d.ts +13 -0
- package/dist/resource-cascade/mongo/mongo-cascade-helper.repository.js +50 -0
- package/dist/resource-cascade/registry.d.ts +8 -0
- package/dist/resource-cascade/registry.js +32 -0
- package/dist/resource-cascade/scanner.d.ts +10 -0
- package/dist/resource-cascade/scanner.js +43 -0
- package/dist/resource-cascade/token.d.ts +4 -0
- package/dist/resource-cascade/token.js +10 -0
- package/dist/resource-cascade/type.d.ts +8 -0
- package/dist/resource-cascade/type.js +2 -0
- package/dist/transition/compiler.d.ts +8 -0
- package/dist/transition/compiler.js +35 -0
- package/dist/transition/decorator.d.ts +3 -0
- package/dist/transition/decorator.js +12 -0
- package/dist/transition/index.d.ts +2 -0
- package/dist/transition/index.js +18 -0
- package/dist/transition/module.d.ts +7 -0
- package/dist/transition/module.js +35 -0
- package/dist/transition/registry.d.ts +8 -0
- package/dist/transition/registry.js +34 -0
- package/dist/transition/scanner.d.ts +8 -0
- package/dist/transition/scanner.js +50 -0
- package/dist/transition/type.d.ts +8 -0
- package/dist/transition/type.js +2 -0
- package/package.json +41 -4
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ResourceReferenceRegistry } from "./registry";
|
|
2
|
+
import { ResourceReferenceScanner } from "./scanner";
|
|
3
|
+
import { ResourceFieldCompiler } from "../../base-resource-field";
|
|
4
|
+
export declare class ResourceReferenceCompiler extends ResourceFieldCompiler {
|
|
5
|
+
private readonly referenceScanner;
|
|
6
|
+
private readonly referenceRegistry;
|
|
7
|
+
constructor(referenceScanner: ResourceReferenceScanner, referenceRegistry: ResourceReferenceRegistry);
|
|
8
|
+
compileReferences(): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ResourceReferenceCompiler = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const registry_1 = require("./registry");
|
|
15
|
+
const scanner_1 = require("./scanner");
|
|
16
|
+
const base_resource_field_1 = require("../../base-resource-field");
|
|
17
|
+
let ResourceReferenceCompiler = class ResourceReferenceCompiler extends base_resource_field_1.ResourceFieldCompiler {
|
|
18
|
+
referenceScanner;
|
|
19
|
+
referenceRegistry;
|
|
20
|
+
constructor(referenceScanner, referenceRegistry) {
|
|
21
|
+
super(referenceScanner, referenceRegistry);
|
|
22
|
+
this.referenceScanner = referenceScanner;
|
|
23
|
+
this.referenceRegistry = referenceRegistry;
|
|
24
|
+
}
|
|
25
|
+
compileReferences() {
|
|
26
|
+
super.compileFields();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
exports.ResourceReferenceCompiler = ResourceReferenceCompiler;
|
|
30
|
+
exports.ResourceReferenceCompiler = ResourceReferenceCompiler = __decorate([
|
|
31
|
+
(0, common_1.Injectable)(),
|
|
32
|
+
__metadata("design:paramtypes", [scanner_1.ResourceReferenceScanner,
|
|
33
|
+
registry_1.ResourceReferenceRegistry])
|
|
34
|
+
], ResourceReferenceCompiler);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Type } from "@nestjs/common";
|
|
2
|
+
export interface ResourceReferenceMetadata<K = unknown> {
|
|
3
|
+
propertyKey: string;
|
|
4
|
+
targetModel: Type<K>;
|
|
5
|
+
}
|
|
6
|
+
export declare const RESOURCE_REFERENCE_METADATA: unique symbol;
|
|
7
|
+
export declare const ResourceReference: (targetModelFunction: () => Type) => PropertyDecorator;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResourceReference = exports.RESOURCE_REFERENCE_METADATA = void 0;
|
|
4
|
+
exports.RESOURCE_REFERENCE_METADATA = Symbol('RESOURCE_REFERENCE');
|
|
5
|
+
const ResourceReference = (targetModelFunction) => (prototype, propertyKey) => {
|
|
6
|
+
const existing = Reflect.getMetadata(exports.RESOURCE_REFERENCE_METADATA, prototype.constructor) ?? [];
|
|
7
|
+
existing.push({ propertyKey: propertyKey.toString(), targetModel: targetModelFunction() });
|
|
8
|
+
Reflect.defineMetadata(exports.RESOURCE_REFERENCE_METADATA, existing, prototype.constructor);
|
|
9
|
+
};
|
|
10
|
+
exports.ResourceReference = ResourceReference;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./decorator"), exports);
|
|
18
|
+
__exportStar(require("./registry"), exports);
|
|
19
|
+
__exportStar(require("./type"), exports);
|
|
20
|
+
__exportStar(require("./module"), exports);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DynamicModule, OnModuleInit, Type } from "@nestjs/common";
|
|
2
|
+
import { ResourceReferenceCompiler } from "./compiler";
|
|
3
|
+
export declare class ResourceReferenceModule implements OnModuleInit {
|
|
4
|
+
private readonly resourceReferenceCompiler;
|
|
5
|
+
constructor(resourceReferenceCompiler: ResourceReferenceCompiler);
|
|
6
|
+
static forRoot(...resources: Type[]): DynamicModule;
|
|
7
|
+
onModuleInit(): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var ResourceReferenceModule_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ResourceReferenceModule = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const core_1 = require("@nestjs/core");
|
|
16
|
+
const compiler_1 = require("./compiler");
|
|
17
|
+
const registry_1 = require("./registry");
|
|
18
|
+
const scanner_1 = require("./scanner");
|
|
19
|
+
const resource_1 = require("../../resource");
|
|
20
|
+
let ResourceReferenceModule = ResourceReferenceModule_1 = class ResourceReferenceModule {
|
|
21
|
+
resourceReferenceCompiler;
|
|
22
|
+
constructor(resourceReferenceCompiler) {
|
|
23
|
+
this.resourceReferenceCompiler = resourceReferenceCompiler;
|
|
24
|
+
}
|
|
25
|
+
static forRoot(...resources) {
|
|
26
|
+
return {
|
|
27
|
+
module: ResourceReferenceModule_1,
|
|
28
|
+
imports: [core_1.DiscoveryModule],
|
|
29
|
+
providers: [
|
|
30
|
+
(0, resource_1.useValueMahmoudResources)(resources),
|
|
31
|
+
registry_1.ResourceReferenceRegistry,
|
|
32
|
+
scanner_1.ResourceReferenceScanner,
|
|
33
|
+
compiler_1.ResourceReferenceCompiler
|
|
34
|
+
],
|
|
35
|
+
exports: [registry_1.ResourceReferenceRegistry],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
onModuleInit() {
|
|
39
|
+
this.resourceReferenceCompiler.compileReferences();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.ResourceReferenceModule = ResourceReferenceModule;
|
|
43
|
+
exports.ResourceReferenceModule = ResourceReferenceModule = ResourceReferenceModule_1 = __decorate([
|
|
44
|
+
(0, common_1.Module)({}),
|
|
45
|
+
__metadata("design:paramtypes", [compiler_1.ResourceReferenceCompiler])
|
|
46
|
+
], ResourceReferenceModule);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ResourceReferenceRegistry = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const base_resource_field_1 = require("../../base-resource-field");
|
|
15
|
+
let ResourceReferenceRegistry = class ResourceReferenceRegistry extends base_resource_field_1.ResourceFieldRegistry {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(new Map());
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.ResourceReferenceRegistry = ResourceReferenceRegistry;
|
|
21
|
+
exports.ResourceReferenceRegistry = ResourceReferenceRegistry = __decorate([
|
|
22
|
+
(0, common_1.Injectable)(),
|
|
23
|
+
__metadata("design:paramtypes", [])
|
|
24
|
+
], ResourceReferenceRegistry);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { IResourceReference } from './type';
|
|
4
|
+
import { ResourceFieldScanner } from '../../base-resource-field';
|
|
5
|
+
export declare class ResourceReferenceScanner extends ResourceFieldScanner {
|
|
6
|
+
private readonly referenceResources;
|
|
7
|
+
private readonly reflector;
|
|
8
|
+
constructor(referenceResources: Type[], reflector: Reflector);
|
|
9
|
+
protected getMetadata<T>(target: Type<T>): IResourceReference<T, unknown>[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ResourceReferenceScanner = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const core_1 = require("@nestjs/core");
|
|
18
|
+
const decorator_1 = require("./decorator");
|
|
19
|
+
const token_1 = require("../../resource/token");
|
|
20
|
+
const base_resource_field_1 = require("../../base-resource-field");
|
|
21
|
+
let ResourceReferenceScanner = class ResourceReferenceScanner extends base_resource_field_1.ResourceFieldScanner {
|
|
22
|
+
referenceResources;
|
|
23
|
+
reflector;
|
|
24
|
+
constructor(referenceResources, reflector) {
|
|
25
|
+
super(referenceResources);
|
|
26
|
+
this.referenceResources = referenceResources;
|
|
27
|
+
this.reflector = reflector;
|
|
28
|
+
}
|
|
29
|
+
getMetadata(target) {
|
|
30
|
+
const references = this.reflector.get(decorator_1.RESOURCE_REFERENCE_METADATA, target);
|
|
31
|
+
if (!references) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
return references.map(({ targetModel, propertyKey }) => ({
|
|
35
|
+
sourceModel: target,
|
|
36
|
+
targetModel,
|
|
37
|
+
propertyKey,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.ResourceReferenceScanner = ResourceReferenceScanner;
|
|
42
|
+
exports.ResourceReferenceScanner = ResourceReferenceScanner = __decorate([
|
|
43
|
+
(0, common_1.Injectable)(),
|
|
44
|
+
__param(0, (0, token_1.InjectMahmoudResources)()),
|
|
45
|
+
__metadata("design:paramtypes", [Array, core_1.Reflector])
|
|
46
|
+
], ResourceReferenceScanner);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Type } from "@nestjs/common";
|
|
2
|
+
import { ResourceProviderRegistry } from "./resource-provider/registry";
|
|
3
|
+
import { ResourceReferenceRegistry } from "./resource-reference/registry";
|
|
4
|
+
interface ResourceResolveState {
|
|
5
|
+
rootType: Type;
|
|
6
|
+
rootResource: unknown;
|
|
7
|
+
resourceCache?: Map<Type, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export declare class ResourceResolverService {
|
|
10
|
+
private readonly resourceReferences;
|
|
11
|
+
private readonly resourceProviders;
|
|
12
|
+
private readonly routeCache;
|
|
13
|
+
constructor(resourceReferences: ResourceReferenceRegistry, resourceProviders: ResourceProviderRegistry);
|
|
14
|
+
resolve<T>(state: ResourceResolveState, target: Type<T>): Promise<T>;
|
|
15
|
+
private findRoutes;
|
|
16
|
+
private cacheRoutes;
|
|
17
|
+
private resolveRoute;
|
|
18
|
+
private resolveReference;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ResourceResolverService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const common_2 = require("@mahmoud-auth/common");
|
|
15
|
+
const missing_resource_provider_exception_1 = require("../errors/missing-resource-provider.exception");
|
|
16
|
+
const missing_transition_exception_1 = require("../errors/missing-transition.exception");
|
|
17
|
+
const registry_1 = require("./resource-provider/registry");
|
|
18
|
+
const registry_2 = require("./resource-reference/registry");
|
|
19
|
+
let ResourceResolverService = class ResourceResolverService {
|
|
20
|
+
resourceReferences;
|
|
21
|
+
resourceProviders;
|
|
22
|
+
routeCache = new Map();
|
|
23
|
+
constructor(resourceReferences, resourceProviders) {
|
|
24
|
+
this.resourceReferences = resourceReferences;
|
|
25
|
+
this.resourceProviders = resourceProviders;
|
|
26
|
+
}
|
|
27
|
+
async resolve(state, target) {
|
|
28
|
+
const routes = this.findRoutes(state.rootType, target);
|
|
29
|
+
const result = await routes.reduce(async (previousResult, route) => {
|
|
30
|
+
const previous = await previousResult;
|
|
31
|
+
if (previous.found) {
|
|
32
|
+
return previous;
|
|
33
|
+
}
|
|
34
|
+
return this.resolveRoute(state, target, route);
|
|
35
|
+
}, Promise.resolve({ found: false, resource: undefined }));
|
|
36
|
+
if (!result.found) {
|
|
37
|
+
throw new missing_transition_exception_1.MissingTransitionException(state.rootType.name, target.name);
|
|
38
|
+
}
|
|
39
|
+
return result.resource;
|
|
40
|
+
}
|
|
41
|
+
findRoutes(from, target) {
|
|
42
|
+
const cachedRoutes = this.routeCache.get(from)?.get(target);
|
|
43
|
+
if (cachedRoutes) {
|
|
44
|
+
return cachedRoutes;
|
|
45
|
+
}
|
|
46
|
+
if (from.name === target.name) {
|
|
47
|
+
return this.cacheRoutes(from, target, [[]]);
|
|
48
|
+
}
|
|
49
|
+
const pendingRoutes = new Set([
|
|
50
|
+
{ model: from, steps: [], visitedModels: new Set([from.name]) },
|
|
51
|
+
]);
|
|
52
|
+
const routes = [];
|
|
53
|
+
pendingRoutes.forEach(currentRoute => {
|
|
54
|
+
this.resourceReferences.getFrom(currentRoute.model).forEach(reference => {
|
|
55
|
+
const steps = [
|
|
56
|
+
...currentRoute.steps,
|
|
57
|
+
{
|
|
58
|
+
targetModel: reference.targetModel,
|
|
59
|
+
propertyKey: reference.propertyKey,
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
if (reference.targetModel.name === target.name) {
|
|
63
|
+
routes.push(steps);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (currentRoute.visitedModels.has(reference.targetModel.name)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const visitedModels = new Set(currentRoute.visitedModels);
|
|
70
|
+
visitedModels.add(reference.targetModel.name);
|
|
71
|
+
pendingRoutes.add({ model: reference.targetModel, steps, visitedModels });
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
if (routes.length === 0) {
|
|
75
|
+
throw new missing_transition_exception_1.MissingTransitionException(from.name, target.name);
|
|
76
|
+
}
|
|
77
|
+
return this.cacheRoutes(from, target, routes);
|
|
78
|
+
}
|
|
79
|
+
cacheRoutes(from, target, routes) {
|
|
80
|
+
const routesFromSource = this.routeCache.get(from)
|
|
81
|
+
?? new Map();
|
|
82
|
+
if (!this.routeCache.has(from)) {
|
|
83
|
+
this.routeCache.set(from, routesFromSource);
|
|
84
|
+
}
|
|
85
|
+
routesFromSource.set(target, routes);
|
|
86
|
+
return routes;
|
|
87
|
+
}
|
|
88
|
+
async resolveRoute(state, target, route) {
|
|
89
|
+
const resourceCache = state.resourceCache ?? null;
|
|
90
|
+
const resolvedResources = new Map();
|
|
91
|
+
const result = await route.reduce(async (previousResult, step) => {
|
|
92
|
+
const previous = await previousResult;
|
|
93
|
+
if (previous.missing) {
|
|
94
|
+
return previous;
|
|
95
|
+
}
|
|
96
|
+
const resolvedResource = await this.resolveReference(previous.resource, step, resourceCache);
|
|
97
|
+
if (!(0, common_2.isNotNull)(resolvedResource)) {
|
|
98
|
+
return { missing: true, resource: undefined };
|
|
99
|
+
}
|
|
100
|
+
resolvedResources.set(step.targetModel, resolvedResource);
|
|
101
|
+
return { missing: false, resource: resolvedResource };
|
|
102
|
+
}, Promise.resolve({ missing: false, resource: state.rootResource }));
|
|
103
|
+
if (result.missing) {
|
|
104
|
+
return { found: false, resource: undefined };
|
|
105
|
+
}
|
|
106
|
+
resolvedResources.forEach((resource, resourceType) => resourceCache?.set(resourceType, resource));
|
|
107
|
+
return { found: true, resource: result.resource };
|
|
108
|
+
}
|
|
109
|
+
async resolveReference(resource, reference, resourceCache) {
|
|
110
|
+
const cachedResource = resourceCache?.get(reference.targetModel);
|
|
111
|
+
if (cachedResource) {
|
|
112
|
+
return cachedResource;
|
|
113
|
+
}
|
|
114
|
+
if (typeof resource !== 'object' || resource === null) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const id = resource[reference.propertyKey];
|
|
118
|
+
if (!id) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
const provider = this.resourceProviders.get(reference.targetModel);
|
|
122
|
+
if (!provider) {
|
|
123
|
+
throw new missing_resource_provider_exception_1.MissingResourceProviderException(reference.targetModel.name);
|
|
124
|
+
}
|
|
125
|
+
const resolvedResource = await provider(id);
|
|
126
|
+
if ((0, common_2.isNotNull)(resolvedResource) && resourceCache) {
|
|
127
|
+
resourceCache.set(reference.targetModel, resolvedResource);
|
|
128
|
+
}
|
|
129
|
+
return resolvedResource;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
exports.ResourceResolverService = ResourceResolverService;
|
|
133
|
+
exports.ResourceResolverService = ResourceResolverService = __decorate([
|
|
134
|
+
(0, common_1.Injectable)(),
|
|
135
|
+
__metadata("design:paramtypes", [registry_2.ResourceReferenceRegistry,
|
|
136
|
+
registry_1.ResourceProviderRegistry])
|
|
137
|
+
], ResourceResolverService);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './token';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./token"), exports);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { IUseValueWithToken, IUseFactoryWithToken } from "@mahmoud-auth/utils";
|
|
2
|
+
export declare const InjectMahmoudResources: () => PropertyDecorator & ParameterDecorator;
|
|
3
|
+
export declare const useValueMahmoudResources: IUseValueWithToken;
|
|
4
|
+
export declare const useFactoryMahmoudResources: IUseFactoryWithToken;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useFactoryMahmoudResources = exports.useValueMahmoudResources = exports.InjectMahmoudResources = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const utils_1 = require("@mahmoud-auth/utils");
|
|
6
|
+
const MAHMOUD_RESOURCES = Symbol('MAHMOUD_RESOURCES');
|
|
7
|
+
const InjectMahmoudResources = () => (0, common_1.Inject)(MAHMOUD_RESOURCES);
|
|
8
|
+
exports.InjectMahmoudResources = InjectMahmoudResources;
|
|
9
|
+
const useValueMahmoudResources = (resources, ...rest) => (0, utils_1.useValue)(MAHMOUD_RESOURCES, resources, ...rest);
|
|
10
|
+
exports.useValueMahmoudResources = useValueMahmoudResources;
|
|
11
|
+
const useFactoryMahmoudResources = (...rest) => (0, utils_1.useFactory)(MAHMOUD_RESOURCES, ...rest);
|
|
12
|
+
exports.useFactoryMahmoudResources = useFactoryMahmoudResources;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ClientSession, RootFilterQuery } from 'mongoose';
|
|
2
|
+
export interface CascadeDeleteOptions {
|
|
3
|
+
/** Reuses a caller-owned transaction for selection and every cascade write. */
|
|
4
|
+
session?: ClientSession;
|
|
5
|
+
}
|
|
6
|
+
export interface CascadeDeleteResult {
|
|
7
|
+
acknowledged: boolean;
|
|
8
|
+
/** Number of selected root-model documents deleted; child cascades are not included. */
|
|
9
|
+
deletedCount: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ICascadeHelperRepository<T, Id = unknown> {
|
|
12
|
+
getIdKey(id: Id): string;
|
|
13
|
+
findIds(filter: RootFilterQuery<T>, options?: CascadeDeleteOptions): Promise<Id[]>;
|
|
14
|
+
findIdsByField(field: string, value: unknown, options?: CascadeDeleteOptions): Promise<Id[]>;
|
|
15
|
+
nullifyByField(field: string, value: unknown, options?: CascadeDeleteOptions): Promise<void>;
|
|
16
|
+
deleteById(id: Id, options?: CascadeDeleteOptions): Promise<unknown | null>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Type } from "@nestjs/common";
|
|
2
|
+
import { CascadeService } from "./base-service";
|
|
3
|
+
import { Model, RootFilterQuery } from 'mongoose';
|
|
4
|
+
import { CascadeDeleteOptions, CascadeDeleteResult } from './base-cascade-helper.repository';
|
|
5
|
+
export declare class CascadeModel<T, Id = unknown> {
|
|
6
|
+
readonly model: Model<T>;
|
|
7
|
+
private readonly cascadeService;
|
|
8
|
+
private readonly type;
|
|
9
|
+
constructor(model: Model<T>, cascadeService: CascadeService, type: Type<T>);
|
|
10
|
+
deleteById(id: Id, options?: CascadeDeleteOptions): Promise<unknown | null>;
|
|
11
|
+
deleteOne(filter: RootFilterQuery<T>, options?: CascadeDeleteOptions): Promise<CascadeDeleteResult>;
|
|
12
|
+
deleteMany(filter: RootFilterQuery<T>, options?: CascadeDeleteOptions): Promise<CascadeDeleteResult>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CascadeModel = void 0;
|
|
4
|
+
class CascadeModel {
|
|
5
|
+
model;
|
|
6
|
+
cascadeService;
|
|
7
|
+
type;
|
|
8
|
+
constructor(model, cascadeService, type) {
|
|
9
|
+
this.model = model;
|
|
10
|
+
this.cascadeService = cascadeService;
|
|
11
|
+
this.type = type;
|
|
12
|
+
}
|
|
13
|
+
async deleteById(id, options) {
|
|
14
|
+
return this.cascadeService.cascadeById(this.type, id, options);
|
|
15
|
+
}
|
|
16
|
+
async deleteOne(filter, options) {
|
|
17
|
+
const query = options
|
|
18
|
+
? this.model.findOne(filter, { _id: 1 }, options)
|
|
19
|
+
: this.model.findOne(filter, { _id: 1 });
|
|
20
|
+
const document = await query.lean();
|
|
21
|
+
if (!document || document._id === null || document._id === undefined) {
|
|
22
|
+
return { acknowledged: true, deletedCount: 0 };
|
|
23
|
+
}
|
|
24
|
+
const deletedDocument = await this.deleteById(document._id, options);
|
|
25
|
+
return { acknowledged: true, deletedCount: deletedDocument === null ? 0 : 1 };
|
|
26
|
+
}
|
|
27
|
+
async deleteMany(filter, options) {
|
|
28
|
+
const query = options
|
|
29
|
+
? this.model.find(filter, { _id: 1 }, options)
|
|
30
|
+
: this.model.find(filter, { _id: 1 });
|
|
31
|
+
const documents = await query.lean();
|
|
32
|
+
let deletedCount = 0;
|
|
33
|
+
for (const document of documents) {
|
|
34
|
+
const deletedDocument = await this.deleteById(document._id, options);
|
|
35
|
+
if (deletedDocument !== null) {
|
|
36
|
+
deletedCount += 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { acknowledged: true, deletedCount };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.CascadeModel = CascadeModel;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Type } from "@nestjs/common";
|
|
2
|
+
import { ResourceCascadeRegistry } from "../registry";
|
|
3
|
+
import { CascadeDeleteOptions } from "./base-cascade-helper.repository";
|
|
4
|
+
import { CascadeRepositoryRegistry } from "./repository-registry";
|
|
5
|
+
export declare class CascadeService {
|
|
6
|
+
private readonly registry;
|
|
7
|
+
private readonly repositories;
|
|
8
|
+
constructor(registry: ResourceCascadeRegistry, repositories: CascadeRepositoryRegistry);
|
|
9
|
+
cascadeById<T, Id>(type: Type<T>, id: Id, options?: CascadeDeleteOptions): Promise<unknown | null>;
|
|
10
|
+
private assertRepositoriesAvailable;
|
|
11
|
+
private deleteRecursive;
|
|
12
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CascadeService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const enum_1 = require("../enum");
|
|
15
|
+
const registry_1 = require("../registry");
|
|
16
|
+
const repository_registry_1 = require("./repository-registry");
|
|
17
|
+
let CascadeService = class CascadeService {
|
|
18
|
+
registry;
|
|
19
|
+
repositories;
|
|
20
|
+
constructor(registry, repositories) {
|
|
21
|
+
this.registry = registry;
|
|
22
|
+
this.repositories = repositories;
|
|
23
|
+
}
|
|
24
|
+
async cascadeById(type, id, options) {
|
|
25
|
+
this.assertRepositoriesAvailable(type, new Set());
|
|
26
|
+
return this.deleteRecursive(type, id, new Map(), options);
|
|
27
|
+
}
|
|
28
|
+
assertRepositoriesAvailable(type, visited) {
|
|
29
|
+
if (visited.has(type)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
visited.add(type);
|
|
33
|
+
if (!this.repositories.get(type)) {
|
|
34
|
+
throw new Error(`Missing cascade repository for ${type.name}`);
|
|
35
|
+
}
|
|
36
|
+
for (const cascade of this.registry.getReferencing(type)) {
|
|
37
|
+
if (cascade.type !== enum_1.CascadeType.DELETE && cascade.type !== enum_1.CascadeType.NULL) {
|
|
38
|
+
throw new Error(`Invalid cascade type for ${cascade.sourceModel.name}.${cascade.propertyKey}`);
|
|
39
|
+
}
|
|
40
|
+
if (!this.repositories.get(cascade.sourceModel)) {
|
|
41
|
+
throw new Error(`Missing cascade repository for ${cascade.sourceModel.name}`);
|
|
42
|
+
}
|
|
43
|
+
if (cascade.type === enum_1.CascadeType.DELETE) {
|
|
44
|
+
this.assertRepositoriesAvailable(cascade.sourceModel, visited);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async deleteRecursive(type, id, visited, options) {
|
|
49
|
+
const repository = this.repositories.get(type);
|
|
50
|
+
if (!repository) {
|
|
51
|
+
throw new Error(`Missing cascade repository for ${type.name}`);
|
|
52
|
+
}
|
|
53
|
+
const visitedIds = visited.get(type) ?? new Set();
|
|
54
|
+
const key = repository.getIdKey(id);
|
|
55
|
+
if (visitedIds.has(key)) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
visitedIds.add(key);
|
|
59
|
+
visited.set(type, visitedIds);
|
|
60
|
+
for (const cascade of this.registry.getReferencing(type)) {
|
|
61
|
+
const sourceRepository = this.repositories.get(cascade.sourceModel);
|
|
62
|
+
if (!sourceRepository) {
|
|
63
|
+
throw new Error(`Missing cascade repository for ${cascade.sourceModel.name}`);
|
|
64
|
+
}
|
|
65
|
+
if (cascade.type === enum_1.CascadeType.NULL) {
|
|
66
|
+
await sourceRepository.nullifyByField(cascade.propertyKey, id, options);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const sourceIds = await sourceRepository.findIdsByField(cascade.propertyKey, id, options);
|
|
70
|
+
for (const sourceId of sourceIds) {
|
|
71
|
+
await this.deleteRecursive(cascade.sourceModel, sourceId, visited, options);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return repository.deleteById(id, options);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports.CascadeService = CascadeService;
|
|
78
|
+
exports.CascadeService = CascadeService = __decorate([
|
|
79
|
+
(0, common_1.Injectable)(),
|
|
80
|
+
__metadata("design:paramtypes", [registry_1.ResourceCascadeRegistry,
|
|
81
|
+
repository_registry_1.CascadeRepositoryRegistry])
|
|
82
|
+
], CascadeService);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { ICascadeHelperRepository } from './base-cascade-helper.repository';
|
|
3
|
+
export declare class CascadeRepositoryRegistry {
|
|
4
|
+
private readonly repositories;
|
|
5
|
+
constructor(repositories: ReadonlyMap<Type, ICascadeHelperRepository<unknown>>);
|
|
6
|
+
get<T>(type: Type<T>): ICascadeHelperRepository<T> | undefined;
|
|
7
|
+
}
|