streamby-core 0.18.0 → 0.20.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 (94) hide show
  1. package/README.md +206 -114
  2. package/dist/adapters/database/connectionManager.d.ts +6 -0
  3. package/dist/adapters/database/connectionManager.js +47 -0
  4. package/dist/adapters/database/nosql.d.ts +8 -0
  5. package/dist/adapters/database/nosql.js +46 -0
  6. package/dist/adapters/database/nosqlAdapter.d.ts +8 -0
  7. package/dist/adapters/database/nosqlAdapter.js +30 -0
  8. package/dist/adapters/database/sql.d.ts +8 -0
  9. package/dist/adapters/database/sql.js +42 -0
  10. package/dist/adapters/database/sqlAdapter.d.ts +8 -0
  11. package/dist/adapters/database/sqlAdapter.js +42 -0
  12. package/dist/adapters/s3.d.ts +11 -2
  13. package/dist/adapters/s3.js +59 -76
  14. package/dist/adapters/storage/gcs.d.ts +0 -0
  15. package/dist/adapters/storage/gcs.js +1 -0
  16. package/dist/adapters/storage/local.d.ts +0 -0
  17. package/dist/adapters/storage/local.js +1 -0
  18. package/dist/adapters/storage/s3.d.ts +11 -0
  19. package/dist/adapters/storage/s3.js +65 -0
  20. package/dist/database/Model.d.ts +11 -0
  21. package/dist/database/Model.js +95 -0
  22. package/dist/database/connectionManager.d.ts +5 -0
  23. package/dist/database/connectionManager.js +32 -0
  24. package/dist/database/index.d.ts +3 -0
  25. package/dist/database/index.js +19 -0
  26. package/dist/database/model.d.ts +20 -0
  27. package/dist/database/model.js +2 -0
  28. package/dist/database/modelManager.d.ts +8 -0
  29. package/dist/database/modelManager.js +38 -0
  30. package/dist/database/modelRegistry.d.ts +3 -0
  31. package/dist/database/modelRegistry.js +17 -0
  32. package/dist/database/mongoAdapter.d.ts +11 -0
  33. package/dist/database/mongoAdapter.js +42 -0
  34. package/dist/database/sqlAdapter.d.ts +12 -0
  35. package/dist/database/sqlAdapter.js +68 -0
  36. package/dist/middleware/createRouter.js +81 -158
  37. package/dist/models/Model.d.ts +12 -0
  38. package/dist/models/Model.js +146 -0
  39. package/dist/models/manager.d.ts +2 -0
  40. package/dist/models/manager.js +7 -0
  41. package/dist/models/modelManager.d.ts +2 -0
  42. package/dist/models/modelManager.js +7 -0
  43. package/dist/models/modelRegistry.d.ts +3 -0
  44. package/dist/models/modelRegistry.js +17 -0
  45. package/dist/models/register.d.ts +1 -0
  46. package/dist/models/register.js +8 -0
  47. package/dist/models/registerModel.d.ts +1 -0
  48. package/dist/models/registerModel.js +8 -0
  49. package/dist/models/registry.d.ts +3 -0
  50. package/dist/models/registry.js +17 -0
  51. package/dist/providers/createStorageProvider.d.ts +1 -1
  52. package/dist/providers/createStorageProvider.js +9 -13
  53. package/dist/providers/storage.d.ts +2 -0
  54. package/dist/providers/storage.js +12 -0
  55. package/dist/services/auth.d.ts +0 -1
  56. package/dist/services/auth.js +0 -11
  57. package/dist/types/index.d.ts +4 -95
  58. package/package.json +5 -1
  59. package/dist/config.d.ts +0 -18
  60. package/dist/config.js +0 -26
  61. package/dist/db/initExportModel.d.ts +0 -60
  62. package/dist/db/initExportModel.js +0 -18
  63. package/dist/db/initProjectModel.d.ts +0 -2502
  64. package/dist/db/initProjectModel.js +0 -33
  65. package/dist/db/initUserModel.d.ts +0 -48
  66. package/dist/db/initUserModel.js +0 -19
  67. package/dist/models/ExportCollection.d.ts +0 -54
  68. package/dist/models/ExportCollection.js +0 -19
  69. package/dist/mongoose_models/initExportModel.d.ts +0 -61
  70. package/dist/mongoose_models/initExportModel.js +0 -19
  71. package/dist/mongoose_models/initProjectModel.d.ts +0 -2503
  72. package/dist/mongoose_models/initProjectModel.js +0 -34
  73. package/dist/providers/createDatabaseProvider.d.ts +0 -2
  74. package/dist/providers/createDatabaseProvider.js +0 -36
  75. package/dist/providers/createMongooseProvider.d.ts +0 -8
  76. package/dist/providers/createMongooseProvider.js +0 -33
  77. package/dist/providers/createPrismaProvider.d.ts +0 -14
  78. package/dist/providers/createPrismaProvider.js +0 -29
  79. package/dist/providers/mongoExportProvider.d.ts +0 -3
  80. package/dist/providers/mongoExportProvider.js +0 -13
  81. package/dist/providers/mongoProjectProvider.d.ts +0 -3
  82. package/dist/providers/mongoProjectProvider.js +0 -107
  83. package/dist/providers/mongooseExportProvider.d.ts +0 -3
  84. package/dist/providers/mongooseExportProvider.js +0 -13
  85. package/dist/providers/mongooseProjectProvider.d.ts +0 -3
  86. package/dist/providers/mongooseProjectProvider.js +0 -120
  87. package/dist/providers/prismaExportCollectionProvider.d.ts +0 -61
  88. package/dist/providers/prismaExportCollectionProvider.js +0 -45
  89. package/dist/providers/prismaExportProvider.d.ts +0 -3
  90. package/dist/providers/prismaExportProvider.js +0 -13
  91. package/dist/providers/prismaProjectProvider.d.ts +0 -3
  92. package/dist/providers/prismaProjectProvider.js +0 -157
  93. package/dist/utils/pushPrismaSchema.d.ts +0 -5
  94. package/dist/utils/pushPrismaSchema.js +0 -35
@@ -7,35 +7,25 @@ exports.createStreamByRouter = createStreamByRouter;
7
7
  const express_1 = __importDefault(require("express"));
8
8
  const file_1 = require("../services/file");
9
9
  const presign_1 = require("../services/presign");
10
- const createStorageProvider_1 = require("../providers/createStorageProvider");
11
- const createDatabaseProvider_1 = require("../providers/createDatabaseProvider");
10
+ const manager_1 = require("../models/manager");
11
+ const storage_1 = require("../providers/storage");
12
+ const connectionManager_1 = require("../adapters/database/connectionManager");
12
13
  function isProjectMember(project, userId) {
13
14
  return project.members?.some((m) => m.userId?.toString() === userId?.toString());
14
15
  }
15
16
  function createStreamByRouter(config) {
16
17
  const router = express_1.default.Router();
17
- const adapter = config.adapter || (0, createStorageProvider_1.createStorageProvider)(config.storageProviders);
18
- const projectProviders = {};
19
- let exportProvider;
20
- let exportCollectionProvider;
18
+ const adapter = config.adapter || (0, storage_1.createStorageProvider)(config.storageProviders);
21
19
  if (config.databases) {
22
- const db = (0, createDatabaseProvider_1.createDatabaseProvider)(config.databases, adapter);
23
- projectProviders.nosql = db.projectProviders.nosql;
24
- projectProviders.sql = db.projectProviders.sql;
25
- exportProvider = db.exportProvider;
26
- exportCollectionProvider = db.exportCollectionProvider;
27
- }
28
- else {
29
- projectProviders.default = config.projectProvider;
30
- exportProvider = config.exportProvider;
31
- exportCollectionProvider = config.exportCollectionProvider;
32
- }
33
- if (!projectProviders.nosql && !projectProviders.sql) {
34
- throw new Error('Project provider is not initialized. Please check your database configuration.');
35
- }
36
- if (!exportProvider) {
37
- throw new Error('Export provider is not initialized. Please check your database configuration.');
20
+ for (const db of config.databases) {
21
+ if (db.type === 'sql') {
22
+ (0, manager_1.registerModel)('Project', [db.id], 'projects');
23
+ (0, manager_1.registerModel)('Export', [db.id], 'exports');
24
+ }
25
+ }
38
26
  }
27
+ const Project = (0, manager_1.getModel)('Project');
28
+ const Export = (0, manager_1.getModel)('Export');
39
29
  router.get('/auth', async (req, res) => {
40
30
  try {
41
31
  const auth = await config.authProvider(req);
@@ -51,13 +41,10 @@ function createStreamByRouter(config) {
51
41
  if (!auth) {
52
42
  return res.status(401).json({ error: 'Unauthorized' });
53
43
  }
54
- const databases = [];
55
- if (projectProviders.nosql) {
56
- databases.push({ name: "NoSQL (Mongo)", value: "nosql" });
57
- }
58
- if (projectProviders.sql) {
59
- databases.push({ name: "SQL (Prisma)", value: "sql" });
60
- }
44
+ const connectedDbIds = (0, connectionManager_1.getConnectedIds)();
45
+ const databases = (config.databases || [])
46
+ .filter(db => connectedDbIds.includes(db.id))
47
+ .map(db => ({ name: db.id, value: db.type }));
61
48
  res.status(200).json({ databases });
62
49
  }
63
50
  catch (err) {
@@ -92,11 +79,7 @@ function createStreamByRouter(config) {
92
79
  return res.status(400).json({ error: 'Missing projectId' });
93
80
  }
94
81
  await (0, file_1.deleteProjectImage)(adapter, projectId);
95
- const provider = await getProjectProvider(projectId);
96
- if (!provider) {
97
- return res.status(404).json({ error: 'Project not found' });
98
- }
99
- const updated = await provider.update(projectId, { image: '' });
82
+ const updated = await Project.update({ _id: projectId }, { image: '' });
100
83
  res.status(201).json(updated);
101
84
  }
102
85
  catch (err) {
@@ -107,7 +90,7 @@ function createStreamByRouter(config) {
107
90
  try {
108
91
  const auth = await config.authProvider(req);
109
92
  const projectId = (req.query.projectId || req.headers['x-project-id']);
110
- if (!projectId || !auth.projects.includes(projectId)) {
93
+ if (!projectId) {
111
94
  return res.status(403).json({ error: 'Unauthorized or missing projectId' });
112
95
  }
113
96
  const files = await (0, file_1.listFilesService)(adapter, req, projectId);
@@ -117,52 +100,20 @@ function createStreamByRouter(config) {
117
100
  res.status(500).json({ error: 'Failed to list files', details: err });
118
101
  }
119
102
  });
120
- async function getProjectProvider(projectId, dbType) {
121
- if (dbType) {
122
- const specificProvider = projectProviders[dbType];
123
- if (specificProvider) {
124
- try {
125
- const project = await specificProvider.getById(projectId, true);
126
- if (project)
127
- return specificProvider;
128
- }
129
- catch (error) { /* ignore */ }
130
- }
131
- return null; // If dbType was provided and no project found in that specific provider, return null.
132
- }
133
- // If dbType is not provided, search both nosql and sql
134
- if (projectProviders.nosql) {
135
- try {
136
- const project = await projectProviders.nosql.getById(projectId, true);
137
- if (project)
138
- return projectProviders.nosql;
139
- }
140
- catch (error) { /* ignore */ }
141
- }
142
- if (projectProviders.sql) {
143
- try {
144
- const project = await projectProviders.sql.getById(projectId, true);
145
- if (project)
146
- return projectProviders.sql;
147
- }
148
- catch (error) { /* ignore */ }
149
- }
150
- return null; // If not found in either nosql or sql, return null.
151
- }
152
103
  router.get('/projects', async (req, res) => {
153
104
  try {
154
105
  const auth = await config.authProvider(req);
155
106
  const archived = req.query.archived ? String(req.query.archived).toLowerCase() === 'true' : undefined;
156
- const projects = [];
157
- if (projectProviders.nosql) {
158
- projects.push(...await projectProviders.nosql.list(auth.userId, archived));
159
- }
160
- if (projectProviders.sql) {
161
- projects.push(...await projectProviders.sql.list(auth.userId, archived));
162
- }
163
- if (projectProviders.default) {
164
- projects.push(...await projectProviders.default.list(auth.userId, archived));
165
- }
107
+ const projects = (await Project.find({ members: { $elemMatch: { userId: auth.userId } }, archived })).map(project => {
108
+ const currentUserMember = project.members?.find((member) => member.userId === auth.userId);
109
+ return {
110
+ id: project._id || project.id,
111
+ dbType: project.dbType,
112
+ name: project.name,
113
+ image: project.image || '',
114
+ archived: currentUserMember ? currentUserMember.archived || false : false,
115
+ };
116
+ });
166
117
  res.json({ projects });
167
118
  }
168
119
  catch (err) {
@@ -176,17 +127,13 @@ function createStreamByRouter(config) {
176
127
  return res.status(403).json({ error: 'Permission denied' });
177
128
  }
178
129
  const { name, description, dbType } = req.body;
179
- const provider = dbType ? projectProviders[dbType] : projectProviders.default || projectProviders.nosql || projectProviders.sql;
180
- if (!provider) {
181
- return res.status(400).json({ error: 'Invalid dbType' });
182
- }
183
- const newProject = await provider.create({
130
+ const newProject = await Project.create({
184
131
  dbType: dbType || 'nosql',
185
132
  name,
186
133
  description: description || '',
187
- members: [{ userId: auth.userId, role: "admin" }]
134
+ members: [{ userId: auth.userId, role: "admin", archived: false }]
188
135
  });
189
- res.status(201).json({ project: newProject });
136
+ res.status(201).json({ project: { ...newProject, id: newProject._id || newProject.id, _id: undefined } });
190
137
  }
191
138
  catch (err) {
192
139
  res.status(500).json({ error: 'Failed to create project', details: err.message });
@@ -196,19 +143,14 @@ function createStreamByRouter(config) {
196
143
  try {
197
144
  const auth = await config.authProvider(req);
198
145
  const projectId = req.params.id;
199
- const dbType = req.query.dbType;
200
- const projectProvider = await getProjectProvider(projectId, dbType);
201
- if (!projectProvider) {
202
- return res.status(404).json({ error: 'Project not found' });
203
- }
204
- const project = await projectProvider.getById(projectId, true);
146
+ const project = await Project.findOne({ _id: projectId });
205
147
  if (!project) {
206
148
  return res.status(404).json({ error: 'Project not found' });
207
149
  }
208
150
  if (!isProjectMember(project, auth.userId)) {
209
151
  return res.status(403).json({ error: 'Unauthorized project access' });
210
152
  }
211
- res.json({ project });
153
+ res.json({ project: { ...project, id: project._id || project.id, _id: undefined } });
212
154
  }
213
155
  catch (err) {
214
156
  res.status(500).json({ error: 'Failed to fetch project', details: err.message });
@@ -222,11 +164,7 @@ function createStreamByRouter(config) {
222
164
  }
223
165
  const projectId = req.params.id;
224
166
  const updates = req.body;
225
- const projectProvider = await getProjectProvider(projectId);
226
- if (!projectProvider) {
227
- return res.status(404).json({ error: 'Project not found' });
228
- }
229
- const project = await projectProvider.getById(projectId, true);
167
+ const project = await Project.findOne({ _id: projectId });
230
168
  if (!project) {
231
169
  return res.status(404).json({ error: 'Project not found' });
232
170
  }
@@ -236,8 +174,11 @@ function createStreamByRouter(config) {
236
174
  if (!isProjectMember(project, auth.userId)) {
237
175
  return res.status(403).json({ error: 'Unauthorized project access' });
238
176
  }
239
- const updated = await projectProvider.update(projectId, updates);
240
- res.status(200).json({ success: true, project: updated });
177
+ const updated = await Project.update({ _id: projectId }, updates);
178
+ if (!updated) {
179
+ return res.status(404).json({ error: 'Project not found or not updated' });
180
+ }
181
+ res.status(200).json({ success: true, project: { ...updated, id: updated._id || updated.id, _id: undefined } });
241
182
  }
242
183
  catch (err) {
243
184
  res.status(500).json({ error: 'Failed to update project', details: err.message });
@@ -247,18 +188,14 @@ function createStreamByRouter(config) {
247
188
  try {
248
189
  const auth = await config.authProvider(req);
249
190
  const projectId = req.params.id;
250
- const projectProvider = await getProjectProvider(projectId);
251
- if (!projectProvider) {
252
- return res.status(404).json({ error: 'Project not found' });
253
- }
254
- const project = await projectProvider.getById(projectId, true);
191
+ const project = await Project.findOne({ _id: projectId });
255
192
  if (!project) {
256
193
  return res.status(404).json({ error: 'Project not found' });
257
194
  }
258
195
  if (!isProjectMember(project, auth.userId)) {
259
196
  return res.status(403).json({ error: 'Unauthorized project access' });
260
197
  }
261
- await projectProvider.delete(projectId);
198
+ await Project.delete({ _id: projectId });
262
199
  res.status(200).json({ success: true });
263
200
  }
264
201
  catch (err) {
@@ -269,26 +206,25 @@ function createStreamByRouter(config) {
269
206
  try {
270
207
  const auth = await config.authProvider(req);
271
208
  const projectId = req.params.id;
272
- const projectProvider = await getProjectProvider(projectId);
273
- if (!projectProvider) {
274
- return res.status(404).json({ error: 'Project not found' });
275
- }
276
- const project = await projectProvider.getById(projectId, true);
209
+ const project = await Project.findOne({ _id: projectId });
277
210
  if (!project || !isProjectMember(project, auth.userId)) {
278
211
  return res.status(403).json({ error: 'Unauthorized project access' });
279
212
  }
280
- await projectProvider.archive(projectId, auth.userId);
281
- const projects = [];
282
- if (projectProviders.nosql) {
283
- projects.push(...await projectProviders.nosql.list(auth.userId));
284
- }
285
- if (projectProviders.sql) {
286
- projects.push(...await projectProviders.sql.list(auth.userId));
287
- }
288
- if (projectProviders.default) {
289
- projects.push(...await projectProviders.default.list(auth.userId));
290
- }
291
- res.status(200).json({ success: true, projects });
213
+ await Project.update({ _id: projectId, "members.userId": auth.userId }, { "members.$.archived": true, "members.$.archivedBy": auth.userId, "members.$.archivedAt": new Date() });
214
+ const updatedProject = await Project.findOne({ _id: projectId }); // Fetch the updated project
215
+ const projects = (await Project.find({ members: { $elemMatch: { userId: auth.userId } } })).map(project => {
216
+ const currentUserMember = project.members?.find((member) => member.userId === auth.userId);
217
+ return {
218
+ id: project._id || project.id,
219
+ dbType: project.dbType,
220
+ name: project.name,
221
+ image: project.image || '',
222
+ archived: currentUserMember ? currentUserMember.archived || false : false,
223
+ };
224
+ });
225
+ // Replace the old project with the updated one in the list
226
+ const finalProjects = projects.map(p => p.id === (updatedProject?._id || updatedProject?.id) ? ({ ...updatedProject, id: updatedProject._id || updatedProject.id, _id: undefined }) : p);
227
+ res.status(200).json({ success: true, projects: finalProjects });
292
228
  }
293
229
  catch (err) {
294
230
  res.status(500).json({ error: 'Failed to archive project', details: err.message });
@@ -298,26 +234,25 @@ function createStreamByRouter(config) {
298
234
  try {
299
235
  const auth = await config.authProvider(req);
300
236
  const projectId = req.params.id;
301
- const projectProvider = await getProjectProvider(projectId);
302
- if (!projectProvider) {
303
- return res.status(404).json({ error: 'Project not found' });
304
- }
305
- const project = await projectProvider.getById(projectId, true);
237
+ const project = await Project.findOne({ _id: projectId });
306
238
  if (!project || !isProjectMember(project, auth.userId)) {
307
239
  return res.status(403).json({ error: 'Unauthorized project access' });
308
240
  }
309
- await projectProvider.unarchive(projectId, auth.userId);
310
- const projects = [];
311
- if (projectProviders.nosql) {
312
- projects.push(...await projectProviders.nosql.list(auth.userId));
313
- }
314
- if (projectProviders.sql) {
315
- projects.push(...await projectProviders.sql.list(auth.userId));
316
- }
317
- if (projectProviders.default) {
318
- projects.push(...await projectProviders.default.list(auth.userId));
319
- }
320
- res.status(200).json({ success: true, projects });
241
+ await Project.update({ _id: projectId, "members.userId": auth.userId }, { "members.$.archived": false, "members.$.archivedBy": null, "members.$.archivedAt": null });
242
+ const updatedProject = await Project.findOne({ _id: projectId }); // Fetch the updated project
243
+ const projects = (await Project.find({ members: { $elemMatch: { userId: auth.userId } } })).map(project => {
244
+ const currentUserMember = project.members?.find((member) => member.userId === auth.userId);
245
+ return {
246
+ id: project._id || project.id,
247
+ dbType: project.dbType,
248
+ name: project.name,
249
+ image: project.image || '',
250
+ archived: currentUserMember ? currentUserMember.archived || false : false,
251
+ };
252
+ });
253
+ // Replace the old project with the updated one in the list
254
+ const finalProjects = projects.map(p => p.id === (updatedProject?._id || updatedProject?.id) ? ({ ...updatedProject, id: updatedProject._id || updatedProject.id, _id: undefined }) : p);
255
+ res.status(200).json({ success: true, projects: finalProjects });
321
256
  }
322
257
  catch (err) {
323
258
  res.status(500).json({ error: 'Failed to unarchive project', details: err.message });
@@ -328,19 +263,15 @@ function createStreamByRouter(config) {
328
263
  const auth = await config.authProvider(req);
329
264
  const projectId = req.params.id;
330
265
  const exportId = req.params.export_id;
331
- const projectProvider = await getProjectProvider(projectId);
332
- if (!projectProvider) {
333
- return res.status(404).json({ error: 'Project not found' });
334
- }
335
- const project = await projectProvider.getById(projectId, true);
266
+ const project = await Project.findOne({ _id: projectId });
336
267
  if (!project) {
337
268
  return res.status(404).json({ error: 'Project not found' });
338
269
  }
339
270
  if (!isProjectMember(project, auth.userId)) {
340
271
  return res.status(403).json({ error: 'Unauthorized access' });
341
272
  }
342
- const data = await exportProvider.getById(exportId);
343
- res.json({ data });
273
+ const data = await Export.findOne({ _id: exportId });
274
+ res.json({ data: { ...data, id: data._id || data.id, _id: undefined } });
344
275
  }
345
276
  catch (err) {
346
277
  res.status(500).json({ error: 'Failed to fetch export data', details: err.message });
@@ -354,22 +285,18 @@ function createStreamByRouter(config) {
354
285
  if (!name || !collectionName) {
355
286
  return res.status(400).json({ error: 'Missing export name or collectionName' });
356
287
  }
357
- const projectProvider = await getProjectProvider(projectId);
358
- if (!projectProvider) {
359
- return res.status(404).json({ error: 'Project not found' });
360
- }
361
- const project = await projectProvider.getById(projectId, true);
288
+ const project = await Project.findOne({ _id: projectId });
362
289
  if (!project || !isProjectMember(project, auth.userId)) {
363
290
  return res.status(403).json({ error: 'Unauthorized project access' });
364
291
  }
365
- const newExport = await exportProvider.create({
292
+ const newExport = await Export.create({
366
293
  name,
367
294
  description,
368
295
  collectionName,
369
296
  projectId
370
297
  });
371
- await projectProvider.addExportToProject(projectId, newExport.id);
372
- res.status(201).json({ data: newExport });
298
+ await Project.update({ _id: projectId }, { $push: { exports: newExport._id } });
299
+ res.status(201).json({ data: { ...newExport, id: newExport._id || newExport.id, _id: undefined } });
373
300
  }
374
301
  catch (err) {
375
302
  res.status(500).json({ error: 'Failed to create export', details: err.message });
@@ -379,11 +306,7 @@ function createStreamByRouter(config) {
379
306
  try {
380
307
  const auth = await config.authProvider(req);
381
308
  const projectId = req.params.id;
382
- const projectProvider = await getProjectProvider(projectId);
383
- if (!projectProvider) {
384
- return res.status(404).json({ error: 'Project not found' });
385
- }
386
- const project = await projectProvider.getById(projectId, true);
309
+ const project = await Project.findOne({ _id: projectId });
387
310
  if (!project) {
388
311
  return res.status(404).json({ error: 'Project not found' });
389
312
  }
@@ -0,0 +1,12 @@
1
+ import { Document } from 'mongodb';
2
+ export declare class Model<T extends Document> {
3
+ private connectionIds;
4
+ private tableName;
5
+ constructor(connectionIds: string[], tableName: string);
6
+ find(filter: any): Promise<T[]>;
7
+ private transformResult;
8
+ findOne(filter: any): Promise<T | null>;
9
+ create(data: T): Promise<T>;
10
+ update(filter: any, data: Partial<T>): Promise<T | null>;
11
+ delete(filter: any): Promise<number>;
12
+ }
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Model = void 0;
4
+ const connectionManager_1 = require("../adapters/database/connectionManager");
5
+ const pg_1 = require("pg");
6
+ const mongodb_1 = require("mongodb");
7
+ const sql_1 = require("../adapters/database/sql");
8
+ const nosql_1 = require("../adapters/database/nosql");
9
+ class Model {
10
+ constructor(connectionIds, tableName) {
11
+ this.connectionIds = connectionIds;
12
+ this.tableName = tableName;
13
+ }
14
+ async find(filter) {
15
+ const allResults = [];
16
+ const activeConnectionIds = this.connectionIds.filter(id => (0, connectionManager_1.getConnectedIds)().includes(id));
17
+ for (const connectionId of activeConnectionIds) {
18
+ const connection = (0, connectionManager_1.getConnection)(connectionId);
19
+ if (connection instanceof pg_1.Pool) {
20
+ const sqlResults = await sql_1.sqlAdapter.find(connection, this.tableName, filter);
21
+ for (const item of sqlResults) {
22
+ allResults.push(this.transformResult(item));
23
+ }
24
+ }
25
+ else if (connection instanceof mongodb_1.MongoClient) {
26
+ const nosqlResults = await nosql_1.nosqlAdapter.find(connection, this.tableName, filter);
27
+ for (const item of nosqlResults) {
28
+ allResults.push(this.transformResult(item));
29
+ }
30
+ }
31
+ }
32
+ return allResults;
33
+ }
34
+ transformResult(item) {
35
+ const transformedItem = { ...item };
36
+ if (transformedItem._id && !transformedItem.id) {
37
+ transformedItem.id = transformedItem._id.toString();
38
+ }
39
+ return transformedItem;
40
+ }
41
+ async findOne(filter) {
42
+ const activeConnectionIds = this.connectionIds.filter(id => (0, connectionManager_1.getConnectedIds)().includes(id));
43
+ for (const connectionId of activeConnectionIds) {
44
+ const connection = (0, connectionManager_1.getConnection)(connectionId);
45
+ let processedFilter = { ...filter };
46
+ if (connection instanceof pg_1.Pool) {
47
+ if (processedFilter._id) {
48
+ processedFilter.id = processedFilter._id;
49
+ delete processedFilter._id;
50
+ }
51
+ const result = await sql_1.sqlAdapter.findOne(connection, this.tableName, processedFilter);
52
+ if (result)
53
+ return result;
54
+ }
55
+ else if (connection instanceof mongodb_1.MongoClient) {
56
+ const result = await nosql_1.nosqlAdapter.findOne(connection, this.tableName, processedFilter);
57
+ if (result)
58
+ return result;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ async create(data) {
64
+ const activeConnectionIds = this.connectionIds.filter(id => (0, connectionManager_1.getConnectedIds)().includes(id));
65
+ const connection = (0, connectionManager_1.getConnection)(activeConnectionIds[0]); // Use the first active connection for creation
66
+ if (connection instanceof pg_1.Pool) {
67
+ const created = await sql_1.sqlAdapter.create(connection, this.tableName, data);
68
+ return created;
69
+ }
70
+ else if (connection instanceof mongodb_1.MongoClient) {
71
+ const created = await nosql_1.nosqlAdapter.create(connection, this.tableName, data);
72
+ return created;
73
+ }
74
+ return data;
75
+ }
76
+ async update(filter, data) {
77
+ const activeConnectionIds = this.connectionIds.filter(id => (0, connectionManager_1.getConnectedIds)().includes(id));
78
+ for (const connectionId of activeConnectionIds) {
79
+ const connection = (0, connectionManager_1.getConnection)(connectionId);
80
+ let processedFilter = { ...filter };
81
+ // Handle specific member archiving/unarchiving
82
+ if (data["members.$.archived"] !== undefined && processedFilter["_id"] && processedFilter["members.userId"]) {
83
+ const projectId = processedFilter["_id"];
84
+ const userIdToUpdate = processedFilter["members.userId"];
85
+ const newArchivedStatus = data["members.$.archived"];
86
+ const archivedBy = data["members.$.archivedBy"];
87
+ const archivedAt = data["members.$.archivedAt"];
88
+ // Fetch the project to modify its members array
89
+ const projectToUpdate = await this.findOne({ _id: projectId });
90
+ if (!projectToUpdate || !projectToUpdate.members) {
91
+ continue; // Project not found or has no members, try next connection
92
+ }
93
+ const updatedMembers = projectToUpdate.members.map((member) => {
94
+ if (member.userId === userIdToUpdate) {
95
+ return { ...member, archived: newArchivedStatus, archivedBy: archivedBy, archivedAt: archivedAt };
96
+ }
97
+ return member;
98
+ });
99
+ // Update the project with the modified members array
100
+ const result = await (connection instanceof pg_1.Pool ? sql_1.sqlAdapter.update(connection, this.tableName, { id: projectId }, { members: updatedMembers }) : nosql_1.nosqlAdapter.update(connection, this.tableName, { _id: new mongodb_1.ObjectId(projectId) }, { members: updatedMembers }));
101
+ if (result)
102
+ return result;
103
+ }
104
+ else {
105
+ // General update logic
106
+ if (connection instanceof pg_1.Pool) {
107
+ if (processedFilter._id) {
108
+ processedFilter.id = processedFilter._id;
109
+ delete processedFilter._id;
110
+ }
111
+ const result = await sql_1.sqlAdapter.update(connection, this.tableName, processedFilter, data);
112
+ if (result)
113
+ return result;
114
+ }
115
+ else if (connection instanceof mongodb_1.MongoClient) {
116
+ const result = await nosql_1.nosqlAdapter.update(connection, this.tableName, processedFilter, data);
117
+ if (result)
118
+ return result;
119
+ }
120
+ }
121
+ }
122
+ return null;
123
+ }
124
+ async delete(filter) {
125
+ let deletedCount = 0;
126
+ const activeConnectionIds = this.connectionIds.filter(id => (0, connectionManager_1.getConnectedIds)().includes(id));
127
+ for (const connectionId of activeConnectionIds) {
128
+ const connection = (0, connectionManager_1.getConnection)(connectionId);
129
+ let processedFilter = { ...filter };
130
+ if (connection instanceof pg_1.Pool) {
131
+ if (processedFilter._id) {
132
+ processedFilter.id = processedFilter._id;
133
+ delete processedFilter._id;
134
+ }
135
+ const count = await sql_1.sqlAdapter.delete(connection, this.tableName, processedFilter);
136
+ deletedCount += count;
137
+ }
138
+ else if (connection instanceof mongodb_1.MongoClient) {
139
+ const count = await nosql_1.nosqlAdapter.delete(connection, this.tableName, processedFilter);
140
+ deletedCount += count;
141
+ }
142
+ }
143
+ return deletedCount;
144
+ }
145
+ }
146
+ exports.Model = Model;
@@ -0,0 +1,2 @@
1
+ export { registerModel } from './register';
2
+ export { getModel } from './registry';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getModel = exports.registerModel = void 0;
4
+ var register_1 = require("./register");
5
+ Object.defineProperty(exports, "registerModel", { enumerable: true, get: function () { return register_1.registerModel; } });
6
+ var registry_1 = require("./registry");
7
+ Object.defineProperty(exports, "getModel", { enumerable: true, get: function () { return registry_1.getModel; } });
@@ -0,0 +1,2 @@
1
+ export { registerModel } from './registerModel';
2
+ export { getModel } from './modelRegistry';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getModel = exports.registerModel = void 0;
4
+ var registerModel_1 = require("./registerModel");
5
+ Object.defineProperty(exports, "registerModel", { enumerable: true, get: function () { return registerModel_1.registerModel; } });
6
+ var modelRegistry_1 = require("./modelRegistry");
7
+ Object.defineProperty(exports, "getModel", { enumerable: true, get: function () { return modelRegistry_1.getModel; } });
@@ -0,0 +1,3 @@
1
+ import { Model } from './Model';
2
+ export declare const defineModel: (name: string, connectionId: string, tableName: string) => void;
3
+ export declare const getModel: (name: string) => Model<any>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getModel = exports.defineModel = void 0;
4
+ const Model_1 = require("./Model");
5
+ const models = {};
6
+ const defineModel = (name, connectionId, tableName) => {
7
+ models[name] = new Model_1.Model(connectionId, tableName);
8
+ };
9
+ exports.defineModel = defineModel;
10
+ const getModel = (name) => {
11
+ const model = models[name];
12
+ if (!model) {
13
+ throw new Error(`Model ${name} not defined.`);
14
+ }
15
+ return model;
16
+ };
17
+ exports.getModel = getModel;
@@ -0,0 +1 @@
1
+ export declare const registerModel: (name: string, connectionIds: string[], tableName: string) => void;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerModel = void 0;
4
+ const registry_1 = require("./registry");
5
+ const registerModel = (name, connectionIds, tableName) => {
6
+ (0, registry_1.defineModel)(name, connectionIds, tableName);
7
+ };
8
+ exports.registerModel = registerModel;
@@ -0,0 +1 @@
1
+ export declare const registerModel: (name: string, connectionId: string, tableName: string) => void;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerModel = void 0;
4
+ const modelRegistry_1 = require("./modelRegistry");
5
+ const registerModel = (name, connectionId, tableName) => {
6
+ (0, modelRegistry_1.defineModel)(name, connectionId, tableName);
7
+ };
8
+ exports.registerModel = registerModel;
@@ -0,0 +1,3 @@
1
+ import { Model } from './Model';
2
+ export declare const defineModel: (name: string, connectionIds: string[], tableName: string) => void;
3
+ export declare const getModel: (name: string) => Model<any>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getModel = exports.defineModel = void 0;
4
+ const Model_1 = require("./Model");
5
+ const models = {};
6
+ const defineModel = (name, connectionIds, tableName) => {
7
+ models[name] = new Model_1.Model(connectionIds, tableName);
8
+ };
9
+ exports.defineModel = defineModel;
10
+ const getModel = (name) => {
11
+ const model = models[name];
12
+ if (!model) {
13
+ throw new Error(`Model ${name} not defined.`);
14
+ }
15
+ return model;
16
+ };
17
+ exports.getModel = getModel;