streamby-core 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/config.d.ts +18 -0
  2. package/dist/config.js +25 -0
  3. package/dist/db/initExportModel.d.ts +2 -2
  4. package/dist/db/initProjectModel.d.ts +67 -61
  5. package/dist/db/initProjectModel.js +1 -0
  6. package/dist/db/initUserModel.d.ts +2 -2
  7. package/dist/middleware/createRouter.js +134 -16
  8. package/dist/models/ExportCollection.d.ts +2 -2
  9. package/dist/mongoose_models/initExportModel.d.ts +61 -0
  10. package/dist/mongoose_models/initExportModel.js +19 -0
  11. package/dist/mongoose_models/initProjectModel.d.ts +2503 -0
  12. package/dist/mongoose_models/initProjectModel.js +34 -0
  13. package/dist/providers/createDatabaseProvider.d.ts +2 -13
  14. package/dist/providers/createDatabaseProvider.js +28 -23
  15. package/dist/providers/createMongooseProvider.d.ts +8 -0
  16. package/dist/providers/createMongooseProvider.js +33 -0
  17. package/dist/providers/createPrismaProvider.d.ts +14 -0
  18. package/dist/providers/createPrismaProvider.js +29 -0
  19. package/dist/providers/mongoProjectProvider.js +5 -2
  20. package/dist/providers/mongooseExportProvider.d.ts +3 -0
  21. package/dist/providers/mongooseExportProvider.js +13 -0
  22. package/dist/providers/mongooseProjectProvider.d.ts +3 -0
  23. package/dist/providers/mongooseProjectProvider.js +114 -0
  24. package/dist/providers/prismaExportCollectionProvider.d.ts +61 -0
  25. package/dist/providers/prismaExportCollectionProvider.js +45 -0
  26. package/dist/providers/prismaExportProvider.d.ts +3 -0
  27. package/dist/providers/prismaExportProvider.js +13 -0
  28. package/dist/providers/prismaProjectProvider.d.ts +3 -0
  29. package/dist/providers/prismaProjectProvider.js +147 -0
  30. package/dist/types/index.d.ts +54 -12
  31. package/package.json +4 -2
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initProjectModel = initProjectModel;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ function initProjectModel(connection) {
9
+ const folderNodeSchema = new mongoose_1.default.Schema({
10
+ id: String,
11
+ name: String,
12
+ children: [Object],
13
+ }, { _id: false });
14
+ const memberSchema = new mongoose_1.default.Schema({
15
+ userId: { type: mongoose_1.default.Schema.Types.ObjectId, required: true },
16
+ role: { type: String, enum: ['viewer', 'editor', 'admin'], default: 'viewer' },
17
+ archived: { type: Boolean, default: false }
18
+ }, { _id: false });
19
+ const projectSchema = new mongoose_1.default.Schema({
20
+ dbType: { type: String, required: true },
21
+ name: { type: String, required: true },
22
+ description: { type: String },
23
+ image: { type: String },
24
+ folders: [folderNodeSchema],
25
+ allowUpload: { type: Boolean, default: true },
26
+ allowSharing: { type: Boolean, default: false },
27
+ members: [memberSchema],
28
+ exports: [{ type: mongoose_1.default.Schema.Types.ObjectId, ref: 'Export' }]
29
+ }, {
30
+ timestamps: true,
31
+ collection: 'streamby_projects'
32
+ });
33
+ return connection.model('Project', projectSchema);
34
+ }
@@ -1,13 +1,2 @@
1
- import mongoose from 'mongoose';
2
- import { StorageAdapter } from '../types';
3
- type SupportedDbType = 'mongo';
4
- export interface DatabaseCredential {
5
- dbType: SupportedDbType;
6
- connectionString: string;
7
- }
8
- export declare function createDatabaseProvider(databases: DatabaseCredential[], adapter: StorageAdapter): {
9
- exportProvider: import("../types").ExportProvider;
10
- projectProvider: import("../types").ProjectProvider;
11
- mongoConnection: mongoose.Connection;
12
- };
13
- export {};
1
+ import { StorageAdapter, DatabaseCredential, DatabaseProviders } from '../types';
2
+ export declare function createDatabaseProvider(databases: DatabaseCredential[], adapter: StorageAdapter): DatabaseProviders;
@@ -1,31 +1,36 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.createDatabaseProvider = createDatabaseProvider;
7
- const mongoose_1 = __importDefault(require("mongoose"));
8
- const initProjectModel_1 = require("../db/initProjectModel");
9
- const initUserModel_1 = require("../db/initUserModel");
10
- const mongoExportProvider_1 = require("./mongoExportProvider");
11
- const mongoProjectProvider_1 = require("./mongoProjectProvider");
12
- const initExportModel_1 = require("../db/initExportModel");
4
+ const createPrismaProvider_1 = require("./createPrismaProvider");
5
+ const createMongooseProvider_1 = require("./createMongooseProvider");
13
6
  function createDatabaseProvider(databases, adapter) {
14
- const mongoConfig = databases.find((db) => db.dbType === 'mongo');
15
- if (!mongoConfig) {
16
- throw new Error('No MongoDB configuration provided. Mongo is currently required.');
7
+ let mongoProviders;
8
+ let prismaProviders;
9
+ const mongoConfig = databases.find((db) => db.dbType === 'nosql');
10
+ if (mongoConfig) {
11
+ if (!mongoConfig.connectionString) {
12
+ throw new Error('MongoDB connection string is required for mongo dbType.');
13
+ }
14
+ mongoProviders = (0, createMongooseProvider_1.createMongooseProvider)(mongoConfig.connectionString, adapter) || undefined;
15
+ }
16
+ const prismaConfig = databases.find((db) => db.dbType === 'sql');
17
+ if (prismaConfig) {
18
+ if (!prismaConfig.connectionString) {
19
+ throw new Error('Prisma connection string is required for prisma dbType.');
20
+ }
21
+ prismaProviders = (0, createPrismaProvider_1.createPrismaProvider)(prismaConfig.connectionString, adapter) || undefined;
22
+ }
23
+ if (!mongoProviders && !prismaProviders) {
24
+ throw new Error('At least one database configuration (mongo or prisma) is required.');
17
25
  }
18
- const connection = mongoose_1.default.createConnection(mongoConfig.connectionString, {
19
- dbName: undefined,
20
- });
21
- const ExportModel = (0, initExportModel_1.initExportModel)(connection);
22
- const ProjectModel = (0, initProjectModel_1.initProjectModel)(connection);
23
- const UserModel = (0, initUserModel_1.initUserModel)(connection);
24
- const exportProvider = (0, mongoExportProvider_1.createMongoExportProvider)(ExportModel);
25
- const projectProvider = (0, mongoProjectProvider_1.createMongoProjectProvider)(ProjectModel, ExportModel, adapter);
26
26
  return {
27
- exportProvider,
28
- projectProvider,
29
- mongoConnection: connection,
27
+ exportProvider: mongoProviders?.exportProvider || prismaProviders?.exportProvider,
28
+ projectProviders: {
29
+ nosql: mongoProviders?.projectProvider,
30
+ sql: prismaProviders?.projectProvider,
31
+ },
32
+ exportCollectionProvider: mongoProviders?.exportCollectionProvider || prismaProviders?.exportCollectionProvider,
33
+ mongooseClient: mongoProviders?.mongooseClient,
34
+ prismaClient: prismaProviders?.prismaClient,
30
35
  };
31
36
  }
@@ -0,0 +1,8 @@
1
+ import mongoose from 'mongoose';
2
+ import { StorageAdapter, ProjectProvider, ExportProvider } from '../types';
3
+ export declare function createMongooseProvider(connectionString: string, adapter: StorageAdapter): {
4
+ mongooseClient: mongoose.Connection;
5
+ exportProvider: ExportProvider;
6
+ projectProvider: ProjectProvider;
7
+ exportCollectionProvider: undefined;
8
+ } | null;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createMongooseProvider = createMongooseProvider;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const initProjectModel_1 = require("../mongoose_models/initProjectModel");
9
+ const initExportModel_1 = require("../mongoose_models/initExportModel");
10
+ const mongooseExportProvider_1 = require("./mongooseExportProvider");
11
+ const mongooseProjectProvider_1 = require("./mongooseProjectProvider");
12
+ function createMongooseProvider(connectionString, adapter) {
13
+ if (!connectionString) {
14
+ console.warn('Connection string is not provided. Mongoose client will not be initialized.');
15
+ return null;
16
+ }
17
+ const mongooseClient = mongoose_1.default.createConnection(connectionString, {
18
+ dbName: undefined,
19
+ });
20
+ const ExportModel = (0, initExportModel_1.initExportModel)(mongooseClient);
21
+ const ProjectModel = (0, initProjectModel_1.initProjectModel)(mongooseClient);
22
+ const exportProvider = (0, mongooseExportProvider_1.createMongooseExportProvider)(ExportModel);
23
+ const projectProvider = (0, mongooseProjectProvider_1.createMongooseProjectProvider)(ProjectModel, ExportModel, adapter);
24
+ // Mongoose does not have a direct equivalent for ExportCollectionProvider in the same way Prisma does.
25
+ // If a Mongoose-based ExportCollectionProvider is needed, it would be implemented here.
26
+ const exportCollectionProvider = undefined;
27
+ return {
28
+ mongooseClient,
29
+ exportProvider,
30
+ projectProvider,
31
+ exportCollectionProvider,
32
+ };
33
+ }
@@ -0,0 +1,14 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ import { StorageAdapter, ProjectProvider, ExportProvider, ExportCollectionProvider } from '../types';
3
+ export declare function createPrismaProvider(connectionString: string, adapter: StorageAdapter): {
4
+ prismaClient: PrismaClient<{
5
+ datasources: {
6
+ db: {
7
+ url: string;
8
+ };
9
+ };
10
+ }, never, import("@prisma/client/runtime/library").DefaultArgs>;
11
+ exportProvider: ExportProvider;
12
+ projectProvider: ProjectProvider;
13
+ exportCollectionProvider: ExportCollectionProvider;
14
+ } | null;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPrismaProvider = createPrismaProvider;
4
+ const client_1 = require("@prisma/client");
5
+ const prismaExportProvider_1 = require("./prismaExportProvider");
6
+ const prismaProjectProvider_1 = require("./prismaProjectProvider");
7
+ const prismaExportCollectionProvider_1 = require("./prismaExportCollectionProvider");
8
+ function createPrismaProvider(connectionString, adapter) {
9
+ if (!connectionString) {
10
+ console.warn('Connection string is not provided. Prisma client will not be initialized.');
11
+ return null;
12
+ }
13
+ const prisma = new client_1.PrismaClient({
14
+ datasources: {
15
+ db: {
16
+ url: connectionString,
17
+ },
18
+ },
19
+ });
20
+ const exportProvider = (0, prismaExportProvider_1.createPrismaExportProvider)(prisma);
21
+ const projectProvider = (0, prismaProjectProvider_1.createPrismaProjectProvider)(prisma, adapter);
22
+ const exportCollectionProvider = (0, prismaExportCollectionProvider_1.createPrismaExportCollectionProvider)(prisma);
23
+ return {
24
+ prismaClient: prisma,
25
+ exportProvider,
26
+ projectProvider,
27
+ exportCollectionProvider,
28
+ };
29
+ }
@@ -15,6 +15,7 @@ function createMongoProjectProvider(ProjectModel, ExportModel, adapter) {
15
15
  },
16
16
  async create(data) {
17
17
  const newProject = await ProjectModel.create({
18
+ dbType: data.dbType,
18
19
  members: [
19
20
  {
20
21
  userId: data.members?.[0].userId,
@@ -25,7 +26,7 @@ function createMongoProjectProvider(ProjectModel, ExportModel, adapter) {
25
26
  name: data.name,
26
27
  description: data.description || '',
27
28
  image: data.image || '',
28
- rootFolders: data.rootFolders || [],
29
+ rootFolders: data.folders || [],
29
30
  allowUpload: data.allowUpload ?? true,
30
31
  allowSharing: data.allowSharing ?? false,
31
32
  });
@@ -74,6 +75,7 @@ function createMongoProjectProvider(ProjectModel, ExportModel, adapter) {
74
75
  function formatProject(doc) {
75
76
  return {
76
77
  id: doc._id.toString(),
78
+ dbType: doc.dbType,
77
79
  name: doc.name,
78
80
  image: doc.image,
79
81
  members: doc.members.map((m) => ({
@@ -84,7 +86,7 @@ function createMongoProjectProvider(ProjectModel, ExportModel, adapter) {
84
86
  archived: m.archived ?? false
85
87
  })),
86
88
  description: doc.description,
87
- rootFolders: doc.rootFolders || [],
89
+ folders: doc.rootFolders || [],
88
90
  settings: {
89
91
  allowUpload: doc.allowUpload,
90
92
  allowSharing: doc.allowSharing,
@@ -96,6 +98,7 @@ function createMongoProjectProvider(ProjectModel, ExportModel, adapter) {
96
98
  const archived = doc.members?.find((m) => m.userId?.toString() === userId)?.archived ?? false;
97
99
  return {
98
100
  id: doc._id.toString(),
101
+ dbType: doc.dbType,
99
102
  name: doc.name,
100
103
  image: doc.image,
101
104
  archived
@@ -0,0 +1,3 @@
1
+ import { Model } from 'mongoose';
2
+ import { ExportProvider } from '../types';
3
+ export declare function createMongooseExportProvider(ExportModel: Model<any>): ExportProvider;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMongooseExportProvider = createMongooseExportProvider;
4
+ function createMongooseExportProvider(ExportModel) {
5
+ return {
6
+ async getById(exportId) {
7
+ return await ExportModel.findById(exportId).lean();
8
+ },
9
+ async create(data) {
10
+ return await ExportModel.create(data);
11
+ }
12
+ };
13
+ }
@@ -0,0 +1,3 @@
1
+ import { ProjectProvider, StorageAdapter } from '../types';
2
+ import { Model } from 'mongoose';
3
+ export declare function createMongooseProjectProvider(ProjectModel: Model<any>, ExportModel: Model<any>, adapter: StorageAdapter): ProjectProvider;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMongooseProjectProvider = createMongooseProjectProvider;
4
+ function createMongooseProjectProvider(ProjectModel, ExportModel, adapter) {
5
+ return {
6
+ async getById(projectId, populateMembers = false) {
7
+ let query = ProjectModel.findById(projectId).populate('exports', ['_id', 'collectionName']);
8
+ if (populateMembers) {
9
+ // No longer populating 'members.userId' to avoid dependency on external User model
10
+ }
11
+ const project = await query;
12
+ if (!project)
13
+ throw new Error('Project not found');
14
+ return formatProject(project);
15
+ },
16
+ async create(data) {
17
+ const newProject = await ProjectModel.create({
18
+ dbType: data.dbType,
19
+ members: [
20
+ {
21
+ userId: data.members?.[0].userId,
22
+ role: data.members?.[0].role,
23
+ archived: false
24
+ }
25
+ ],
26
+ name: data.name,
27
+ description: data.description || '',
28
+ image: data.image || '',
29
+ folders: data.folders || [],
30
+ allowUpload: data.allowUpload ?? true,
31
+ allowSharing: data.allowSharing ?? false,
32
+ });
33
+ return formatProject(newProject);
34
+ },
35
+ async update(projectId, updates) {
36
+ const updated = await ProjectModel.findByIdAndUpdate(projectId, updates, { new: true }).populate('exports', ['_id', 'collectionName']);
37
+ if (!updated)
38
+ throw new Error('Project not found');
39
+ return formatProject(updated);
40
+ },
41
+ async list(userId) {
42
+ const all = await ProjectModel.find(userId
43
+ ? { 'members': { $elemMatch: { userId } } }
44
+ : {});
45
+ return all.map(doc => formatProjectList(doc, userId));
46
+ },
47
+ async delete(projectId) {
48
+ try {
49
+ await ProjectModel.findByIdAndDelete(projectId);
50
+ await adapter.deleteProjectDirectory(projectId);
51
+ return { success: true };
52
+ }
53
+ catch (error) {
54
+ throw new Error('Project not found');
55
+ }
56
+ },
57
+ async archive(projectId, userId) {
58
+ await ProjectModel.updateOne({ _id: projectId, 'members.userId': userId }, { $set: { 'members.$.archived': true } });
59
+ return { success: true, projects: await this.list(userId) };
60
+ },
61
+ async unarchive(projectId, userId) {
62
+ await ProjectModel.updateOne({ _id: projectId, 'members.userId': userId }, { $set: { 'members.$.archived': false } });
63
+ return { success: true, projects: await this.list(userId) };
64
+ },
65
+ async getExport(projectId, exportId) {
66
+ const exportDoc = await ExportModel.findOne({ _id: exportId, project: projectId });
67
+ if (!exportDoc)
68
+ throw new Error('Export not found');
69
+ return exportDoc;
70
+ },
71
+ async addExportToProject(projectId, exportId) {
72
+ // En Mongoose, la relación ya está definida en el modelo Export.
73
+ // No es necesario actualizar el Project directamente.
74
+ // Si se necesita vincular un Export existente a un Project, se haría al crear o actualizar el Export.
75
+ // Por ejemplo, al crear un Export:
76
+ // ExportModel.create({ ..., projectId: projectId });
77
+ // O al actualizar un Export:
78
+ // ExportModel.findByIdAndUpdate(exportId, { projectId: projectId });
79
+ // Dado que el método original de Mongoose solo añade el ID, asumimos que el Export ya existe y tiene el projectId correcto.
80
+ // Si la lógica requiere añadir un Export existente a un Project, y el Export no tiene el projectId, se debería actualizar el Export.
81
+ // Por ahora, no se requiere ninguna acción aquí si la relación ya está establecida en el modelo Export.
82
+ }
83
+ };
84
+ function formatProject(doc) {
85
+ return {
86
+ id: doc._id.toString(),
87
+ dbType: doc.dbType,
88
+ name: doc.name,
89
+ image: doc.image,
90
+ members: doc.members.map((m) => ({
91
+ userId: m.userId,
92
+ role: m.role,
93
+ archived: m.archived ?? false
94
+ })),
95
+ description: doc.description,
96
+ folders: doc.rootFolders || [],
97
+ settings: {
98
+ allowUpload: doc.allowUpload,
99
+ allowSharing: doc.allowSharing,
100
+ },
101
+ exports: doc.exports || []
102
+ };
103
+ }
104
+ function formatProjectList(doc, userId) {
105
+ const archived = doc.members?.find((m) => m.userId?.toString() === userId)?.archived ?? false;
106
+ return {
107
+ id: doc._id.toString(),
108
+ dbType: doc.dbType,
109
+ name: doc.name,
110
+ image: doc.image,
111
+ archived
112
+ };
113
+ }
114
+ }
@@ -0,0 +1,61 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ export declare function createPrismaExportCollectionProvider(prisma: PrismaClient): {
3
+ getById(id: string): Promise<({
4
+ entries: {
5
+ id: string;
6
+ exportCollectionId: string;
7
+ key: string;
8
+ value: string;
9
+ }[];
10
+ } & {
11
+ id: string;
12
+ name: string;
13
+ projectId: string;
14
+ createdAt: Date;
15
+ updatedAt: Date;
16
+ }) | null>;
17
+ create(data: {
18
+ projectId: string;
19
+ name: string;
20
+ entries: Array<{
21
+ key: string;
22
+ value: string;
23
+ }>;
24
+ }): Promise<{
25
+ entries: {
26
+ id: string;
27
+ exportCollectionId: string;
28
+ key: string;
29
+ value: string;
30
+ }[];
31
+ } & {
32
+ id: string;
33
+ name: string;
34
+ projectId: string;
35
+ createdAt: Date;
36
+ updatedAt: Date;
37
+ }>;
38
+ update(id: string, data: {
39
+ name?: string;
40
+ entries?: Array<{
41
+ key: string;
42
+ value: string;
43
+ }>;
44
+ }): Promise<{
45
+ entries: {
46
+ id: string;
47
+ exportCollectionId: string;
48
+ key: string;
49
+ value: string;
50
+ }[];
51
+ } & {
52
+ id: string;
53
+ name: string;
54
+ projectId: string;
55
+ createdAt: Date;
56
+ updatedAt: Date;
57
+ }>;
58
+ delete(id: string): Promise<{
59
+ success: boolean;
60
+ }>;
61
+ };
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPrismaExportCollectionProvider = createPrismaExportCollectionProvider;
4
+ function createPrismaExportCollectionProvider(prisma) {
5
+ return {
6
+ async getById(id) {
7
+ return prisma.exportCollection.findUnique({
8
+ where: { id },
9
+ include: { entries: true },
10
+ });
11
+ },
12
+ async create(data) {
13
+ const { entries, ...rest } = data;
14
+ return prisma.exportCollection.create({
15
+ data: {
16
+ ...rest,
17
+ entries: {
18
+ createMany: { data: entries },
19
+ },
20
+ },
21
+ include: { entries: true },
22
+ });
23
+ },
24
+ async update(id, data) {
25
+ const { entries, ...rest } = data;
26
+ const updateData = { ...rest };
27
+ if (entries) {
28
+ // Eliminar entradas existentes y crear nuevas
29
+ await prisma.exportEntry.deleteMany({ where: { exportCollectionId: id } });
30
+ updateData.entries = {
31
+ createMany: { data: entries },
32
+ };
33
+ }
34
+ return prisma.exportCollection.update({
35
+ where: { id },
36
+ data: updateData,
37
+ include: { entries: true },
38
+ });
39
+ },
40
+ async delete(id) {
41
+ await prisma.exportCollection.delete({ where: { id } });
42
+ return { success: true };
43
+ },
44
+ };
45
+ }
@@ -0,0 +1,3 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ import { ExportProvider } from '../types';
3
+ export declare function createPrismaExportProvider(prisma: PrismaClient): ExportProvider;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPrismaExportProvider = createPrismaExportProvider;
4
+ function createPrismaExportProvider(prisma) {
5
+ return {
6
+ async getById(exportId) {
7
+ return await prisma.export.findUnique({ where: { id: exportId } });
8
+ },
9
+ async create(data) {
10
+ return await prisma.export.create({ data });
11
+ },
12
+ };
13
+ }
@@ -0,0 +1,3 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ import { ProjectProvider, StorageAdapter } from '../types';
3
+ export declare function createPrismaProjectProvider(prisma: PrismaClient, adapter: StorageAdapter): ProjectProvider;
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPrismaProjectProvider = createPrismaProjectProvider;
4
+ function createPrismaProjectProvider(prisma, adapter) {
5
+ return {
6
+ async getById(projectId, populateMembers = false) {
7
+ const project = await prisma.project.findUnique({
8
+ where: { id: projectId },
9
+ include: {
10
+ exports: { select: { id: true, collectionName: true } },
11
+ members: populateMembers ? true : false,
12
+ },
13
+ });
14
+ if (!project)
15
+ return null;
16
+ return formatProject(project);
17
+ },
18
+ async create(data) {
19
+ const newProject = await prisma.project.create({
20
+ data: {
21
+ dbType: data.dbType,
22
+ name: data.name,
23
+ description: data.description || '',
24
+ image: data.image || '',
25
+ allowUpload: data.allowUpload ?? true,
26
+ allowSharing: data.allowSharing ?? false,
27
+ members: {
28
+ create: data.members?.[0] ? {
29
+ userId: data.members[0].userId,
30
+ role: data.members[0].role,
31
+ archived: false,
32
+ } : undefined,
33
+ },
34
+ },
35
+ include: {
36
+ exports: { select: { id: true, collectionName: true } },
37
+ members: true,
38
+ },
39
+ });
40
+ return formatProject(newProject);
41
+ },
42
+ async update(projectId, updates) {
43
+ const updated = await prisma.project.update({
44
+ where: { id: projectId },
45
+ data: {
46
+ name: updates.name,
47
+ description: updates.description,
48
+ image: updates.image,
49
+ allowUpload: updates.settings?.allowUpload,
50
+ allowSharing: updates.settings?.allowSharing,
51
+ },
52
+ include: {
53
+ exports: { select: { id: true, collectionName: true } },
54
+ members: true,
55
+ },
56
+ });
57
+ if (!updated)
58
+ throw new Error('Project not found');
59
+ return formatProject(updated);
60
+ },
61
+ async list(userId) {
62
+ const all = await prisma.project.findMany({
63
+ where: userId ? { members: { some: { userId } } } : {},
64
+ include: {
65
+ members: true,
66
+ },
67
+ });
68
+ return all.map(doc => formatProjectList(doc, userId));
69
+ },
70
+ async delete(projectId) {
71
+ try {
72
+ await prisma.project.delete({ where: { id: projectId } });
73
+ await adapter.deleteProjectDirectory(projectId);
74
+ return { success: true };
75
+ }
76
+ catch (error) {
77
+ throw new Error('Project not found');
78
+ }
79
+ },
80
+ async archive(projectId, userId) {
81
+ await prisma.member.updateMany({
82
+ where: { projectId, userId },
83
+ data: { archived: true },
84
+ });
85
+ return { success: true, projects: await this.list(userId) };
86
+ },
87
+ async unarchive(projectId, userId) {
88
+ await prisma.member.updateMany({
89
+ where: { projectId, userId },
90
+ data: { archived: false },
91
+ });
92
+ return { success: true, projects: await this.list(userId) };
93
+ },
94
+ async getExport(projectId, exportId) {
95
+ const exportDoc = await prisma.export.findFirst({
96
+ where: { id: exportId, projectId: projectId },
97
+ });
98
+ if (!exportDoc)
99
+ throw new Error('Export not found');
100
+ return exportDoc;
101
+ },
102
+ async addExportToProject(projectId, exportId) {
103
+ // En Prisma, la relación ya está definida en el modelo Export.
104
+ // No es necesario actualizar el Project directamente.
105
+ // Si se necesita vincular un Export existente a un Project, se haría al crear o actualizar el Export.
106
+ // Por ejemplo, al crear un Export:
107
+ // prisma.export.create({ data: { ..., projectId: projectId } });
108
+ // O al actualizar un Export:
109
+ // prisma.export.update({ where: { id: exportId }, data: { projectId: projectId } });
110
+ // Dado que el método original de Mongoose solo añade el ID, asumimos que el Export ya existe y tiene el projectId correcto.
111
+ // Si la lógica requiere añadir un Export existente a un Project, y el Export no tiene el projectId, se debería actualizar el Export.
112
+ // Por ahora, no se requiere ninguna acción aquí si la relación ya está establecida en el modelo Export.
113
+ },
114
+ };
115
+ function formatProject(doc) {
116
+ return {
117
+ id: doc.id,
118
+ dbType: doc.dbType,
119
+ name: doc.name,
120
+ image: doc.image,
121
+ members: doc.members?.map((m) => ({
122
+ userId: m.userId,
123
+ username: m.username, // Asumimos que el username y email se obtendrán de un servicio externo si es necesario
124
+ email: m.email,
125
+ role: m.role,
126
+ archived: m.archived ?? false
127
+ })) || [],
128
+ description: doc.description,
129
+ folders: doc.folders || [], // Prisma usa 'folders' en lugar de 'rootFolders'
130
+ settings: {
131
+ allowUpload: doc.allowUpload,
132
+ allowSharing: doc.allowSharing,
133
+ },
134
+ exports: doc.exports || []
135
+ };
136
+ }
137
+ function formatProjectList(doc, userId) {
138
+ const archived = doc.members?.find((m) => m.userId === userId)?.archived ?? false;
139
+ return {
140
+ id: doc.id,
141
+ dbType: doc.dbType,
142
+ name: doc.name,
143
+ image: doc.image,
144
+ archived
145
+ };
146
+ }
147
+ }