streamby-core 0.9.12 → 0.9.14

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.
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.createS3Adapter = createS3Adapter;
7
- const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
8
7
  const client_s3_1 = require("@aws-sdk/client-s3");
8
+ const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
9
9
  const bcrypt_1 = __importDefault(require("bcrypt"));
10
10
  function createS3Adapter(config) {
11
11
  const s3 = new client_s3_1.S3Client({
@@ -37,5 +37,21 @@ function createS3Adapter(config) {
37
37
  const result = await s3.send(command);
38
38
  return result.Contents || [];
39
39
  },
40
+ async deleteProjectDirectory(projectId) {
41
+ const listCommand = new client_s3_1.ListObjectsV2Command({
42
+ Bucket: config.bucket,
43
+ Prefix: `${projectId}/`,
44
+ });
45
+ const listedObjects = await s3.send(listCommand);
46
+ if (!listedObjects.Contents || listedObjects.Contents.length === 0)
47
+ return;
48
+ const deleteCommand = new client_s3_1.DeleteObjectsCommand({
49
+ Bucket: config.bucket,
50
+ Delete: {
51
+ Objects: listedObjects.Contents.map((item) => ({ Key: item.Key })),
52
+ },
53
+ });
54
+ await s3.send(deleteCommand);
55
+ },
40
56
  };
41
57
  }
@@ -105,6 +105,21 @@ function createStreamByRouter(config) {
105
105
  res.status(500).json({ error: 'Failed to create project', details: err.message });
106
106
  }
107
107
  });
108
+ router.delete('/projects/:id', async (req, res) => {
109
+ try {
110
+ const auth = await config.authProvider(req);
111
+ const projectId = req.params.id;
112
+ if (auth.role !== 'admin' && auth.role !== 'editor') {
113
+ return res.status(403).json({ error: 'Permission denied' });
114
+ }
115
+ await config.projectProvider.delete(projectId);
116
+ await adapter.deleteProjectDirectory(projectId);
117
+ res.status(200).json({ success: true });
118
+ }
119
+ catch (err) {
120
+ res.status(500).json({ error: 'Failed to delete project', details: err.message });
121
+ }
122
+ });
108
123
  router.get('/projects', async (req, res) => {
109
124
  try {
110
125
  const auth = await config.authProvider(req);
@@ -1,3 +1,3 @@
1
- import { ProjectProvider } from '../types';
1
+ import { ProjectProvider, StorageAdapter } from '../types';
2
2
  import { Model } from 'mongoose';
3
- export declare function createMongoProjectProvider(ProjectModel: Model<any>): ProjectProvider;
3
+ export declare function createMongoProjectProvider(ProjectModel: Model<any>, adapter: StorageAdapter): ProjectProvider;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createMongoProjectProvider = createMongoProjectProvider;
4
- function createMongoProjectProvider(ProjectModel) {
4
+ function createMongoProjectProvider(ProjectModel, adapter) {
5
5
  return {
6
6
  async getById(projectId) {
7
7
  const project = await ProjectModel.findById(projectId);
@@ -36,6 +36,16 @@ function createMongoProjectProvider(ProjectModel) {
36
36
  const query = userId ? { 'members.userId': userId } : {};
37
37
  const all = await ProjectModel.find(query);
38
38
  return all.map(formatProject);
39
+ },
40
+ async delete(projectId) {
41
+ try {
42
+ await ProjectModel.findByIdAndDelete(projectId);
43
+ await adapter.deleteProjectDirectory(projectId);
44
+ return { success: true };
45
+ }
46
+ catch (error) {
47
+ throw new Error('Project not found');
48
+ }
39
49
  }
40
50
  };
41
51
  }
@@ -10,6 +10,7 @@ export type StorageProviderType = 's3';
10
10
  export interface StorageAdapter {
11
11
  listFiles(projectId: string): Promise<any[]>;
12
12
  getPresignedUrl?: (filename: string, contentType: string, projectId: string) => Promise<any>;
13
+ deleteProjectDirectory: (projectId: string) => Promise<void>;
13
14
  }
14
15
  export interface ProjectInfo {
15
16
  id: string;
@@ -50,6 +51,9 @@ export type AuthProvider = (req: Request) => Promise<AuthContext>;
50
51
  export interface ProjectProvider {
51
52
  list(userId?: string): Promise<ProjectInfo[]>;
52
53
  getById(projectId: string): Promise<ProjectInfo>;
54
+ delete(projectId: string): Promise<{
55
+ success: boolean;
56
+ }>;
53
57
  update(projectId: string, updates: Partial<Omit<ProjectInfo, 'id' | 'rootFolders'>>): Promise<ProjectInfo>;
54
58
  create(data: {
55
59
  name: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "streamby-core",
3
- "version": "0.9.12",
3
+ "version": "0.9.14",
4
4
  "description": "StreamBy middleware framework for media storage management",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",