@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.
Files changed (121) hide show
  1. package/.commitlintrc.json +22 -0
  2. package/.eslintrc.js +66 -0
  3. package/.husky/commit-msg +4 -0
  4. package/.husky/pre-commit +4 -0
  5. package/.prettierrc +4 -0
  6. package/.prettierrc copy +4 -0
  7. package/README.md +93 -0
  8. package/dist/base/base.medias.d.ts +37 -0
  9. package/dist/base/base.medias.js +161 -0
  10. package/dist/base/base.medias.js.map +1 -0
  11. package/dist/base/base.repository.abstract.d.ts +12 -0
  12. package/dist/base/base.repository.abstract.js +22 -0
  13. package/dist/base/base.repository.abstract.js.map +1 -0
  14. package/dist/base/base.repository.interface.d.ts +9 -0
  15. package/dist/base/base.repository.interface.js +3 -0
  16. package/dist/base/base.repository.interface.js.map +1 -0
  17. package/dist/common/common.module.d.ts +2 -0
  18. package/dist/common/common.module.js +23 -0
  19. package/dist/common/common.module.js.map +1 -0
  20. package/dist/common/common.service.d.ts +13 -0
  21. package/dist/common/common.service.js +108 -0
  22. package/dist/common/common.service.js.map +1 -0
  23. package/dist/common/dto/add-field-translation.dto.d.ts +7 -0
  24. package/dist/common/dto/add-field-translation.dto.js +42 -0
  25. package/dist/common/dto/add-field-translation.dto.js.map +1 -0
  26. package/dist/common/dto/get-media.dto.d.ts +5 -0
  27. package/dist/common/dto/get-media.dto.js +29 -0
  28. package/dist/common/dto/get-media.dto.js.map +1 -0
  29. package/dist/dto/external-media.dto.d.ts +10 -0
  30. package/dist/dto/external-media.dto.js +70 -0
  31. package/dist/dto/external-media.dto.js.map +1 -0
  32. package/dist/dto/internal-medias.dto.d.ts +12 -0
  33. package/dist/dto/internal-medias.dto.js +87 -0
  34. package/dist/dto/internal-medias.dto.js.map +1 -0
  35. package/dist/entities/medias.entity.d.ts +21 -0
  36. package/dist/entities/medias.entity.js +152 -0
  37. package/dist/entities/medias.entity.js.map +1 -0
  38. package/dist/enum/index.d.ts +2 -0
  39. package/dist/enum/index.js +6 -0
  40. package/dist/enum/index.js.map +1 -0
  41. package/dist/enum/medias.enum.d.ts +5 -0
  42. package/dist/enum/medias.enum.js +10 -0
  43. package/dist/enum/medias.enum.js.map +1 -0
  44. package/dist/helpers/error.d.ts +1 -0
  45. package/dist/helpers/error.js +14 -0
  46. package/dist/helpers/error.js.map +1 -0
  47. package/dist/helpers/index.d.ts +2 -0
  48. package/dist/helpers/index.js +6 -0
  49. package/dist/helpers/index.js.map +1 -0
  50. package/dist/index.d.ts +6 -0
  51. package/dist/index.js +14 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/interfaces/base.medias-attr.interface.d.ts +20 -0
  54. package/dist/interfaces/base.medias-attr.interface.js +3 -0
  55. package/dist/interfaces/base.medias-attr.interface.js.map +1 -0
  56. package/dist/interfaces/medias.repository.interface.d.ts +3 -0
  57. package/dist/interfaces/medias.repository.interface.js +3 -0
  58. package/dist/interfaces/medias.repository.interface.js.map +1 -0
  59. package/dist/medias.controller.d.ts +25 -0
  60. package/dist/medias.controller.js +225 -0
  61. package/dist/medias.controller.js.map +1 -0
  62. package/dist/medias.d.ts +42 -0
  63. package/dist/medias.js +373 -0
  64. package/dist/medias.js.map +1 -0
  65. package/dist/medias.module.d.ts +2 -0
  66. package/dist/medias.module.js +32 -0
  67. package/dist/medias.module.js.map +1 -0
  68. package/dist/medias.repository.d.ts +16 -0
  69. package/dist/medias.repository.js +47 -0
  70. package/dist/medias.repository.js.map +1 -0
  71. package/dist/pipe/append-id.pipe.d.ts +6 -0
  72. package/dist/pipe/append-id.pipe.js +28 -0
  73. package/dist/pipe/append-id.pipe.js.map +1 -0
  74. package/dist/pipe/validate-enum.pipe.d.ts +6 -0
  75. package/dist/pipe/validate-enum.pipe.js +34 -0
  76. package/dist/pipe/validate-enum.pipe.js.map +1 -0
  77. package/dist/pipe/validate-id.pipe.d.ts +6 -0
  78. package/dist/pipe/validate-id.pipe.js +31 -0
  79. package/dist/pipe/validate-id.pipe.js.map +1 -0
  80. package/dist/pipe/validate-search.pipe.d.ts +7 -0
  81. package/dist/pipe/validate-search.pipe.js +46 -0
  82. package/dist/pipe/validate-search.pipe.js.map +1 -0
  83. package/dist/responses/deleted.response.d.ts +3 -0
  84. package/dist/responses/deleted.response.js +21 -0
  85. package/dist/responses/deleted.response.js.map +1 -0
  86. package/dist/responses/pagination.response.d.ts +5 -0
  87. package/dist/responses/pagination.response.js +26 -0
  88. package/dist/responses/pagination.response.js.map +1 -0
  89. package/dist/tsconfig.tsbuildinfo +1 -0
  90. package/nest-cli.json +19 -0
  91. package/package.json +60 -0
  92. package/src/base/base.medias.ts +200 -0
  93. package/src/base/base.repository.abstract.ts +28 -0
  94. package/src/base/base.repository.interface.ts +9 -0
  95. package/src/common/common.module.ts +10 -0
  96. package/src/common/common.service.ts +109 -0
  97. package/src/common/dto/add-field-translation.dto.ts +23 -0
  98. package/src/common/dto/get-media.dto.ts +12 -0
  99. package/src/dto/external-media.dto.ts +49 -0
  100. package/src/dto/internal-medias.dto.ts +64 -0
  101. package/src/entities/medias.entity.ts +125 -0
  102. package/src/enum/index.ts +3 -0
  103. package/src/enum/medias.enum.ts +5 -0
  104. package/src/helpers/error.ts +12 -0
  105. package/src/helpers/index.ts +3 -0
  106. package/src/index.ts +13 -0
  107. package/src/interfaces/base.medias-attr.interface.ts +21 -0
  108. package/src/interfaces/medias.repository.interface.ts +4 -0
  109. package/src/medias.controller.ts +244 -0
  110. package/src/medias.module.ts +19 -0
  111. package/src/medias.repository.ts +44 -0
  112. package/src/medias.ts +494 -0
  113. package/src/pipe/append-id.pipe.ts +15 -0
  114. package/src/pipe/validate-enum.pipe.ts +31 -0
  115. package/src/pipe/validate-id.pipe.ts +18 -0
  116. package/src/pipe/validate-search.pipe.ts +41 -0
  117. package/src/responses/deleted.response.ts +6 -0
  118. package/src/responses/pagination.response.ts +10 -0
  119. package/tsconfig.build.json +4 -0
  120. package/tsconfig.json +30 -0
  121. package/tslint.json +18 -0
@@ -0,0 +1,4 @@
1
+ import { IBaseRepository } from '../base/base.repository.interface';
2
+ import { MediasModel } from '../entities/medias.entity';
3
+
4
+ export type IMediasRepository = IBaseRepository<MediasModel>;
@@ -0,0 +1,244 @@
1
+ import {
2
+ DefaultValuePipe,
3
+ Get,
4
+ Inject,
5
+ ParseIntPipe,
6
+ Query,
7
+ Body,
8
+ Controller,
9
+ Post,
10
+ UploadedFile,
11
+ UseInterceptors,
12
+ BadRequestException,
13
+ Delete,
14
+ Param,
15
+ Put,
16
+ StreamableFile,
17
+ Res,
18
+ HttpException,
19
+ } from '@nestjs/common';
20
+ import { FileInterceptor } from '@nestjs/platform-express';
21
+ import { ApiOkResponse, ApiOperation } from '@nestjs/swagger';
22
+ import * as cuid from 'cuid';
23
+ import { CommonService } from './common/common.service';
24
+ import { ValidateSearchPipe } from './pipe/validate-search.pipe';
25
+ import { ExternalMediaDto } from './dto/external-media.dto';
26
+ import { InternalMediaDto } from './dto/internal-medias.dto';
27
+ import { MediasModel } from './entities/medias.entity';
28
+ import { IBaseMediasAttr } from './interfaces/base.medias-attr.interface';
29
+ import { IMediasRepository } from './interfaces/medias.repository.interface';
30
+ import { Medias } from './medias';
31
+ import { Op } from 'sequelize';
32
+ import { ValidateIdPipe } from './pipe/validate-id.pipe';
33
+ import { Response } from 'express';
34
+ import { throwException } from './helpers';
35
+
36
+ @Controller('medias')
37
+ export class MediasController {
38
+ constructor(
39
+ @Inject('MediasRepository')
40
+ private readonly mediaRepository: IMediasRepository,
41
+ private readonly commonService: CommonService,
42
+ ) {}
43
+ @Post('internal')
44
+ @UseInterceptors(FileInterceptor('FileStream'))
45
+ async createInternal(
46
+ @UploadedFile() fileStream: Express.Multer.File,
47
+ @Body() createMedia: InternalMediaDto,
48
+ ) {
49
+ try {
50
+ const mediaAttr: IBaseMediasAttr = {
51
+ ...createMedia,
52
+ MediaId: cuid(),
53
+ IsExternalYN: 'N',
54
+ ExternalSource: '',
55
+ URL: '',
56
+ FilePath: '',
57
+ CreatedAt: new Date(),
58
+ UpdatedAt: new Date(),
59
+ CreatedById: 'test_user',
60
+ UpdatedById: 'test_user',
61
+ };
62
+ const media = new Medias(
63
+ this.mediaRepository,
64
+ this.commonService,
65
+ mediaAttr,
66
+ );
67
+ const createdData = await media.createMedias(false, fileStream);
68
+ return createdData;
69
+ } catch (error) {
70
+ throw error;
71
+ }
72
+ }
73
+
74
+ @Post('/external')
75
+ async createExternal(@Body() createMedia: ExternalMediaDto) {
76
+ const mediaAttr: IBaseMediasAttr = {
77
+ ...createMedia,
78
+ MediaId: cuid(),
79
+ IsExternalYN: 'Y',
80
+ CreatedAt: new Date(),
81
+ UpdatedAt: new Date(),
82
+ IsEncryptedYN: 'N',
83
+ FilePath: '',
84
+ FileName: '',
85
+ FileExtension: '',
86
+ CreatedById: 'test_user',
87
+ UpdatedById: 'test_user',
88
+ };
89
+ const media = new Medias(
90
+ this.mediaRepository,
91
+ this.commonService,
92
+ mediaAttr,
93
+ );
94
+ await media.createMedias(true);
95
+ return mediaAttr;
96
+ }
97
+
98
+ @Get()
99
+ @ApiOperation({
100
+ summary: 'Get all Medias',
101
+ })
102
+ @ApiOkResponse({
103
+ description: 'Paginanted Medias',
104
+ })
105
+ async findAll(
106
+ @Query('rows', new DefaultValuePipe(10), ParseIntPipe) rows: number,
107
+ @Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number,
108
+ @Query(
109
+ 'search',
110
+ new ValidateSearchPipe(MediasModel, ['ObjectId', 'ObjectType', 'Title']),
111
+ )
112
+ search: string,
113
+ ) {
114
+ let searchObj: any;
115
+ try {
116
+ searchObj = search ? JSON.parse(search) : {};
117
+ } catch (err) {
118
+ throw new BadRequestException('Bad value for search.');
119
+ }
120
+
121
+ const { ...mediaFilter } = searchObj;
122
+ const queryObj = {};
123
+
124
+ Object.entries(mediaFilter).forEach(([key, value]) => {
125
+ queryObj[key] = {
126
+ [Op.substring]: value,
127
+ };
128
+ });
129
+
130
+ const offset = rows * (page - 1);
131
+
132
+ const options = {
133
+ order: [['CreatedAt', 'DESC']],
134
+ limit: rows,
135
+ offset: offset,
136
+ where: queryObj,
137
+ distinct: true,
138
+ };
139
+
140
+ const media = new Medias(this.mediaRepository, this.commonService);
141
+
142
+ return media.findAllWithPagination(options);
143
+ }
144
+
145
+ @Get('/:id')
146
+ @ApiOperation({ summary: 'Get media by MediaId' })
147
+ @ApiOkResponse({
148
+ description: 'The found media',
149
+ type: MediasModel,
150
+ })
151
+ async findOne(@Param('id', new ValidateIdPipe()) id: string) {
152
+ const media = new Medias(this.mediaRepository, this.commonService);
153
+ const file = await media.findOne({where: { MediaId: id}});
154
+ return file;
155
+ }
156
+
157
+ @Get('/:id/file')
158
+ @ApiOperation({ summary: 'Get media file by MediaId' })
159
+ @ApiOkResponse({
160
+ description: 'filestream',
161
+ type: Buffer,
162
+ })
163
+ async getFile(
164
+ @Param('id', new ValidateIdPipe()) id: string,
165
+ @Res({ passthrough: true }) res: Response,
166
+ ) {
167
+ let media = new Medias(this.mediaRepository, this.commonService);
168
+ const mediaData = await media.findOne({where: { MediaId: id}});
169
+ media = new Medias(this.mediaRepository, this.commonService, {
170
+ ...mediaData.get({ plain: true }),
171
+ });
172
+ const fileBuffer: Buffer = await media.getFile();
173
+
174
+ res.set({
175
+ 'Content-Type': 'application/octet-stream',
176
+ 'Content-Disposition': `attachment; filename=${mediaData.FileName}.${mediaData.FileExtension}`,
177
+ 'Content-Length': fileBuffer.length,
178
+ });
179
+ return new StreamableFile(fileBuffer);
180
+ }
181
+
182
+ @Delete('/:id')
183
+ @ApiOperation({ summary: 'Delete media by MediaId' })
184
+ async delete(@Param('id', new ValidateIdPipe()) id: string) {
185
+ try {
186
+ let media = new Medias(this.mediaRepository, this.commonService);
187
+ const mediaData = await media.findOne({where: { MediaId: id}});
188
+
189
+ const mediaAttr: IBaseMediasAttr = {
190
+ ...mediaData.get({ plain: true }),
191
+ UpdatedAt: new Date(),
192
+ UpdatedById: 'test_user',
193
+ };
194
+ media = new Medias(this.mediaRepository, this.commonService, mediaAttr);
195
+ return await media.delete();
196
+ } catch (error) {
197
+ throw error;
198
+ }
199
+ }
200
+
201
+ @Put('/external/:id')
202
+ async updateExternal(
203
+ @Param('id', new ValidateIdPipe()) id: string,
204
+ @Body() updatedMedia: ExternalMediaDto,
205
+ ) {
206
+ let media = new Medias(this.mediaRepository, this.commonService);
207
+
208
+ const mediaData = await media.findOne({where: { MediaId: id}});
209
+
210
+ const mediaAttr: IBaseMediasAttr = {
211
+ ...mediaData.get({ plain: true }),
212
+ ...updatedMedia,
213
+ UpdatedAt: new Date(),
214
+ UpdatedById: 'test_user',
215
+ };
216
+ media = new Medias(this.mediaRepository, this.commonService, mediaAttr);
217
+ await media.updateMedias(true);
218
+ }
219
+
220
+ @Put('/internal/:id')
221
+ @UseInterceptors(FileInterceptor('FileStream'))
222
+ async updateInternal(
223
+ @UploadedFile() fileStream: Express.Multer.File,
224
+ @Param('id', new ValidateIdPipe()) id: string,
225
+ @Body() updatedMedia: InternalMediaDto,
226
+ ) {
227
+ try {
228
+ let media = new Medias(this.mediaRepository, this.commonService);
229
+
230
+ const mediaData = await media.findOne({where: { MediaId: id}});
231
+ const mediaAttr: IBaseMediasAttr = {
232
+ ...mediaData.get({ plain: true }),
233
+ ...updatedMedia,
234
+ UpdatedAt: new Date(),
235
+ UpdatedById: 'test_user',
236
+ };
237
+ media = new Medias(this.mediaRepository, this.commonService, mediaAttr);
238
+ await media.updateMedias(false, fileStream);
239
+ return mediaAttr;
240
+ } catch (error) {
241
+ throw error;
242
+ }
243
+ }
244
+ }
@@ -0,0 +1,19 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { SequelizeModule } from '@nestjs/sequelize';
3
+ import { CommonModule } from './common/common.module';
4
+ import { MediasController } from './medias.controller';
5
+ import { MediasRepository } from './medias.repository';
6
+ import { MediasModel } from './entities/medias.entity';
7
+
8
+ @Module({
9
+ controllers: [MediasController],
10
+ providers: [
11
+ {
12
+ provide: 'MediasRepository',
13
+ useClass: MediasRepository,
14
+ },
15
+ ],
16
+ imports: [SequelizeModule.forFeature([MediasModel], process.env.SEQUELIZE_DB_NAME), CommonModule],
17
+ exports: [SequelizeModule],
18
+ })
19
+ export class MediasModule {}
@@ -0,0 +1,44 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { InjectModel } from '@nestjs/sequelize';
3
+ import { BaseRepository } from './base/base.repository.abstract';
4
+ import { MediasModel } from './entities/medias.entity';
5
+ import { IBaseMediasAttr } from './interfaces/base.medias-attr.interface';
6
+ import { IMediasRepository } from './interfaces/medias.repository.interface';
7
+
8
+ @Injectable()
9
+ export class MediasRepository
10
+ extends BaseRepository<MediasModel>
11
+ implements IMediasRepository
12
+ {
13
+ constructor(
14
+ @InjectModel(MediasModel, 'csmsDB')
15
+ private readonly mediasModel: typeof MediasModel,
16
+ ) {
17
+ super(mediasModel);
18
+ }
19
+
20
+ create(
21
+ data: IBaseMediasAttr,
22
+ options?: any,
23
+ ): Promise<MediasModel> | any {
24
+ return this.mediasModel.create({ ...data }, options);
25
+ }
26
+
27
+ findAll(options: any): Promise<MediasModel[]> {
28
+ return this.mediasModel.findAll(options);
29
+ }
30
+
31
+ findAllWithPagination(
32
+ options: any,
33
+ ): Promise<{ count: number; rows: MediasModel[] }> {
34
+ return this.mediasModel.findAndCountAll(options);
35
+ }
36
+
37
+ findOne(options: any): Promise<MediasModel> {
38
+ return this.mediasModel.findOne(options);
39
+ }
40
+
41
+ update(data: IBaseMediasAttr, options?: any): any {
42
+ return this.mediasModel.update({ ...data }, options);
43
+ }
44
+ }