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.
- package/README.md +206 -114
- package/dist/adapters/database/connectionManager.d.ts +6 -0
- package/dist/adapters/database/connectionManager.js +47 -0
- package/dist/adapters/database/nosql.d.ts +8 -0
- package/dist/adapters/database/nosql.js +46 -0
- package/dist/adapters/database/nosqlAdapter.d.ts +8 -0
- package/dist/adapters/database/nosqlAdapter.js +30 -0
- package/dist/adapters/database/sql.d.ts +8 -0
- package/dist/adapters/database/sql.js +42 -0
- package/dist/adapters/database/sqlAdapter.d.ts +8 -0
- package/dist/adapters/database/sqlAdapter.js +42 -0
- package/dist/adapters/s3.d.ts +11 -2
- package/dist/adapters/s3.js +59 -76
- package/dist/adapters/storage/gcs.d.ts +0 -0
- package/dist/adapters/storage/gcs.js +1 -0
- package/dist/adapters/storage/local.d.ts +0 -0
- package/dist/adapters/storage/local.js +1 -0
- package/dist/adapters/storage/s3.d.ts +11 -0
- package/dist/adapters/storage/s3.js +65 -0
- package/dist/database/Model.d.ts +11 -0
- package/dist/database/Model.js +95 -0
- package/dist/database/connectionManager.d.ts +5 -0
- package/dist/database/connectionManager.js +32 -0
- package/dist/database/index.d.ts +3 -0
- package/dist/database/index.js +19 -0
- package/dist/database/model.d.ts +20 -0
- package/dist/database/model.js +2 -0
- package/dist/database/modelManager.d.ts +8 -0
- package/dist/database/modelManager.js +38 -0
- package/dist/database/modelRegistry.d.ts +3 -0
- package/dist/database/modelRegistry.js +17 -0
- package/dist/database/mongoAdapter.d.ts +11 -0
- package/dist/database/mongoAdapter.js +42 -0
- package/dist/database/sqlAdapter.d.ts +12 -0
- package/dist/database/sqlAdapter.js +68 -0
- package/dist/middleware/createRouter.js +75 -160
- package/dist/models/Model.d.ts +12 -0
- package/dist/models/Model.js +146 -0
- package/dist/models/manager.d.ts +2 -0
- package/dist/models/manager.js +7 -0
- package/dist/models/modelManager.d.ts +2 -0
- package/dist/models/modelManager.js +7 -0
- package/dist/models/modelRegistry.d.ts +3 -0
- package/dist/models/modelRegistry.js +17 -0
- package/dist/models/register.d.ts +1 -0
- package/dist/models/register.js +8 -0
- package/dist/models/registerModel.d.ts +1 -0
- package/dist/models/registerModel.js +8 -0
- package/dist/models/registry.d.ts +3 -0
- package/dist/models/registry.js +17 -0
- package/dist/providers/createStorageProvider.d.ts +1 -1
- package/dist/providers/createStorageProvider.js +9 -13
- package/dist/providers/storage.d.ts +2 -0
- package/dist/providers/storage.js +12 -0
- package/dist/services/auth.d.ts +0 -1
- package/dist/services/auth.js +0 -11
- package/dist/types/index.d.ts +4 -95
- package/package.json +5 -1
- package/dist/config.d.ts +0 -18
- package/dist/config.js +0 -26
- package/dist/db/initExportModel.d.ts +0 -60
- package/dist/db/initExportModel.js +0 -18
- package/dist/db/initProjectModel.d.ts +0 -2502
- package/dist/db/initProjectModel.js +0 -33
- package/dist/db/initUserModel.d.ts +0 -48
- package/dist/db/initUserModel.js +0 -19
- package/dist/models/ExportCollection.d.ts +0 -54
- package/dist/models/ExportCollection.js +0 -19
- package/dist/mongoose_models/initExportModel.d.ts +0 -61
- package/dist/mongoose_models/initExportModel.js +0 -19
- package/dist/mongoose_models/initProjectModel.d.ts +0 -2503
- package/dist/mongoose_models/initProjectModel.js +0 -34
- package/dist/providers/createDatabaseProvider.d.ts +0 -2
- package/dist/providers/createDatabaseProvider.js +0 -36
- package/dist/providers/createMongooseProvider.d.ts +0 -8
- package/dist/providers/createMongooseProvider.js +0 -33
- package/dist/providers/createPrismaProvider.d.ts +0 -14
- package/dist/providers/createPrismaProvider.js +0 -29
- package/dist/providers/mongoExportProvider.d.ts +0 -3
- package/dist/providers/mongoExportProvider.js +0 -13
- package/dist/providers/mongoProjectProvider.d.ts +0 -3
- package/dist/providers/mongoProjectProvider.js +0 -107
- package/dist/providers/mongooseExportProvider.d.ts +0 -3
- package/dist/providers/mongooseExportProvider.js +0 -13
- package/dist/providers/mongooseProjectProvider.d.ts +0 -3
- package/dist/providers/mongooseProjectProvider.js +0 -120
- package/dist/providers/prismaExportCollectionProvider.d.ts +0 -61
- package/dist/providers/prismaExportCollectionProvider.js +0 -45
- package/dist/providers/prismaExportProvider.d.ts +0 -3
- package/dist/providers/prismaExportProvider.js +0 -13
- package/dist/providers/prismaProjectProvider.d.ts +0 -3
- package/dist/providers/prismaProjectProvider.js +0 -157
- package/dist/utils/pushPrismaSchema.d.ts +0 -5
- 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
|
|
11
|
-
const
|
|
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,
|
|
18
|
-
const
|
|
19
|
-
|
|
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
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
240
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
|
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
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
284
|
+
const newExport = await Export.create({
|
|
366
285
|
name,
|
|
367
286
|
description,
|
|
368
287
|
collectionName,
|
|
369
288
|
projectId
|
|
370
289
|
});
|
|
371
|
-
await
|
|
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
|
|
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,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,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,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,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
|
|
2
|
+
export declare const createStorageProvider: (providers: StorageProvider[]) => StorageAdapter;
|