@solidxai/core 0.1.6-beta.14 → 0.1.6-beta.16
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/helpers/bootstrap.helper.d.ts +1 -0
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +47 -1
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/cache.helper.d.ts +2 -0
- package/dist/helpers/cache.helper.d.ts.map +1 -0
- package/dist/helpers/cache.helper.js +8 -0
- package/dist/helpers/cache.helper.js.map +1 -0
- package/dist/jobs/computed-field-evaluation-queue-options.d.ts +1 -0
- package/dist/jobs/computed-field-evaluation-queue-options.d.ts.map +1 -1
- package/dist/jobs/computed-field-evaluation-queue-options.js +1 -0
- package/dist/jobs/computed-field-evaluation-queue-options.js.map +1 -1
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +4 -1
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -1
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +41 -11
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +4 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +31 -2
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +0 -2
- package/dist/solid-core.module.js.map +1 -1
- package/package.json +1 -1
- package/src/helpers/bootstrap.helper.ts +85 -8
- package/src/helpers/cache.helper.ts +5 -0
- package/src/jobs/computed-field-evaluation-queue-options.ts +1 -0
- package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +54 -12
- package/src/services/model-metadata.service.ts +38 -0
- package/src/solid-core.module.ts +0 -2
- package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.d.ts +0 -15
- package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.d.ts.map +0 -1
- package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.js +0 -71
- package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.js.map +0 -1
- package/src/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.ts +0 -70
|
@@ -10,4 +10,5 @@ export interface SolidBootstrapOptions {
|
|
|
10
10
|
permissionsPolicyOverrides?: Partial<PermissionsPolicyConfig>;
|
|
11
11
|
}
|
|
12
12
|
export declare function bootstrapSolidApp(appModuleFactory: () => Promise<any>, options?: SolidBootstrapOptions): Promise<void>;
|
|
13
|
+
export declare function bootstrapSolidCli(appModuleFactory: () => Promise<any>): Promise<void>;
|
|
13
14
|
//# sourceMappingURL=bootstrap.helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/bootstrap.helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/bootstrap.helper.ts"],"names":[],"mappings":"AAYA,OAAO,EAAmE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAyB7H,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IAEpC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAC;IAEtC,0BAA0B,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAC/D;AAcD,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EACpC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAgGf;AAgBD,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAwCf"}
|
|
@@ -4,23 +4,36 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.bootstrapSolidApp = bootstrapSolidApp;
|
|
7
|
+
exports.bootstrapSolidCli = bootstrapSolidCli;
|
|
7
8
|
const common_1 = require("@nestjs/common");
|
|
8
9
|
const core_1 = require("@nestjs/core");
|
|
9
10
|
const swagger_1 = require("@nestjs/swagger");
|
|
10
11
|
const helmet_1 = __importDefault(require("helmet"));
|
|
11
12
|
const qs_1 = __importDefault(require("qs"));
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const path_1 = require("path");
|
|
12
15
|
const nest_winston_1 = require("nest-winston");
|
|
16
|
+
const nest_commander_1 = require("nest-commander");
|
|
13
17
|
const wrap_response_interceptor_1 = require("../interceptors/wrap-response.interceptor");
|
|
14
18
|
const cors_helper_1 = require("./cors.helper");
|
|
15
19
|
const security_helper_1 = require("./security.helper");
|
|
16
20
|
const environment_helper_1 = require("./environment.helper");
|
|
17
|
-
|
|
21
|
+
function registerGlobalProcessHandlers() {
|
|
18
22
|
process.on('unhandledRejection', (reason, promise) => {
|
|
19
23
|
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
|
|
20
24
|
});
|
|
21
25
|
process.on('uncaughtException', (err) => {
|
|
22
26
|
console.error('Uncaught Exception thrown:', err);
|
|
23
27
|
});
|
|
28
|
+
process.on('warning', (warning) => {
|
|
29
|
+
if (warning.name === 'DeprecationWarning' && (warning.message.includes('client.query()') || warning.message.includes('punycode'))) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.warn(warning);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function bootstrapSolidApp(appModuleFactory, options = {}) {
|
|
36
|
+
registerGlobalProcessHandlers();
|
|
24
37
|
const { globalPrefix = 'api', swagger = {}, permissionsPolicyOverrides = {} } = options;
|
|
25
38
|
const appModule = await appModuleFactory();
|
|
26
39
|
const app = await core_1.NestFactory.create(appModule);
|
|
@@ -83,4 +96,37 @@ async function bootstrapSolidApp(appModuleFactory, options = {}) {
|
|
|
83
96
|
types.setTypeParser(types.builtins.INT8, (val) => parseInt(val));
|
|
84
97
|
await app.listen(port);
|
|
85
98
|
}
|
|
99
|
+
async function bootstrapSolidCli(appModuleFactory) {
|
|
100
|
+
registerGlobalProcessHandlers();
|
|
101
|
+
process.on('exit', (code) => {
|
|
102
|
+
if (code !== 0) {
|
|
103
|
+
console.error(`Exiting with error status code: ${code}`);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
const packageJsonPath = (0, path_1.resolve)(process.cwd(), 'package.json');
|
|
107
|
+
if (!(0, fs_1.existsSync)(packageJsonPath)) {
|
|
108
|
+
console.error('Does not seem to be a valid solid-api project.');
|
|
109
|
+
console.error('Exit reason: missing package.json in the current directory.');
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
const showLogs = process.argv.includes('--verbose') || process.argv.includes('-v');
|
|
113
|
+
for (const flag of ['--verbose', '-v']) {
|
|
114
|
+
const idx = process.argv.indexOf(flag);
|
|
115
|
+
if (idx !== -1)
|
|
116
|
+
process.argv.splice(idx, 1);
|
|
117
|
+
}
|
|
118
|
+
const appModule = await appModuleFactory();
|
|
119
|
+
process.env.SOLID_CLI_RUNNING = 'true';
|
|
120
|
+
const app = await nest_commander_1.CommandFactory.createWithoutRunning(appModule, {
|
|
121
|
+
logger: showLogs ? ['debug', 'error', 'fatal', 'log', 'verbose', 'warn'] : false,
|
|
122
|
+
});
|
|
123
|
+
try {
|
|
124
|
+
await nest_commander_1.CommandFactory.runApplication(app);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
console.error('CLI exited abruptly due to an error:', e);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
process.exit(0);
|
|
131
|
+
}
|
|
86
132
|
//# sourceMappingURL=bootstrap.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.helper.js","sourceRoot":"","sources":["../../src/helpers/bootstrap.helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { ValidationPipe } from '@nestjs/common';\nimport { NestFactory } from '@nestjs/core';\nimport { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';\nimport { NextFunction, Request, Response } from 'express';\nimport helmet from 'helmet';\nimport qs from 'qs';\nimport { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston';\nimport { WrapResponseInterceptor } from '../interceptors/wrap-response.interceptor';\nimport { buildDefaultCorsOptions } from './cors.helper';\nimport { buildDefaultSecurityHeaderOptions, buildPermissionsPolicyHeader, PermissionsPolicyConfig } from './security.helper';\nimport { parseBooleanEnv } from './environment.helper';\n\nexport interface SolidSwaggerOptions {\n title?: string;\n description?: string;\n version?: string;\n}\n\nexport interface SolidBootstrapOptions {\n /** Global API prefix. Defaults to 'api'. Set to '' to disable. */\n globalPrefix?: string;\n /** Swagger configuration. Set to false to disable Swagger entirely. */\n swagger?: SolidSwaggerOptions | false;\n /** Permissions-Policy header overrides (merged with defaults). */\n permissionsPolicyOverrides?: Partial<PermissionsPolicyConfig>;\n}\n\n/**\n * Bootstraps a SolidX NestJS application with sensible defaults:\n * security headers, CORS, Winston logger, ValidationPipe,\n * WrapResponseInterceptor, qs deep query parsing, Swagger, and the\n * pg BIGINT type parser.\n *\n * @example\n * // main.ts\n * bootstrapSolidApp(() => AppModule.forRoot(), {\n * swagger: { title: 'My API', description: 'My API description' },\n * });\n */\nexport async function bootstrapSolidApp(\n appModuleFactory: () => Promise<any>,\n options: SolidBootstrapOptions = {},\n): Promise<void> {\n process.on('unhandledRejection', (reason, promise) => {\n console.error('Unhandled Rejection at:', promise, 'reason:', reason);\n });\n\n process.on('uncaughtException', (err) => {\n console.error('Uncaught Exception thrown:', err);\n });\n\n const { globalPrefix = 'api', swagger = {}, permissionsPolicyOverrides = {} } = options;\n\n const appModule = await appModuleFactory();\n const app = await NestFactory.create(appModule);\n\n const apiEnabled = parseBooleanEnv('API_ENABLED', true);\n\n if (!apiEnabled) {\n await app.init();\n app\n .get(WINSTON_MODULE_NEST_PROVIDER)\n .log('API server disabled via API_ENABLED=false. Skipping HTTP listen.', 'Bootstrap');\n return;\n }\n\n // Health check at root path\n const server = app.getHttpAdapter().getInstance();\n server.get('/', (_req, res) => res.status(200).send('SOLID OK'));\n\n // Security headers\n app.use(helmet(buildDefaultSecurityHeaderOptions()));\n\n // Permissions-Policy header\n app.use((_req: Request, res: Response, next: NextFunction) => {\n res.setHeader('Permissions-Policy', buildPermissionsPolicyHeader(permissionsPolicyOverrides));\n next();\n });\n\n // Winston logger\n app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER));\n\n const port = process.env.PORT || 3000;\n\n if (globalPrefix) {\n app.setGlobalPrefix(globalPrefix);\n }\n\n // qs-based deep query parsing (dot notation, nested objects, arrays)\n app.use((req: Request, _res: Response, next: NextFunction) => {\n if (req.query) {\n req.query = qs.parse(req.url.split('?')[1], {\n allowDots: true,\n depth: 10,\n arrayLimit: 100,\n });\n }\n next();\n });\n\n // Global ValidationPipe\n app.useGlobalPipes(\n new ValidationPipe({\n transform: true,\n transformOptions: { enableImplicitConversion: true },\n }),\n );\n\n // Swagger\n if (swagger !== false) {\n const { title = 'Solid Starters', description = 'Solid Starters API', version = '1.0' } = swagger;\n const swaggerConfig = new DocumentBuilder()\n .setTitle(title)\n .setDescription(description)\n .setVersion(version)\n .setExternalDoc('Postman Collection', '/docs-json')\n .addBearerAuth(\n {\n description: 'Please enter token in following format: Bearer <JWT>',\n name: 'Authorization',\n bearerFormat: 'Bearer',\n scheme: 'Bearer',\n type: 'http',\n in: 'Header',\n },\n 'jwt',\n )\n .build();\n const document = SwaggerModule.createDocument(app, swaggerConfig);\n SwaggerModule.setup('/docs', app, document);\n }\n\n // Global interceptor\n app.useGlobalInterceptors(new WrapResponseInterceptor());\n\n // CORS\n app.enableCors(buildDefaultCorsOptions());\n\n // Fix pg returning BIGINT columns as strings\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const types = require('pg').types;\n types.setTypeParser(types.builtins.INT8, (val: string) => parseInt(val));\n\n await app.listen(port);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bootstrap.helper.js","sourceRoot":"","sources":["../../src/helpers/bootstrap.helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { ValidationPipe } from '@nestjs/common';\nimport { NestFactory } from '@nestjs/core';\nimport { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';\nimport { NextFunction, Request, Response } from 'express';\nimport helmet from 'helmet';\nimport qs from 'qs';\nimport { existsSync } from 'fs';\nimport { resolve } from 'path';\nimport { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston';\nimport { CommandFactory } from 'nest-commander';\nimport { WrapResponseInterceptor } from '../interceptors/wrap-response.interceptor';\nimport { buildDefaultCorsOptions } from './cors.helper';\nimport { buildDefaultSecurityHeaderOptions, buildPermissionsPolicyHeader, PermissionsPolicyConfig } from './security.helper';\nimport { parseBooleanEnv } from './environment.helper';\n\n// ---- Shared process handlers ----\n\nfunction registerGlobalProcessHandlers() {\n process.on('unhandledRejection', (reason, promise) => {\n console.error('Unhandled Rejection at:', promise, 'reason:', reason);\n });\n\n process.on('uncaughtException', (err) => {\n console.error('Uncaught Exception thrown:', err);\n });\n\n // Suppress pg deprecation warning caused by TypeORM's internal query scheduling\n process.on('warning', (warning) => {\n if (warning.name === 'DeprecationWarning' && (warning.message.includes('client.query()') || warning.message.includes('punycode'))) {\n return;\n }\n console.warn(warning);\n });\n}\n\n// ---- HTTP server bootstrap ----\n\nexport interface SolidSwaggerOptions {\n title?: string;\n description?: string;\n version?: string;\n}\n\nexport interface SolidBootstrapOptions {\n /** Global API prefix. Defaults to 'api'. Set to '' to disable. */\n globalPrefix?: string;\n /** Swagger configuration. Set to false to disable Swagger entirely. */\n swagger?: SolidSwaggerOptions | false;\n /** Permissions-Policy header overrides (merged with defaults). */\n permissionsPolicyOverrides?: Partial<PermissionsPolicyConfig>;\n}\n\n/**\n * Bootstraps a SolidX NestJS HTTP application with sensible defaults:\n * security headers, CORS, Winston logger, ValidationPipe,\n * WrapResponseInterceptor, qs deep query parsing, Swagger, and the\n * pg BIGINT type parser.\n *\n * @example\n * // main.ts\n * bootstrapSolidApp(() => AppModule.forRoot(), {\n * swagger: { title: 'My API', description: 'My API description' },\n * });\n */\nexport async function bootstrapSolidApp(\n appModuleFactory: () => Promise<any>,\n options: SolidBootstrapOptions = {},\n): Promise<void> {\n registerGlobalProcessHandlers();\n\n const { globalPrefix = 'api', swagger = {}, permissionsPolicyOverrides = {} } = options;\n\n const appModule = await appModuleFactory();\n const app = await NestFactory.create(appModule);\n\n const apiEnabled = parseBooleanEnv('API_ENABLED', true);\n\n if (!apiEnabled) {\n await app.init();\n app\n .get(WINSTON_MODULE_NEST_PROVIDER)\n .log('API server disabled via API_ENABLED=false. Skipping HTTP listen.', 'Bootstrap');\n return;\n }\n\n // Health check at root path\n const server = app.getHttpAdapter().getInstance();\n server.get('/', (_req, res) => res.status(200).send('SOLID OK'));\n\n // Security headers\n app.use(helmet(buildDefaultSecurityHeaderOptions()));\n\n // Permissions-Policy header\n app.use((_req: Request, res: Response, next: NextFunction) => {\n res.setHeader('Permissions-Policy', buildPermissionsPolicyHeader(permissionsPolicyOverrides));\n next();\n });\n\n // Winston logger\n app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER));\n\n const port = process.env.PORT || 3000;\n\n if (globalPrefix) {\n app.setGlobalPrefix(globalPrefix);\n }\n\n // qs-based deep query parsing (dot notation, nested objects, arrays)\n app.use((req: Request, _res: Response, next: NextFunction) => {\n if (req.query) {\n req.query = qs.parse(req.url.split('?')[1], {\n allowDots: true,\n depth: 10,\n arrayLimit: 100,\n });\n }\n next();\n });\n\n // Global ValidationPipe\n app.useGlobalPipes(\n new ValidationPipe({\n transform: true,\n transformOptions: { enableImplicitConversion: true },\n }),\n );\n\n // Swagger\n if (swagger !== false) {\n const { title = 'Solid Starters', description = 'Solid Starters API', version = '1.0' } = swagger;\n const swaggerConfig = new DocumentBuilder()\n .setTitle(title)\n .setDescription(description)\n .setVersion(version)\n .setExternalDoc('Postman Collection', '/docs-json')\n .addBearerAuth(\n {\n description: 'Please enter token in following format: Bearer <JWT>',\n name: 'Authorization',\n bearerFormat: 'Bearer',\n scheme: 'Bearer',\n type: 'http',\n in: 'Header',\n },\n 'jwt',\n )\n .build();\n const document = SwaggerModule.createDocument(app, swaggerConfig);\n SwaggerModule.setup('/docs', app, document);\n }\n\n // Global interceptor\n app.useGlobalInterceptors(new WrapResponseInterceptor());\n\n // CORS\n app.enableCors(buildDefaultCorsOptions());\n\n // Fix pg returning BIGINT columns as strings\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const types = require('pg').types;\n types.setTypeParser(types.builtins.INT8, (val: string) => parseInt(val));\n\n await app.listen(port);\n}\n\n// ---- CLI bootstrap ----\n\n/**\n * Bootstraps a SolidX NestJS CLI application using nest-commander.\n * Handles verbose flag stripping, project root validation, and clean process exit.\n *\n * @example\n * // main-cli.ts\n * #!/usr/bin/env node\n * import { bootstrapSolidCli } from '@solidxai/core';\n * import { AppModule } from './app.module';\n *\n * bootstrapSolidCli(() => AppModule.forRoot());\n */\nexport async function bootstrapSolidCli(\n appModuleFactory: () => Promise<any>,\n): Promise<void> {\n registerGlobalProcessHandlers();\n\n process.on('exit', (code) => {\n if (code !== 0) {\n console.error(`Exiting with error status code: ${code}`);\n }\n });\n\n // Validate that cwd is a valid Solid API project\n const packageJsonPath = resolve(process.cwd(), 'package.json');\n if (!existsSync(packageJsonPath)) {\n console.error('Does not seem to be a valid solid-api project.');\n console.error('Exit reason: missing package.json in the current directory.');\n process.exit(1);\n }\n\n // Strip --verbose / -v before nest-commander processes argv\n const showLogs = process.argv.includes('--verbose') || process.argv.includes('-v');\n for (const flag of ['--verbose', '-v']) {\n const idx = process.argv.indexOf(flag);\n if (idx !== -1) process.argv.splice(idx, 1);\n }\n\n const appModule = await appModuleFactory();\n process.env.SOLID_CLI_RUNNING = 'true';\n\n // @ts-ignore\n const app = await CommandFactory.createWithoutRunning(appModule, {\n logger: showLogs ? ['debug', 'error', 'fatal', 'log', 'verbose', 'warn'] : false,\n });\n\n try {\n await CommandFactory.runApplication(app);\n } catch (e) {\n console.error('CLI exited abruptly due to an error:', e);\n process.exit(1);\n }\n\n process.exit(0);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/cache.helper.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,IAAI,OAAO,CAGxC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shouldUseCache = shouldUseCache;
|
|
4
|
+
function shouldUseCache() {
|
|
5
|
+
const env = (process.env.ENV ?? process.env.NODE_ENV ?? '').toLowerCase();
|
|
6
|
+
return env === 'prod' || env === 'production';
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=cache.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.helper.js","sourceRoot":"","sources":["../../src/helpers/cache.helper.ts"],"names":[],"mappings":";;AAAA,wCAGC;AAHD,SAAgB,cAAc;IAC5B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,OAAO,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,YAAY,CAAC;AAChD,CAAC","sourcesContent":["export function shouldUseCache(): boolean {\n const env = (process.env.ENV ?? process.env.NODE_ENV ?? '').toLowerCase();\n return env === 'prod' || env === 'production';\n}\n\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computed-field-evaluation-queue-options.d.ts","sourceRoot":"","sources":["../../src/jobs/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC
|
|
1
|
+
{"version":3,"file":"computed-field-evaluation-queue-options.d.ts","sourceRoot":"","sources":["../../src/jobs/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;;;;;;AAI3C,wBAKE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computed-field-evaluation-queue-options.js","sourceRoot":"","sources":["../../src/jobs/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":";;AAAA,8CAA2C;AAE3C,MAAM,UAAU,GAAG,uCAAuC,CAAC;AAE3D,kBAAe;IACX,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,uBAAU,CAAC,QAAQ;IACzB,SAAS,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"computed-field-evaluation-queue-options.js","sourceRoot":"","sources":["../../src/jobs/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":";;AAAA,8CAA2C;AAE3C,MAAM,UAAU,GAAG,uCAAuC,CAAC;AAE3D,kBAAe;IACX,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,uBAAU,CAAC,QAAQ;IACzB,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,EAAE;CACf,CAAC","sourcesContent":["import { BrokerType } from \"../interfaces\";\n\nconst QUEUE_NAME = 'solid_computed_field_evaluation_queue';\n\nexport default {\n name: QUEUE_NAME,\n type: BrokerType.RabbitMQ,\n queueName: QUEUE_NAME,\n prefetch: 20\n};\n"]}
|
|
@@ -4,13 +4,16 @@ import { IEntityPostComputeFieldProvider } from "src/interfaces";
|
|
|
4
4
|
import { DataSource } from "typeorm";
|
|
5
5
|
export interface SequenceNumComputedFieldContext {
|
|
6
6
|
sequenceName: string;
|
|
7
|
+
mode?: 'counter' | 'entityId';
|
|
7
8
|
}
|
|
8
9
|
export declare class SequenceNumComputedFieldProvider<T extends CommonEntity> implements IEntityPostComputeFieldProvider<T, SequenceNumComputedFieldContext> {
|
|
9
10
|
private readonly dataSource;
|
|
10
11
|
constructor(dataSource: DataSource);
|
|
11
12
|
name(): string;
|
|
12
13
|
help(): string;
|
|
13
|
-
private
|
|
14
|
+
private buildSequenceString;
|
|
15
|
+
private generateCounterSequenceValue;
|
|
16
|
+
private generateEntityIdSequenceValue;
|
|
14
17
|
postComputeAndSaveValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<SequenceNumComputedFieldContext>): Promise<void>;
|
|
15
18
|
}
|
|
16
19
|
//# sourceMappingURL=sequence-num-computed-field-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence-num-computed-field-provider.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/sequence-num-computed-field-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sequence-num-computed-field-provider.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/sequence-num-computed-field-provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAiB,MAAM,SAAS,CAAC;AAGpD,MAAM,WAAW,+BAA+B;IAC5C,YAAY,EAAE,MAAM,CAAC;IAMrB,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;CACjC;AAED,qBAEa,gCAAgC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,+BAA+B,CAAC,CAAC,EAAE,+BAA+B,CAAC;IAG5I,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAG3C,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAMd,OAAO,CAAC,mBAAmB;YAOb,4BAA4B;YAkC5B,6BAA6B;IAmBrC,uBAAuB,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAwBhJ"}
|
|
@@ -16,6 +16,7 @@ exports.SequenceNumComputedFieldProvider = void 0;
|
|
|
16
16
|
const strings_1 = require("@angular-devkit/core/src/utils/strings");
|
|
17
17
|
const common_1 = require("@nestjs/common");
|
|
18
18
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
19
|
+
const create_field_metadata_dto_1 = require("../../../dtos/create-field-metadata.dto");
|
|
19
20
|
const computed_field_provider_decorator_1 = require("../../../decorators/computed-field-provider.decorator");
|
|
20
21
|
const model_sequence_entity_1 = require("../../../entities/model-sequence.entity");
|
|
21
22
|
const typeorm_2 = require("typeorm");
|
|
@@ -27,9 +28,17 @@ let SequenceNumComputedFieldProvider = class SequenceNumComputedFieldProvider {
|
|
|
27
28
|
return "SequenceNumComputedFieldProvider";
|
|
28
29
|
}
|
|
29
30
|
help() {
|
|
30
|
-
return "Computed field provider used to create fields whose value is based on some prefix, padding & sequence number."
|
|
31
|
+
return "Computed field provider used to create fields whose value is based on some prefix, padding & sequence number. " +
|
|
32
|
+
"Use mode='counter' (default) to auto-increment the sequence's currentValue. " +
|
|
33
|
+
"Use mode='entityId' to use the entity's own id as the number (afterInsert only, does not update the counter).";
|
|
31
34
|
}
|
|
32
|
-
|
|
35
|
+
buildSequenceString(modelSequence, numericValue) {
|
|
36
|
+
const prefix = modelSequence.prefix ?? "";
|
|
37
|
+
const separator = modelSequence.separator ?? "";
|
|
38
|
+
const padded = String(numericValue).padStart(modelSequence.padding ?? 5, "0");
|
|
39
|
+
return `${prefix}${separator}${padded}`;
|
|
40
|
+
}
|
|
41
|
+
async generateCounterSequenceValue(sequenceName, manager) {
|
|
33
42
|
const run = async (mgr) => {
|
|
34
43
|
const modelSequenceRepo = mgr.getRepository(model_sequence_entity_1.ModelSequence);
|
|
35
44
|
const modelSequence = await modelSequenceRepo.findOne({
|
|
@@ -40,17 +49,12 @@ let SequenceNumComputedFieldProvider = class SequenceNumComputedFieldProvider {
|
|
|
40
49
|
throw new Error(`ModelSequence not found for ${sequenceName}`);
|
|
41
50
|
}
|
|
42
51
|
const nextValue = modelSequence.currentValue + 1;
|
|
43
|
-
const
|
|
44
|
-
const prefix = modelSequence.prefix ?? "";
|
|
45
|
-
const separator = modelSequence.separator ?? "";
|
|
46
|
-
const sequenceString = `${prefix}${separator}${paddedValue}`;
|
|
52
|
+
const sequenceString = this.buildSequenceString(modelSequence, nextValue);
|
|
47
53
|
modelSequence.currentValue = nextValue;
|
|
48
54
|
await modelSequenceRepo.save(modelSequence);
|
|
49
55
|
const modelSequenceWithModel = await modelSequenceRepo.findOne({
|
|
50
56
|
where: { id: modelSequence.id },
|
|
51
|
-
relations: {
|
|
52
|
-
model: true,
|
|
53
|
-
},
|
|
57
|
+
relations: { model: true },
|
|
54
58
|
});
|
|
55
59
|
const modelSingularName = modelSequenceWithModel?.model?.singularName;
|
|
56
60
|
if (!modelSingularName) {
|
|
@@ -60,12 +64,38 @@ let SequenceNumComputedFieldProvider = class SequenceNumComputedFieldProvider {
|
|
|
60
64
|
};
|
|
61
65
|
return manager ? run(manager) : this.dataSource.transaction(run);
|
|
62
66
|
}
|
|
67
|
+
async generateEntityIdSequenceValue(sequenceName, entityId) {
|
|
68
|
+
const modelSequenceRepo = this.dataSource.manager.getRepository(model_sequence_entity_1.ModelSequence);
|
|
69
|
+
const modelSequence = await modelSequenceRepo.findOne({
|
|
70
|
+
where: { sequenceName },
|
|
71
|
+
relations: { model: true },
|
|
72
|
+
});
|
|
73
|
+
if (!modelSequence) {
|
|
74
|
+
throw new Error(`ModelSequence not found for ${sequenceName}`);
|
|
75
|
+
}
|
|
76
|
+
const modelSingularName = modelSequence.model?.singularName;
|
|
77
|
+
if (!modelSingularName) {
|
|
78
|
+
throw new Error(`Model singularName not found for sequence ${sequenceName}`);
|
|
79
|
+
}
|
|
80
|
+
return { sequenceString: this.buildSequenceString(modelSequence, entityId), modelSingularName };
|
|
81
|
+
}
|
|
63
82
|
async postComputeAndSaveValue(triggerEntity, computedFieldMetadata) {
|
|
64
|
-
const { sequenceName } = computedFieldMetadata.computedFieldValueProviderCtxt ?? {};
|
|
83
|
+
const { sequenceName, mode = 'counter' } = computedFieldMetadata.computedFieldValueProviderCtxt ?? {};
|
|
65
84
|
if (!sequenceName) {
|
|
66
85
|
throw new Error("sequenceName is required for sequence computation");
|
|
67
86
|
}
|
|
68
|
-
|
|
87
|
+
let sequenceString;
|
|
88
|
+
let modelSingularName;
|
|
89
|
+
if (mode === 'entityId') {
|
|
90
|
+
const eventType = computedFieldMetadata.eventContext?.eventType;
|
|
91
|
+
if (eventType !== create_field_metadata_dto_1.ComputedFieldTriggerOperation.afterInsert) {
|
|
92
|
+
throw new Error(`SequenceNumComputedFieldProvider with mode='entityId' only supports "${create_field_metadata_dto_1.ComputedFieldTriggerOperation.afterInsert}" events, but received "${eventType}"`);
|
|
93
|
+
}
|
|
94
|
+
({ sequenceString, modelSingularName } = await this.generateEntityIdSequenceValue(sequenceName, triggerEntity.id));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
({ sequenceString, modelSingularName } = await this.generateCounterSequenceValue(sequenceName));
|
|
98
|
+
}
|
|
69
99
|
const entityName = (0, strings_1.classify)(modelSingularName);
|
|
70
100
|
const entityRepo = this.dataSource.manager.getRepository(entityName);
|
|
71
101
|
await entityRepo.update(triggerEntity.id, { [computedFieldMetadata.fieldName]: sequenceString });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence-num-computed-field-provider.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/sequence-num-computed-field-provider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oEAAkE;AAClE,2CAA4C;AAC5C,6CAAmD;AACnD,6GAAyF;AAEzF,mFAAmE;AAGnE,qCAAoD;
|
|
1
|
+
{"version":3,"file":"sequence-num-computed-field-provider.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/sequence-num-computed-field-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { classify } from \"@angular-devkit/core/src/utils/strings\";\nimport { Injectable } from \"@nestjs/common\";\nimport { InjectDataSource } from \"@nestjs/typeorm\";\nimport { ComputedFieldTriggerOperation } from \"src/dtos/create-field-metadata.dto\";\nimport { ComputedFieldProvider } from \"src/decorators/computed-field-provider.decorator\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { ModelSequence } from \"src/entities/model-sequence.entity\";\nimport { ComputedFieldMetadata } from \"src/helpers/solid-registry\";\nimport { IEntityPostComputeFieldProvider } from \"src/interfaces\";\nimport { DataSource, EntityManager } from \"typeorm\";\n\n\nexport interface SequenceNumComputedFieldContext {\n sequenceName: string;\n /**\n * - `'counter'` (default): increments the sequence's `currentValue` and uses it as the number.\n * - `'entityId'`: uses the entity's own `id` as the number; does not update the counter.\n * Only valid on `afterInsert` events.\n */\n mode?: 'counter' | 'entityId';\n}\n\n@ComputedFieldProvider()\n@Injectable()\nexport class SequenceNumComputedFieldProvider<T extends CommonEntity> implements IEntityPostComputeFieldProvider<T, SequenceNumComputedFieldContext> {\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource\n ) { }\n\n name(): string {\n return \"SequenceNumComputedFieldProvider\";\n }\n\n help(): string {\n return \"Computed field provider used to create fields whose value is based on some prefix, padding & sequence number. \" +\n \"Use mode='counter' (default) to auto-increment the sequence's currentValue. \" +\n \"Use mode='entityId' to use the entity's own id as the number (afterInsert only, does not update the counter).\";\n }\n\n private buildSequenceString(modelSequence: ModelSequence, numericValue: number): string {\n const prefix = modelSequence.prefix ?? \"\";\n const separator = modelSequence.separator ?? \"\";\n const padded = String(numericValue).padStart(modelSequence.padding ?? 5, \"0\");\n return `${prefix}${separator}${padded}`;\n }\n\n private async generateCounterSequenceValue(sequenceName: string, manager?: EntityManager): Promise<{ sequenceString: string; currentValue: number; modelSingularName: string }> {\n const run = async (mgr: EntityManager) => {\n const modelSequenceRepo = mgr.getRepository(ModelSequence);\n const modelSequence = await modelSequenceRepo.findOne({\n where: { sequenceName },\n lock: { mode: \"pessimistic_write\" }\n });\n\n if (!modelSequence) {\n throw new Error(`ModelSequence not found for ${sequenceName}`);\n }\n\n const nextValue = modelSequence.currentValue + 1;\n const sequenceString = this.buildSequenceString(modelSequence, nextValue);\n\n modelSequence.currentValue = nextValue;\n await modelSequenceRepo.save(modelSequence);\n\n // Load model relation in a separate query to avoid FOR UPDATE on joined relation.\n const modelSequenceWithModel = await modelSequenceRepo.findOne({\n where: { id: modelSequence.id },\n relations: { model: true },\n });\n const modelSingularName = modelSequenceWithModel?.model?.singularName;\n if (!modelSingularName) {\n throw new Error(`Model singularName not found for sequence ${sequenceName}`);\n }\n\n return { sequenceString, currentValue: nextValue, modelSingularName };\n };\n\n return manager ? run(manager) : this.dataSource.transaction(run);\n }\n\n private async generateEntityIdSequenceValue(sequenceName: string, entityId: number): Promise<{ sequenceString: string; modelSingularName: string }> {\n const modelSequenceRepo = this.dataSource.manager.getRepository(ModelSequence);\n const modelSequence = await modelSequenceRepo.findOne({\n where: { sequenceName },\n relations: { model: true },\n });\n\n if (!modelSequence) {\n throw new Error(`ModelSequence not found for ${sequenceName}`);\n }\n\n const modelSingularName = modelSequence.model?.singularName;\n if (!modelSingularName) {\n throw new Error(`Model singularName not found for sequence ${sequenceName}`);\n }\n\n return { sequenceString: this.buildSequenceString(modelSequence, entityId), modelSingularName };\n }\n\n async postComputeAndSaveValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<SequenceNumComputedFieldContext>): Promise<void> {\n const { sequenceName, mode = 'counter' } = computedFieldMetadata.computedFieldValueProviderCtxt ?? {};\n\n if (!sequenceName) {\n throw new Error(\"sequenceName is required for sequence computation\");\n }\n\n let sequenceString: string;\n let modelSingularName: string;\n\n if (mode === 'entityId') {\n const eventType = computedFieldMetadata.eventContext?.eventType;\n if (eventType !== ComputedFieldTriggerOperation.afterInsert) {\n throw new Error(`SequenceNumComputedFieldProvider with mode='entityId' only supports \"${ComputedFieldTriggerOperation.afterInsert}\" events, but received \"${eventType}\"`);\n }\n ({ sequenceString, modelSingularName } = await this.generateEntityIdSequenceValue(sequenceName, triggerEntity.id));\n } else {\n ({ sequenceString, modelSingularName } = await this.generateCounterSequenceValue(sequenceName));\n }\n\n const entityName = classify(modelSingularName);\n const entityRepo = this.dataSource.manager.getRepository(entityName);\n await entityRepo.update(triggerEntity.id, { [computedFieldMetadata.fieldName]: sequenceString });\n }\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Cache } from 'cache-manager';
|
|
1
2
|
import { DataSource, EntityManager, Repository } from 'typeorm';
|
|
2
3
|
import { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';
|
|
3
4
|
import { ModelMetadata } from '../entities/model-metadata.entity';
|
|
@@ -27,8 +28,9 @@ export declare class ModelMetadataService {
|
|
|
27
28
|
private readonly moduleMetadataHelperService;
|
|
28
29
|
readonly introspectService: SolidIntrospectService;
|
|
29
30
|
private readonly solidTsMorphService;
|
|
31
|
+
private readonly cacheManager;
|
|
30
32
|
private logger;
|
|
31
|
-
constructor(modelMetadataRepo: ModelMetadataRepository, fieldMetadataRepo: FieldMetadataRepository, schematicService: SchematicService, dataSource: DataSource, crudHelperService: CrudHelperService, mediaStorageProviderMetadataService: MediaStorageProviderMetadataService, fieldMetadataService: FieldMetadataService, roleService: RoleMetadataService, moduleMetadataHelperService: ModuleMetadataHelperService, introspectService: SolidIntrospectService, solidTsMorphService: SolidTsMorphService);
|
|
33
|
+
constructor(modelMetadataRepo: ModelMetadataRepository, fieldMetadataRepo: FieldMetadataRepository, schematicService: SchematicService, dataSource: DataSource, crudHelperService: CrudHelperService, mediaStorageProviderMetadataService: MediaStorageProviderMetadataService, fieldMetadataService: FieldMetadataService, roleService: RoleMetadataService, moduleMetadataHelperService: ModuleMetadataHelperService, introspectService: SolidIntrospectService, solidTsMorphService: SolidTsMorphService, cacheManager: Cache);
|
|
32
34
|
find(basicFilterDto: BasicFilterDto): Promise<{
|
|
33
35
|
meta: {
|
|
34
36
|
totalRecords: number;
|
|
@@ -52,6 +54,7 @@ export declare class ModelMetadataService {
|
|
|
52
54
|
records: ModelMetadata[];
|
|
53
55
|
}>;
|
|
54
56
|
findOne(id: any, query?: any): Promise<ModelMetadata>;
|
|
57
|
+
private buildModelBySingularNameCacheKey;
|
|
55
58
|
findOneBySingularName(singularName: string, relations?: {}): Promise<ModelMetadata>;
|
|
56
59
|
findOneByUserKey(singularName: string, relations?: {}): Promise<ModelMetadata>;
|
|
57
60
|
create(createDto: CreateModelMetadataDto): Promise<ModelMetadata>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAM,UAAU,EAAsB,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AASlE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,OAAO,EAGL,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,qBACa,oBAAoB;IAQ7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,mCAAmC;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,2BAA2B;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,sBAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACb,OAAO,CAAC,QAAQ,CAAC,YAAY;IAnBtD,OAAO,CAAC,MAAM,CAAsC;gBAOjC,iBAAiB,EAAE,uBAAuB,EAC1C,iBAAiB,EAAE,uBAAuB,EAC1C,gBAAgB,EAAE,gBAAgB,EAElC,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,mCAAmC,EAAE,mCAAmC,EACxE,oBAAoB,EAAE,oBAAoB,EAC1C,WAAW,EAAE,mBAAmB,EAChC,2BAA2B,EAAE,2BAA2B,EAChE,iBAAiB,EAAE,sBAAsB,EACjC,mBAAmB,EAAE,mBAAmB,EACjB,YAAY,EAAE,KAAK;IAMvD,IAAI,CAAC,cAAc,EAAE,cAAc;;;;;;;;;;;IAInC,QAAQ,CAAC,cAAc,EAAE,cAAc;;;;;;;;;;;IAgCvC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG;IAclC,OAAO,CAAC,gCAAgC;IAIlC,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK;IA4B1D,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK;IA4BrD,MAAM,CAAC,SAAS,EAAE,sBAAsB;YAuBhC,kCAAkC;IAS1C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,sBAAsB;IAyBjE,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB;IAoEpE,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC;IAoD1D,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,sBAAsB;IA6G7F,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC;IAwE1D,MAAM,CAAC,SAAS,EAAE,sBAAsB;IAqBxC,oBAAoB,CAAC,YAAY,EAAE,MAAM;IAUzC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAwBvC,MAAM,CAAC,EAAE,EAAE,MAAM;IAOjB,eAAe,CAAC,aAAa,EAAE,MAAM;IAgLrC,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC;YAqBxD,4BAA4B;IAmBpC,iBAAiB,CAAC,OAAO,EAAE,MAAM;YAmBzB,uBAAuB;IA6BrC,OAAO,CAAC,+BAA+B;YAkLzB,qBAAqB;IA8L7B,YAAY,CAAC,OAAO,EAAE,qBAAqB;;;;;IAkB3C,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAuDzE,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;YA0B1D,0BAA0B;YAc1B,0BAA0B;IAkBlC,aAAa,CAAC,IAAI,EAAE,GAAG;;;;YAiCf,wBAAwB;IAiBhC,UAAU,CAAC,aAAa,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;CAkJ9C"}
|
|
@@ -47,6 +47,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
48
|
exports.ModelMetadataService = void 0;
|
|
49
49
|
const common_1 = require("@nestjs/common");
|
|
50
|
+
const cache_manager_1 = require("@nestjs/cache-manager");
|
|
50
51
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
51
52
|
const fs = __importStar(require("fs/promises"));
|
|
52
53
|
const path = __importStar(require("path"));
|
|
@@ -57,6 +58,7 @@ const strings_1 = require("@angular-devkit/core/src/utils/strings");
|
|
|
57
58
|
const error_messages_1 = require("../constants/error-messages");
|
|
58
59
|
const disallow_in_production_decorator_1 = require("../decorators/disallow-in-production.decorator");
|
|
59
60
|
const create_field_metadata_dto_1 = require("../dtos/create-field-metadata.dto");
|
|
61
|
+
const cache_helper_1 = require("../helpers/cache.helper");
|
|
60
62
|
const module_metadata_helper_service_1 = require("../helpers/module-metadata-helper.service");
|
|
61
63
|
const field_metadata_repository_1 = require("../repository/field-metadata.repository");
|
|
62
64
|
const model_metadata_repository_1 = require("../repository/model-metadata.repository");
|
|
@@ -72,7 +74,7 @@ const role_metadata_service_1 = require("./role-metadata.service");
|
|
|
72
74
|
const solid_introspect_service_1 = require("./solid-introspect.service");
|
|
73
75
|
const solid_ts_morph_service_1 = require("./solid-ts-morph.service");
|
|
74
76
|
let ModelMetadataService = class ModelMetadataService {
|
|
75
|
-
constructor(modelMetadataRepo, fieldMetadataRepo, schematicService, dataSource, crudHelperService, mediaStorageProviderMetadataService, fieldMetadataService, roleService, moduleMetadataHelperService, introspectService, solidTsMorphService) {
|
|
77
|
+
constructor(modelMetadataRepo, fieldMetadataRepo, schematicService, dataSource, crudHelperService, mediaStorageProviderMetadataService, fieldMetadataService, roleService, moduleMetadataHelperService, introspectService, solidTsMorphService, cacheManager) {
|
|
76
78
|
this.modelMetadataRepo = modelMetadataRepo;
|
|
77
79
|
this.fieldMetadataRepo = fieldMetadataRepo;
|
|
78
80
|
this.schematicService = schematicService;
|
|
@@ -84,6 +86,7 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
84
86
|
this.moduleMetadataHelperService = moduleMetadataHelperService;
|
|
85
87
|
this.introspectService = introspectService;
|
|
86
88
|
this.solidTsMorphService = solidTsMorphService;
|
|
89
|
+
this.cacheManager = cacheManager;
|
|
87
90
|
this.logger = new common_1.Logger('ModelMetadataService');
|
|
88
91
|
}
|
|
89
92
|
async find(basicFilterDto) {
|
|
@@ -124,7 +127,18 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
124
127
|
}
|
|
125
128
|
return entity;
|
|
126
129
|
}
|
|
130
|
+
buildModelBySingularNameCacheKey(singularName) {
|
|
131
|
+
return `modelMetadata:singularName:${singularName}`;
|
|
132
|
+
}
|
|
127
133
|
async findOneBySingularName(singularName, relations = {}) {
|
|
134
|
+
const useCache = (0, cache_helper_1.shouldUseCache)();
|
|
135
|
+
const cacheKey = this.buildModelBySingularNameCacheKey(singularName);
|
|
136
|
+
if (useCache) {
|
|
137
|
+
const cached = await this.cacheManager.get(cacheKey);
|
|
138
|
+
if (cached) {
|
|
139
|
+
return cached;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
128
142
|
const entity = await this.modelMetadataRepo.findOne({
|
|
129
143
|
where: {
|
|
130
144
|
singularName: singularName,
|
|
@@ -134,9 +148,20 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
134
148
|
if (!entity) {
|
|
135
149
|
throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));
|
|
136
150
|
}
|
|
151
|
+
if (useCache) {
|
|
152
|
+
await this.cacheManager.set(cacheKey, entity);
|
|
153
|
+
}
|
|
137
154
|
return entity;
|
|
138
155
|
}
|
|
139
156
|
async findOneByUserKey(singularName, relations = {}) {
|
|
157
|
+
const useCache = (0, cache_helper_1.shouldUseCache)();
|
|
158
|
+
const cacheKey = this.buildModelBySingularNameCacheKey(singularName);
|
|
159
|
+
if (useCache) {
|
|
160
|
+
const cached = await this.cacheManager.get(cacheKey);
|
|
161
|
+
if (cached) {
|
|
162
|
+
return cached;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
140
165
|
const entity = await this.modelMetadataRepo.findOne({
|
|
141
166
|
where: {
|
|
142
167
|
singularName: singularName,
|
|
@@ -146,6 +171,9 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
146
171
|
if (!entity) {
|
|
147
172
|
throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));
|
|
148
173
|
}
|
|
174
|
+
if (useCache) {
|
|
175
|
+
await this.cacheManager.set(cacheKey, entity);
|
|
176
|
+
}
|
|
149
177
|
return entity;
|
|
150
178
|
}
|
|
151
179
|
async create(createDto) {
|
|
@@ -1181,6 +1209,7 @@ exports.ModelMetadataService = ModelMetadataService = __decorate([
|
|
|
1181
1209
|
(0, common_1.Injectable)(),
|
|
1182
1210
|
__param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => model_metadata_repository_1.ModelMetadataRepository))),
|
|
1183
1211
|
__param(3, (0, typeorm_1.InjectDataSource)()),
|
|
1212
|
+
__param(11, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)),
|
|
1184
1213
|
__metadata("design:paramtypes", [model_metadata_repository_1.ModelMetadataRepository,
|
|
1185
1214
|
field_metadata_repository_1.FieldMetadataRepository,
|
|
1186
1215
|
schematic_service_1.SchematicService,
|
|
@@ -1191,6 +1220,6 @@ exports.ModelMetadataService = ModelMetadataService = __decorate([
|
|
|
1191
1220
|
role_metadata_service_1.RoleMetadataService,
|
|
1192
1221
|
module_metadata_helper_service_1.ModuleMetadataHelperService,
|
|
1193
1222
|
solid_introspect_service_1.SolidIntrospectService,
|
|
1194
|
-
solid_ts_morph_service_1.SolidTsMorphService])
|
|
1223
|
+
solid_ts_morph_service_1.SolidTsMorphService, Object])
|
|
1195
1224
|
], ModelMetadataService);
|
|
1196
1225
|
//# sourceMappingURL=model-metadata.service.js.map
|