streamby-core 0.18.0 → 0.19.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 +75 -160
  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,17 @@ 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;
21
- 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.');
38
- }
18
+ const adapter = config.adapter || (0, storage_1.createStorageProvider)(config.storageProviders);
19
+ const Project = (0, manager_1.getModel)('Project');
20
+ const Export = (0, manager_1.getModel)('Export');
39
21
  router.get('/auth', async (req, res) => {
40
22
  try {
41
23
  const auth = await config.authProvider(req);
@@ -51,13 +33,10 @@ function createStreamByRouter(config) {
51
33
  if (!auth) {
52
34
  return res.status(401).json({ error: 'Unauthorized' });
53
35
  }
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
- }
36
+ const connectedDbIds = (0, connectionManager_1.getConnectedIds)();
37
+ const databases = (config.databases || [])
38
+ .filter(db => connectedDbIds.includes(db.id))
39
+ .map(db => ({ name: db.id, value: db.type }));
61
40
  res.status(200).json({ databases });
62
41
  }
63
42
  catch (err) {
@@ -92,11 +71,7 @@ function createStreamByRouter(config) {
92
71
  return res.status(400).json({ error: 'Missing projectId' });
93
72
  }
94
73
  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: '' });
74
+ const updated = await Project.update({ _id: projectId }, { image: '' });
100
75
  res.status(201).json(updated);
101
76
  }
102
77
  catch (err) {
@@ -107,7 +82,7 @@ function createStreamByRouter(config) {
107
82
  try {
108
83
  const auth = await config.authProvider(req);
109
84
  const projectId = (req.query.projectId || req.headers['x-project-id']);
110
- if (!projectId || !auth.projects.includes(projectId)) {
85
+ if (!projectId) {
111
86
  return res.status(403).json({ error: 'Unauthorized or missing projectId' });
112
87
  }
113
88
  const files = await (0, file_1.listFilesService)(adapter, req, projectId);
@@ -117,52 +92,20 @@ function createStreamByRouter(config) {
117
92
  res.status(500).json({ error: 'Failed to list files', details: err });
118
93
  }
119
94
  });
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
95
  router.get('/projects', async (req, res) => {
153
96
  try {
154
97
  const auth = await config.authProvider(req);
155
98
  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
- }
99
+ const projects = (await Project.find({ members: { $elemMatch: { userId: auth.userId } }, archived })).map(project => {
100
+ const currentUserMember = project.members?.find((member) => member.userId === auth.userId);
101
+ return {
102
+ id: project._id || project.id,
103
+ dbType: project.dbType,
104
+ name: project.name,
105
+ image: project.image || '',
106
+ archived: currentUserMember ? currentUserMember.archived || false : false,
107
+ };
108
+ });
166
109
  res.json({ projects });
167
110
  }
168
111
  catch (err) {
@@ -176,17 +119,13 @@ function createStreamByRouter(config) {
176
119
  return res.status(403).json({ error: 'Permission denied' });
177
120
  }
178
121
  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({
122
+ const newProject = await Project.create({
184
123
  dbType: dbType || 'nosql',
185
124
  name,
186
125
  description: description || '',
187
- members: [{ userId: auth.userId, role: "admin" }]
126
+ members: [{ userId: auth.userId, role: "admin", archived: false }]
188
127
  });
189
- res.status(201).json({ project: newProject });
128
+ res.status(201).json({ project: { ...newProject, id: newProject._id || newProject.id, _id: undefined } });
190
129
  }
191
130
  catch (err) {
192
131
  res.status(500).json({ error: 'Failed to create project', details: err.message });
@@ -196,19 +135,14 @@ function createStreamByRouter(config) {
196
135
  try {
197
136
  const auth = await config.authProvider(req);
198
137
  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);
138
+ const project = await Project.findOne({ _id: projectId });
205
139
  if (!project) {
206
140
  return res.status(404).json({ error: 'Project not found' });
207
141
  }
208
142
  if (!isProjectMember(project, auth.userId)) {
209
143
  return res.status(403).json({ error: 'Unauthorized project access' });
210
144
  }
211
- res.json({ project });
145
+ res.json({ project: { ...project, id: project._id || project.id, _id: undefined } });
212
146
  }
213
147
  catch (err) {
214
148
  res.status(500).json({ error: 'Failed to fetch project', details: err.message });
@@ -222,11 +156,7 @@ function createStreamByRouter(config) {
222
156
  }
223
157
  const projectId = req.params.id;
224
158
  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);
159
+ const project = await Project.findOne({ _id: projectId });
230
160
  if (!project) {
231
161
  return res.status(404).json({ error: 'Project not found' });
232
162
  }
@@ -236,8 +166,11 @@ function createStreamByRouter(config) {
236
166
  if (!isProjectMember(project, auth.userId)) {
237
167
  return res.status(403).json({ error: 'Unauthorized project access' });
238
168
  }
239
- const updated = await projectProvider.update(projectId, updates);
240
- res.status(200).json({ success: true, project: updated });
169
+ const updated = await Project.update({ _id: projectId }, updates);
170
+ if (!updated) {
171
+ return res.status(404).json({ error: 'Project not found or not updated' });
172
+ }
173
+ res.status(200).json({ success: true, project: { ...updated, id: updated._id || updated.id, _id: undefined } });
241
174
  }
242
175
  catch (err) {
243
176
  res.status(500).json({ error: 'Failed to update project', details: err.message });
@@ -247,18 +180,14 @@ function createStreamByRouter(config) {
247
180
  try {
248
181
  const auth = await config.authProvider(req);
249
182
  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);
183
+ const project = await Project.findOne({ _id: projectId });
255
184
  if (!project) {
256
185
  return res.status(404).json({ error: 'Project not found' });
257
186
  }
258
187
  if (!isProjectMember(project, auth.userId)) {
259
188
  return res.status(403).json({ error: 'Unauthorized project access' });
260
189
  }
261
- await projectProvider.delete(projectId);
190
+ await Project.delete({ _id: projectId });
262
191
  res.status(200).json({ success: true });
263
192
  }
264
193
  catch (err) {
@@ -269,26 +198,25 @@ function createStreamByRouter(config) {
269
198
  try {
270
199
  const auth = await config.authProvider(req);
271
200
  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);
201
+ const project = await Project.findOne({ _id: projectId });
277
202
  if (!project || !isProjectMember(project, auth.userId)) {
278
203
  return res.status(403).json({ error: 'Unauthorized project access' });
279
204
  }
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 });
205
+ await Project.update({ _id: projectId, "members.userId": auth.userId }, { "members.$.archived": true, "members.$.archivedBy": auth.userId, "members.$.archivedAt": new Date() });
206
+ const updatedProject = await Project.findOne({ _id: projectId }); // Fetch the updated project
207
+ const projects = (await Project.find({ members: { $elemMatch: { userId: auth.userId } } })).map(project => {
208
+ const currentUserMember = project.members?.find((member) => member.userId === auth.userId);
209
+ return {
210
+ id: project._id || project.id,
211
+ dbType: project.dbType,
212
+ name: project.name,
213
+ image: project.image || '',
214
+ archived: currentUserMember ? currentUserMember.archived || false : false,
215
+ };
216
+ });
217
+ // Replace the old project with the updated one in the list
218
+ const finalProjects = projects.map(p => p.id === (updatedProject?._id || updatedProject?.id) ? ({ ...updatedProject, id: updatedProject._id || updatedProject.id, _id: undefined }) : p);
219
+ res.status(200).json({ success: true, projects: finalProjects });
292
220
  }
293
221
  catch (err) {
294
222
  res.status(500).json({ error: 'Failed to archive project', details: err.message });
@@ -298,26 +226,25 @@ function createStreamByRouter(config) {
298
226
  try {
299
227
  const auth = await config.authProvider(req);
300
228
  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);
229
+ const project = await Project.findOne({ _id: projectId });
306
230
  if (!project || !isProjectMember(project, auth.userId)) {
307
231
  return res.status(403).json({ error: 'Unauthorized project access' });
308
232
  }
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 });
233
+ await Project.update({ _id: projectId, "members.userId": auth.userId }, { "members.$.archived": false, "members.$.archivedBy": null, "members.$.archivedAt": null });
234
+ const updatedProject = await Project.findOne({ _id: projectId }); // Fetch the updated project
235
+ const projects = (await Project.find({ members: { $elemMatch: { userId: auth.userId } } })).map(project => {
236
+ const currentUserMember = project.members?.find((member) => member.userId === auth.userId);
237
+ return {
238
+ id: project._id || project.id,
239
+ dbType: project.dbType,
240
+ name: project.name,
241
+ image: project.image || '',
242
+ archived: currentUserMember ? currentUserMember.archived || false : false,
243
+ };
244
+ });
245
+ // Replace the old project with the updated one in the list
246
+ const finalProjects = projects.map(p => p.id === (updatedProject?._id || updatedProject?.id) ? ({ ...updatedProject, id: updatedProject._id || updatedProject.id, _id: undefined }) : p);
247
+ res.status(200).json({ success: true, projects: finalProjects });
321
248
  }
322
249
  catch (err) {
323
250
  res.status(500).json({ error: 'Failed to unarchive project', details: err.message });
@@ -328,19 +255,15 @@ function createStreamByRouter(config) {
328
255
  const auth = await config.authProvider(req);
329
256
  const projectId = req.params.id;
330
257
  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);
258
+ const project = await Project.findOne({ _id: projectId });
336
259
  if (!project) {
337
260
  return res.status(404).json({ error: 'Project not found' });
338
261
  }
339
262
  if (!isProjectMember(project, auth.userId)) {
340
263
  return res.status(403).json({ error: 'Unauthorized access' });
341
264
  }
342
- const data = await exportProvider.getById(exportId);
343
- res.json({ data });
265
+ const data = await Export.findOne({ _id: exportId });
266
+ res.json({ data: { ...data, id: data._id || data.id, _id: undefined } });
344
267
  }
345
268
  catch (err) {
346
269
  res.status(500).json({ error: 'Failed to fetch export data', details: err.message });
@@ -354,22 +277,18 @@ function createStreamByRouter(config) {
354
277
  if (!name || !collectionName) {
355
278
  return res.status(400).json({ error: 'Missing export name or collectionName' });
356
279
  }
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);
280
+ const project = await Project.findOne({ _id: projectId });
362
281
  if (!project || !isProjectMember(project, auth.userId)) {
363
282
  return res.status(403).json({ error: 'Unauthorized project access' });
364
283
  }
365
- const newExport = await exportProvider.create({
284
+ const newExport = await Export.create({
366
285
  name,
367
286
  description,
368
287
  collectionName,
369
288
  projectId
370
289
  });
371
- await projectProvider.addExportToProject(projectId, newExport.id);
372
- res.status(201).json({ data: newExport });
290
+ await Project.update({ _id: projectId }, { $push: { exports: newExport._id } });
291
+ res.status(201).json({ data: { ...newExport, id: newExport._id || newExport.id, _id: undefined } });
373
292
  }
374
293
  catch (err) {
375
294
  res.status(500).json({ error: 'Failed to create export', details: err.message });
@@ -379,11 +298,7 @@ function createStreamByRouter(config) {
379
298
  try {
380
299
  const auth = await config.authProvider(req);
381
300
  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);
301
+ const project = await Project.findOne({ _id: projectId });
387
302
  if (!project) {
388
303
  return res.status(404).json({ error: 'Project not found' });
389
304
  }
@@ -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;
@@ -1,2 +1,2 @@
1
1
  import { StorageAdapter, StorageProvider } from '../types';
2
- export declare function createStorageProvider(providers: StorageProvider[]): StorageAdapter;
2
+ export declare const createStorageProvider: (providers: StorageProvider[]) => StorageAdapter;