@hamak/smart-data-dico 1.0.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/backend/dist/server.mjs +82212 -0
  2. package/bin/cli.js +28 -17
  3. package/package.json +28 -27
  4. package/backend/package.json +0 -51
  5. package/backend/src/__tests__/integration/api.test.ts +0 -149
  6. package/backend/src/__tests__/setup.ts +0 -24
  7. package/backend/src/__tests__/utils/testUtils.ts +0 -76
  8. package/backend/src/adapters/EntityFileAdapter.ts +0 -154
  9. package/backend/src/adapters/YamlFileInfoEnricher.ts +0 -52
  10. package/backend/src/controllers/authController.ts +0 -131
  11. package/backend/src/controllers/diagramController.ts +0 -143
  12. package/backend/src/controllers/dictionaryController.ts +0 -306
  13. package/backend/src/controllers/importExportController.ts +0 -64
  14. package/backend/src/controllers/perspectiveController.ts +0 -90
  15. package/backend/src/controllers/serviceController.ts +0 -418
  16. package/backend/src/controllers/stereotypeController.ts +0 -59
  17. package/backend/src/controllers/versionController.ts +0 -226
  18. package/backend/src/kernel/config.ts +0 -43
  19. package/backend/src/middleware/auth.ts +0 -128
  20. package/backend/src/middleware/jwtAuth.ts +0 -100
  21. package/backend/src/models/Dictionary.ts +0 -38
  22. package/backend/src/models/EntitySchema.ts +0 -393
  23. package/backend/src/models/__tests__/Dictionary.test.ts +0 -92
  24. package/backend/src/models/__tests__/EntitySchema.test.ts +0 -119
  25. package/backend/src/routes/index.ts +0 -120
  26. package/backend/src/scripts/migrate-to-uuid.ts +0 -24
  27. package/backend/src/server.ts +0 -158
  28. package/backend/src/services/__mocks__/entityService.ts +0 -38
  29. package/backend/src/services/__mocks__/serviceService.ts +0 -88
  30. package/backend/src/services/__mocks__/versionService.ts +0 -38
  31. package/backend/src/services/__tests__/dictionaryService.test.ts +0 -74
  32. package/backend/src/services/diagramService.ts +0 -165
  33. package/backend/src/services/dictionaryService.ts +0 -582
  34. package/backend/src/services/entityService.ts +0 -102
  35. package/backend/src/services/exportService.ts +0 -172
  36. package/backend/src/services/importService.ts +0 -208
  37. package/backend/src/services/perspectiveService.ts +0 -276
  38. package/backend/src/services/qualityService.ts +0 -121
  39. package/backend/src/services/serviceService.ts +0 -763
  40. package/backend/src/services/stereotypeService.ts +0 -98
  41. package/backend/src/services/versionService.ts +0 -135
  42. package/backend/src/setupTests.ts +0 -12
  43. package/backend/src/utils/__mocks__/fileOperations.ts +0 -116
  44. package/backend/src/utils/fileOperations.ts +0 -602
  45. package/backend/src/utils/logger.ts +0 -38
  46. package/backend/src/utils/migration.ts +0 -254
  47. package/backend/src/utils/swagger.ts +0 -358
  48. package/backend/src/utils/uuid.ts +0 -41
  49. package/backend/tsconfig.json +0 -20
@@ -1,90 +0,0 @@
1
- import { Request, Response } from 'express';
2
- import { perspectiveService } from '../services/perspectiveService.js';
3
- import { logger } from '../utils/logger.js';
4
-
5
- export const getAllPerspectives = async (_req: Request, res: Response) => {
6
- try {
7
- const perspectives = await perspectiveService.getAll();
8
- res.json({ message: 'Success', data: perspectives });
9
- } catch (error) {
10
- logger.error('Error fetching perspectives', error);
11
- res.status(500).json({ message: 'Error fetching perspectives', error });
12
- }
13
- };
14
-
15
- export const getPerspective = async (req: Request, res: Response) => {
16
- try {
17
- const perspective = await perspectiveService.getById(req.params.id);
18
- if (!perspective) return res.status(404).json({ message: 'Perspective not found' });
19
- res.json({ message: 'Success', data: perspective });
20
- } catch (error) {
21
- logger.error('Error fetching perspective', error);
22
- res.status(500).json({ message: 'Error fetching perspective', error });
23
- }
24
- };
25
-
26
- export const createPerspective = async (req: Request, res: Response) => {
27
- try {
28
- const result = await perspectiveService.create(req.body);
29
- if (!result.success) return res.status(400).json({ message: 'Failed to create perspective', errors: result.errors });
30
- res.status(201).json({ message: 'Perspective created successfully', data: result.perspective });
31
- } catch (error) {
32
- logger.error('Error creating perspective', error);
33
- res.status(500).json({ message: 'Error creating perspective', error });
34
- }
35
- };
36
-
37
- export const updatePerspective = async (req: Request, res: Response) => {
38
- try {
39
- const result = await perspectiveService.update(req.params.id, req.body);
40
- if (!result.success) return res.status(400).json({ message: 'Failed to update perspective', errors: result.errors });
41
- res.json({ message: 'Perspective updated successfully', data: result.perspective });
42
- } catch (error) {
43
- logger.error('Error updating perspective', error);
44
- res.status(500).json({ message: 'Error updating perspective', error });
45
- }
46
- };
47
-
48
- export const deletePerspective = async (req: Request, res: Response) => {
49
- try {
50
- const result = await perspectiveService.delete(req.params.id);
51
- if (!result.success) return res.status(400).json({ message: 'Failed to delete perspective', errors: result.errors });
52
- res.json({ message: 'Perspective deleted successfully' });
53
- } catch (error) {
54
- logger.error('Error deleting perspective', error);
55
- res.status(500).json({ message: 'Error deleting perspective', error });
56
- }
57
- };
58
-
59
- export const resolvePerspective = async (req: Request, res: Response) => {
60
- try {
61
- const resolved = await perspectiveService.resolve(req.params.id);
62
- if (!resolved) return res.status(404).json({ message: 'Perspective not found' });
63
- res.json({ message: 'Success', data: resolved });
64
- } catch (error) {
65
- logger.error('Error resolving perspective', error);
66
- res.status(500).json({ message: 'Error resolving perspective', error });
67
- }
68
- };
69
-
70
- export const getPerspectiveGraph = async (req: Request, res: Response) => {
71
- try {
72
- const graph = await perspectiveService.getGraphData(req.params.id);
73
- if (!graph) return res.status(404).json({ message: 'Perspective not found' });
74
- res.json({ message: 'Success', data: graph });
75
- } catch (error) {
76
- logger.error('Error getting perspective graph', error);
77
- res.status(500).json({ message: 'Error getting perspective graph', error });
78
- }
79
- };
80
-
81
- export const upsertPerspectiveNode = async (req: Request, res: Response) => {
82
- try {
83
- const result = await perspectiveService.upsertNode(req.params.id, req.body);
84
- if (!result.success) return res.status(400).json({ message: 'Failed to update node', errors: result.errors });
85
- res.json({ message: 'Node updated successfully' });
86
- } catch (error) {
87
- logger.error('Error updating perspective node', error);
88
- res.status(500).json({ message: 'Error updating perspective node', error });
89
- }
90
- };
@@ -1,418 +0,0 @@
1
- import { Request, Response } from 'express';
2
- import { serviceService } from '../services/serviceService.js';
3
- import { logger } from '../utils/logger.js';
4
- import { Entity, Relationship } from '../models/EntitySchema.js';
5
-
6
- /**
7
- * @swagger
8
- * /api/services:
9
- * get:
10
- * summary: Get all services (packages)
11
- * tags: [Services]
12
- * responses:
13
- * 200:
14
- * description: A list of services
15
- */
16
- export const getAllServices = async (req: Request, res: Response) => {
17
- try {
18
- const services = await serviceService.getAllServices();
19
- res.json({
20
- message: 'Success',
21
- data: services
22
- });
23
- } catch (error) {
24
- logger.error('Error fetching services', error);
25
- res.status(500).json({ message: 'Error fetching services', error });
26
- }
27
- };
28
-
29
- /**
30
- * @swagger
31
- * /api/services/{service}/entities:
32
- * get:
33
- * summary: Get all entities for a specific service
34
- * tags: [Entities]
35
- */
36
- export const getServiceEntities = async (req: Request, res: Response) => {
37
- try {
38
- const startTime = process.hrtime();
39
- const { service } = req.params;
40
-
41
- logger.info(`Starting to fetch entities for service: ${service}`);
42
- const entities = await serviceService.getServiceEntities(service);
43
-
44
- const endTime = process.hrtime(startTime);
45
- const executionTimeMs = Number((endTime[0] * 1e3 + endTime[1] / 1e6).toFixed(2));
46
-
47
- logger.info(`Fetched ${entities.length} entities for service: ${service} in ${executionTimeMs}ms`);
48
-
49
- res.json({
50
- message: 'Success',
51
- data: entities,
52
- meta: {
53
- count: entities.length,
54
- executionTimeMs
55
- }
56
- });
57
- } catch (error) {
58
- logger.error(`Error fetching entities for service: ${req.params.service}`, error);
59
- res.status(500).json({ message: 'Error fetching service entities', error });
60
- }
61
- };
62
-
63
- /**
64
- * @swagger
65
- * /api/services/{service}/entities/{entity}:
66
- * get:
67
- * summary: Get entity schema by service and entity name
68
- * tags: [Entities]
69
- */
70
- export const getEntitySchema = async (req: Request, res: Response) => {
71
- try {
72
- const { service, entity } = req.params;
73
- const entitySchema = await serviceService.getEntitySchema(service, entity);
74
-
75
- if (!entitySchema) {
76
- return res.status(404).json({ message: 'Entity not found' });
77
- }
78
-
79
- res.json({
80
- message: 'Success',
81
- data: entitySchema
82
- });
83
- } catch (error) {
84
- logger.error(`Error fetching entity schema: ${error}`);
85
- res.status(500).json({ message: 'Error fetching entity schema', error });
86
- }
87
- };
88
-
89
- /**
90
- * @swagger
91
- * /api/services/{service}/entities:
92
- * post:
93
- * summary: Create a new entity
94
- * tags: [Entities]
95
- */
96
- export const createEntity = async (req: Request, res: Response) => {
97
- try {
98
- const { service } = req.params;
99
- const entityData = req.body as Entity;
100
-
101
- const result = await serviceService.createEntity(service, entityData);
102
-
103
- if (!result.success) {
104
- return res.status(400).json({
105
- message: 'Failed to create entity',
106
- errors: result.errors
107
- });
108
- }
109
-
110
- res.status(201).json({
111
- message: 'Entity created successfully',
112
- data: entityData
113
- });
114
- } catch (error) {
115
- logger.error(`Error creating entity: ${error}`);
116
- res.status(500).json({ message: 'Error creating entity', error });
117
- }
118
- };
119
-
120
- /**
121
- * @swagger
122
- * /api/services/{service}/entities/{entity}:
123
- * put:
124
- * summary: Update an existing entity
125
- * tags: [Entities]
126
- */
127
- export const updateEntity = async (req: Request, res: Response) => {
128
- try {
129
- const { service, entity } = req.params;
130
- const entityData = req.body as Entity;
131
-
132
- if (entityData.name !== entity) {
133
- return res.status(400).json({
134
- message: 'Entity name mismatch',
135
- error: `Entity name (${entityData.name}) does not match the URL (${entity})`
136
- });
137
- }
138
-
139
- const existingEntity = await serviceService.getEntitySchema(service, entity);
140
- if (!existingEntity) {
141
- return res.status(404).json({ message: 'Entity not found' });
142
- }
143
-
144
- const result = await serviceService.updateEntity(service, entityData);
145
-
146
- if (!result.success) {
147
- return res.status(400).json({
148
- message: 'Failed to update entity',
149
- errors: result.errors
150
- });
151
- }
152
-
153
- res.json({
154
- message: 'Entity updated successfully',
155
- data: entityData
156
- });
157
- } catch (error) {
158
- logger.error(`Error updating entity: ${error}`);
159
- res.status(500).json({ message: 'Error updating entity', error });
160
- }
161
- };
162
-
163
- /**
164
- * @swagger
165
- * /api/services/{service}/entities/{entity}:
166
- * delete:
167
- * summary: Delete an entity
168
- * tags: [Entities]
169
- */
170
- export const deleteEntity = async (req: Request, res: Response) => {
171
- try {
172
- const { service, entity } = req.params;
173
-
174
- const existingEntity = await serviceService.getEntitySchema(service, entity);
175
- if (!existingEntity) {
176
- return res.status(404).json({ message: 'Entity not found' });
177
- }
178
-
179
- const result = await serviceService.deleteEntity(service, entity);
180
-
181
- if (!result.success) {
182
- return res.status(400).json({
183
- message: 'Failed to delete entity',
184
- errors: result.errors
185
- });
186
- }
187
-
188
- res.json({
189
- message: 'Entity deleted successfully'
190
- });
191
- } catch (error) {
192
- logger.error(`Error deleting entity: ${error}`);
193
- res.status(500).json({ message: 'Error deleting entity', error });
194
- }
195
- };
196
-
197
- /**
198
- * @swagger
199
- * /api/search:
200
- * get:
201
- * summary: Search for entities and attributes
202
- * tags: [Search]
203
- */
204
- export const searchEntities = async (req: Request, res: Response) => {
205
- try {
206
- const { q, type, service, stereotype, hasMetadata } = req.query;
207
-
208
- if (!q || typeof q !== 'string') {
209
- return res.status(400).json({ message: 'Search query is required' });
210
- }
211
-
212
- const filters: any = {};
213
- if (type) filters.type = String(type);
214
- if (service) filters.service = String(service);
215
- if (stereotype) filters.stereotype = String(stereotype);
216
- if (hasMetadata) filters.hasMetadata = String(hasMetadata);
217
-
218
- const results = await serviceService.searchEntities(q, Object.keys(filters).length > 0 ? filters : undefined);
219
-
220
- res.json({
221
- message: 'Success',
222
- data: results
223
- });
224
- } catch (error) {
225
- logger.error(`Error searching entities: ${error}`);
226
- res.status(500).json({ message: 'Error searching entities', error });
227
- }
228
- };
229
-
230
- export const submitEntity = async (req: Request, res: Response) => {
231
- try {
232
- const { service, entity } = req.params;
233
- const result = await serviceService.changeEntityStatus(service, entity, 'submitted' as any);
234
- if (!result.success) return res.status(400).json({ message: 'Failed to submit', errors: result.errors });
235
- res.json({ message: 'Entity submitted for review' });
236
- } catch (error) {
237
- logger.error('Error submitting entity', error);
238
- res.status(500).json({ message: 'Error submitting entity', error });
239
- }
240
- };
241
-
242
- export const approveEntity = async (req: Request, res: Response) => {
243
- try {
244
- const { service, entity } = req.params;
245
- const result = await serviceService.changeEntityStatus(service, entity, 'approved' as any);
246
- if (!result.success) return res.status(400).json({ message: 'Failed to approve', errors: result.errors });
247
- res.json({ message: 'Entity approved' });
248
- } catch (error) {
249
- logger.error('Error approving entity', error);
250
- res.status(500).json({ message: 'Error approving entity', error });
251
- }
252
- };
253
-
254
- export const returnEntity = async (req: Request, res: Response) => {
255
- try {
256
- const { service, entity } = req.params;
257
- const result = await serviceService.changeEntityStatus(service, entity, 'returned' as any);
258
- if (!result.success) return res.status(400).json({ message: 'Failed to return', errors: result.errors });
259
-
260
- // Add return comment if provided
261
- if (req.body.comment) {
262
- await serviceService.addComment(service, entity, {
263
- author: req.body.author || 'reviewer',
264
- message: req.body.comment,
265
- });
266
- }
267
-
268
- res.json({ message: 'Entity returned for revision' });
269
- } catch (error) {
270
- logger.error('Error returning entity', error);
271
- res.status(500).json({ message: 'Error returning entity', error });
272
- }
273
- };
274
-
275
- export const getEntityComments = async (req: Request, res: Response) => {
276
- try {
277
- const { service, entity } = req.params;
278
- const comments = await serviceService.getComments(service, entity);
279
- res.json({ message: 'Success', data: comments });
280
- } catch (error) {
281
- logger.error('Error fetching comments', error);
282
- res.status(500).json({ message: 'Error fetching comments', error });
283
- }
284
- };
285
-
286
- export const addEntityComment = async (req: Request, res: Response) => {
287
- try {
288
- const { service, entity } = req.params;
289
- const result = await serviceService.addComment(service, entity, req.body);
290
- if (!result.success) return res.status(400).json({ message: 'Failed to add comment', errors: result.errors });
291
- res.status(201).json({ message: 'Comment added', data: result.comment });
292
- } catch (error) {
293
- logger.error('Error adding comment', error);
294
- res.status(500).json({ message: 'Error adding comment', error });
295
- }
296
- };
297
-
298
- export const resolveEntityComment = async (req: Request, res: Response) => {
299
- try {
300
- const { service, entity, id } = req.params;
301
- const result = await serviceService.resolveComment(service, entity, id);
302
- if (!result.success) return res.status(400).json({ message: 'Failed to resolve comment', errors: result.errors });
303
- res.json({ message: 'Comment resolved' });
304
- } catch (error) {
305
- logger.error('Error resolving comment', error);
306
- res.status(500).json({ message: 'Error resolving comment', error });
307
- }
308
- };
309
-
310
- export const getLineage = async (req: Request, res: Response) => {
311
- try {
312
- const { uuid } = req.params;
313
- const lineage = await serviceService.getLineage(uuid);
314
- res.json({ message: 'Success', data: lineage });
315
- } catch (error) {
316
- logger.error(`Error getting lineage: ${error}`);
317
- res.status(500).json({ message: 'Error getting lineage', error });
318
- }
319
- };
320
-
321
- export const getImpactAnalysis = async (req: Request, res: Response) => {
322
- try {
323
- const { uuid } = req.params;
324
- const impact = await serviceService.getImpactAnalysis(uuid);
325
- res.json({ message: 'Success', data: impact });
326
- } catch (error) {
327
- logger.error(`Error getting impact analysis: ${error}`);
328
- res.status(500).json({ message: 'Error getting impact analysis', error });
329
- }
330
- };
331
-
332
- /**
333
- * @swagger
334
- * /api/graph/{service}:
335
- * get:
336
- * summary: Get graph data for visualization
337
- * tags: [Visualization]
338
- */
339
- export const getGraphData = async (req: Request, res: Response) => {
340
- try {
341
- const { service } = req.params;
342
- const graphData = await serviceService.getGraphData(service);
343
-
344
- res.json({
345
- message: 'Success',
346
- data: graphData
347
- });
348
- } catch (error) {
349
- logger.error(`Error generating graph data: ${error}`);
350
- res.status(500).json({ message: 'Error generating graph data', error });
351
- }
352
- };
353
-
354
- // --- Relationship CRUD controllers ---
355
-
356
- export const getPackageRelationships = async (req: Request, res: Response) => {
357
- try {
358
- const { packageName } = req.params;
359
- const relationships = await serviceService.getPackageRelationships(packageName);
360
- res.json({ message: 'Success', data: relationships });
361
- } catch (error) {
362
- logger.error(`Error fetching relationships: ${error}`);
363
- res.status(500).json({ message: 'Error fetching relationships', error });
364
- }
365
- };
366
-
367
- export const createRelationship = async (req: Request, res: Response) => {
368
- try {
369
- const { packageName } = req.params;
370
- const relationship = req.body as Relationship;
371
-
372
- const result = await serviceService.createRelationship(packageName, relationship);
373
-
374
- if (!result.success) {
375
- return res.status(400).json({ message: 'Failed to create relationship', errors: result.errors });
376
- }
377
-
378
- res.status(201).json({ message: 'Relationship created successfully', data: result.relationship });
379
- } catch (error) {
380
- logger.error(`Error creating relationship: ${error}`);
381
- res.status(500).json({ message: 'Error creating relationship', error });
382
- }
383
- };
384
-
385
- export const updateRelationship = async (req: Request, res: Response) => {
386
- try {
387
- const { packageName, uuid } = req.params;
388
- const relationship = req.body as Relationship;
389
-
390
- const result = await serviceService.updateRelationship(packageName, uuid, relationship);
391
-
392
- if (!result.success) {
393
- return res.status(400).json({ message: 'Failed to update relationship', errors: result.errors });
394
- }
395
-
396
- res.json({ message: 'Relationship updated successfully' });
397
- } catch (error) {
398
- logger.error(`Error updating relationship: ${error}`);
399
- res.status(500).json({ message: 'Error updating relationship', error });
400
- }
401
- };
402
-
403
- export const deleteRelationship = async (req: Request, res: Response) => {
404
- try {
405
- const { packageName, uuid } = req.params;
406
-
407
- const result = await serviceService.deleteRelationship(packageName, uuid);
408
-
409
- if (!result.success) {
410
- return res.status(400).json({ message: 'Failed to delete relationship', errors: result.errors });
411
- }
412
-
413
- res.json({ message: 'Relationship deleted successfully' });
414
- } catch (error) {
415
- logger.error(`Error deleting relationship: ${error}`);
416
- res.status(500).json({ message: 'Error deleting relationship', error });
417
- }
418
- };
@@ -1,59 +0,0 @@
1
- import { Request, Response } from 'express';
2
- import { stereotypeService } from '../services/stereotypeService.js';
3
- import { StereotypeTarget } from '../models/EntitySchema.js';
4
- import { logger } from '../utils/logger.js';
5
-
6
- export const getAllStereotypes = async (req: Request, res: Response) => {
7
- try {
8
- const appliesTo = req.query.appliesTo as StereotypeTarget | undefined;
9
- const stereotypes = await stereotypeService.getAllStereotypes(appliesTo);
10
- res.json({ message: 'Success', data: stereotypes });
11
- } catch (error) {
12
- logger.error('Error fetching stereotypes', error);
13
- res.status(500).json({ message: 'Error fetching stereotypes', error });
14
- }
15
- };
16
-
17
- export const getStereotype = async (req: Request, res: Response) => {
18
- try {
19
- const stereotype = await stereotypeService.getStereotype(req.params.id);
20
- if (!stereotype) return res.status(404).json({ message: 'Stereotype not found' });
21
- res.json({ message: 'Success', data: stereotype });
22
- } catch (error) {
23
- logger.error('Error fetching stereotype', error);
24
- res.status(500).json({ message: 'Error fetching stereotype', error });
25
- }
26
- };
27
-
28
- export const createStereotype = async (req: Request, res: Response) => {
29
- try {
30
- const result = await stereotypeService.createStereotype(req.body);
31
- if (!result.success) return res.status(400).json({ message: 'Failed to create stereotype', errors: result.errors });
32
- res.status(201).json({ message: 'Stereotype created successfully', data: result.stereotype });
33
- } catch (error) {
34
- logger.error('Error creating stereotype', error);
35
- res.status(500).json({ message: 'Error creating stereotype', error });
36
- }
37
- };
38
-
39
- export const updateStereotype = async (req: Request, res: Response) => {
40
- try {
41
- const result = await stereotypeService.updateStereotype(req.params.id, req.body);
42
- if (!result.success) return res.status(400).json({ message: 'Failed to update stereotype', errors: result.errors });
43
- res.json({ message: 'Stereotype updated successfully', data: result.stereotype });
44
- } catch (error) {
45
- logger.error('Error updating stereotype', error);
46
- res.status(500).json({ message: 'Error updating stereotype', error });
47
- }
48
- };
49
-
50
- export const deleteStereotype = async (req: Request, res: Response) => {
51
- try {
52
- const result = await stereotypeService.deleteStereotype(req.params.id);
53
- if (!result.success) return res.status(400).json({ message: 'Failed to delete stereotype', errors: result.errors });
54
- res.json({ message: 'Stereotype deleted successfully' });
55
- } catch (error) {
56
- logger.error('Error deleting stereotype', error);
57
- res.status(500).json({ message: 'Error deleting stereotype', error });
58
- }
59
- };