@elchinabilov/nestjs-media-library 1.1.0 → 1.2.1
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 +106 -11
- package/dist/controllers/media.controller.d.ts +4 -3
- package/dist/controllers/media.controller.js +25 -9
- package/dist/controllers/media.controller.js.map +1 -1
- package/dist/entities/media.entity.d.ts +1 -0
- package/dist/entities/media.entity.js +4 -0
- package/dist/entities/media.entity.js.map +1 -1
- package/dist/migrations/1703000000000-CreateMediaTable.js +5 -0
- package/dist/migrations/1703000000000-CreateMediaTable.js.map +1 -1
- package/dist/services/media.service.d.ts +4 -3
- package/dist/services/media.service.js +17 -4
- package/dist/services/media.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,6 +7,7 @@ Complete NestJS media management library with S3 integration, automatic image op
|
|
|
7
7
|
✅ **Database Migrations** - TypeORM migrations included
|
|
8
8
|
✅ **Single/Multiple File Upload** - Support for both single and multiple file uploads
|
|
9
9
|
✅ **Retrieve Files** - Get files as objects or arrays
|
|
10
|
+
✅ **Custom Meta Data** - Add custom metadata (userId, organizationId, etc.) to each file
|
|
10
11
|
✅ **Automatic Image Optimization** - Built-in image compression to WebP format
|
|
11
12
|
✅ **Multiple Conversions** - Generate thumbnails, medium, large sizes automatically
|
|
12
13
|
✅ **AWS S3 Integration** - Seamless S3 upload support
|
|
@@ -92,24 +93,44 @@ import { MediaService } from "@elchinabilov/nestjs-media-library";
|
|
|
92
93
|
export class YourService {
|
|
93
94
|
constructor(private mediaService: MediaService) {}
|
|
94
95
|
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
// Upload with custom meta data
|
|
97
|
+
async uploadFile(file: Express.Multer.File, userId: string, orgId: string) {
|
|
98
|
+
const media = await this.mediaService.uploadSingle(file, {
|
|
99
|
+
userId: userId,
|
|
100
|
+
organizationId: orgId,
|
|
101
|
+
category: "document",
|
|
102
|
+
uploadedBy: "admin",
|
|
103
|
+
});
|
|
104
|
+
|
|
97
105
|
console.log("Original:", media.url);
|
|
98
106
|
console.log("Thumbnail:", media.conversions.thumbnail);
|
|
99
|
-
console.log("
|
|
107
|
+
console.log("Meta:", media.meta);
|
|
100
108
|
return media;
|
|
101
109
|
}
|
|
102
110
|
|
|
103
|
-
async uploadMultiple(files: Express.Multer.File[]) {
|
|
104
|
-
return await this.mediaService.uploadMultiple(files
|
|
111
|
+
async uploadMultiple(files: Express.Multer.File[], projectId: string) {
|
|
112
|
+
return await this.mediaService.uploadMultiple(files, {
|
|
113
|
+
projectId: projectId,
|
|
114
|
+
type: "gallery",
|
|
115
|
+
});
|
|
105
116
|
}
|
|
106
117
|
|
|
107
118
|
async getMedia(id: string) {
|
|
108
119
|
return await this.mediaService.findOne(id);
|
|
109
120
|
}
|
|
110
121
|
|
|
111
|
-
|
|
112
|
-
|
|
122
|
+
// Filter by meta data
|
|
123
|
+
async getOrganizationMedia(orgId: string) {
|
|
124
|
+
return await this.mediaService.findAll({ organizationId: orgId });
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Update meta data
|
|
128
|
+
async approveDocument(mediaId: string, adminId: string) {
|
|
129
|
+
return await this.mediaService.updateMeta(mediaId, {
|
|
130
|
+
status: "approved",
|
|
131
|
+
approvedBy: adminId,
|
|
132
|
+
approvedAt: new Date().toISOString(),
|
|
133
|
+
});
|
|
113
134
|
}
|
|
114
135
|
|
|
115
136
|
async deleteMedia(id: string) {
|
|
@@ -127,7 +148,14 @@ The package provides ready-to-use REST endpoints:
|
|
|
127
148
|
```bash
|
|
128
149
|
POST /media/upload
|
|
129
150
|
Content-Type: multipart/form-data
|
|
130
|
-
Body:
|
|
151
|
+
Body:
|
|
152
|
+
- file (form-data)
|
|
153
|
+
- meta (optional JSON string)
|
|
154
|
+
|
|
155
|
+
# Example with cURL:
|
|
156
|
+
curl -X POST http://localhost:3000/media/upload \
|
|
157
|
+
-F "file=@photo.jpg" \
|
|
158
|
+
-F 'meta={"userId":"123","organizationId":"org_456","category":"profile"}'
|
|
131
159
|
```
|
|
132
160
|
|
|
133
161
|
Response:
|
|
@@ -146,6 +174,11 @@ Response:
|
|
|
146
174
|
"medium": "https://bucket.s3.amazonaws.com/media/uuid-medium.webp",
|
|
147
175
|
"large": "https://bucket.s3.amazonaws.com/media/uuid-large.webp"
|
|
148
176
|
},
|
|
177
|
+
"meta": {
|
|
178
|
+
"userId": "123",
|
|
179
|
+
"organizationId": "org_456",
|
|
180
|
+
"category": "profile"
|
|
181
|
+
},
|
|
149
182
|
"disk": "s3",
|
|
150
183
|
"createdAt": "2024-01-01T00:00:00.000Z"
|
|
151
184
|
}
|
|
@@ -156,13 +189,17 @@ Response:
|
|
|
156
189
|
```bash
|
|
157
190
|
POST /media/upload-multiple
|
|
158
191
|
Content-Type: multipart/form-data
|
|
159
|
-
Body:
|
|
192
|
+
Body:
|
|
193
|
+
- files (form-data, multiple)
|
|
194
|
+
- meta (optional JSON string)
|
|
160
195
|
```
|
|
161
196
|
|
|
162
|
-
### Get All Media
|
|
197
|
+
### Get All Media (with optional filter)
|
|
163
198
|
|
|
164
199
|
```bash
|
|
165
200
|
GET /media
|
|
201
|
+
GET /media?organizationId=org_123
|
|
202
|
+
GET /media?userId=user_456&category=profile
|
|
166
203
|
```
|
|
167
204
|
|
|
168
205
|
### Get Single Media
|
|
@@ -171,6 +208,18 @@ GET /media
|
|
|
171
208
|
GET /media/:id
|
|
172
209
|
```
|
|
173
210
|
|
|
211
|
+
### Update Meta Data
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
PATCH /media/:id/meta
|
|
215
|
+
Content-Type: application/json
|
|
216
|
+
|
|
217
|
+
{
|
|
218
|
+
"status": "approved",
|
|
219
|
+
"approvedBy": "admin_123"
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
174
223
|
### Delete Media
|
|
175
224
|
|
|
176
225
|
```bash
|
|
@@ -244,15 +293,61 @@ export class CustomController {
|
|
|
244
293
|
@Post("avatar")
|
|
245
294
|
@UseInterceptors(FileInterceptor("avatar"))
|
|
246
295
|
async uploadAvatar(@UploadedFile() file: Express.Multer.File) {
|
|
247
|
-
const media = await this.mediaService.uploadSingle(file
|
|
296
|
+
const media = await this.mediaService.uploadSingle(file, {
|
|
297
|
+
type: "avatar",
|
|
298
|
+
category: "profile",
|
|
299
|
+
});
|
|
300
|
+
|
|
248
301
|
return {
|
|
249
302
|
avatarUrl: media.url,
|
|
250
303
|
thumbnailUrl: media.conversions?.thumbnail,
|
|
304
|
+
metadata: media.meta,
|
|
251
305
|
};
|
|
252
306
|
}
|
|
253
307
|
}
|
|
254
308
|
```
|
|
255
309
|
|
|
310
|
+
### Meta Data Usage Examples
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// E-commerce: Product image with metadata
|
|
314
|
+
await this.mediaService.uploadSingle(file, {
|
|
315
|
+
productId: "prod_123",
|
|
316
|
+
category: "product-image",
|
|
317
|
+
sku: "SKU-12345",
|
|
318
|
+
color: "red",
|
|
319
|
+
position: 0,
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
// SaaS: Company logo
|
|
323
|
+
await this.mediaService.uploadSingle(file, {
|
|
324
|
+
organizationId: "org_456",
|
|
325
|
+
companyName: "Acme Corp",
|
|
326
|
+
type: "logo",
|
|
327
|
+
planType: "premium",
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
// Social Media: Post images
|
|
331
|
+
await this.mediaService.uploadMultiple(files, {
|
|
332
|
+
userId: "user_789",
|
|
333
|
+
postId: "post_123",
|
|
334
|
+
hashtags: ["travel", "nature"],
|
|
335
|
+
location: "Baku, Azerbaijan",
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// Filter by meta
|
|
339
|
+
const orgMedia = await this.mediaService.findAll({
|
|
340
|
+
organizationId: "org_456",
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
// Update meta
|
|
344
|
+
await this.mediaService.updateMeta("media-id", {
|
|
345
|
+
status: "approved",
|
|
346
|
+
approvedBy: "admin_123",
|
|
347
|
+
approvedAt: new Date().toISOString(),
|
|
348
|
+
});
|
|
349
|
+
```
|
|
350
|
+
|
|
256
351
|
### Direct S3 Service Usage
|
|
257
352
|
|
|
258
353
|
```typescript
|
|
@@ -3,10 +3,11 @@ import { Media } from "../entities/media.entity";
|
|
|
3
3
|
export declare class MediaController {
|
|
4
4
|
private readonly mediaService;
|
|
5
5
|
constructor(mediaService: MediaService);
|
|
6
|
-
uploadSingle(file: Express.Multer.File): Promise<Media>;
|
|
7
|
-
uploadMultiple(files: Express.Multer.File[]): Promise<Media[]>;
|
|
8
|
-
findAll(): Promise<Media[]>;
|
|
6
|
+
uploadSingle(file: Express.Multer.File, meta?: string): Promise<Media>;
|
|
7
|
+
uploadMultiple(files: Express.Multer.File[], meta?: string): Promise<Media[]>;
|
|
8
|
+
findAll(filter?: Record<string, any>): Promise<Media[]>;
|
|
9
9
|
findOne(id: string): Promise<Media>;
|
|
10
|
+
updateMeta(id: string, meta: Record<string, any>): Promise<Media>;
|
|
10
11
|
delete(id: string): Promise<{
|
|
11
12
|
message: string;
|
|
12
13
|
}>;
|
|
@@ -20,18 +20,23 @@ let MediaController = class MediaController {
|
|
|
20
20
|
constructor(mediaService) {
|
|
21
21
|
this.mediaService = mediaService;
|
|
22
22
|
}
|
|
23
|
-
async uploadSingle(file) {
|
|
24
|
-
|
|
23
|
+
async uploadSingle(file, meta) {
|
|
24
|
+
const parsedMeta = meta ? JSON.parse(meta) : undefined;
|
|
25
|
+
return this.mediaService.uploadSingle(file, parsedMeta);
|
|
25
26
|
}
|
|
26
|
-
async uploadMultiple(files) {
|
|
27
|
-
|
|
27
|
+
async uploadMultiple(files, meta) {
|
|
28
|
+
const parsedMeta = meta ? JSON.parse(meta) : undefined;
|
|
29
|
+
return this.mediaService.uploadMultiple(files, parsedMeta);
|
|
28
30
|
}
|
|
29
|
-
async findAll() {
|
|
30
|
-
return this.mediaService.findAll();
|
|
31
|
+
async findAll(filter) {
|
|
32
|
+
return this.mediaService.findAll(filter);
|
|
31
33
|
}
|
|
32
34
|
async findOne(id) {
|
|
33
35
|
return this.mediaService.findOne(id);
|
|
34
36
|
}
|
|
37
|
+
async updateMeta(id, meta) {
|
|
38
|
+
return this.mediaService.updateMeta(id, meta);
|
|
39
|
+
}
|
|
35
40
|
async delete(id) {
|
|
36
41
|
await this.mediaService.delete(id);
|
|
37
42
|
return { message: "Media deleted successfully" };
|
|
@@ -42,22 +47,25 @@ __decorate([
|
|
|
42
47
|
(0, common_1.Post)("upload"),
|
|
43
48
|
(0, common_1.UseInterceptors)((0, platform_express_1.FileInterceptor)("file")),
|
|
44
49
|
__param(0, (0, common_1.UploadedFile)()),
|
|
50
|
+
__param(1, (0, common_1.Body)("meta")),
|
|
45
51
|
__metadata("design:type", Function),
|
|
46
|
-
__metadata("design:paramtypes", [Object]),
|
|
52
|
+
__metadata("design:paramtypes", [Object, String]),
|
|
47
53
|
__metadata("design:returntype", Promise)
|
|
48
54
|
], MediaController.prototype, "uploadSingle", null);
|
|
49
55
|
__decorate([
|
|
50
56
|
(0, common_1.Post)("upload-multiple"),
|
|
51
57
|
(0, common_1.UseInterceptors)((0, platform_express_1.FilesInterceptor)("files", 10)),
|
|
52
58
|
__param(0, (0, common_1.UploadedFiles)()),
|
|
59
|
+
__param(1, (0, common_1.Body)("meta")),
|
|
53
60
|
__metadata("design:type", Function),
|
|
54
|
-
__metadata("design:paramtypes", [Array]),
|
|
61
|
+
__metadata("design:paramtypes", [Array, String]),
|
|
55
62
|
__metadata("design:returntype", Promise)
|
|
56
63
|
], MediaController.prototype, "uploadMultiple", null);
|
|
57
64
|
__decorate([
|
|
58
65
|
(0, common_1.Get)(),
|
|
66
|
+
__param(0, (0, common_1.Query)()),
|
|
59
67
|
__metadata("design:type", Function),
|
|
60
|
-
__metadata("design:paramtypes", []),
|
|
68
|
+
__metadata("design:paramtypes", [Object]),
|
|
61
69
|
__metadata("design:returntype", Promise)
|
|
62
70
|
], MediaController.prototype, "findAll", null);
|
|
63
71
|
__decorate([
|
|
@@ -67,6 +75,14 @@ __decorate([
|
|
|
67
75
|
__metadata("design:paramtypes", [String]),
|
|
68
76
|
__metadata("design:returntype", Promise)
|
|
69
77
|
], MediaController.prototype, "findOne", null);
|
|
78
|
+
__decorate([
|
|
79
|
+
(0, common_1.Patch)(":id/meta"),
|
|
80
|
+
__param(0, (0, common_1.Param)("id")),
|
|
81
|
+
__param(1, (0, common_1.Body)()),
|
|
82
|
+
__metadata("design:type", Function),
|
|
83
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
84
|
+
__metadata("design:returntype", Promise)
|
|
85
|
+
], MediaController.prototype, "updateMeta", null);
|
|
70
86
|
__decorate([
|
|
71
87
|
(0, common_1.Delete)(":id"),
|
|
72
88
|
__param(0, (0, common_1.Param)("id")),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.controller.js","sourceRoot":"","sources":["../../src/controllers/media.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"media.controller.js","sourceRoot":"","sources":["../../src/controllers/media.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAYwB;AACxB,+DAA6E;AAC7E,6DAAyD;AAIlD,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAIrD,AAAN,KAAK,CAAC,YAAY,CACA,IAAyB,EAC3B,IAAa;QAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAIK,AAAN,KAAK,CAAC,cAAc,CACD,KAA4B,EAC/B,IAAa;QAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAU,MAA4B;QACjD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAc,EAAU;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAGK,AAAN,KAAK,CAAC,UAAU,CACD,EAAU,EACf,IAAyB;QAEjC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAc,EAAU;QAClC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACnD,CAAC;CACF,CAAA;AA9CY,0CAAe;AAKpB;IAFL,IAAA,aAAI,EAAC,QAAQ,CAAC;IACd,IAAA,wBAAe,EAAC,IAAA,kCAAe,EAAC,MAAM,CAAC,CAAC;IAEtC,WAAA,IAAA,qBAAY,GAAE,CAAA;IACd,WAAA,IAAA,aAAI,EAAC,MAAM,CAAC,CAAA;;;;mDAId;AAIK;IAFL,IAAA,aAAI,EAAC,iBAAiB,CAAC;IACvB,IAAA,wBAAe,EAAC,IAAA,mCAAgB,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAE5C,WAAA,IAAA,sBAAa,GAAE,CAAA;IACf,WAAA,IAAA,aAAI,EAAC,MAAM,CAAC,CAAA;;;;qDAId;AAGK;IADL,IAAA,YAAG,GAAE;IACS,WAAA,IAAA,cAAK,GAAE,CAAA;;;;8CAErB;AAGK;IADL,IAAA,YAAG,EAAC,KAAK,CAAC;IACI,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;8CAEzB;AAGK;IADL,IAAA,cAAK,EAAC,UAAU,CAAC;IAEf,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;IACX,WAAA,IAAA,aAAI,GAAE,CAAA;;;;iDAGR;AAGK;IADL,IAAA,eAAM,EAAC,KAAK,CAAC;IACA,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;6CAGxB;0BA7CU,eAAe;IAD3B,IAAA,mBAAU,EAAC,OAAO,CAAC;qCAEyB,4BAAY;GAD5C,eAAe,CA8C3B"}
|
|
@@ -50,6 +50,10 @@ __decorate([
|
|
|
50
50
|
(0, typeorm_1.Column)({ nullable: true }),
|
|
51
51
|
__metadata("design:type", String)
|
|
52
52
|
], Media.prototype, "disk", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
(0, typeorm_1.Column)({ type: "json", nullable: true }),
|
|
55
|
+
__metadata("design:type", Object)
|
|
56
|
+
], Media.prototype, "meta", void 0);
|
|
53
57
|
__decorate([
|
|
54
58
|
(0, typeorm_1.CreateDateColumn)(),
|
|
55
59
|
__metadata("design:type", Date)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.entity.js","sourceRoot":"","sources":["../../src/entities/media.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAKiB;AAGV,IAAM,KAAK,GAAX,MAAM,KAAK;
|
|
1
|
+
{"version":3,"file":"media.entity.js","sourceRoot":"","sources":["../../src/entities/media.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAKiB;AAGV,IAAM,KAAK,GAAX,MAAM,KAAK;CAiCjB,CAAA;AAjCY,sBAAK;AAEhB;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;iCACpB;AAGX;IADC,IAAA,gBAAM,GAAE;;uCACQ;AAGjB;IADC,IAAA,gBAAM,GAAE;;2CACY;AAGrB;IADC,IAAA,gBAAM,GAAE;;uCACQ;AAGjB;IADC,IAAA,gBAAM,GAAE;;mCACI;AAGb;IADC,IAAA,gBAAM,GAAE;;mCACI;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kCACf;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACL;AAGpC;IADC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mCACd;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mCACf;AAG1B;IADC,IAAA,0BAAgB,GAAE;8BACR,IAAI;wCAAC;gBAhCL,KAAK;IADjB,IAAA,gBAAM,EAAC,OAAO,CAAC;GACH,KAAK,CAiCjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"1703000000000-CreateMediaTable.js","sourceRoot":"","sources":["../../src/migrations/1703000000000-CreateMediaTable.ts"],"names":[],"mappings":";;;AAAA,qCAAiE;AAEjE,MAAa,6BAA6B;IACjC,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,MAAM,WAAW,CAAC,WAAW,CAC3B,IAAI,eAAK,CAAC;YACR,IAAI,EAAE,OAAO;YACb,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,IAAI;iBAChB;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACf;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,mBAAmB;iBAC7B;aACF;SACF,CAAC,EACF,IAAI,CACL,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB;QACxC,MAAM,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"1703000000000-CreateMediaTable.js","sourceRoot":"","sources":["../../src/migrations/1703000000000-CreateMediaTable.ts"],"names":[],"mappings":";;;AAAA,qCAAiE;AAEjE,MAAa,6BAA6B;IACjC,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,MAAM,WAAW,CAAC,WAAW,CAC3B,IAAI,eAAK,CAAC;YACR,IAAI,EAAE,OAAO;YACb,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,IAAI;iBAChB;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACf;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,mBAAmB;iBAC7B;aACF;SACF,CAAC,EACF,IAAI,CACL,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB;QACxC,MAAM,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;CACF;AAlED,sEAkEC"}
|
|
@@ -9,9 +9,10 @@ export declare class MediaService {
|
|
|
9
9
|
private s3Service;
|
|
10
10
|
private imageService;
|
|
11
11
|
constructor(mediaRepository: Repository<Media>, config: MediaLibraryConfig, s3Service: S3Service, imageService: ImageService);
|
|
12
|
-
uploadSingle(file: Express.Multer.File): Promise<Media>;
|
|
13
|
-
uploadMultiple(files: Express.Multer.File[]): Promise<Media[]>;
|
|
12
|
+
uploadSingle(file: Express.Multer.File, meta?: Record<string, any>): Promise<Media>;
|
|
13
|
+
uploadMultiple(files: Express.Multer.File[], meta?: Record<string, any>): Promise<Media[]>;
|
|
14
14
|
findOne(id: string): Promise<Media>;
|
|
15
|
-
findAll(): Promise<Media[]>;
|
|
15
|
+
findAll(filter?: Record<string, any>): Promise<Media[]>;
|
|
16
|
+
updateMeta(id: string, meta: Record<string, any>): Promise<Media>;
|
|
16
17
|
delete(id: string): Promise<void>;
|
|
17
18
|
}
|
|
@@ -62,7 +62,7 @@ let MediaService = class MediaService {
|
|
|
62
62
|
this.s3Service = s3Service;
|
|
63
63
|
this.imageService = imageService;
|
|
64
64
|
}
|
|
65
|
-
async uploadSingle(file) {
|
|
65
|
+
async uploadSingle(file, meta) {
|
|
66
66
|
const filename = `${(0, uuid_1.v4)()}${path.extname(file.originalname)}`;
|
|
67
67
|
const filePath = `${this.config.uploadPath || "uploads"}/${filename}`;
|
|
68
68
|
let url;
|
|
@@ -110,11 +110,12 @@ let MediaService = class MediaService {
|
|
|
110
110
|
url,
|
|
111
111
|
conversions: Object.keys(conversions).length > 0 ? conversions : null,
|
|
112
112
|
disk: this.config.disk || "local",
|
|
113
|
+
meta: meta || null,
|
|
113
114
|
});
|
|
114
115
|
return this.mediaRepository.save(media);
|
|
115
116
|
}
|
|
116
|
-
async uploadMultiple(files) {
|
|
117
|
-
const uploadPromises = files.map((file) => this.uploadSingle(file));
|
|
117
|
+
async uploadMultiple(files, meta) {
|
|
118
|
+
const uploadPromises = files.map((file) => this.uploadSingle(file, meta));
|
|
118
119
|
return Promise.all(uploadPromises);
|
|
119
120
|
}
|
|
120
121
|
async findOne(id) {
|
|
@@ -124,9 +125,21 @@ let MediaService = class MediaService {
|
|
|
124
125
|
}
|
|
125
126
|
return media;
|
|
126
127
|
}
|
|
127
|
-
async findAll() {
|
|
128
|
+
async findAll(filter) {
|
|
129
|
+
if (filter && Object.keys(filter).length > 0) {
|
|
130
|
+
return this.mediaRepository
|
|
131
|
+
.createQueryBuilder("media")
|
|
132
|
+
.where("media.meta @> :filter", { filter: JSON.stringify(filter) })
|
|
133
|
+
.orderBy("media.createdAt", "DESC")
|
|
134
|
+
.getMany();
|
|
135
|
+
}
|
|
128
136
|
return this.mediaRepository.find({ order: { createdAt: "DESC" } });
|
|
129
137
|
}
|
|
138
|
+
async updateMeta(id, meta) {
|
|
139
|
+
const media = await this.findOne(id);
|
|
140
|
+
media.meta = { ...media.meta, ...meta };
|
|
141
|
+
return this.mediaRepository.save(media);
|
|
142
|
+
}
|
|
130
143
|
async delete(id) {
|
|
131
144
|
const media = await this.findOne(id);
|
|
132
145
|
if (media.disk === "s3") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAuE;AACvE,6CAAmD;AACnD,qCAAqC;AACrC,+BAAoC;AACpC,2CAA6B;AAC7B,gDAAkC;AAClC,2DAAiD;AAEjD,6CAAyC;AACzC,mDAA+C;AAGxC,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB,YAEU,eAAkC,EAElC,MAA0B,EAE1B,SAAoB,EACpB,YAA0B;QAL1B,oBAAe,GAAf,eAAe,CAAmB;QAElC,WAAM,GAAN,MAAM,CAAoB;QAE1B,cAAS,GAAT,SAAS,CAAW;QACpB,iBAAY,GAAZ,YAAY,CAAc;IACjC,CAAC;IAEJ,KAAK,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"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"}
|