streamby-core 0.17.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 +76 -140
- 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 -114
- 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 -148
- 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,51 +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
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
98
|
+
const archived = req.query.archived ? String(req.query.archived).toLowerCase() === 'true' : undefined;
|
|
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
|
+
});
|
|
165
109
|
res.json({ projects });
|
|
166
110
|
}
|
|
167
111
|
catch (err) {
|
|
@@ -175,17 +119,13 @@ function createStreamByRouter(config) {
|
|
|
175
119
|
return res.status(403).json({ error: 'Permission denied' });
|
|
176
120
|
}
|
|
177
121
|
const { name, description, dbType } = req.body;
|
|
178
|
-
const
|
|
179
|
-
if (!provider) {
|
|
180
|
-
return res.status(400).json({ error: 'Invalid dbType' });
|
|
181
|
-
}
|
|
182
|
-
const newProject = await provider.create({
|
|
122
|
+
const newProject = await Project.create({
|
|
183
123
|
dbType: dbType || 'nosql',
|
|
184
124
|
name,
|
|
185
125
|
description: description || '',
|
|
186
|
-
members: [{ userId: auth.userId, role: "admin" }]
|
|
126
|
+
members: [{ userId: auth.userId, role: "admin", archived: false }]
|
|
187
127
|
});
|
|
188
|
-
res.status(201).json({ project: newProject });
|
|
128
|
+
res.status(201).json({ project: { ...newProject, id: newProject._id || newProject.id, _id: undefined } });
|
|
189
129
|
}
|
|
190
130
|
catch (err) {
|
|
191
131
|
res.status(500).json({ error: 'Failed to create project', details: err.message });
|
|
@@ -195,19 +135,14 @@ function createStreamByRouter(config) {
|
|
|
195
135
|
try {
|
|
196
136
|
const auth = await config.authProvider(req);
|
|
197
137
|
const projectId = req.params.id;
|
|
198
|
-
const
|
|
199
|
-
const projectProvider = await getProjectProvider(projectId, dbType);
|
|
200
|
-
if (!projectProvider) {
|
|
201
|
-
return res.status(404).json({ error: 'Project not found' });
|
|
202
|
-
}
|
|
203
|
-
const project = await projectProvider.getById(projectId, true);
|
|
138
|
+
const project = await Project.findOne({ _id: projectId });
|
|
204
139
|
if (!project) {
|
|
205
140
|
return res.status(404).json({ error: 'Project not found' });
|
|
206
141
|
}
|
|
207
142
|
if (!isProjectMember(project, auth.userId)) {
|
|
208
143
|
return res.status(403).json({ error: 'Unauthorized project access' });
|
|
209
144
|
}
|
|
210
|
-
res.json({ project });
|
|
145
|
+
res.json({ project: { ...project, id: project._id || project.id, _id: undefined } });
|
|
211
146
|
}
|
|
212
147
|
catch (err) {
|
|
213
148
|
res.status(500).json({ error: 'Failed to fetch project', details: err.message });
|
|
@@ -221,11 +156,7 @@ function createStreamByRouter(config) {
|
|
|
221
156
|
}
|
|
222
157
|
const projectId = req.params.id;
|
|
223
158
|
const updates = req.body;
|
|
224
|
-
const
|
|
225
|
-
if (!projectProvider) {
|
|
226
|
-
return res.status(404).json({ error: 'Project not found' });
|
|
227
|
-
}
|
|
228
|
-
const project = await projectProvider.getById(projectId, true);
|
|
159
|
+
const project = await Project.findOne({ _id: projectId });
|
|
229
160
|
if (!project) {
|
|
230
161
|
return res.status(404).json({ error: 'Project not found' });
|
|
231
162
|
}
|
|
@@ -235,8 +166,11 @@ function createStreamByRouter(config) {
|
|
|
235
166
|
if (!isProjectMember(project, auth.userId)) {
|
|
236
167
|
return res.status(403).json({ error: 'Unauthorized project access' });
|
|
237
168
|
}
|
|
238
|
-
const updated = await
|
|
239
|
-
|
|
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 } });
|
|
240
174
|
}
|
|
241
175
|
catch (err) {
|
|
242
176
|
res.status(500).json({ error: 'Failed to update project', details: err.message });
|
|
@@ -246,18 +180,14 @@ function createStreamByRouter(config) {
|
|
|
246
180
|
try {
|
|
247
181
|
const auth = await config.authProvider(req);
|
|
248
182
|
const projectId = req.params.id;
|
|
249
|
-
const
|
|
250
|
-
if (!projectProvider) {
|
|
251
|
-
return res.status(404).json({ error: 'Project not found' });
|
|
252
|
-
}
|
|
253
|
-
const project = await projectProvider.getById(projectId, true);
|
|
183
|
+
const project = await Project.findOne({ _id: projectId });
|
|
254
184
|
if (!project) {
|
|
255
185
|
return res.status(404).json({ error: 'Project not found' });
|
|
256
186
|
}
|
|
257
187
|
if (!isProjectMember(project, auth.userId)) {
|
|
258
188
|
return res.status(403).json({ error: 'Unauthorized project access' });
|
|
259
189
|
}
|
|
260
|
-
await
|
|
190
|
+
await Project.delete({ _id: projectId });
|
|
261
191
|
res.status(200).json({ success: true });
|
|
262
192
|
}
|
|
263
193
|
catch (err) {
|
|
@@ -268,16 +198,25 @@ function createStreamByRouter(config) {
|
|
|
268
198
|
try {
|
|
269
199
|
const auth = await config.authProvider(req);
|
|
270
200
|
const projectId = req.params.id;
|
|
271
|
-
const
|
|
272
|
-
if (!projectProvider) {
|
|
273
|
-
return res.status(404).json({ error: 'Project not found' });
|
|
274
|
-
}
|
|
275
|
-
const project = await projectProvider.getById(projectId, true);
|
|
201
|
+
const project = await Project.findOne({ _id: projectId });
|
|
276
202
|
if (!project || !isProjectMember(project, auth.userId)) {
|
|
277
203
|
return res.status(403).json({ error: 'Unauthorized project access' });
|
|
278
204
|
}
|
|
279
|
-
|
|
280
|
-
|
|
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 });
|
|
281
220
|
}
|
|
282
221
|
catch (err) {
|
|
283
222
|
res.status(500).json({ error: 'Failed to archive project', details: err.message });
|
|
@@ -287,16 +226,25 @@ function createStreamByRouter(config) {
|
|
|
287
226
|
try {
|
|
288
227
|
const auth = await config.authProvider(req);
|
|
289
228
|
const projectId = req.params.id;
|
|
290
|
-
const
|
|
291
|
-
if (!projectProvider) {
|
|
292
|
-
return res.status(404).json({ error: 'Project not found' });
|
|
293
|
-
}
|
|
294
|
-
const project = await projectProvider.getById(projectId, true);
|
|
229
|
+
const project = await Project.findOne({ _id: projectId });
|
|
295
230
|
if (!project || !isProjectMember(project, auth.userId)) {
|
|
296
231
|
return res.status(403).json({ error: 'Unauthorized project access' });
|
|
297
232
|
}
|
|
298
|
-
|
|
299
|
-
|
|
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 });
|
|
300
248
|
}
|
|
301
249
|
catch (err) {
|
|
302
250
|
res.status(500).json({ error: 'Failed to unarchive project', details: err.message });
|
|
@@ -307,19 +255,15 @@ function createStreamByRouter(config) {
|
|
|
307
255
|
const auth = await config.authProvider(req);
|
|
308
256
|
const projectId = req.params.id;
|
|
309
257
|
const exportId = req.params.export_id;
|
|
310
|
-
const
|
|
311
|
-
if (!projectProvider) {
|
|
312
|
-
return res.status(404).json({ error: 'Project not found' });
|
|
313
|
-
}
|
|
314
|
-
const project = await projectProvider.getById(projectId, true);
|
|
258
|
+
const project = await Project.findOne({ _id: projectId });
|
|
315
259
|
if (!project) {
|
|
316
260
|
return res.status(404).json({ error: 'Project not found' });
|
|
317
261
|
}
|
|
318
262
|
if (!isProjectMember(project, auth.userId)) {
|
|
319
263
|
return res.status(403).json({ error: 'Unauthorized access' });
|
|
320
264
|
}
|
|
321
|
-
const data = await
|
|
322
|
-
res.json({ data });
|
|
265
|
+
const data = await Export.findOne({ _id: exportId });
|
|
266
|
+
res.json({ data: { ...data, id: data._id || data.id, _id: undefined } });
|
|
323
267
|
}
|
|
324
268
|
catch (err) {
|
|
325
269
|
res.status(500).json({ error: 'Failed to fetch export data', details: err.message });
|
|
@@ -333,22 +277,18 @@ function createStreamByRouter(config) {
|
|
|
333
277
|
if (!name || !collectionName) {
|
|
334
278
|
return res.status(400).json({ error: 'Missing export name or collectionName' });
|
|
335
279
|
}
|
|
336
|
-
const
|
|
337
|
-
if (!projectProvider) {
|
|
338
|
-
return res.status(404).json({ error: 'Project not found' });
|
|
339
|
-
}
|
|
340
|
-
const project = await projectProvider.getById(projectId, true);
|
|
280
|
+
const project = await Project.findOne({ _id: projectId });
|
|
341
281
|
if (!project || !isProjectMember(project, auth.userId)) {
|
|
342
282
|
return res.status(403).json({ error: 'Unauthorized project access' });
|
|
343
283
|
}
|
|
344
|
-
const newExport = await
|
|
284
|
+
const newExport = await Export.create({
|
|
345
285
|
name,
|
|
346
286
|
description,
|
|
347
287
|
collectionName,
|
|
348
288
|
projectId
|
|
349
289
|
});
|
|
350
|
-
await
|
|
351
|
-
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 } });
|
|
352
292
|
}
|
|
353
293
|
catch (err) {
|
|
354
294
|
res.status(500).json({ error: 'Failed to create export', details: err.message });
|
|
@@ -358,11 +298,7 @@ function createStreamByRouter(config) {
|
|
|
358
298
|
try {
|
|
359
299
|
const auth = await config.authProvider(req);
|
|
360
300
|
const projectId = req.params.id;
|
|
361
|
-
const
|
|
362
|
-
if (!projectProvider) {
|
|
363
|
-
return res.status(404).json({ error: 'Project not found' });
|
|
364
|
-
}
|
|
365
|
-
const project = await projectProvider.getById(projectId, true);
|
|
301
|
+
const project = await Project.findOne({ _id: projectId });
|
|
366
302
|
if (!project) {
|
|
367
303
|
return res.status(404).json({ error: 'Project not found' });
|
|
368
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;
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createStorageProvider =
|
|
4
|
-
const s3_1 = require("../adapters/s3");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
switch (selected.type) {
|
|
10
|
-
case 's3':
|
|
11
|
-
return (0, s3_1.createS3Adapter)(selected.config);
|
|
12
|
-
// futuro: case 'gcs': return createGCSAdapter(selected.config);
|
|
13
|
-
default:
|
|
14
|
-
throw new Error(`Unsupported storage type: ${selected.type}`);
|
|
3
|
+
exports.createStorageProvider = void 0;
|
|
4
|
+
const s3_1 = require("../adapters/storage/s3");
|
|
5
|
+
const createStorageProvider = (providers) => {
|
|
6
|
+
const s3Provider = providers.find(p => p.type === 's3');
|
|
7
|
+
if (s3Provider) {
|
|
8
|
+
return new s3_1.S3Adapter(s3Provider.config);
|
|
15
9
|
}
|
|
16
|
-
|
|
10
|
+
throw new Error('No storage provider configured.');
|
|
11
|
+
};
|
|
12
|
+
exports.createStorageProvider = createStorageProvider;
|