@selentar/analitoly 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/api/dist/dashboards/dash_1775220041958_v1r8io.json +829 -0
  4. package/api/dist/dashboards/dash_1775222037264_1rrsrd.json +309 -0
  5. package/api/dist/src/agent/agent.controller.d.ts +26 -0
  6. package/api/dist/src/agent/agent.controller.js +124 -0
  7. package/api/dist/src/agent/agent.controller.js.map +1 -0
  8. package/api/dist/src/agent/agent.module.d.ts +2 -0
  9. package/api/dist/src/agent/agent.module.js +23 -0
  10. package/api/dist/src/agent/agent.module.js.map +1 -0
  11. package/api/dist/src/agent/agent.service.d.ts +39 -0
  12. package/api/dist/src/agent/agent.service.js +389 -0
  13. package/api/dist/src/agent/agent.service.js.map +1 -0
  14. package/api/dist/src/agent/mcp-config.d.ts +9 -0
  15. package/api/dist/src/agent/mcp-config.js +51 -0
  16. package/api/dist/src/agent/mcp-config.js.map +1 -0
  17. package/api/dist/src/app.module.d.ts +2 -0
  18. package/api/dist/src/app.module.js +52 -0
  19. package/api/dist/src/app.module.js.map +1 -0
  20. package/api/dist/src/chart/chart.controller.d.ts +8 -0
  21. package/api/dist/src/chart/chart.controller.js +38 -0
  22. package/api/dist/src/chart/chart.controller.js.map +1 -0
  23. package/api/dist/src/chart/chart.module.d.ts +2 -0
  24. package/api/dist/src/chart/chart.module.js +24 -0
  25. package/api/dist/src/chart/chart.module.js.map +1 -0
  26. package/api/dist/src/chart/chart.service.d.ts +32 -0
  27. package/api/dist/src/chart/chart.service.js +106 -0
  28. package/api/dist/src/chart/chart.service.js.map +1 -0
  29. package/api/dist/src/chat/chat.controller.d.ts +14 -0
  30. package/api/dist/src/chat/chat.controller.js +73 -0
  31. package/api/dist/src/chat/chat.controller.js.map +1 -0
  32. package/api/dist/src/chat/chat.module.d.ts +2 -0
  33. package/api/dist/src/chat/chat.module.js +22 -0
  34. package/api/dist/src/chat/chat.module.js.map +1 -0
  35. package/api/dist/src/chat/chat.service.d.ts +25 -0
  36. package/api/dist/src/chat/chat.service.js +168 -0
  37. package/api/dist/src/chat/chat.service.js.map +1 -0
  38. package/api/dist/src/connection/connection.controller.d.ts +46 -0
  39. package/api/dist/src/connection/connection.controller.js +189 -0
  40. package/api/dist/src/connection/connection.controller.js.map +1 -0
  41. package/api/dist/src/connection/connection.model.d.ts +116 -0
  42. package/api/dist/src/connection/connection.model.js +23 -0
  43. package/api/dist/src/connection/connection.model.js.map +1 -0
  44. package/api/dist/src/connection/connection.module.d.ts +2 -0
  45. package/api/dist/src/connection/connection.module.js +31 -0
  46. package/api/dist/src/connection/connection.module.js.map +1 -0
  47. package/api/dist/src/connection/connection.repository.d.ts +16 -0
  48. package/api/dist/src/connection/connection.repository.js +195 -0
  49. package/api/dist/src/connection/connection.repository.js.map +1 -0
  50. package/api/dist/src/connection/connection.service.d.ts +50 -0
  51. package/api/dist/src/connection/connection.service.js +343 -0
  52. package/api/dist/src/connection/connection.service.js.map +1 -0
  53. package/api/dist/src/context/context.controller.d.ts +13 -0
  54. package/api/dist/src/context/context.controller.js +86 -0
  55. package/api/dist/src/context/context.controller.js.map +1 -0
  56. package/api/dist/src/context/context.module.d.ts +2 -0
  57. package/api/dist/src/context/context.module.js +39 -0
  58. package/api/dist/src/context/context.module.js.map +1 -0
  59. package/api/dist/src/context/context.service.d.ts +32 -0
  60. package/api/dist/src/context/context.service.js +177 -0
  61. package/api/dist/src/context/context.service.js.map +1 -0
  62. package/api/dist/src/dashboard/dashboard.controller.d.ts +21 -0
  63. package/api/dist/src/dashboard/dashboard.controller.js +109 -0
  64. package/api/dist/src/dashboard/dashboard.controller.js.map +1 -0
  65. package/api/dist/src/dashboard/dashboard.model.d.ts +15 -0
  66. package/api/dist/src/dashboard/dashboard.model.js +3 -0
  67. package/api/dist/src/dashboard/dashboard.model.js.map +1 -0
  68. package/api/dist/src/dashboard/dashboard.module.d.ts +2 -0
  69. package/api/dist/src/dashboard/dashboard.module.js +24 -0
  70. package/api/dist/src/dashboard/dashboard.module.js.map +1 -0
  71. package/api/dist/src/dashboard/dashboard.repository.d.ts +9 -0
  72. package/api/dist/src/dashboard/dashboard.repository.js +72 -0
  73. package/api/dist/src/dashboard/dashboard.repository.js.map +1 -0
  74. package/api/dist/src/dashboard/dashboard.service.d.ts +14 -0
  75. package/api/dist/src/dashboard/dashboard.service.js +87 -0
  76. package/api/dist/src/dashboard/dashboard.service.js.map +1 -0
  77. package/api/dist/src/datasource/connectors/connector.interface.d.ts +6 -0
  78. package/api/dist/src/datasource/connectors/connector.interface.js +3 -0
  79. package/api/dist/src/datasource/connectors/connector.interface.js.map +1 -0
  80. package/api/dist/src/datasource/connectors/mongo.connector.d.ts +30 -0
  81. package/api/dist/src/datasource/connectors/mongo.connector.js +167 -0
  82. package/api/dist/src/datasource/connectors/mongo.connector.js.map +1 -0
  83. package/api/dist/src/datasource/connectors/mongo.connector.test.d.ts +1 -0
  84. package/api/dist/src/datasource/connectors/mongo.connector.test.js +179 -0
  85. package/api/dist/src/datasource/connectors/mongo.connector.test.js.map +1 -0
  86. package/api/dist/src/datasource/connectors/postgres.connector.d.ts +50 -0
  87. package/api/dist/src/datasource/connectors/postgres.connector.js +213 -0
  88. package/api/dist/src/datasource/connectors/postgres.connector.js.map +1 -0
  89. package/api/dist/src/datasource/connectors/postgres.connector.test.d.ts +1 -0
  90. package/api/dist/src/datasource/connectors/postgres.connector.test.js +197 -0
  91. package/api/dist/src/datasource/connectors/postgres.connector.test.js.map +1 -0
  92. package/api/dist/src/datasource/datasource.controller.d.ts +16 -0
  93. package/api/dist/src/datasource/datasource.controller.js +79 -0
  94. package/api/dist/src/datasource/datasource.controller.js.map +1 -0
  95. package/api/dist/src/datasource/datasource.model.d.ts +26 -0
  96. package/api/dist/src/datasource/datasource.model.js +3 -0
  97. package/api/dist/src/datasource/datasource.model.js.map +1 -0
  98. package/api/dist/src/datasource/datasource.module.d.ts +2 -0
  99. package/api/dist/src/datasource/datasource.module.js +31 -0
  100. package/api/dist/src/datasource/datasource.module.js.map +1 -0
  101. package/api/dist/src/datasource/datasource.repository.d.ts +11 -0
  102. package/api/dist/src/datasource/datasource.repository.js +61 -0
  103. package/api/dist/src/datasource/datasource.repository.js.map +1 -0
  104. package/api/dist/src/datasource/datasource.service.d.ts +28 -0
  105. package/api/dist/src/datasource/datasource.service.js +95 -0
  106. package/api/dist/src/datasource/datasource.service.js.map +1 -0
  107. package/api/dist/src/example/example.controller.d.ts +10 -0
  108. package/api/dist/src/example/example.controller.js +43 -0
  109. package/api/dist/src/example/example.controller.js.map +1 -0
  110. package/api/dist/src/example/example.model.d.ts +6 -0
  111. package/api/dist/src/example/example.model.js +3 -0
  112. package/api/dist/src/example/example.model.js.map +1 -0
  113. package/api/dist/src/example/example.module.d.ts +2 -0
  114. package/api/dist/src/example/example.module.js +23 -0
  115. package/api/dist/src/example/example.module.js.map +1 -0
  116. package/api/dist/src/example/example.repository.d.ts +6 -0
  117. package/api/dist/src/example/example.repository.js +30 -0
  118. package/api/dist/src/example/example.repository.js.map +1 -0
  119. package/api/dist/src/example/example.service.d.ts +10 -0
  120. package/api/dist/src/example/example.service.js +31 -0
  121. package/api/dist/src/example/example.service.js.map +1 -0
  122. package/api/dist/src/integration/integration.controller.d.ts +15 -0
  123. package/api/dist/src/integration/integration.controller.js +69 -0
  124. package/api/dist/src/integration/integration.controller.js.map +1 -0
  125. package/api/dist/src/integration/integration.model.d.ts +17 -0
  126. package/api/dist/src/integration/integration.model.js +3 -0
  127. package/api/dist/src/integration/integration.model.js.map +1 -0
  128. package/api/dist/src/integration/integration.module.d.ts +2 -0
  129. package/api/dist/src/integration/integration.module.js +24 -0
  130. package/api/dist/src/integration/integration.module.js.map +1 -0
  131. package/api/dist/src/integration/integration.repository.d.ts +6 -0
  132. package/api/dist/src/integration/integration.repository.js +45 -0
  133. package/api/dist/src/integration/integration.repository.js.map +1 -0
  134. package/api/dist/src/integration/integration.service.d.ts +12 -0
  135. package/api/dist/src/integration/integration.service.js +78 -0
  136. package/api/dist/src/integration/integration.service.js.map +1 -0
  137. package/api/dist/src/main.d.ts +1 -0
  138. package/api/dist/src/main.js +19 -0
  139. package/api/dist/src/main.js.map +1 -0
  140. package/api/dist/src/mcp/grafana.mcp.d.ts +1 -0
  141. package/api/dist/src/mcp/grafana.mcp.js +95 -0
  142. package/api/dist/src/mcp/grafana.mcp.js.map +1 -0
  143. package/api/dist/src/mcp/graylog.mcp.d.ts +1 -0
  144. package/api/dist/src/mcp/graylog.mcp.js +241 -0
  145. package/api/dist/src/mcp/graylog.mcp.js.map +1 -0
  146. package/api/dist/src/mcp/mcp-server.d.ts +1 -0
  147. package/api/dist/src/mcp/mcp-server.js +336 -0
  148. package/api/dist/src/mcp/mcp-server.js.map +1 -0
  149. package/api/dist/src/paths.d.ts +8 -0
  150. package/api/dist/src/paths.js +50 -0
  151. package/api/dist/src/paths.js.map +1 -0
  152. package/api/dist/src/paths.test.d.ts +1 -0
  153. package/api/dist/src/paths.test.js +60 -0
  154. package/api/dist/src/paths.test.js.map +1 -0
  155. package/api/dist/src/project/project.controller.d.ts +44 -0
  156. package/api/dist/src/project/project.controller.js +79 -0
  157. package/api/dist/src/project/project.controller.js.map +1 -0
  158. package/api/dist/src/project/project.model.d.ts +19 -0
  159. package/api/dist/src/project/project.model.js +3 -0
  160. package/api/dist/src/project/project.model.js.map +1 -0
  161. package/api/dist/src/project/project.module.d.ts +2 -0
  162. package/api/dist/src/project/project.module.js +24 -0
  163. package/api/dist/src/project/project.module.js.map +1 -0
  164. package/api/dist/src/project/project.repository.d.ts +6 -0
  165. package/api/dist/src/project/project.repository.js +52 -0
  166. package/api/dist/src/project/project.repository.js.map +1 -0
  167. package/api/dist/src/project/project.service.d.ts +17 -0
  168. package/api/dist/src/project/project.service.js +163 -0
  169. package/api/dist/src/project/project.service.js.map +1 -0
  170. package/api/dist/tsconfig.tsbuildinfo +1 -0
  171. package/api/dist/vitest.config.d.ts +2 -0
  172. package/api/dist/vitest.config.js +10 -0
  173. package/api/dist/vitest.config.js.map +1 -0
  174. package/api/public/dist/Analitoly.png +0 -0
  175. package/api/public/dist/AnalitolyShort.png +0 -0
  176. package/api/public/dist/Gitlab.png +0 -0
  177. package/api/public/dist/Grafana.png +0 -0
  178. package/api/public/dist/Graylog.png +0 -0
  179. package/api/public/dist/Mongodb.png +0 -0
  180. package/api/public/dist/PostgreSQL.png +0 -0
  181. package/api/public/dist/assets/index-BPB3ckw4.js +222 -0
  182. package/api/public/dist/assets/index-CSAGa0SG.js +227 -0
  183. package/api/public/dist/index.html +12 -0
  184. package/bin/analitoly-mcp.js +18 -0
  185. package/bin/analitoly.js +38 -0
  186. package/package.json +54 -0
@@ -0,0 +1,177 @@
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.ContextService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const fs = require("fs");
15
+ const path = require("path");
16
+ const crypto = require("crypto");
17
+ const paths_1 = require("../paths");
18
+ const connection_repository_1 = require("../connection/connection.repository");
19
+ const datasource_service_1 = require("../datasource/datasource.service");
20
+ const project_repository_1 = require("../project/project.repository");
21
+ let ContextService = class ContextService {
22
+ constructor(connectionRepo, dataSourceService, projectRepo) {
23
+ this.connectionRepo = connectionRepo;
24
+ this.dataSourceService = dataSourceService;
25
+ this.projectRepo = projectRepo;
26
+ }
27
+ readContext() {
28
+ const filePath = (0, paths_1.contextPath)();
29
+ if (!fs.existsSync(filePath))
30
+ return null;
31
+ const raw = fs.readFileSync(filePath, 'utf-8');
32
+ const frontmatterMatch = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
33
+ if (!frontmatterMatch) {
34
+ return { content: raw, fingerprint: '', updatedAt: '' };
35
+ }
36
+ const meta = frontmatterMatch[1];
37
+ const content = frontmatterMatch[2];
38
+ let fingerprint = '';
39
+ let updatedAt = '';
40
+ for (const line of meta.split('\n')) {
41
+ const [key, ...rest] = line.split(': ');
42
+ const val = rest.join(': ').trim();
43
+ if (key === 'fingerprint')
44
+ fingerprint = val;
45
+ if (key === 'updatedAt')
46
+ updatedAt = val;
47
+ }
48
+ return { content, fingerprint, updatedAt };
49
+ }
50
+ writeContext(content, fingerprint) {
51
+ const fp = fingerprint ?? this.computeFingerprint();
52
+ const now = new Date().toISOString();
53
+ const file = `---\nfingerprint: ${fp}\nupdatedAt: ${now}\n---\n${content}`;
54
+ const dir = path.dirname((0, paths_1.contextPath)());
55
+ if (!fs.existsSync(dir))
56
+ fs.mkdirSync(dir, { recursive: true });
57
+ fs.writeFileSync((0, paths_1.contextPath)(), file, 'utf-8');
58
+ }
59
+ deleteContext() {
60
+ const filePath = (0, paths_1.contextPath)();
61
+ if (fs.existsSync(filePath))
62
+ fs.unlinkSync(filePath);
63
+ }
64
+ computeFingerprint() {
65
+ const connections = this.connectionRepo.readAll(false);
66
+ const activeIds = connections
67
+ .filter((c) => c.active)
68
+ .map((c) => c.id)
69
+ .sort()
70
+ .join(',');
71
+ return crypto.createHash('md5').update(activeIds).digest('hex').slice(0, 12);
72
+ }
73
+ checkStaleness() {
74
+ const ctx = this.readContext();
75
+ if (!ctx)
76
+ return { stale: false, newSources: [] };
77
+ const currentFp = this.computeFingerprint();
78
+ if (ctx.fingerprint === currentFp)
79
+ return { stale: false, newSources: [] };
80
+ const connections = this.connectionRepo.readAll(false).filter((c) => c.active);
81
+ const newSources = connections.map((c) => `${c.type}: ${c.name}`);
82
+ return { stale: true, newSources };
83
+ }
84
+ getStatus() {
85
+ const ctx = this.readContext();
86
+ if (!ctx)
87
+ return { initialized: false };
88
+ const { stale, newSources } = this.checkStaleness();
89
+ return {
90
+ initialized: true,
91
+ updatedAt: ctx.updatedAt,
92
+ fingerprint: ctx.fingerprint,
93
+ stale,
94
+ newSources: stale ? newSources : undefined,
95
+ };
96
+ }
97
+ async collectRawData() {
98
+ const sections = [];
99
+ const connections = this.connectionRepo.readAll(false).filter((c) => c.active);
100
+ for (const type of ['postgresql', 'mongodb']) {
101
+ const dbConns = connections.filter((c) => c.type === type);
102
+ for (const conn of dbConns) {
103
+ try {
104
+ const schema = await this.dataSourceService.getSchema(type, conn.name);
105
+ sections.push(`## ${type === 'postgresql' ? 'PostgreSQL' : 'MongoDB'}: ${conn.name}\nБаза данных: ${conn.config.database}\n\nСхема:\n\`\`\`json\n${JSON.stringify(schema, null, 2)}\n\`\`\``);
106
+ }
107
+ catch (err) {
108
+ sections.push(`## ${type === 'postgresql' ? 'PostgreSQL' : 'MongoDB'}: ${conn.name}\nОшибка получения схемы: ${err instanceof Error ? err.message : String(err)}`);
109
+ }
110
+ }
111
+ }
112
+ const project = this.projectRepo.read();
113
+ if (project && project.status === 'ready') {
114
+ let projectSection = `## Проект: ${project.localPath}\nТип: ${project.config.type}`;
115
+ const claudeMdPath = path.join(project.localPath, 'CLAUDE.md');
116
+ try {
117
+ if (fs.existsSync(claudeMdPath)) {
118
+ const claudeMd = fs.readFileSync(claudeMdPath, 'utf-8');
119
+ projectSection += `\n\nCLAUDE.md:\n\`\`\`\n${claudeMd}\n\`\`\``;
120
+ }
121
+ else {
122
+ projectSection += '\n\nCLAUDE.md: не найден';
123
+ }
124
+ }
125
+ catch {
126
+ projectSection += '\n\nCLAUDE.md: ошибка чтения';
127
+ }
128
+ sections.push(projectSection);
129
+ }
130
+ const graylogConn = connections.find((c) => c.type === 'graylog');
131
+ const grafanaConn = connections.find((c) => c.type === 'grafana');
132
+ if (graylogConn || grafanaConn) {
133
+ let integrations = '## Активные интеграции\n';
134
+ if (graylogConn) {
135
+ integrations += `- **Graylog**: подключён (${graylogConn.config.baseUrl}). Используй list_streams для получения списка стримов.\n`;
136
+ }
137
+ if (grafanaConn) {
138
+ integrations += `- **Grafana**: подключён (${grafanaConn.config.url}). Используй search_dashboards и list_datasources для деталей.\n`;
139
+ }
140
+ sections.push(integrations);
141
+ }
142
+ if (sections.length === 0) {
143
+ return 'Нет активных подключений.';
144
+ }
145
+ return sections.join('\n\n');
146
+ }
147
+ async buildInitializationPrompt() {
148
+ const rawData = await this.collectRawData();
149
+ const fingerprint = this.computeFingerprint();
150
+ return `Инициализация контекста. Проанализируй подключённые источники и создай подробный контекст.
151
+
152
+ Вот собранные данные:
153
+
154
+ ${rawData}
155
+
156
+ ---
157
+
158
+ Задачи:
159
+ 1. Проанализируй схемы БД — опиши таблицы/коллекции, их назначение, связи между ними, типы данных ключевых полей
160
+ 2. Если подключён проект — изучи код (используй Read, Glob, Grep), пойми бизнес-логику, опиши стек и ключевые сущности
161
+ 3. Если есть Graylog — вызови list_streams, опиши какие логи доступны и что они содержат
162
+ 4. Если есть Grafana — вызови search_dashboards и list_datasources, опиши что мониторится
163
+ 5. Запиши всё через write_context одним markdown-документом
164
+
165
+ Fingerprint текущих подключений: ${fingerprint}
166
+
167
+ Формат контекста — markdown с секциями по каждому источнику. Пиши на русском. Будь конкретен — укажи имена таблиц, полей, типы данных, связи. Опиши бизнес-контекст если удалось его понять из кода/данных.`;
168
+ }
169
+ };
170
+ exports.ContextService = ContextService;
171
+ exports.ContextService = ContextService = __decorate([
172
+ (0, common_1.Injectable)(),
173
+ __metadata("design:paramtypes", [connection_repository_1.ConnectionRepository,
174
+ datasource_service_1.DataSourceService,
175
+ project_repository_1.ProjectRepository])
176
+ ], ContextService);
177
+ //# sourceMappingURL=context.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.service.js","sourceRoot":"","sources":["../../../src/context/context.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Response } from 'express';
2
+ import { DashboardService } from './dashboard.service';
3
+ export declare class DashboardController {
4
+ private readonly service;
5
+ constructor(service: DashboardService);
6
+ list(): import("./dashboard.model").Dashboard[];
7
+ get(id: string): import("./dashboard.model").Dashboard;
8
+ create(body: {
9
+ name: string;
10
+ charts?: any[];
11
+ }): import("./dashboard.model").Dashboard;
12
+ update(id: string, body: {
13
+ name?: string;
14
+ charts?: any[];
15
+ }): import("./dashboard.model").Dashboard;
16
+ delete(id: string): {
17
+ ok: boolean;
18
+ };
19
+ import(body: any): import("./dashboard.model").Dashboard;
20
+ export(id: string, res: Response): void;
21
+ }
@@ -0,0 +1,109 @@
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 _a;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.DashboardController = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const express_1 = require("express");
19
+ const dashboard_service_1 = require("./dashboard.service");
20
+ let DashboardController = class DashboardController {
21
+ constructor(service) {
22
+ this.service = service;
23
+ }
24
+ list() {
25
+ return this.service.list();
26
+ }
27
+ get(id) {
28
+ return this.service.get(id);
29
+ }
30
+ create(body) {
31
+ return this.service.create(body.name, body.charts ?? []);
32
+ }
33
+ update(id, body) {
34
+ if (id === 'main') {
35
+ return this.service.upsert(id, body.name ?? 'Дашборд', body.charts ?? []);
36
+ }
37
+ return this.service.update(id, body);
38
+ }
39
+ delete(id) {
40
+ this.service.delete(id);
41
+ return { ok: true };
42
+ }
43
+ import(body) {
44
+ return this.service.import(body);
45
+ }
46
+ export(id, res) {
47
+ const dashboard = this.service.get(id);
48
+ res.setHeader('Content-Disposition', `attachment; filename="${dashboard.name.replace(/[^a-zA-Z0-9а-яА-ЯёЁ_-]/g, '_')}.json"`);
49
+ res.json(dashboard);
50
+ }
51
+ };
52
+ exports.DashboardController = DashboardController;
53
+ __decorate([
54
+ (0, common_1.Get)(),
55
+ __metadata("design:type", Function),
56
+ __metadata("design:paramtypes", []),
57
+ __metadata("design:returntype", void 0)
58
+ ], DashboardController.prototype, "list", null);
59
+ __decorate([
60
+ (0, common_1.Get)(':id'),
61
+ __param(0, (0, common_1.Param)('id')),
62
+ __metadata("design:type", Function),
63
+ __metadata("design:paramtypes", [String]),
64
+ __metadata("design:returntype", void 0)
65
+ ], DashboardController.prototype, "get", null);
66
+ __decorate([
67
+ (0, common_1.Post)(),
68
+ __param(0, (0, common_1.Body)()),
69
+ __metadata("design:type", Function),
70
+ __metadata("design:paramtypes", [Object]),
71
+ __metadata("design:returntype", void 0)
72
+ ], DashboardController.prototype, "create", null);
73
+ __decorate([
74
+ (0, common_1.Put)(':id'),
75
+ __param(0, (0, common_1.Param)('id')),
76
+ __param(1, (0, common_1.Body)()),
77
+ __metadata("design:type", Function),
78
+ __metadata("design:paramtypes", [String, Object]),
79
+ __metadata("design:returntype", void 0)
80
+ ], DashboardController.prototype, "update", null);
81
+ __decorate([
82
+ (0, common_1.Delete)(':id'),
83
+ __param(0, (0, common_1.Param)('id')),
84
+ __metadata("design:type", Function),
85
+ __metadata("design:paramtypes", [String]),
86
+ __metadata("design:returntype", void 0)
87
+ ], DashboardController.prototype, "delete", null);
88
+ __decorate([
89
+ (0, common_1.Post)('import'),
90
+ __param(0, (0, common_1.Body)()),
91
+ __metadata("design:type", Function),
92
+ __metadata("design:paramtypes", [Object]),
93
+ __metadata("design:returntype", void 0)
94
+ ], DashboardController.prototype, "import", null);
95
+ __decorate([
96
+ (0, common_1.Get)(':id/export'),
97
+ (0, common_1.Header)('Content-Type', 'application/json'),
98
+ (0, common_1.Header)('Content-Disposition', 'attachment'),
99
+ __param(0, (0, common_1.Param)('id')),
100
+ __param(1, (0, common_1.Res)()),
101
+ __metadata("design:type", Function),
102
+ __metadata("design:paramtypes", [String, typeof (_a = typeof express_1.Response !== "undefined" && express_1.Response) === "function" ? _a : Object]),
103
+ __metadata("design:returntype", void 0)
104
+ ], DashboardController.prototype, "export", null);
105
+ exports.DashboardController = DashboardController = __decorate([
106
+ (0, common_1.Controller)('dashboard'),
107
+ __metadata("design:paramtypes", [dashboard_service_1.DashboardService])
108
+ ], DashboardController);
109
+ //# sourceMappingURL=dashboard.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.controller.js","sourceRoot":"","sources":["../../../src/dashboard/dashboard.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAUwB;AACxB,qCAAmC;AACnC,2DAAuD;AAGhD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YAA6B,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;IAAG,CAAC;IAG1D,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAGD,GAAG,CAAc,EAAU;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAGD,MAAM,CAAS,IAAsC;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAGD,MAAM,CAAc,EAAU,EAAU,IAAuC;QAE7E,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAGD,MAAM,CAAc,EAAU;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAGD,MAAM,CAAS,IAAS;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAKD,MAAM,CAAc,EAAU,EAAS,GAAa;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,GAAG,CAAC,SAAS,CACX,qBAAqB,EACrB,yBAAyB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,QAAQ,CACxF,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;CACF,CAAA;AAjDY,kDAAmB;AAI9B;IADC,IAAA,YAAG,GAAE;;;;+CAGL;AAGD;IADC,IAAA,YAAG,EAAC,KAAK,CAAC;IACN,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;8CAEf;AAGD;IADC,IAAA,aAAI,GAAE;IACC,WAAA,IAAA,aAAI,GAAE,CAAA;;;;iDAEb;AAGD;IADC,IAAA,YAAG,EAAC,KAAK,CAAC;IACH,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;IAAc,WAAA,IAAA,aAAI,GAAE,CAAA;;;;iDAMtC;AAGD;IADC,IAAA,eAAM,EAAC,KAAK,CAAC;IACN,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;iDAGlB;AAGD;IADC,IAAA,aAAI,EAAC,QAAQ,CAAC;IACP,WAAA,IAAA,aAAI,GAAE,CAAA;;;;iDAEb;AAKD;IAHC,IAAA,YAAG,EAAC,YAAY,CAAC;IACjB,IAAA,eAAM,EAAC,cAAc,EAAE,kBAAkB,CAAC;IAC1C,IAAA,eAAM,EAAC,qBAAqB,EAAE,YAAY,CAAC;IACpC,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;IAAc,WAAA,IAAA,YAAG,GAAE,CAAA;;iEAAM,kBAAQ,oBAAR,kBAAQ;;iDAOnD;8BAhDU,mBAAmB;IAD/B,IAAA,mBAAU,EAAC,WAAW,CAAC;qCAEgB,oCAAgB;GAD3C,mBAAmB,CAiD/B"}
@@ -0,0 +1,15 @@
1
+ export interface DashboardChart {
2
+ chartId: string;
3
+ title: string;
4
+ echartsOption: Record<string, unknown>;
5
+ description: string;
6
+ sourceQuery: string;
7
+ position: number;
8
+ }
9
+ export interface Dashboard {
10
+ id: string;
11
+ name: string;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ charts: DashboardChart[];
15
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=dashboard.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.model.js","sourceRoot":"","sources":["../../../src/dashboard/dashboard.model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare class DashboardModule {
2
+ }
@@ -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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DashboardModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const dashboard_controller_1 = require("./dashboard.controller");
12
+ const dashboard_service_1 = require("./dashboard.service");
13
+ const dashboard_repository_1 = require("./dashboard.repository");
14
+ let DashboardModule = class DashboardModule {
15
+ };
16
+ exports.DashboardModule = DashboardModule;
17
+ exports.DashboardModule = DashboardModule = __decorate([
18
+ (0, common_1.Module)({
19
+ controllers: [dashboard_controller_1.DashboardController],
20
+ providers: [dashboard_service_1.DashboardService, dashboard_repository_1.DashboardRepository],
21
+ exports: [dashboard_service_1.DashboardService],
22
+ })
23
+ ], DashboardModule);
24
+ //# sourceMappingURL=dashboard.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.module.js","sourceRoot":"","sources":["../../../src/dashboard/dashboard.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,iEAA6D;AAC7D,2DAAuD;AACvD,iEAA6D;AAOtD,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAL3B,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,CAAC,0CAAmB,CAAC;QAClC,SAAS,EAAE,CAAC,oCAAgB,EAAE,0CAAmB,CAAC;QAClD,OAAO,EAAE,CAAC,oCAAgB,CAAC;KAC5B,CAAC;GACW,eAAe,CAAG"}
@@ -0,0 +1,9 @@
1
+ import { Dashboard } from './dashboard.model';
2
+ export declare class DashboardRepository {
3
+ constructor();
4
+ private filePath;
5
+ findAll(): Dashboard[];
6
+ findById(id: string): Dashboard | null;
7
+ save(dashboard: Dashboard): void;
8
+ delete(id: string): boolean;
9
+ }
@@ -0,0 +1,72 @@
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.DashboardRepository = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const fs = require("fs");
15
+ const path = require("path");
16
+ const paths_1 = require("../paths");
17
+ const DASHBOARDS_DIR = (0, paths_1.dashboardsDir)();
18
+ let DashboardRepository = class DashboardRepository {
19
+ constructor() {
20
+ if (!fs.existsSync(DASHBOARDS_DIR)) {
21
+ fs.mkdirSync(DASHBOARDS_DIR, { recursive: true });
22
+ }
23
+ }
24
+ filePath(id) {
25
+ const safe = id.replace(/[^a-zA-Z0-9_-]/g, '');
26
+ return path.join(DASHBOARDS_DIR, `${safe}.json`);
27
+ }
28
+ findAll() {
29
+ if (!fs.existsSync(DASHBOARDS_DIR))
30
+ return [];
31
+ return fs
32
+ .readdirSync(DASHBOARDS_DIR)
33
+ .filter((f) => f.endsWith('.json'))
34
+ .map((f) => {
35
+ try {
36
+ return JSON.parse(fs.readFileSync(path.join(DASHBOARDS_DIR, f), 'utf-8'));
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ })
42
+ .filter((d) => d !== null)
43
+ .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
44
+ }
45
+ findById(id) {
46
+ const fp = this.filePath(id);
47
+ if (!fs.existsSync(fp))
48
+ return null;
49
+ try {
50
+ return JSON.parse(fs.readFileSync(fp, 'utf-8'));
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ save(dashboard) {
57
+ fs.writeFileSync(this.filePath(dashboard.id), JSON.stringify(dashboard, null, 2), 'utf-8');
58
+ }
59
+ delete(id) {
60
+ const fp = this.filePath(id);
61
+ if (!fs.existsSync(fp))
62
+ return false;
63
+ fs.unlinkSync(fp);
64
+ return true;
65
+ }
66
+ };
67
+ exports.DashboardRepository = DashboardRepository;
68
+ exports.DashboardRepository = DashboardRepository = __decorate([
69
+ (0, common_1.Injectable)(),
70
+ __metadata("design:paramtypes", [])
71
+ ], DashboardRepository);
72
+ //# sourceMappingURL=dashboard.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.repository.js","sourceRoot":"","sources":["../../../src/dashboard/dashboard.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,yBAAyB;AACzB,6BAA6B;AAG7B,oCAAyC;AACzC,MAAM,cAAc,GAAG,IAAA,qBAAa,GAAE,CAAC;AAGhC,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B;QACE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,EAAU;QAEzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9C,OAAO,EAAE;aACN,WAAW,CAAC,cAAc,CAAC;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAc,CAAC;YACzF,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;aACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAc,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAoB;QACvB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAjDY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;;GACA,mBAAmB,CAiD/B"}
@@ -0,0 +1,14 @@
1
+ import { DashboardRepository } from './dashboard.repository';
2
+ import { Dashboard, DashboardChart } from './dashboard.model';
3
+ export declare class DashboardService {
4
+ private readonly repository;
5
+ constructor(repository: DashboardRepository);
6
+ list(): Dashboard[];
7
+ get(id: string): Dashboard;
8
+ create(name: string, charts?: DashboardChart[]): Dashboard;
9
+ getOrNull(id: string): Dashboard | null;
10
+ update(id: string, data: Partial<Pick<Dashboard, 'name' | 'charts'>>): Dashboard;
11
+ upsert(id: string, name: string, charts: DashboardChart[]): Dashboard;
12
+ delete(id: string): void;
13
+ import(json: Dashboard): Dashboard;
14
+ }
@@ -0,0 +1,87 @@
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.DashboardService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const dashboard_repository_1 = require("./dashboard.repository");
15
+ let DashboardService = class DashboardService {
16
+ constructor(repository) {
17
+ this.repository = repository;
18
+ }
19
+ list() {
20
+ return this.repository.findAll();
21
+ }
22
+ get(id) {
23
+ const dash = this.repository.findById(id);
24
+ if (!dash)
25
+ throw new common_1.NotFoundException('Dashboard not found');
26
+ return dash;
27
+ }
28
+ create(name, charts = []) {
29
+ const dashboard = {
30
+ id: `dash_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
31
+ name,
32
+ createdAt: new Date().toISOString(),
33
+ updatedAt: new Date().toISOString(),
34
+ charts: charts.map((c, i) => ({ ...c, position: c.position ?? i })),
35
+ };
36
+ this.repository.save(dashboard);
37
+ return dashboard;
38
+ }
39
+ getOrNull(id) {
40
+ return this.repository.findById(id);
41
+ }
42
+ update(id, data) {
43
+ const dashboard = this.get(id);
44
+ if (data.name !== undefined)
45
+ dashboard.name = data.name;
46
+ if (data.charts !== undefined) {
47
+ dashboard.charts = data.charts.map((c, i) => ({ ...c, position: c.position ?? i }));
48
+ }
49
+ dashboard.updatedAt = new Date().toISOString();
50
+ this.repository.save(dashboard);
51
+ return dashboard;
52
+ }
53
+ upsert(id, name, charts) {
54
+ const existing = this.repository.findById(id);
55
+ const now = new Date().toISOString();
56
+ const dashboard = {
57
+ id,
58
+ name,
59
+ createdAt: existing?.createdAt ?? now,
60
+ updatedAt: now,
61
+ charts: charts.map((c, i) => ({ ...c, position: c.position ?? i })),
62
+ };
63
+ this.repository.save(dashboard);
64
+ return dashboard;
65
+ }
66
+ delete(id) {
67
+ if (!this.repository.delete(id)) {
68
+ throw new common_1.NotFoundException('Dashboard not found');
69
+ }
70
+ }
71
+ import(json) {
72
+ const dashboard = {
73
+ ...json,
74
+ id: `dash_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
75
+ createdAt: json.createdAt || new Date().toISOString(),
76
+ updatedAt: new Date().toISOString(),
77
+ };
78
+ this.repository.save(dashboard);
79
+ return dashboard;
80
+ }
81
+ };
82
+ exports.DashboardService = DashboardService;
83
+ exports.DashboardService = DashboardService = __decorate([
84
+ (0, common_1.Injectable)(),
85
+ __metadata("design:paramtypes", [dashboard_repository_1.DashboardRepository])
86
+ ], DashboardService);
87
+ //# sourceMappingURL=dashboard.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.service.js","sourceRoot":"","sources":["../../../src/dashboard/dashboard.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { DataSourceConfig, DatabaseSchema } from '../datasource.model';
2
+ export interface IDatabaseConnector {
3
+ testConnection(config: DataSourceConfig): Promise<boolean>;
4
+ getSchema(config: DataSourceConfig): Promise<DatabaseSchema>;
5
+ executeQuery(config: DataSourceConfig, query: string): Promise<unknown[]>;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=connector.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.interface.js","sourceRoot":"","sources":["../../../../src/datasource/connectors/connector.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { IDatabaseConnector } from './connector.interface';
2
+ import { DataSourceConfig, DatabaseSchema } from '../datasource.model';
3
+ export interface MongoExplainResult {
4
+ queryPlanner: object;
5
+ executionStats?: object;
6
+ }
7
+ export interface MongoCountResult {
8
+ collection: string;
9
+ count: number;
10
+ }
11
+ export interface MongoStatsResult {
12
+ level: 'database' | 'collection';
13
+ stats: object;
14
+ }
15
+ export type MongoIndexResult = {
16
+ name: string;
17
+ key: Record<string, number | string>;
18
+ unique?: boolean;
19
+ sparse?: boolean;
20
+ };
21
+ export declare class MongoConnector implements IDatabaseConnector {
22
+ testConnection(config: DataSourceConfig): Promise<boolean>;
23
+ getSchema(config: DataSourceConfig): Promise<DatabaseSchema>;
24
+ executeQuery(config: DataSourceConfig, query: string): Promise<unknown[]>;
25
+ explainQuery(config: DataSourceConfig, collection: string, filter?: object, verbosity?: 'queryPlanner' | 'executionStats'): Promise<MongoExplainResult>;
26
+ countDocuments(config: DataSourceConfig, collection: string, filter?: object): Promise<MongoCountResult>;
27
+ getStats(config: DataSourceConfig, collection?: string): Promise<MongoStatsResult>;
28
+ listIndexes(config: DataSourceConfig, collection: string): Promise<MongoIndexResult[]>;
29
+ private createClient;
30
+ }