streamby-core 0.9.19 → 0.9.20

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.
@@ -23,7 +23,17 @@ function createS3Adapter(config) {
23
23
  const publicUrl = `https://${config.bucket}.s3.${config.region}.amazonaws.com/${encodeURIComponent(key)}`;
24
24
  return { url, publicUrl };
25
25
  },
26
- async getPresignedUrl(filename, contentType, projectId) {
26
+ async deleteProjectImage(projectId) {
27
+ const key = `${projectId}/project-image`;
28
+ const command = new client_s3_1.DeleteObjectsCommand({
29
+ Bucket: config.bucket,
30
+ Delete: {
31
+ Objects: [{ Key: key }],
32
+ },
33
+ });
34
+ await s3.send(command);
35
+ },
36
+ async getPresignedUrl(contentType, projectId) {
27
37
  const key = `${projectId}/${contentType}/file-${Date.now()}`;
28
38
  const command = new client_s3_1.PutObjectCommand({
29
39
  Bucket: config.bucket,
@@ -45,6 +45,24 @@ function createStreamByRouter(config) {
45
45
  res.status(500).json({ error: 'Failed to generate presigned URL', details: err.message });
46
46
  }
47
47
  });
48
+ router.delete('/delete-project-image-url/:id', async (req, res) => {
49
+ try {
50
+ const auth = await config.authProvider(req);
51
+ if (auth.role !== 'admin' && auth.role !== 'editor') {
52
+ return res.status(403).json({ error: 'Permission denied' });
53
+ }
54
+ const projectId = req.params.id;
55
+ if (!projectId) {
56
+ return res.status(400).json({ error: 'Missing filename, contentType, or projectId' });
57
+ }
58
+ await (0, file_1.deleteProjectImage)(adapter, projectId);
59
+ const updated = await (0, project_1.deleteProjectImageService)(req, config.authProvider, config.projectProvider);
60
+ res.status(201).json(updated);
61
+ }
62
+ catch (err) {
63
+ res.status(500).json({ error: 'Failed to generate presigned URL', details: err.message });
64
+ }
65
+ });
48
66
  router.post('/upload-url', async (req, res) => {
49
67
  try {
50
68
  const auth = await config.authProvider(req);
@@ -55,7 +73,7 @@ function createStreamByRouter(config) {
55
73
  if (!filename || !contentType || !projectId) {
56
74
  return res.status(400).json({ error: 'Missing filename, contentType, or projectId' });
57
75
  }
58
- const url = await (0, presign_1.getPresignedUrl)(adapter, filename, contentType, projectId);
76
+ const url = await (0, presign_1.getPresignedUrl)(adapter, contentType, projectId);
59
77
  res.json(url);
60
78
  }
61
79
  catch (err) {
@@ -1,3 +1,4 @@
1
1
  import { StorageAdapter } from '../types';
2
2
  import { Request } from 'express';
3
3
  export declare function listFilesService(adapter: StorageAdapter, req: Request, projectId: string): Promise<any[]>;
4
+ export declare function deleteProjectImage(adapter: StorageAdapter, projectId: string): Promise<any>;
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.listFilesService = listFilesService;
4
+ exports.deleteProjectImage = deleteProjectImage;
4
5
  async function listFilesService(adapter, req, projectId) {
5
6
  return adapter.listFiles(projectId);
6
7
  }
8
+ async function deleteProjectImage(adapter, projectId) {
9
+ if (!('deleteProjectImage' in adapter)) {
10
+ throw new Error('StorageAdapter does not support deleting project images');
11
+ }
12
+ return adapter.deleteProjectImage(projectId);
13
+ }
@@ -1,3 +1,3 @@
1
1
  import { StorageAdapter } from '../types';
2
- export declare function getPresignedUrl(adapter: StorageAdapter, filename: string, contentType: string, projectId: string): Promise<any>;
2
+ export declare function getPresignedUrl(adapter: StorageAdapter, contentType: string, projectId: string): Promise<any>;
3
3
  export declare function getPresignedProjectImageUrl(adapter: StorageAdapter, projectId: string): Promise<any>;
@@ -2,11 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getPresignedUrl = getPresignedUrl;
4
4
  exports.getPresignedProjectImageUrl = getPresignedProjectImageUrl;
5
- async function getPresignedUrl(adapter, filename, contentType, projectId) {
5
+ async function getPresignedUrl(adapter, contentType, projectId) {
6
6
  if (!('getPresignedUrl' in adapter)) {
7
7
  throw new Error('StorageAdapter does not support presigned URLs');
8
8
  }
9
- return adapter.getPresignedUrl(filename, contentType, projectId);
9
+ return adapter.getPresignedUrl(contentType, projectId);
10
10
  }
11
11
  async function getPresignedProjectImageUrl(adapter, projectId) {
12
12
  if (!('getPresignedProjectImageUrl' in adapter)) {
@@ -4,3 +4,10 @@ export declare function createProjectService(req: Request, authProvider: AuthPro
4
4
  success: boolean;
5
5
  project: import("../types").ProjectInfo;
6
6
  }>;
7
+ export declare function updateProjectService(req: Request, authProvider: AuthProvider, projectProvider: ProjectProvider): Promise<{
8
+ success: boolean;
9
+ project: import("../types").ProjectInfo;
10
+ }>;
11
+ export declare function deleteProjectImageService(req: Request, authProvider: AuthProvider, projectProvider: ProjectProvider): Promise<{
12
+ success: boolean;
13
+ }>;
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createProjectService = createProjectService;
4
+ exports.updateProjectService = updateProjectService;
5
+ exports.deleteProjectImageService = deleteProjectImageService;
4
6
  async function createProjectService(req, authProvider, projectProvider) {
5
7
  const { name, description } = req.body;
6
8
  const auth = await authProvider(req);
@@ -17,3 +19,35 @@ async function createProjectService(req, authProvider, projectProvider) {
17
19
  project: newProject,
18
20
  };
19
21
  }
22
+ async function updateProjectService(req, authProvider, projectProvider) {
23
+ const { projectId } = req.params;
24
+ const updates = req.body;
25
+ const auth = await authProvider(req);
26
+ const project = await projectProvider.getById(projectId);
27
+ if (!project) {
28
+ throw new Error('Project not found');
29
+ }
30
+ if (!project.members?.find((e) => e.userId === auth.userId)) {
31
+ throw new Error('Unauthorized');
32
+ }
33
+ const updatedProject = await projectProvider.update(projectId, updates);
34
+ return {
35
+ success: true,
36
+ project: updatedProject,
37
+ };
38
+ }
39
+ async function deleteProjectImageService(req, authProvider, projectProvider) {
40
+ const { projectId } = req.params;
41
+ const auth = await authProvider(req);
42
+ const project = await projectProvider.getById(projectId);
43
+ if (!project) {
44
+ throw new Error('Project not found');
45
+ }
46
+ if (!project.members?.find((e) => e.userId === auth.userId)) {
47
+ throw new Error('Unauthorized');
48
+ }
49
+ await projectProvider.update(projectId, { image: '' });
50
+ return {
51
+ success: true,
52
+ };
53
+ }
@@ -9,8 +9,9 @@ export interface S3Config {
9
9
  export type StorageProviderType = 's3';
10
10
  export interface StorageAdapter {
11
11
  listFiles(projectId: string): Promise<any[]>;
12
+ deleteProjectImage: (projectId: string) => Promise<any>;
12
13
  deleteProjectDirectory: (projectId: string) => Promise<any>;
13
- getPresignedUrl?: (filename: string, contentType: string, projectId: string) => Promise<any>;
14
+ getPresignedUrl?: (contentType: string, projectId: string) => Promise<any>;
14
15
  getPresignedProjectImageUrl?: (projectId: string) => Promise<any>;
15
16
  }
16
17
  export interface ProjectInfo {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "streamby-core",
3
- "version": "0.9.19",
3
+ "version": "0.9.20",
4
4
  "description": "StreamBy middleware framework for media storage management",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",