@tomei/media 0.1.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/.commitlintrc.json +22 -0
- package/.eslintrc.js +66 -0
- package/.husky/commit-msg +4 -0
- package/.husky/pre-commit +4 -0
- package/.prettierrc +4 -0
- package/.prettierrc copy +4 -0
- package/README.md +93 -0
- package/dist/base/base.medias.d.ts +37 -0
- package/dist/base/base.medias.js +161 -0
- package/dist/base/base.medias.js.map +1 -0
- package/dist/base/base.repository.abstract.d.ts +12 -0
- package/dist/base/base.repository.abstract.js +22 -0
- package/dist/base/base.repository.abstract.js.map +1 -0
- package/dist/base/base.repository.interface.d.ts +9 -0
- package/dist/base/base.repository.interface.js +3 -0
- package/dist/base/base.repository.interface.js.map +1 -0
- package/dist/common/common.module.d.ts +2 -0
- package/dist/common/common.module.js +23 -0
- package/dist/common/common.module.js.map +1 -0
- package/dist/common/common.service.d.ts +13 -0
- package/dist/common/common.service.js +108 -0
- package/dist/common/common.service.js.map +1 -0
- package/dist/common/dto/add-field-translation.dto.d.ts +7 -0
- package/dist/common/dto/add-field-translation.dto.js +42 -0
- package/dist/common/dto/add-field-translation.dto.js.map +1 -0
- package/dist/common/dto/get-media.dto.d.ts +5 -0
- package/dist/common/dto/get-media.dto.js +29 -0
- package/dist/common/dto/get-media.dto.js.map +1 -0
- package/dist/dto/external-media.dto.d.ts +10 -0
- package/dist/dto/external-media.dto.js +70 -0
- package/dist/dto/external-media.dto.js.map +1 -0
- package/dist/dto/internal-medias.dto.d.ts +12 -0
- package/dist/dto/internal-medias.dto.js +87 -0
- package/dist/dto/internal-medias.dto.js.map +1 -0
- package/dist/entities/medias.entity.d.ts +21 -0
- package/dist/entities/medias.entity.js +152 -0
- package/dist/entities/medias.entity.js.map +1 -0
- package/dist/enum/index.d.ts +2 -0
- package/dist/enum/index.js +6 -0
- package/dist/enum/index.js.map +1 -0
- package/dist/enum/medias.enum.d.ts +5 -0
- package/dist/enum/medias.enum.js +10 -0
- package/dist/enum/medias.enum.js.map +1 -0
- package/dist/helpers/error.d.ts +1 -0
- package/dist/helpers/error.js +14 -0
- package/dist/helpers/error.js.map +1 -0
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.js +6 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/base.medias-attr.interface.d.ts +20 -0
- package/dist/interfaces/base.medias-attr.interface.js +3 -0
- package/dist/interfaces/base.medias-attr.interface.js.map +1 -0
- package/dist/interfaces/medias.repository.interface.d.ts +3 -0
- package/dist/interfaces/medias.repository.interface.js +3 -0
- package/dist/interfaces/medias.repository.interface.js.map +1 -0
- package/dist/medias.controller.d.ts +25 -0
- package/dist/medias.controller.js +225 -0
- package/dist/medias.controller.js.map +1 -0
- package/dist/medias.d.ts +42 -0
- package/dist/medias.js +373 -0
- package/dist/medias.js.map +1 -0
- package/dist/medias.module.d.ts +2 -0
- package/dist/medias.module.js +32 -0
- package/dist/medias.module.js.map +1 -0
- package/dist/medias.repository.d.ts +16 -0
- package/dist/medias.repository.js +47 -0
- package/dist/medias.repository.js.map +1 -0
- package/dist/pipe/append-id.pipe.d.ts +6 -0
- package/dist/pipe/append-id.pipe.js +28 -0
- package/dist/pipe/append-id.pipe.js.map +1 -0
- package/dist/pipe/validate-enum.pipe.d.ts +6 -0
- package/dist/pipe/validate-enum.pipe.js +34 -0
- package/dist/pipe/validate-enum.pipe.js.map +1 -0
- package/dist/pipe/validate-id.pipe.d.ts +6 -0
- package/dist/pipe/validate-id.pipe.js +31 -0
- package/dist/pipe/validate-id.pipe.js.map +1 -0
- package/dist/pipe/validate-search.pipe.d.ts +7 -0
- package/dist/pipe/validate-search.pipe.js +46 -0
- package/dist/pipe/validate-search.pipe.js.map +1 -0
- package/dist/responses/deleted.response.d.ts +3 -0
- package/dist/responses/deleted.response.js +21 -0
- package/dist/responses/deleted.response.js.map +1 -0
- package/dist/responses/pagination.response.d.ts +5 -0
- package/dist/responses/pagination.response.js +26 -0
- package/dist/responses/pagination.response.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/nest-cli.json +19 -0
- package/package.json +60 -0
- package/src/base/base.medias.ts +200 -0
- package/src/base/base.repository.abstract.ts +28 -0
- package/src/base/base.repository.interface.ts +9 -0
- package/src/common/common.module.ts +10 -0
- package/src/common/common.service.ts +109 -0
- package/src/common/dto/add-field-translation.dto.ts +23 -0
- package/src/common/dto/get-media.dto.ts +12 -0
- package/src/dto/external-media.dto.ts +49 -0
- package/src/dto/internal-medias.dto.ts +64 -0
- package/src/entities/medias.entity.ts +125 -0
- package/src/enum/index.ts +3 -0
- package/src/enum/medias.enum.ts +5 -0
- package/src/helpers/error.ts +12 -0
- package/src/helpers/index.ts +3 -0
- package/src/index.ts +13 -0
- package/src/interfaces/base.medias-attr.interface.ts +21 -0
- package/src/interfaces/medias.repository.interface.ts +4 -0
- package/src/medias.controller.ts +244 -0
- package/src/medias.module.ts +19 -0
- package/src/medias.repository.ts +44 -0
- package/src/medias.ts +494 -0
- package/src/pipe/append-id.pipe.ts +15 -0
- package/src/pipe/validate-enum.pipe.ts +31 -0
- package/src/pipe/validate-id.pipe.ts +18 -0
- package/src/pipe/validate-search.pipe.ts +41 -0
- package/src/responses/deleted.response.ts +6 -0
- package/src/responses/pagination.response.ts +10 -0
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +30 -0
- package/tslint.json +18 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
15
|
+
var t = {};
|
|
16
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
17
|
+
t[p] = s[p];
|
|
18
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
19
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
20
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
21
|
+
t[p[i]] = s[p[i]];
|
|
22
|
+
}
|
|
23
|
+
return t;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.MediasController = void 0;
|
|
27
|
+
const common_1 = require("@nestjs/common");
|
|
28
|
+
const platform_express_1 = require("@nestjs/platform-express");
|
|
29
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
30
|
+
const cuid = require("cuid");
|
|
31
|
+
const common_service_1 = require("./common/common.service");
|
|
32
|
+
const validate_search_pipe_1 = require("./pipe/validate-search.pipe");
|
|
33
|
+
const external_media_dto_1 = require("./dto/external-media.dto");
|
|
34
|
+
const internal_medias_dto_1 = require("./dto/internal-medias.dto");
|
|
35
|
+
const medias_entity_1 = require("./entities/medias.entity");
|
|
36
|
+
const medias_1 = require("./medias");
|
|
37
|
+
const sequelize_1 = require("sequelize");
|
|
38
|
+
const validate_id_pipe_1 = require("./pipe/validate-id.pipe");
|
|
39
|
+
let MediasController = class MediasController {
|
|
40
|
+
constructor(mediaRepository, commonService) {
|
|
41
|
+
this.mediaRepository = mediaRepository;
|
|
42
|
+
this.commonService = commonService;
|
|
43
|
+
}
|
|
44
|
+
async createInternal(fileStream, createMedia) {
|
|
45
|
+
try {
|
|
46
|
+
const mediaAttr = Object.assign(Object.assign({}, createMedia), { MediaId: cuid(), IsExternalYN: 'N', ExternalSource: '', URL: '', FilePath: '', CreatedAt: new Date(), UpdatedAt: new Date(), CreatedById: 'test_user', UpdatedById: 'test_user' });
|
|
47
|
+
const media = new medias_1.Medias(this.mediaRepository, this.commonService, mediaAttr);
|
|
48
|
+
const createdData = await media.createMedias(false, fileStream);
|
|
49
|
+
return createdData;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async createExternal(createMedia) {
|
|
56
|
+
const mediaAttr = Object.assign(Object.assign({}, createMedia), { MediaId: cuid(), IsExternalYN: 'Y', CreatedAt: new Date(), UpdatedAt: new Date(), IsEncryptedYN: 'N', FilePath: '', FileName: '', FileExtension: '', CreatedById: 'test_user', UpdatedById: 'test_user' });
|
|
57
|
+
const media = new medias_1.Medias(this.mediaRepository, this.commonService, mediaAttr);
|
|
58
|
+
await media.createMedias(true);
|
|
59
|
+
return mediaAttr;
|
|
60
|
+
}
|
|
61
|
+
async findAll(rows, page, search) {
|
|
62
|
+
let searchObj;
|
|
63
|
+
try {
|
|
64
|
+
searchObj = search ? JSON.parse(search) : {};
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
throw new common_1.BadRequestException('Bad value for search.');
|
|
68
|
+
}
|
|
69
|
+
const mediaFilter = __rest(searchObj, []);
|
|
70
|
+
const queryObj = {};
|
|
71
|
+
Object.entries(mediaFilter).forEach(([key, value]) => {
|
|
72
|
+
queryObj[key] = {
|
|
73
|
+
[sequelize_1.Op.substring]: value,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
const offset = rows * (page - 1);
|
|
77
|
+
const options = {
|
|
78
|
+
order: [['CreatedAt', 'DESC']],
|
|
79
|
+
limit: rows,
|
|
80
|
+
offset: offset,
|
|
81
|
+
where: queryObj,
|
|
82
|
+
distinct: true,
|
|
83
|
+
};
|
|
84
|
+
const media = new medias_1.Medias(this.mediaRepository, this.commonService);
|
|
85
|
+
return media.findAllWithPagination(options);
|
|
86
|
+
}
|
|
87
|
+
async findOne(id) {
|
|
88
|
+
const media = new medias_1.Medias(this.mediaRepository, this.commonService);
|
|
89
|
+
const file = await media.findOne({ where: { MediaId: id } });
|
|
90
|
+
return file;
|
|
91
|
+
}
|
|
92
|
+
async getFile(id, res) {
|
|
93
|
+
let media = new medias_1.Medias(this.mediaRepository, this.commonService);
|
|
94
|
+
const mediaData = await media.findOne({ where: { MediaId: id } });
|
|
95
|
+
media = new medias_1.Medias(this.mediaRepository, this.commonService, Object.assign({}, mediaData.get({ plain: true })));
|
|
96
|
+
const fileBuffer = await media.getFile();
|
|
97
|
+
res.set({
|
|
98
|
+
'Content-Type': 'application/octet-stream',
|
|
99
|
+
'Content-Disposition': `attachment; filename=${mediaData.FileName}.${mediaData.FileExtension}`,
|
|
100
|
+
'Content-Length': fileBuffer.length,
|
|
101
|
+
});
|
|
102
|
+
return new common_1.StreamableFile(fileBuffer);
|
|
103
|
+
}
|
|
104
|
+
async delete(id) {
|
|
105
|
+
try {
|
|
106
|
+
let media = new medias_1.Medias(this.mediaRepository, this.commonService);
|
|
107
|
+
const mediaData = await media.findOne({ where: { MediaId: id } });
|
|
108
|
+
const mediaAttr = Object.assign(Object.assign({}, mediaData.get({ plain: true })), { UpdatedAt: new Date(), UpdatedById: 'test_user' });
|
|
109
|
+
media = new medias_1.Medias(this.mediaRepository, this.commonService, mediaAttr);
|
|
110
|
+
return await media.delete();
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async updateExternal(id, updatedMedia) {
|
|
117
|
+
let media = new medias_1.Medias(this.mediaRepository, this.commonService);
|
|
118
|
+
const mediaData = await media.findOne({ where: { MediaId: id } });
|
|
119
|
+
const mediaAttr = Object.assign(Object.assign(Object.assign({}, mediaData.get({ plain: true })), updatedMedia), { UpdatedAt: new Date(), UpdatedById: 'test_user' });
|
|
120
|
+
media = new medias_1.Medias(this.mediaRepository, this.commonService, mediaAttr);
|
|
121
|
+
await media.updateMedias(true);
|
|
122
|
+
}
|
|
123
|
+
async updateInternal(fileStream, id, updatedMedia) {
|
|
124
|
+
try {
|
|
125
|
+
let media = new medias_1.Medias(this.mediaRepository, this.commonService);
|
|
126
|
+
const mediaData = await media.findOne({ where: { MediaId: id } });
|
|
127
|
+
const mediaAttr = Object.assign(Object.assign(Object.assign({}, mediaData.get({ plain: true })), updatedMedia), { UpdatedAt: new Date(), UpdatedById: 'test_user' });
|
|
128
|
+
media = new medias_1.Medias(this.mediaRepository, this.commonService, mediaAttr);
|
|
129
|
+
await media.updateMedias(false, fileStream);
|
|
130
|
+
return mediaAttr;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
__decorate([
|
|
138
|
+
(0, common_1.Post)('internal'),
|
|
139
|
+
(0, common_1.UseInterceptors)((0, platform_express_1.FileInterceptor)('FileStream')),
|
|
140
|
+
__param(0, (0, common_1.UploadedFile)()),
|
|
141
|
+
__param(1, (0, common_1.Body)()),
|
|
142
|
+
__metadata("design:type", Function),
|
|
143
|
+
__metadata("design:paramtypes", [Object, internal_medias_dto_1.InternalMediaDto]),
|
|
144
|
+
__metadata("design:returntype", Promise)
|
|
145
|
+
], MediasController.prototype, "createInternal", null);
|
|
146
|
+
__decorate([
|
|
147
|
+
(0, common_1.Post)('/external'),
|
|
148
|
+
__param(0, (0, common_1.Body)()),
|
|
149
|
+
__metadata("design:type", Function),
|
|
150
|
+
__metadata("design:paramtypes", [external_media_dto_1.ExternalMediaDto]),
|
|
151
|
+
__metadata("design:returntype", Promise)
|
|
152
|
+
], MediasController.prototype, "createExternal", null);
|
|
153
|
+
__decorate([
|
|
154
|
+
(0, common_1.Get)(),
|
|
155
|
+
(0, swagger_1.ApiOperation)({
|
|
156
|
+
summary: 'Get all Medias',
|
|
157
|
+
}),
|
|
158
|
+
(0, swagger_1.ApiOkResponse)({
|
|
159
|
+
description: 'Paginanted Medias',
|
|
160
|
+
}),
|
|
161
|
+
__param(0, (0, common_1.Query)('rows', new common_1.DefaultValuePipe(10), common_1.ParseIntPipe)),
|
|
162
|
+
__param(1, (0, common_1.Query)('page', new common_1.DefaultValuePipe(1), common_1.ParseIntPipe)),
|
|
163
|
+
__param(2, (0, common_1.Query)('search', new validate_search_pipe_1.ValidateSearchPipe(medias_entity_1.MediasModel, ['ObjectId', 'ObjectType', 'Title']))),
|
|
164
|
+
__metadata("design:type", Function),
|
|
165
|
+
__metadata("design:paramtypes", [Number, Number, String]),
|
|
166
|
+
__metadata("design:returntype", Promise)
|
|
167
|
+
], MediasController.prototype, "findAll", null);
|
|
168
|
+
__decorate([
|
|
169
|
+
(0, common_1.Get)('/:id'),
|
|
170
|
+
(0, swagger_1.ApiOperation)({ summary: 'Get media by MediaId' }),
|
|
171
|
+
(0, swagger_1.ApiOkResponse)({
|
|
172
|
+
description: 'The found media',
|
|
173
|
+
type: medias_entity_1.MediasModel,
|
|
174
|
+
}),
|
|
175
|
+
__param(0, (0, common_1.Param)('id', new validate_id_pipe_1.ValidateIdPipe())),
|
|
176
|
+
__metadata("design:type", Function),
|
|
177
|
+
__metadata("design:paramtypes", [String]),
|
|
178
|
+
__metadata("design:returntype", Promise)
|
|
179
|
+
], MediasController.prototype, "findOne", null);
|
|
180
|
+
__decorate([
|
|
181
|
+
(0, common_1.Get)('/:id/file'),
|
|
182
|
+
(0, swagger_1.ApiOperation)({ summary: 'Get media file by MediaId' }),
|
|
183
|
+
(0, swagger_1.ApiOkResponse)({
|
|
184
|
+
description: 'filestream',
|
|
185
|
+
type: Buffer,
|
|
186
|
+
}),
|
|
187
|
+
__param(0, (0, common_1.Param)('id', new validate_id_pipe_1.ValidateIdPipe())),
|
|
188
|
+
__param(1, (0, common_1.Res)({ passthrough: true })),
|
|
189
|
+
__metadata("design:type", Function),
|
|
190
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
191
|
+
__metadata("design:returntype", Promise)
|
|
192
|
+
], MediasController.prototype, "getFile", null);
|
|
193
|
+
__decorate([
|
|
194
|
+
(0, common_1.Delete)('/:id'),
|
|
195
|
+
(0, swagger_1.ApiOperation)({ summary: 'Delete media by MediaId' }),
|
|
196
|
+
__param(0, (0, common_1.Param)('id', new validate_id_pipe_1.ValidateIdPipe())),
|
|
197
|
+
__metadata("design:type", Function),
|
|
198
|
+
__metadata("design:paramtypes", [String]),
|
|
199
|
+
__metadata("design:returntype", Promise)
|
|
200
|
+
], MediasController.prototype, "delete", null);
|
|
201
|
+
__decorate([
|
|
202
|
+
(0, common_1.Put)('/external/:id'),
|
|
203
|
+
__param(0, (0, common_1.Param)('id', new validate_id_pipe_1.ValidateIdPipe())),
|
|
204
|
+
__param(1, (0, common_1.Body)()),
|
|
205
|
+
__metadata("design:type", Function),
|
|
206
|
+
__metadata("design:paramtypes", [String, external_media_dto_1.ExternalMediaDto]),
|
|
207
|
+
__metadata("design:returntype", Promise)
|
|
208
|
+
], MediasController.prototype, "updateExternal", null);
|
|
209
|
+
__decorate([
|
|
210
|
+
(0, common_1.Put)('/internal/:id'),
|
|
211
|
+
(0, common_1.UseInterceptors)((0, platform_express_1.FileInterceptor)('FileStream')),
|
|
212
|
+
__param(0, (0, common_1.UploadedFile)()),
|
|
213
|
+
__param(1, (0, common_1.Param)('id', new validate_id_pipe_1.ValidateIdPipe())),
|
|
214
|
+
__param(2, (0, common_1.Body)()),
|
|
215
|
+
__metadata("design:type", Function),
|
|
216
|
+
__metadata("design:paramtypes", [Object, String, internal_medias_dto_1.InternalMediaDto]),
|
|
217
|
+
__metadata("design:returntype", Promise)
|
|
218
|
+
], MediasController.prototype, "updateInternal", null);
|
|
219
|
+
MediasController = __decorate([
|
|
220
|
+
(0, common_1.Controller)('medias'),
|
|
221
|
+
__param(0, (0, common_1.Inject)('MediasRepository')),
|
|
222
|
+
__metadata("design:paramtypes", [Object, common_service_1.CommonService])
|
|
223
|
+
], MediasController);
|
|
224
|
+
exports.MediasController = MediasController;
|
|
225
|
+
//# sourceMappingURL=medias.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"medias.controller.js","sourceRoot":"","sources":["../src/medias.controller.ts"],"names":[],"mappings":"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"}
|
package/dist/medias.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/// <reference types="multer" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { BlobServiceClient } from '@azure/storage-blob';
|
|
4
|
+
import { CommonService } from './common/common.service';
|
|
5
|
+
import { BaseMedias } from './base/base.medias';
|
|
6
|
+
import { MediasModel } from './entities/medias.entity';
|
|
7
|
+
import { IBaseMediasAttr } from './interfaces/base.medias-attr.interface';
|
|
8
|
+
import { IMediasRepository } from './interfaces/medias.repository.interface';
|
|
9
|
+
declare type MediaFile = {
|
|
10
|
+
buffer: Buffer;
|
|
11
|
+
iv?: Buffer;
|
|
12
|
+
isEncrypted?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare class Medias extends BaseMedias {
|
|
15
|
+
blobServiceClient: BlobServiceClient;
|
|
16
|
+
container: string;
|
|
17
|
+
algorithm: string;
|
|
18
|
+
commonService: CommonService;
|
|
19
|
+
entity: "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function";
|
|
20
|
+
constructor(mediaRepository: IMediasRepository, commonService: CommonService, media?: IBaseMediasAttr);
|
|
21
|
+
createMedias(isExternalMedias: boolean, stream?: Express.Multer.File): Promise<MediasModel>;
|
|
22
|
+
updateMedias(isExternalMedias: boolean, stream?: Express.Multer.File): Promise<any>;
|
|
23
|
+
private IsStorageTypeAzure;
|
|
24
|
+
private updateInternalMedia;
|
|
25
|
+
private createInternalMedias;
|
|
26
|
+
private getIvPath;
|
|
27
|
+
private uploadFileToLocal;
|
|
28
|
+
private deleteUploadedFileFromLocal;
|
|
29
|
+
private uploadFileToAzure;
|
|
30
|
+
private deleteUploadedFileFromAzure;
|
|
31
|
+
private uploadFileToAzureStorage;
|
|
32
|
+
deleteUploadedFileToAzureStorage(path: string, FileName: string, FileExtension: string): Promise<any>;
|
|
33
|
+
private setKey;
|
|
34
|
+
getFile(): Promise<Buffer>;
|
|
35
|
+
private stream2buffer;
|
|
36
|
+
private getFileFromAzure;
|
|
37
|
+
private getFileFromLocal;
|
|
38
|
+
encrypt(fileBuffer: Buffer): Promise<MediaFile>;
|
|
39
|
+
decrypt(file: MediaFile): Promise<MediaFile>;
|
|
40
|
+
delete(): Promise<any>;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
package/dist/medias.js
ADDED
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Medias = void 0;
|
|
4
|
+
const storage_blob_1 = require("@azure/storage-blob");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const crypto = require("crypto");
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
const util = require("util");
|
|
9
|
+
const base_medias_1 = require("./base/base.medias");
|
|
10
|
+
const medias_entity_1 = require("./entities/medias.entity");
|
|
11
|
+
const stream_1 = require("stream");
|
|
12
|
+
class Medias extends base_medias_1.BaseMedias {
|
|
13
|
+
constructor(mediaRepository, commonService, media) {
|
|
14
|
+
super(mediaRepository, media);
|
|
15
|
+
this.blobServiceClient = storage_blob_1.BlobServiceClient.fromConnectionString(process.env.AZURE_STORAGE_CONNECTION_STRING);
|
|
16
|
+
this.algorithm = 'aes-256-cbc';
|
|
17
|
+
this.entity = typeof medias_entity_1.MediasModel;
|
|
18
|
+
this.commonService = commonService;
|
|
19
|
+
try {
|
|
20
|
+
this.container = process.env.MEDIA_AZUREBLOB_CONTAINER_NAME;
|
|
21
|
+
if (!this.container && this.IsStorageTypeAzure()) {
|
|
22
|
+
throw new common_1.BadRequestException('CONTAINER_NAME Environtment Variable name not found');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async createMedias(isExternalMedias, stream) {
|
|
30
|
+
try {
|
|
31
|
+
const media = await super.create();
|
|
32
|
+
let activityDescription = `Added a new external media Id: ${this.MediaId}.`;
|
|
33
|
+
if (!isExternalMedias) {
|
|
34
|
+
activityDescription = `Added a new media Id: ${this.MediaId}.`;
|
|
35
|
+
await this.createInternalMedias(stream);
|
|
36
|
+
}
|
|
37
|
+
if (media) {
|
|
38
|
+
await this.commonService.addActivityHistory({
|
|
39
|
+
Action: 'Add',
|
|
40
|
+
Activity: 'Add New Media',
|
|
41
|
+
Description: activityDescription,
|
|
42
|
+
EntityId: this.MediaId,
|
|
43
|
+
EntityValueBefore: '',
|
|
44
|
+
EntityValueAfter: JSON.stringify(Object.assign({}, media.get({ plain: true }))),
|
|
45
|
+
PerformedById: this.CreatedById,
|
|
46
|
+
PerformedAt: this.CreatedAt,
|
|
47
|
+
}, this.entity, '');
|
|
48
|
+
}
|
|
49
|
+
return media;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async updateMedias(isExternalMedias, stream) {
|
|
56
|
+
try {
|
|
57
|
+
const oldMedia = await super.findOne({ where: { MediaId: this.MediaId } });
|
|
58
|
+
const media = await super.update();
|
|
59
|
+
let activityDescription = `Updated external media Id: ${this.MediaId}.`;
|
|
60
|
+
if (!isExternalMedias) {
|
|
61
|
+
await this.updateInternalMedia(stream, oldMedia);
|
|
62
|
+
activityDescription = `Updated media Id: ${this.MediaId}.`;
|
|
63
|
+
}
|
|
64
|
+
if (media) {
|
|
65
|
+
await this.commonService.addActivityHistory({
|
|
66
|
+
Action: 'Update',
|
|
67
|
+
Activity: 'Update Media',
|
|
68
|
+
Description: activityDescription,
|
|
69
|
+
EntityId: this.MediaId,
|
|
70
|
+
EntityValueBefore: JSON.stringify(Object.assign({}, oldMedia.get({ plain: true }))),
|
|
71
|
+
EntityValueAfter: JSON.stringify(Object.assign({}, media.get({ plain: true }))),
|
|
72
|
+
PerformedById: this.UpdatedById,
|
|
73
|
+
PerformedAt: this.UpdatedAt,
|
|
74
|
+
}, this.entity, '');
|
|
75
|
+
}
|
|
76
|
+
return media;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
IsStorageTypeAzure() {
|
|
83
|
+
const mediaStorageType = process.env.MEDIA_STORAGE_TYPE;
|
|
84
|
+
if (mediaStorageType === 'azure') {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async updateInternalMedia(stream, oldMedia) {
|
|
92
|
+
try {
|
|
93
|
+
this.FileExtension = this.FileExtension.split('.')[0];
|
|
94
|
+
this.FileName = this.FileName.replace(/\.[^/.]+$/, '');
|
|
95
|
+
let file;
|
|
96
|
+
if (this.IsEncryptedYN == 'Y') {
|
|
97
|
+
file = await this.encrypt(stream.buffer);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
file = {
|
|
101
|
+
buffer: stream.buffer,
|
|
102
|
+
isEncrypted: false,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (this.IsStorageTypeAzure()) {
|
|
106
|
+
await this.deleteUploadedFileFromAzure(oldMedia.URL, oldMedia.FileName, oldMedia.FileExtension, oldMedia.IsEncryptedYN);
|
|
107
|
+
await this.uploadFileToAzure(file);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const filePath = super.createSaveLocation();
|
|
111
|
+
const isDirExist = util.promisify(fs.exists);
|
|
112
|
+
const isDir = await isDirExist(filePath);
|
|
113
|
+
if (isDir) {
|
|
114
|
+
fs.unlinkSync(this.FilePath);
|
|
115
|
+
if (this.IsEncryptedYN == 'Y') {
|
|
116
|
+
fs.unlinkSync(this.getIvPath());
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
await this.uploadFileToLocal(file);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async createInternalMedias(stream) {
|
|
127
|
+
try {
|
|
128
|
+
this.FileExtension = this.FileExtension.split('.')[0];
|
|
129
|
+
this.FileName = this.FileName.replace(/\.[^/.]+$/, '');
|
|
130
|
+
let file;
|
|
131
|
+
if (this.IsEncryptedYN == 'Y') {
|
|
132
|
+
file = await this.encrypt(stream.buffer);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
file = {
|
|
136
|
+
buffer: stream.buffer,
|
|
137
|
+
isEncrypted: false,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (this.IsStorageTypeAzure()) {
|
|
141
|
+
this.uploadFileToAzure(file);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.uploadFileToLocal(file);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
getIvPath() {
|
|
152
|
+
return super.createSaveLocation() + `/${this.FileName}iv.iv`;
|
|
153
|
+
}
|
|
154
|
+
async uploadFileToLocal(file) {
|
|
155
|
+
try {
|
|
156
|
+
const savelocation = super.createSaveLocation();
|
|
157
|
+
const isDirExist = util.promisify(fs.exists);
|
|
158
|
+
const createDir = util.promisify(fs.mkdir);
|
|
159
|
+
const isDir = await isDirExist(savelocation);
|
|
160
|
+
if (!isDir) {
|
|
161
|
+
await createDir(savelocation, { recursive: true });
|
|
162
|
+
}
|
|
163
|
+
fs.createWriteStream(this.FilePath).write(file.buffer);
|
|
164
|
+
fs.createWriteStream(this.getIvPath()).write(file.iv);
|
|
165
|
+
const path = {
|
|
166
|
+
filePath: super.createSaveLocation(),
|
|
167
|
+
ivFilePath: this.getIvPath(),
|
|
168
|
+
};
|
|
169
|
+
return path;
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async deleteUploadedFileFromLocal(path, isEncryptedYN) {
|
|
176
|
+
try {
|
|
177
|
+
const isDirExist = util.promisify(fs.exists);
|
|
178
|
+
const isDir = await isDirExist(path);
|
|
179
|
+
if (isDir) {
|
|
180
|
+
const deleteFile = util.promisify(fs.unlink);
|
|
181
|
+
await deleteFile(path);
|
|
182
|
+
if (isEncryptedYN == 'Y') {
|
|
183
|
+
await deleteFile(this.getIvPath());
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async uploadFileToAzure(file) {
|
|
192
|
+
const filePath = await this.uploadFileToAzureStorage(file.buffer, this.ObjectType, this.ObjectId, this.FileName, this.FileExtension);
|
|
193
|
+
let ivPath;
|
|
194
|
+
if (this.IsEncryptedYN == 'Y') {
|
|
195
|
+
ivPath = await this.uploadFileToAzureStorage(file.iv, this.ObjectType, this.ObjectId, this.FileName + "iv", 'iv');
|
|
196
|
+
}
|
|
197
|
+
const path = {
|
|
198
|
+
filePath: filePath,
|
|
199
|
+
ivFilePath: ivPath,
|
|
200
|
+
};
|
|
201
|
+
return path;
|
|
202
|
+
}
|
|
203
|
+
async deleteUploadedFileFromAzure(path, FileName, FileExtension, isEncryptedYN) {
|
|
204
|
+
try {
|
|
205
|
+
await this.deleteUploadedFileToAzureStorage(path, FileName, FileExtension);
|
|
206
|
+
if (isEncryptedYN == 'Y') {
|
|
207
|
+
await this.deleteUploadedFileToAzureStorage(path, FileName + "iv", '.iv');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async uploadFileToAzureStorage(bufferFile, ObjectType, ObjectId, FileName, FileExtension) {
|
|
215
|
+
try {
|
|
216
|
+
const fileName = FileName.replace(/\.[^/.]+$/, '');
|
|
217
|
+
const path = `${this.container}/${ObjectType}/${ObjectId}`;
|
|
218
|
+
const blobcontainer = this.blobServiceClient.getContainerClient(path);
|
|
219
|
+
const blockBlobClient = await blobcontainer.getBlockBlobClient(`${fileName}.${FileExtension}`);
|
|
220
|
+
await blockBlobClient.uploadData(bufferFile);
|
|
221
|
+
return path;
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async deleteUploadedFileToAzureStorage(path, FileName, FileExtension) {
|
|
228
|
+
const fileName = FileName.replace(/\.[^/.]+$/, '');
|
|
229
|
+
const blobcontainer = this.blobServiceClient.getContainerClient(path);
|
|
230
|
+
const blockBlobClient = await blobcontainer.getBlockBlobClient(`${fileName}.${FileExtension}`);
|
|
231
|
+
return await blockBlobClient.deleteIfExists();
|
|
232
|
+
}
|
|
233
|
+
setKey() {
|
|
234
|
+
try {
|
|
235
|
+
const key = process.env.MEDIA_ENCRYPT_KEY;
|
|
236
|
+
if (!key) {
|
|
237
|
+
throw new common_1.BadRequestException('MEDIA_ENCRYPT_KEY Environtment Variable name not found');
|
|
238
|
+
}
|
|
239
|
+
return key;
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async getFile() {
|
|
246
|
+
try {
|
|
247
|
+
let fileBuffer;
|
|
248
|
+
if (this.IsStorageTypeAzure()) {
|
|
249
|
+
fileBuffer = await this.getFileFromAzure(this.URL, this.FileName, this.FileExtension);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
fileBuffer = await this.getFileFromLocal(this.FilePath);
|
|
253
|
+
}
|
|
254
|
+
let file = {
|
|
255
|
+
buffer: fileBuffer,
|
|
256
|
+
isEncrypted: this.IsEncryptedYN === 'Y' ? true : false,
|
|
257
|
+
};
|
|
258
|
+
if (file.isEncrypted) {
|
|
259
|
+
if (this.IsStorageTypeAzure()) {
|
|
260
|
+
file.iv = await this.getFileFromAzure(this.URL, this.FileName + "iv", 'iv');
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
file.iv = await this.getFileFromLocal(this.getIvPath());
|
|
264
|
+
}
|
|
265
|
+
file = await this.decrypt(file);
|
|
266
|
+
}
|
|
267
|
+
return file.buffer;
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async stream2buffer(stream) {
|
|
274
|
+
return new Promise((resolve, reject) => {
|
|
275
|
+
const buffer = Array();
|
|
276
|
+
stream.on('data', (chunk) => buffer.push(chunk));
|
|
277
|
+
stream.on('end', () => resolve(Buffer.concat(buffer)));
|
|
278
|
+
stream.on('error', (err) => reject(`error converting stream - ${err}`));
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
async getFileFromAzure(path, FileName, FileExtension) {
|
|
282
|
+
try {
|
|
283
|
+
const fileName = FileName.replace(/\.[^/.]+$/, '');
|
|
284
|
+
const blobcontainer = this.blobServiceClient.getContainerClient(path);
|
|
285
|
+
const blockBlobClient = await blobcontainer.getBlockBlobClient(`${fileName}.${FileExtension}`);
|
|
286
|
+
const downloadResponse = await blockBlobClient.download();
|
|
287
|
+
const ReadStream = new stream_1.Readable().wrap(downloadResponse.readableStreamBody);
|
|
288
|
+
const file = await this.stream2buffer(ReadStream);
|
|
289
|
+
return file;
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
throw error;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
async getFileFromLocal(pathfile) {
|
|
296
|
+
try {
|
|
297
|
+
const stream = fs.createReadStream(pathfile);
|
|
298
|
+
const file = await this.stream2buffer(stream);
|
|
299
|
+
return file;
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
throw error;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
async encrypt(fileBuffer) {
|
|
306
|
+
try {
|
|
307
|
+
const key = this.setKey();
|
|
308
|
+
const iv = crypto.randomBytes(16);
|
|
309
|
+
const cipher = crypto.createCipheriv(this.algorithm, key, iv);
|
|
310
|
+
const resultBuffer = Buffer.concat([
|
|
311
|
+
cipher.update(fileBuffer),
|
|
312
|
+
cipher.final(),
|
|
313
|
+
]);
|
|
314
|
+
const result = {
|
|
315
|
+
buffer: resultBuffer,
|
|
316
|
+
iv: iv,
|
|
317
|
+
isEncrypted: true,
|
|
318
|
+
};
|
|
319
|
+
return result;
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async decrypt(file) {
|
|
326
|
+
try {
|
|
327
|
+
const key = this.setKey();
|
|
328
|
+
const iv = file.iv;
|
|
329
|
+
const decipher = crypto.createDecipheriv(this.algorithm, key, iv);
|
|
330
|
+
const resultBuffer = Buffer.concat([
|
|
331
|
+
decipher.update(file.buffer),
|
|
332
|
+
decipher.final(),
|
|
333
|
+
]);
|
|
334
|
+
const result = {
|
|
335
|
+
buffer: resultBuffer,
|
|
336
|
+
isEncrypted: false,
|
|
337
|
+
};
|
|
338
|
+
return result;
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
throw error;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async delete() {
|
|
345
|
+
try {
|
|
346
|
+
const data = await super.delete();
|
|
347
|
+
if (this.IsExternalYN == 'N') {
|
|
348
|
+
if (this.IsStorageTypeAzure()) {
|
|
349
|
+
await this.deleteUploadedFileFromAzure(this.URL, this.FileName, this.FileExtension, this.IsEncryptedYN);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
await this.deleteUploadedFileFromLocal(this.URL, this.IsEncryptedYN);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
await this.commonService.addActivityHistory({
|
|
356
|
+
Action: 'Delete',
|
|
357
|
+
Activity: 'Delete Media',
|
|
358
|
+
Description: `Deleted media (ID: ${this.MediaId})`,
|
|
359
|
+
EntityId: this.MediaId,
|
|
360
|
+
EntityValueBefore: JSON.stringify(data),
|
|
361
|
+
EntityValueAfter: '',
|
|
362
|
+
PerformedById: this.UpdatedById,
|
|
363
|
+
PerformedAt: new Date(),
|
|
364
|
+
}, this.entity, '');
|
|
365
|
+
return { message: 'Media has been deleted.' };
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
throw error;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
exports.Medias = Medias;
|
|
373
|
+
//# sourceMappingURL=medias.js.map
|