@lenne.tech/nest-server 11.31.2 → 11.31.3

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.
Files changed (160) hide show
  1. package/.claude/rules/architecture.md +2 -0
  2. package/.claude/rules/configurable-features.md +2 -0
  3. package/CLAUDE.md +28 -1
  4. package/FRAMEWORK-API.md +4 -1
  5. package/dist/config.env.d.ts +4 -0
  6. package/dist/config.env.js +32 -2
  7. package/dist/config.env.js.map +1 -1
  8. package/dist/core/common/helpers/logging.helper.d.ts +1 -0
  9. package/dist/core/common/helpers/logging.helper.js +12 -0
  10. package/dist/core/common/helpers/logging.helper.js.map +1 -1
  11. package/dist/core/common/helpers/meta.helper.d.ts +1 -0
  12. package/dist/core/common/helpers/meta.helper.js +32 -1
  13. package/dist/core/common/helpers/meta.helper.js.map +1 -1
  14. package/dist/core/common/interfaces/server-options.interface.d.ts +9 -0
  15. package/dist/core/common/services/email.service.d.ts +3 -1
  16. package/dist/core/common/services/email.service.js +33 -2
  17. package/dist/core/common/services/email.service.js.map +1 -1
  18. package/dist/core/common/services/template.service.js +9 -4
  19. package/dist/core/common/services/template.service.js.map +1 -1
  20. package/dist/core/modules/hub/core-hub-actions.controller.d.ts +22 -0
  21. package/dist/core/modules/hub/core-hub-actions.controller.js +141 -0
  22. package/dist/core/modules/hub/core-hub-actions.controller.js.map +1 -0
  23. package/dist/core/modules/hub/core-hub-html.service.d.ts +8 -0
  24. package/dist/core/modules/hub/core-hub-html.service.js +123 -0
  25. package/dist/core/modules/hub/core-hub-html.service.js.map +1 -0
  26. package/dist/core/modules/hub/core-hub.controller.d.ts +56 -0
  27. package/dist/core/modules/hub/core-hub.controller.js +398 -0
  28. package/dist/core/modules/hub/core-hub.controller.js.map +1 -0
  29. package/dist/core/modules/hub/core-hub.module.d.ts +17 -0
  30. package/dist/core/modules/hub/core-hub.module.js +109 -0
  31. package/dist/core/modules/hub/core-hub.module.js.map +1 -0
  32. package/dist/core/modules/hub/core-hub.service.d.ts +18 -0
  33. package/dist/core/modules/hub/core-hub.service.js +153 -0
  34. package/dist/core/modules/hub/core-hub.service.js.map +1 -0
  35. package/dist/core/modules/hub/helpers/hub-client-js.helper.d.ts +1 -0
  36. package/dist/core/modules/hub/helpers/hub-client-js.helper.js +755 -0
  37. package/dist/core/modules/hub/helpers/hub-client-js.helper.js.map +1 -0
  38. package/dist/core/modules/hub/helpers/hub-command-shape.helper.d.ts +1 -0
  39. package/dist/core/modules/hub/helpers/hub-command-shape.helper.js +33 -0
  40. package/dist/core/modules/hub/helpers/hub-command-shape.helper.js.map +1 -0
  41. package/dist/core/modules/hub/helpers/hub-mask.helper.d.ts +1 -0
  42. package/dist/core/modules/hub/helpers/hub-mask.helper.js +46 -0
  43. package/dist/core/modules/hub/helpers/hub-mask.helper.js.map +1 -0
  44. package/dist/core/modules/hub/helpers/hub-mermaid.helper.d.ts +10 -0
  45. package/dist/core/modules/hub/helpers/hub-mermaid.helper.js +35 -0
  46. package/dist/core/modules/hub/helpers/hub-mermaid.helper.js.map +1 -0
  47. package/dist/core/modules/hub/helpers/hub-shell.helper.d.ts +9 -0
  48. package/dist/core/modules/hub/helpers/hub-shell.helper.js +62 -0
  49. package/dist/core/modules/hub/helpers/hub-shell.helper.js.map +1 -0
  50. package/dist/core/modules/hub/hub-action-messages.d.ts +17 -0
  51. package/dist/core/modules/hub/hub-action-messages.js +21 -0
  52. package/dist/core/modules/hub/hub-action-messages.js.map +1 -0
  53. package/dist/core/modules/hub/hub-config.helper.d.ts +11 -0
  54. package/dist/core/modules/hub/hub-config.helper.js +164 -0
  55. package/dist/core/modules/hub/hub-config.helper.js.map +1 -0
  56. package/dist/core/modules/hub/hub-nav.d.ts +12 -0
  57. package/dist/core/modules/hub/hub-nav.js +43 -0
  58. package/dist/core/modules/hub/hub-nav.js.map +1 -0
  59. package/dist/core/modules/hub/hub-ring-buffer.d.ts +22 -0
  60. package/dist/core/modules/hub/hub-ring-buffer.js +59 -0
  61. package/dist/core/modules/hub/hub-ring-buffer.js.map +1 -0
  62. package/dist/core/modules/hub/hub.constants.d.ts +18 -0
  63. package/dist/core/modules/hub/hub.constants.js +22 -0
  64. package/dist/core/modules/hub/hub.constants.js.map +1 -0
  65. package/dist/core/modules/hub/index.d.ts +25 -0
  66. package/dist/core/modules/hub/index.js +42 -0
  67. package/dist/core/modules/hub/index.js.map +1 -0
  68. package/dist/core/modules/hub/interfaces/hub-config.interface.d.ts +115 -0
  69. package/dist/core/modules/hub/interfaces/hub-config.interface.js +3 -0
  70. package/dist/core/modules/hub/interfaces/hub-config.interface.js.map +1 -0
  71. package/dist/core/modules/hub/interfaces/hub-panels.interface.d.ts +231 -0
  72. package/dist/core/modules/hub/interfaces/hub-panels.interface.js +3 -0
  73. package/dist/core/modules/hub/interfaces/hub-panels.interface.js.map +1 -0
  74. package/dist/core/modules/hub/middleware/hub-trace.middleware.d.ts +8 -0
  75. package/dist/core/modules/hub/middleware/hub-trace.middleware.js +50 -0
  76. package/dist/core/modules/hub/middleware/hub-trace.middleware.js.map +1 -0
  77. package/dist/core/modules/hub/services/core-hub-actions.service.d.ts +48 -0
  78. package/dist/core/modules/hub/services/core-hub-actions.service.js +136 -0
  79. package/dist/core/modules/hub/services/core-hub-actions.service.js.map +1 -0
  80. package/dist/core/modules/hub/services/core-hub-db.service.d.ts +19 -0
  81. package/dist/core/modules/hub/services/core-hub-db.service.js +180 -0
  82. package/dist/core/modules/hub/services/core-hub-db.service.js.map +1 -0
  83. package/dist/core/modules/hub/services/core-hub-email.service.d.ts +24 -0
  84. package/dist/core/modules/hub/services/core-hub-email.service.js +148 -0
  85. package/dist/core/modules/hub/services/core-hub-email.service.js.map +1 -0
  86. package/dist/core/modules/hub/services/core-hub-mailbox.service.d.ts +20 -0
  87. package/dist/core/modules/hub/services/core-hub-mailbox.service.js +103 -0
  88. package/dist/core/modules/hub/services/core-hub-mailbox.service.js.map +1 -0
  89. package/dist/core/modules/hub/services/core-hub-migrations.service.d.ts +25 -0
  90. package/dist/core/modules/hub/services/core-hub-migrations.service.js +115 -0
  91. package/dist/core/modules/hub/services/core-hub-migrations.service.js.map +1 -0
  92. package/dist/core/modules/hub/services/core-hub-sources.service.d.ts +28 -0
  93. package/dist/core/modules/hub/services/core-hub-sources.service.js +187 -0
  94. package/dist/core/modules/hub/services/core-hub-sources.service.js.map +1 -0
  95. package/dist/core/modules/hub/services/hub-log-buffer.service.d.ts +24 -0
  96. package/dist/core/modules/hub/services/hub-log-buffer.service.js +210 -0
  97. package/dist/core/modules/hub/services/hub-log-buffer.service.js.map +1 -0
  98. package/dist/core/modules/hub/services/hub-query-profiler.service.d.ts +38 -0
  99. package/dist/core/modules/hub/services/hub-query-profiler.service.js +235 -0
  100. package/dist/core/modules/hub/services/hub-query-profiler.service.js.map +1 -0
  101. package/dist/core/modules/hub/services/hub-trace-buffer.service.d.ts +18 -0
  102. package/dist/core/modules/hub/services/hub-trace-buffer.service.js +123 -0
  103. package/dist/core/modules/hub/services/hub-trace-buffer.service.js.map +1 -0
  104. package/dist/core.module.js +42 -1
  105. package/dist/core.module.js.map +1 -1
  106. package/dist/index.d.ts +1 -0
  107. package/dist/index.js +1 -0
  108. package/dist/index.js.map +1 -1
  109. package/dist/tsconfig.build.tsbuildinfo +1 -1
  110. package/docs/REQUEST-LIFECYCLE.md +1 -0
  111. package/migration-guides/11.31.2-to-11.31.3.md +135 -0
  112. package/package.json +5 -4
  113. package/src/config.env.ts +75 -2
  114. package/src/core/common/helpers/logging.helper.spec.ts +61 -0
  115. package/src/core/common/helpers/logging.helper.ts +48 -0
  116. package/src/core/common/helpers/meta.helper.ts +46 -1
  117. package/src/core/common/interfaces/server-options.interface.ts +46 -0
  118. package/src/core/common/services/email.service.ts +33 -1
  119. package/src/core/common/services/template.service.ts +21 -16
  120. package/src/core/modules/hub/INTEGRATION-CHECKLIST.md +64 -0
  121. package/src/core/modules/hub/README.md +159 -0
  122. package/src/core/modules/hub/core-hub-actions.controller.ts +137 -0
  123. package/src/core/modules/hub/core-hub-html.service.ts +135 -0
  124. package/src/core/modules/hub/core-hub.controller.ts +286 -0
  125. package/src/core/modules/hub/core-hub.module.spec.ts +108 -0
  126. package/src/core/modules/hub/core-hub.module.ts +159 -0
  127. package/src/core/modules/hub/core-hub.service.ts +169 -0
  128. package/src/core/modules/hub/helpers/hub-client-js.helper.ts +768 -0
  129. package/src/core/modules/hub/helpers/hub-command-shape.helper.spec.ts +48 -0
  130. package/src/core/modules/hub/helpers/hub-command-shape.helper.ts +47 -0
  131. package/src/core/modules/hub/helpers/hub-mask.helper.spec.ts +67 -0
  132. package/src/core/modules/hub/helpers/hub-mask.helper.ts +78 -0
  133. package/src/core/modules/hub/helpers/hub-mermaid.helper.spec.ts +54 -0
  134. package/src/core/modules/hub/helpers/hub-mermaid.helper.ts +62 -0
  135. package/src/core/modules/hub/helpers/hub-shell.helper.spec.ts +106 -0
  136. package/src/core/modules/hub/helpers/hub-shell.helper.ts +90 -0
  137. package/src/core/modules/hub/hub-action-messages.ts +47 -0
  138. package/src/core/modules/hub/hub-config.helper.spec.ts +108 -0
  139. package/src/core/modules/hub/hub-config.helper.ts +233 -0
  140. package/src/core/modules/hub/hub-nav.ts +66 -0
  141. package/src/core/modules/hub/hub-ring-buffer.spec.ts +95 -0
  142. package/src/core/modules/hub/hub-ring-buffer.ts +101 -0
  143. package/src/core/modules/hub/hub.constants.ts +84 -0
  144. package/src/core/modules/hub/index.ts +25 -0
  145. package/src/core/modules/hub/interfaces/hub-config.interface.ts +265 -0
  146. package/src/core/modules/hub/interfaces/hub-panels.interface.ts +186 -0
  147. package/src/core/modules/hub/middleware/hub-trace.middleware.ts +45 -0
  148. package/src/core/modules/hub/services/core-hub-actions.service.ts +133 -0
  149. package/src/core/modules/hub/services/core-hub-db.service.ts +185 -0
  150. package/src/core/modules/hub/services/core-hub-email.service.ts +158 -0
  151. package/src/core/modules/hub/services/core-hub-mailbox.service.spec.ts +116 -0
  152. package/src/core/modules/hub/services/core-hub-mailbox.service.ts +121 -0
  153. package/src/core/modules/hub/services/core-hub-migrations.service.ts +112 -0
  154. package/src/core/modules/hub/services/core-hub-sources.service.ts +194 -0
  155. package/src/core/modules/hub/services/hub-log-buffer.service.ts +252 -0
  156. package/src/core/modules/hub/services/hub-query-profiler.service.ts +274 -0
  157. package/src/core/modules/hub/services/hub-trace-buffer.service.spec.ts +112 -0
  158. package/src/core/modules/hub/services/hub-trace-buffer.service.ts +134 -0
  159. package/src/core.module.ts +61 -1
  160. package/src/index.ts +6 -0
@@ -0,0 +1,136 @@
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.CoreHubActionsService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const email_service_1 = require("../../../common/services/email.service");
18
+ const request_context_service_1 = require("../../../common/services/request-context.service");
19
+ const hub_action_messages_1 = require("../hub-action-messages");
20
+ const core_hub_db_service_1 = require("./core-hub-db.service");
21
+ const core_hub_email_service_1 = require("./core-hub-email.service");
22
+ const core_hub_mailbox_service_1 = require("./core-hub-mailbox.service");
23
+ const core_hub_migrations_service_1 = require("./core-hub-migrations.service");
24
+ const core_hub_sources_service_1 = require("./core-hub-sources.service");
25
+ const hub_log_buffer_service_1 = require("./hub-log-buffer.service");
26
+ const hub_query_profiler_service_1 = require("./hub-query-profiler.service");
27
+ const hub_trace_buffer_service_1 = require("./hub-trace-buffer.service");
28
+ const TEST_MAIL_DATA = {
29
+ appName: 'Nest Server',
30
+ firstName: 'Hub',
31
+ link: 'https://example.com/verify?token=SAMPLE',
32
+ name: 'Hub Admin',
33
+ url: 'https://example.com/verify?token=SAMPLE',
34
+ };
35
+ let CoreHubActionsService = class CoreHubActionsService {
36
+ migrationsService;
37
+ dbService;
38
+ sourcesService;
39
+ hubEmailService;
40
+ logBuffer;
41
+ traceBuffer;
42
+ queryProfiler;
43
+ emailService;
44
+ mailboxService;
45
+ logger = new common_1.Logger('HubAction');
46
+ constructor(migrationsService, dbService, sourcesService, hubEmailService, logBuffer, traceBuffer, queryProfiler, emailService, mailboxService) {
47
+ this.migrationsService = migrationsService;
48
+ this.dbService = dbService;
49
+ this.sourcesService = sourcesService;
50
+ this.hubEmailService = hubEmailService;
51
+ this.logBuffer = logBuffer;
52
+ this.traceBuffer = traceBuffer;
53
+ this.queryProfiler = queryProfiler;
54
+ this.emailService = emailService;
55
+ this.mailboxService = mailboxService;
56
+ }
57
+ clearBuffer(name) {
58
+ this.audit(`clear ${name} buffer`);
59
+ switch (name) {
60
+ case 'logs':
61
+ this.logBuffer.clear();
62
+ break;
63
+ case 'mailbox':
64
+ this.mailboxService?.clear();
65
+ break;
66
+ case 'queries':
67
+ this.queryProfiler.clear();
68
+ break;
69
+ case 'traces':
70
+ this.traceBuffer.clear();
71
+ break;
72
+ }
73
+ return { cleared: name };
74
+ }
75
+ controlCron(name, action) {
76
+ this.audit(`cron ${action} ${name}`);
77
+ this.sourcesService.controlCron(name, action);
78
+ return { action, name };
79
+ }
80
+ async deleteFile(id, expectedFilename) {
81
+ this.audit(`delete file ${id}`);
82
+ return { deleted: await this.dbService.deleteFile(id, expectedFilename) };
83
+ }
84
+ async rollbackMigration() {
85
+ this.audit('rollback last migration');
86
+ return this.migrationsService.rollbackLast();
87
+ }
88
+ async runMigrations() {
89
+ this.audit('run pending migrations');
90
+ return this.migrationsService.runPending();
91
+ }
92
+ async sendTestEmail(to, template, locale) {
93
+ if (!this.emailService) {
94
+ throw new Error(hub_action_messages_1.HubActionMessage.emailServiceUnavailable);
95
+ }
96
+ const htmlTemplate = this.resolveTestTemplate(template, locale);
97
+ this.audit(`send test mail to ${to}`);
98
+ await this.emailService.sendMail(to, 'Hub test email', {
99
+ htmlTemplate,
100
+ templateData: { ...TEST_MAIL_DATA, email: to },
101
+ });
102
+ return { sent: true, to };
103
+ }
104
+ resolveTestTemplate(template, locale) {
105
+ const inventory = this.hubEmailService.getTemplates().templates;
106
+ const requestedBase = template || (locale ? 'email-verification' : 'welcome');
107
+ const match = inventory.find((entry) => entry.name === requestedBase);
108
+ if (!match) {
109
+ throw new Error(hub_action_messages_1.HubActionMessage.unknownEmailTemplate(requestedBase));
110
+ }
111
+ if (locale && match.locales.includes(locale)) {
112
+ return `${requestedBase}-${locale}`;
113
+ }
114
+ return requestedBase;
115
+ }
116
+ audit(action) {
117
+ const userId = request_context_service_1.RequestContext.getCurrentUser()?.id ?? 'unknown';
118
+ this.logger.warn(`[HUB-ACTION] ${action} by user ${userId}`);
119
+ }
120
+ };
121
+ exports.CoreHubActionsService = CoreHubActionsService;
122
+ exports.CoreHubActionsService = CoreHubActionsService = __decorate([
123
+ (0, common_1.Injectable)(),
124
+ __param(7, (0, common_1.Optional)()),
125
+ __param(8, (0, common_1.Optional)()),
126
+ __metadata("design:paramtypes", [core_hub_migrations_service_1.CoreHubMigrationsService,
127
+ core_hub_db_service_1.CoreHubDbService,
128
+ core_hub_sources_service_1.CoreHubSourcesService,
129
+ core_hub_email_service_1.CoreHubEmailService,
130
+ hub_log_buffer_service_1.HubLogBufferService,
131
+ hub_trace_buffer_service_1.HubTraceBufferService,
132
+ hub_query_profiler_service_1.HubQueryProfilerService,
133
+ email_service_1.EmailService,
134
+ core_hub_mailbox_service_1.CoreHubMailboxService])
135
+ ], CoreHubActionsService);
136
+ //# sourceMappingURL=core-hub-actions.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-hub-actions.service.js","sourceRoot":"","sources":["../../../../../src/core/modules/hub/services/core-hub-actions.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import { Connection } from 'mongoose';
3
+ import { HubModelDescriptor } from '../helpers/hub-mermaid.helper';
4
+ import { HubDbData, HubFilesData, HubModelsData, HubUnavailable } from '../interfaces/hub-panels.interface';
5
+ import { ResolvedHubConfig } from '../interfaces/hub-config.interface';
6
+ export declare class CoreHubDbService {
7
+ protected readonly config: ResolvedHubConfig;
8
+ protected readonly connection?: Connection;
9
+ protected readonly logger: Logger;
10
+ constructor(config: ResolvedHubConfig, connection?: Connection);
11
+ getDbStats(): Promise<HubDbData | HubUnavailable>;
12
+ deleteFile(id: string, expectedFilename?: string, bucket?: string): Promise<{
13
+ filename: string;
14
+ id: string;
15
+ }>;
16
+ getFiles(bucket?: string, skip?: number, limit?: number): Promise<HubFilesData | HubUnavailable>;
17
+ getModels(): HubModelsData;
18
+ protected collectModelDescriptors(): HubModelDescriptor[];
19
+ }
@@ -0,0 +1,180 @@
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
+ var CoreHubDbService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.CoreHubDbService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const mongoose_1 = require("@nestjs/mongoose");
19
+ const mongo = require("mongodb");
20
+ const mongoose_2 = require("mongoose");
21
+ const model_registry_service_1 = require("../../../common/services/model-registry.service");
22
+ const hub_action_messages_1 = require("../hub-action-messages");
23
+ const hub_constants_1 = require("../hub.constants");
24
+ const hub_mermaid_helper_1 = require("../helpers/hub-mermaid.helper");
25
+ let CoreHubDbService = CoreHubDbService_1 = class CoreHubDbService {
26
+ config;
27
+ connection;
28
+ logger = new common_1.Logger(CoreHubDbService_1.name);
29
+ constructor(config, connection) {
30
+ this.config = config;
31
+ this.connection = connection;
32
+ }
33
+ async getDbStats() {
34
+ const dbConfig = this.config.db;
35
+ if (dbConfig === false) {
36
+ return { available: false, hint: 'The database panel is disabled (hub.db: false).' };
37
+ }
38
+ const db = this.connection?.db;
39
+ if (!db) {
40
+ return { available: false, hint: 'No MongoDB connection is available.' };
41
+ }
42
+ const includeIndexes = dbConfig.includeIndexes;
43
+ try {
44
+ const dbStats = await db.stats();
45
+ const collectionInfos = await db.listCollections({}, { nameOnly: true }).toArray();
46
+ const collections = await Promise.all(collectionInfos.map(async (info) => {
47
+ try {
48
+ const [stats] = await db
49
+ .collection(info.name)
50
+ .aggregate([{ $collStats: { storageStats: {} } }])
51
+ .toArray();
52
+ const storage = stats?.storageStats ?? {};
53
+ return {
54
+ avgObjSize: storage.avgObjSize,
55
+ count: storage.count ?? 0,
56
+ indexCount: includeIndexes ? storage.nindexes : undefined,
57
+ indexSize: includeIndexes ? storage.totalIndexSize : undefined,
58
+ name: info.name,
59
+ size: storage.size ?? 0,
60
+ storageSize: storage.storageSize ?? 0,
61
+ };
62
+ }
63
+ catch {
64
+ return { count: 0, name: info.name, size: 0, storageSize: 0 };
65
+ }
66
+ }));
67
+ collections.sort((a, b) => b.size - a.size);
68
+ return {
69
+ collections,
70
+ stats: {
71
+ collections: dbStats.collections ?? collections.length,
72
+ dataSize: dbStats.dataSize ?? 0,
73
+ indexSize: dbStats.indexSize ?? 0,
74
+ objects: dbStats.objects ?? 0,
75
+ storageSize: dbStats.storageSize ?? 0,
76
+ },
77
+ };
78
+ }
79
+ catch (error) {
80
+ this.logger.warn(`Failed to read DB stats: ${error instanceof Error ? error.message : String(error)}`);
81
+ return { available: false, hint: 'Failed to read database statistics.' };
82
+ }
83
+ }
84
+ async deleteFile(id, expectedFilename, bucket = 'fs') {
85
+ const db = this.connection?.db;
86
+ if (!db) {
87
+ throw new Error(hub_action_messages_1.HubActionMessage.mongoUnavailable);
88
+ }
89
+ if (!mongoose_2.Types.ObjectId.isValid(id)) {
90
+ throw new Error(hub_action_messages_1.HubActionMessage.invalidFileId);
91
+ }
92
+ const objectId = new mongoose_2.Types.ObjectId(id);
93
+ const [doc] = await db.collection(`${bucket}.files`).find({ _id: objectId }, { limit: 1 }).toArray();
94
+ if (!doc) {
95
+ throw new Error(hub_action_messages_1.HubActionMessage.fileNotFound);
96
+ }
97
+ if (expectedFilename !== undefined && expectedFilename !== doc.filename) {
98
+ throw new Error(hub_action_messages_1.HubActionMessage.confirmationFilenameMismatch);
99
+ }
100
+ const gridFs = new mongo.GridFSBucket(db, { bucketName: bucket });
101
+ await gridFs.delete(objectId);
102
+ return { filename: doc.filename, id };
103
+ }
104
+ async getFiles(bucket = 'fs', skip = 0, limit = 100) {
105
+ const db = this.connection?.db;
106
+ if (!db) {
107
+ return { available: false, hint: 'No MongoDB connection is available.' };
108
+ }
109
+ const filesCollection = `${bucket}.files`;
110
+ try {
111
+ const cursor = db
112
+ .collection(filesCollection)
113
+ .find({}, { limit: Math.min(limit, 500), skip, sort: { uploadDate: -1 } });
114
+ const docs = await cursor.toArray();
115
+ const total = await db.collection(filesCollection).countDocuments();
116
+ return {
117
+ bucket,
118
+ files: docs.map((doc) => ({
119
+ contentType: doc.contentType ?? doc.metadata?.contentType,
120
+ filename: doc.filename,
121
+ id: String(doc._id),
122
+ length: doc.length ?? 0,
123
+ uploadDate: doc.uploadDate ? new Date(doc.uploadDate).toISOString() : undefined,
124
+ })),
125
+ total,
126
+ };
127
+ }
128
+ catch (error) {
129
+ this.logger.warn(`Failed to list GridFS files: ${error instanceof Error ? error.message : String(error)}`);
130
+ return { available: false, hint: `No GridFS bucket "${bucket}" or it is empty.` };
131
+ }
132
+ }
133
+ getModels() {
134
+ const descriptors = this.collectModelDescriptors();
135
+ const mermaid = (0, hub_mermaid_helper_1.buildErDiagram)(descriptors);
136
+ const relationCount = descriptors.reduce((sum, m) => sum + m.fields.filter((f) => f.ref).length, 0);
137
+ return {
138
+ entities: descriptors.map((d) => ({ fields: d.fields, name: d.name })),
139
+ mermaid,
140
+ modelCount: descriptors.length,
141
+ relationCount,
142
+ };
143
+ }
144
+ collectModelDescriptors() {
145
+ const models = this.connection?.models ?? {};
146
+ const registered = model_registry_service_1.ModelRegistry.getAll();
147
+ const names = new Set([...Object.keys(models), ...registered.keys()]);
148
+ const descriptors = [];
149
+ for (const name of names) {
150
+ const schema = models[name]?.schema;
151
+ if (!schema) {
152
+ descriptors.push({ fields: [], name });
153
+ continue;
154
+ }
155
+ const fields = [];
156
+ schema.eachPath((pathName, schemaType) => {
157
+ if (pathName === '__v') {
158
+ return;
159
+ }
160
+ fields.push({
161
+ name: pathName,
162
+ ref: schemaType?.options?.ref ?? schemaType?.caster?.options?.ref,
163
+ type: schemaType?.instance ?? 'Mixed',
164
+ });
165
+ });
166
+ descriptors.push({ fields, name });
167
+ }
168
+ descriptors.sort((a, b) => a.name.localeCompare(b.name));
169
+ return descriptors;
170
+ }
171
+ };
172
+ exports.CoreHubDbService = CoreHubDbService;
173
+ exports.CoreHubDbService = CoreHubDbService = CoreHubDbService_1 = __decorate([
174
+ (0, common_1.Injectable)(),
175
+ __param(0, (0, common_1.Inject)(hub_constants_1.HUB_CONFIG)),
176
+ __param(1, (0, common_1.Optional)()),
177
+ __param(1, (0, mongoose_1.InjectConnection)()),
178
+ __metadata("design:paramtypes", [Object, mongoose_2.Connection])
179
+ ], CoreHubDbService);
180
+ //# sourceMappingURL=core-hub-db.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-hub-db.service.js","sourceRoot":"","sources":["../../../../../src/core/modules/hub/services/core-hub-db.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import { ConfigService } from '../../../common/services/config.service';
3
+ import { TemplateService } from '../../../common/services/template.service';
4
+ import { HubEmailsData, HubUnavailable } from '../interfaces/hub-panels.interface';
5
+ import { ResolvedHubConfig } from '../interfaces/hub-config.interface';
6
+ export declare class CoreHubEmailService {
7
+ protected readonly config: ResolvedHubConfig;
8
+ protected readonly configService: ConfigService;
9
+ protected readonly templateService?: TemplateService;
10
+ protected readonly logger: Logger;
11
+ constructor(config: ResolvedHubConfig, configService: ConfigService, templateService?: TemplateService);
12
+ get previewEnabled(): boolean;
13
+ getTemplates(): HubEmailsData;
14
+ renderPreview(templateName: string, locale?: string): Promise<HubUnavailable | {
15
+ html: string;
16
+ }>;
17
+ protected frameworkTemplatesDir(): string;
18
+ protected listEjs(dir: string): string[];
19
+ protected parseName(file: string): {
20
+ base: string;
21
+ locale?: string;
22
+ };
23
+ protected projectTemplatesDir(): string;
24
+ }
@@ -0,0 +1,148 @@
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
+ var CoreHubEmailService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.CoreHubEmailService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const fs_1 = require("fs");
19
+ const path_1 = require("path");
20
+ const config_service_1 = require("../../../common/services/config.service");
21
+ const template_service_1 = require("../../../common/services/template.service");
22
+ const hub_constants_1 = require("../hub.constants");
23
+ const SAMPLE_PAYLOAD = {
24
+ appName: 'Nest Server',
25
+ email: 'jane.doe@example.com',
26
+ firstName: 'Jane',
27
+ lastName: 'Doe',
28
+ link: 'https://example.com/verify?token=SAMPLE',
29
+ name: 'Jane Doe',
30
+ token: 'SAMPLE-TOKEN',
31
+ url: 'https://example.com/verify?token=SAMPLE',
32
+ username: 'jane.doe',
33
+ };
34
+ let CoreHubEmailService = CoreHubEmailService_1 = class CoreHubEmailService {
35
+ config;
36
+ configService;
37
+ templateService;
38
+ logger = new common_1.Logger(CoreHubEmailService_1.name);
39
+ constructor(config, configService, templateService) {
40
+ this.config = config;
41
+ this.configService = configService;
42
+ this.templateService = templateService;
43
+ }
44
+ get previewEnabled() {
45
+ return this.config.emailPreview !== false;
46
+ }
47
+ getTemplates() {
48
+ const projectDir = this.projectTemplatesDir();
49
+ const frameworkDir = this.frameworkTemplatesDir();
50
+ const grouped = new Map();
51
+ const add = (dir, source) => {
52
+ for (const file of this.listEjs(dir)) {
53
+ const { base, locale } = this.parseName(file);
54
+ const entry = grouped.get(base) ?? { locales: new Set(), source };
55
+ if (locale) {
56
+ entry.locales.add(locale);
57
+ }
58
+ if (source === 'project') {
59
+ entry.source = 'project';
60
+ }
61
+ grouped.set(base, entry);
62
+ }
63
+ };
64
+ add(frameworkDir, 'framework');
65
+ if (projectDir && projectDir !== frameworkDir) {
66
+ add(projectDir, 'project');
67
+ }
68
+ else if (projectDir === frameworkDir) {
69
+ for (const [, entry] of grouped) {
70
+ entry.source = 'project';
71
+ }
72
+ }
73
+ return {
74
+ templates: [...grouped.entries()]
75
+ .map(([name, e]) => ({ locales: [...e.locales].sort(), name, source: e.source }))
76
+ .sort((a, b) => a.name.localeCompare(b.name)),
77
+ };
78
+ }
79
+ async renderPreview(templateName, locale) {
80
+ if (!this.previewEnabled) {
81
+ return { available: false, hint: 'The email preview panel is disabled (hub.emailPreview: false).' };
82
+ }
83
+ if (!this.templateService) {
84
+ return { available: false, hint: 'TemplateService is not available.' };
85
+ }
86
+ const inventory = this.getTemplates().templates;
87
+ const match = inventory.find((t) => t.name === templateName);
88
+ if (!match) {
89
+ return { available: false, hint: `Unknown template "${templateName}".` };
90
+ }
91
+ let fileName = templateName;
92
+ if (locale && match.locales.includes(locale)) {
93
+ fileName = `${templateName}-${locale}`;
94
+ }
95
+ else if (!existsSyncTemplate(this.projectTemplatesDir(), this.frameworkTemplatesDir(), templateName) &&
96
+ match.locales.length) {
97
+ fileName = `${templateName}-${match.locales[0]}`;
98
+ }
99
+ try {
100
+ const html = await this.templateService.renderTemplate(fileName, SAMPLE_PAYLOAD);
101
+ return { html };
102
+ }
103
+ catch (error) {
104
+ this.logger.warn(`Failed to render template "${fileName}": ${error instanceof Error ? error.message : String(error)}`);
105
+ return { available: false, hint: `Failed to render template "${templateName}".` };
106
+ }
107
+ }
108
+ frameworkTemplatesDir() {
109
+ return (0, path_1.resolve)(__dirname, '../../../../templates');
110
+ }
111
+ listEjs(dir) {
112
+ if (!dir || !(0, fs_1.existsSync)(dir)) {
113
+ return [];
114
+ }
115
+ try {
116
+ return (0, fs_1.readdirSync)(dir)
117
+ .filter((f) => f.endsWith('.ejs'))
118
+ .map((f) => f.slice(0, -4));
119
+ }
120
+ catch {
121
+ return [];
122
+ }
123
+ }
124
+ parseName(file) {
125
+ const match = /^(.*)-([a-z]{2})$/.exec(file);
126
+ if (match) {
127
+ return { base: match[1], locale: match[2] };
128
+ }
129
+ return { base: file };
130
+ }
131
+ projectTemplatesDir() {
132
+ const path = this.configService.getFastButReadOnly('templates.path');
133
+ return typeof path === 'string' ? path : '';
134
+ }
135
+ };
136
+ exports.CoreHubEmailService = CoreHubEmailService;
137
+ exports.CoreHubEmailService = CoreHubEmailService = CoreHubEmailService_1 = __decorate([
138
+ (0, common_1.Injectable)(),
139
+ __param(0, (0, common_1.Inject)(hub_constants_1.HUB_CONFIG)),
140
+ __param(2, (0, common_1.Optional)()),
141
+ __metadata("design:paramtypes", [Object, config_service_1.ConfigService,
142
+ template_service_1.TemplateService])
143
+ ], CoreHubEmailService);
144
+ function existsSyncTemplate(projectDir, frameworkDir, name) {
145
+ return ((projectDir && (0, fs_1.existsSync)((0, path_1.join)(projectDir, `${name}.ejs`))) ||
146
+ (frameworkDir && (0, fs_1.existsSync)((0, path_1.join)(frameworkDir, `${name}.ejs`))));
147
+ }
148
+ //# sourceMappingURL=core-hub-email.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-hub-email.service.js","sourceRoot":"","sources":["../../../../../src/core/modules/hub/services/core-hub-email.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { HubRingBuffer } from '../hub-ring-buffer';
2
+ import { HubMailboxData, HubMailboxEntry } from '../interfaces/hub-panels.interface';
3
+ import { IHubCapturedMailInput, IHubEmailCapture, ResolvedHubConfig } from '../interfaces/hub-config.interface';
4
+ interface StoredMail extends HubMailboxEntry {
5
+ html?: string;
6
+ text?: string;
7
+ }
8
+ export declare class CoreHubMailboxService implements IHubEmailCapture {
9
+ protected readonly config: ResolvedHubConfig;
10
+ protected readonly buffer: HubRingBuffer<StoredMail>;
11
+ protected readonly mode: 'capture' | 'copy';
12
+ constructor(config: ResolvedHubConfig);
13
+ capture(mail: IHubCapturedMailInput): boolean;
14
+ captureAndGetSeq(mail: IHubCapturedMailInput): number;
15
+ clear(): void;
16
+ getMailHtml(seq: number): string | undefined;
17
+ getMailbox(since?: number): HubMailboxData;
18
+ protected store(mail: IHubCapturedMailInput): StoredMail;
19
+ }
20
+ export {};