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.
- 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 +81 -158
- 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,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
|
|
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 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
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
240
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
|
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
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
292
|
+
const newExport = await Export.create({
|
|
366
293
|
name,
|
|
367
294
|
description,
|
|
368
295
|
collectionName,
|
|
369
296
|
projectId
|
|
370
297
|
});
|
|
371
|
-
await
|
|
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
|
|
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,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;
|