@solidstarters/solid-core 1.2.38 → 1.2.40

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 (107) hide show
  1. package/dist/controllers/media.controller.d.ts +27 -10
  2. package/dist/controllers/media.controller.d.ts.map +1 -1
  3. package/dist/controllers/media.controller.js +117 -42
  4. package/dist/controllers/media.controller.js.map +1 -1
  5. package/dist/dtos/create-media.dto.d.ts +5 -2
  6. package/dist/dtos/create-media.dto.d.ts.map +1 -1
  7. package/dist/dtos/create-media.dto.js +45 -17
  8. package/dist/dtos/create-media.dto.js.map +1 -1
  9. package/dist/dtos/update-media.dto.d.ts +13 -4
  10. package/dist/dtos/update-media.dto.d.ts.map +1 -1
  11. package/dist/dtos/update-media.dto.js +85 -4
  12. package/dist/dtos/update-media.dto.js.map +1 -1
  13. package/dist/entities/media.entity.d.ts +6 -6
  14. package/dist/entities/media.entity.d.ts.map +1 -1
  15. package/dist/entities/media.entity.js +20 -26
  16. package/dist/entities/media.entity.js.map +1 -1
  17. package/dist/repository/media.repository.d.ts +16 -0
  18. package/dist/repository/media.repository.d.ts.map +1 -0
  19. package/dist/repository/media.repository.js +90 -0
  20. package/dist/repository/media.repository.js.map +1 -0
  21. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  22. package/dist/seeders/module-metadata-seeder.service.js +7 -2
  23. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  24. package/dist/seeders/seed-data/solid-core-metadata.json +154 -38
  25. package/dist/services/action-metadata.service.d.ts +3 -6
  26. package/dist/services/action-metadata.service.d.ts.map +1 -1
  27. package/dist/services/action-metadata.service.js +7 -11
  28. package/dist/services/action-metadata.service.js.map +1 -1
  29. package/dist/services/crud.service.d.ts +3 -6
  30. package/dist/services/crud.service.d.ts.map +1 -1
  31. package/dist/services/crud.service.js +5 -6
  32. package/dist/services/crud.service.js.map +1 -1
  33. package/dist/services/media.service.d.ts +32 -22
  34. package/dist/services/media.service.d.ts.map +1 -1
  35. package/dist/services/media.service.js +64 -134
  36. package/dist/services/media.service.js.map +1 -1
  37. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +3 -3
  38. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  39. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +28 -9
  40. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  41. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +3 -3
  42. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  43. package/dist/services/mediaStorageProviders/file-storage-provider.js +28 -9
  44. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  45. package/dist/services/mediaStorageProviders/index.d.ts +2 -5
  46. package/dist/services/mediaStorageProviders/index.d.ts.map +1 -1
  47. package/dist/services/mediaStorageProviders/index.js +4 -4
  48. package/dist/services/mediaStorageProviders/index.js.map +1 -1
  49. package/dist/services/menu-item-metadata.service.d.ts +3 -6
  50. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  51. package/dist/services/menu-item-metadata.service.js +7 -11
  52. package/dist/services/menu-item-metadata.service.js.map +1 -1
  53. package/dist/services/mq-message-queue.service.d.ts +3 -6
  54. package/dist/services/mq-message-queue.service.d.ts.map +1 -1
  55. package/dist/services/mq-message-queue.service.js +7 -11
  56. package/dist/services/mq-message-queue.service.js.map +1 -1
  57. package/dist/services/mq-message.service.d.ts +3 -6
  58. package/dist/services/mq-message.service.d.ts.map +1 -1
  59. package/dist/services/mq-message.service.js +7 -11
  60. package/dist/services/mq-message.service.js.map +1 -1
  61. package/dist/services/permission-metadata.service.d.ts +3 -6
  62. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  63. package/dist/services/permission-metadata.service.js +7 -11
  64. package/dist/services/permission-metadata.service.js.map +1 -1
  65. package/dist/services/role-metadata.service.d.ts +3 -6
  66. package/dist/services/role-metadata.service.d.ts.map +1 -1
  67. package/dist/services/role-metadata.service.js +8 -12
  68. package/dist/services/role-metadata.service.js.map +1 -1
  69. package/dist/services/setting.service.d.ts +8 -11
  70. package/dist/services/setting.service.d.ts.map +1 -1
  71. package/dist/services/setting.service.js +15 -19
  72. package/dist/services/setting.service.js.map +1 -1
  73. package/dist/services/user.service.d.ts +8 -11
  74. package/dist/services/user.service.d.ts.map +1 -1
  75. package/dist/services/user.service.js +14 -18
  76. package/dist/services/user.service.js.map +1 -1
  77. package/dist/services/view-metadata.service.d.ts +9 -12
  78. package/dist/services/view-metadata.service.d.ts.map +1 -1
  79. package/dist/services/view-metadata.service.js +15 -19
  80. package/dist/services/view-metadata.service.js.map +1 -1
  81. package/dist/solid-core.module.d.ts.map +1 -1
  82. package/dist/solid-core.module.js +6 -0
  83. package/dist/solid-core.module.js.map +1 -1
  84. package/dist/tsconfig.tsbuildinfo +1 -1
  85. package/package.json +1 -1
  86. package/src/controllers/media.controller.ts +97 -68
  87. package/src/dtos/create-media.dto.ts +57 -33
  88. package/src/dtos/update-media.dto.ts +61 -3
  89. package/src/entities/media.entity.ts +29 -31
  90. package/src/repository/media.repository.ts +74 -0
  91. package/src/seeders/module-metadata-seeder.service.ts +7 -2
  92. package/src/seeders/seed-data/solid-core-metadata.json +160 -42
  93. package/src/services/action-metadata.service.ts +4 -6
  94. package/src/services/crud.service.ts +5 -9
  95. package/src/services/media.service.ts +160 -270
  96. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +8 -7
  97. package/src/services/mediaStorageProviders/file-storage-provider.ts +10 -8
  98. package/src/services/mediaStorageProviders/index.ts +7 -13
  99. package/src/services/menu-item-metadata.service.ts +4 -6
  100. package/src/services/mq-message-queue.service.ts +4 -6
  101. package/src/services/mq-message.service.ts +5 -8
  102. package/src/services/permission-metadata.service.ts +4 -6
  103. package/src/services/role-metadata.service.ts +4 -6
  104. package/src/services/setting.service.ts +18 -20
  105. package/src/services/user.service.ts +11 -14
  106. package/src/services/view-metadata.service.ts +10 -12
  107. package/src/solid-core.module.ts +6 -0
@@ -1,292 +1,182 @@
1
- import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common";
2
- import { InjectRepository } from "@nestjs/typeorm";
3
- import { Repository, SelectQueryBuilder } from "typeorm";
4
- import { Media } from "../entities/media.entity";
5
- import { ModelMetadata } from "../entities/model-metadata.entity";
6
- import { MediaStorageProviderMetadata } from "../entities/media-storage-provider-metadata.entity";
7
- import { FieldMetadata } from "../entities/field-metadata.entity";
8
- import { BasicFilterDto } from "../dtos/basic-filters.dto";
9
- import { CrudHelperService } from "./crud-helper.service";
10
- import { FileService } from "src/services/file.service";
11
- import { ConfigService } from "@nestjs/config";
12
- import { MediaStorageProviderType } from "../dtos/create-media-storage-provider-metadata.dto";
13
- import { FileStorageProvider } from "./mediaStorageProviders/file-storage-provider";
14
- import { FileS3StorageProvider } from "./mediaStorageProviders/file-s3-storage-provider";
1
+ import { Injectable, NotFoundException } from '@nestjs/common';
2
+ import { DiscoveryService, ModuleRef } from "@nestjs/core";
3
+ import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
4
+ import { EntityManager, Repository } from 'typeorm';
5
+
6
+ import { ConfigService } from '@nestjs/config';
7
+ import { CrudHelperService } from 'src/services/crud-helper.service';
8
+ import { CRUDService } from 'src/services/crud.service';
9
+ import { FileService } from 'src/services/file.service';
10
+ import { ModelMetadataService } from 'src/services/model-metadata.service';
11
+ import { ModuleMetadataService } from 'src/services/module-metadata.service';
12
+
13
+
14
+ import { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';
15
+ import { FieldMetadata } from 'src/entities/field-metadata.entity';
16
+ import { MediaStorageProviderMetadata } from 'src/entities/media-storage-provider-metadata.entity';
17
+ import { Media } from 'src/entities/media.entity';
18
+ import { ModelMetadata } from 'src/entities/model-metadata.entity';
15
19
  import { getMediaStorageProvider } from "./mediaStorageProviders";
20
+ import { BasicFilterDto } from 'src/dtos/basic-filters.dto';
16
21
 
17
- @Injectable()
18
- export class MediaService {
19
- constructor(
20
- @InjectRepository(Media)
21
- private readonly mediaRepo: Repository<Media>,
22
- @InjectRepository(ModelMetadata)
23
- private readonly modelMetadataRepo: Repository<ModelMetadata>,
24
- @InjectRepository(MediaStorageProviderMetadata)
25
- private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,
26
- @InjectRepository(FieldMetadata)
27
- private readonly fieldMetadataRepo: Repository<FieldMetadata>,
28
- private readonly crudHelperService: CrudHelperService,
29
- readonly fileService: FileService,
30
- // @Inject(radixConfig.KEY)
31
- // private readonly radixConfiguration: ConfigType<typeof radixConfig>,
32
- private readonly configService: ConfigService,
33
- ) { }
34
-
35
- async findMany(basicFilterDto: BasicFilterDto) {
36
- const alias = 'media';
37
- // Extract the required keys from the input query
38
- let { limit, offset } = basicFilterDto;
39
-
40
- // Create above query on pincode table using query builder
41
- var qb: SelectQueryBuilder<Media> = this.mediaRepo.createQueryBuilder(alias)
42
- qb = await this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
43
-
44
- // Get the records and the count
45
- const [entities, count] = await qb.getManyAndCount();
46
22
 
47
- const currentPage = Math.floor(offset / limit) + 1;
48
- const totalPages = Math.ceil(count / limit);
49
-
50
- const nextPage = currentPage < totalPages ? currentPage + 1 : null;
51
- const prevPage = currentPage > 1 ? currentPage - 1 : null;
52
-
53
- const r = {
54
- meta: {
55
- totalRecords: count,
56
- currentPage: currentPage,
57
- nextPage: nextPage,
58
- prevPage: prevPage,
59
- totalPages: totalPages,
60
- perPage: +limit,
61
- },
62
- records: entities
63
- };
64
- return r
65
- }
66
-
67
- async findOne(id: number, relations = {}) {
68
- const lov = await this.mediaRepo.findOne({
69
- where: {
70
- id: id,
71
- },
72
- relations: relations,
73
- });
74
- if (!lov) {
75
- throw new NotFoundException(`Media with #${id} not found`);
23
+ @Injectable()
24
+ export class MediaService extends CRUDService<Media> {
25
+ constructor(
26
+ readonly modelMetadataService: ModelMetadataService,
27
+ readonly moduleMetadataService: ModuleMetadataService,
28
+ readonly configService: ConfigService,
29
+ readonly fileService: FileService,
30
+ readonly discoveryService: DiscoveryService,
31
+ readonly crudHelperService: CrudHelperService,
32
+ @InjectEntityManager()
33
+ readonly entityManager: EntityManager,
34
+ @InjectRepository(Media, 'default')
35
+ readonly repo: Repository<Media>,
36
+ @InjectRepository(ModelMetadata)
37
+ private readonly modelMetadataRepo: Repository<ModelMetadata>,
38
+ @InjectRepository(MediaStorageProviderMetadata)
39
+ private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,
40
+ @InjectRepository(FieldMetadata)
41
+ private readonly fieldMetadataRepo: Repository<FieldMetadata>,
42
+ readonly moduleRef: ModuleRef,
43
+
44
+
45
+
46
+ ) {
47
+ super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'media', 'solid-core', moduleRef);
48
+ }
49
+ async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {
50
+ const data = await super.find(basicFilterDto, solidRequestContext);
51
+ if (data.records) {
52
+ data.records.forEach((media: Media) => {
53
+ if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {
54
+ media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;
55
+ } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {
56
+ media.relativeUri = this.getAwsS3FullFilePath(
57
+ media.relativeUri,
58
+ media.mediaStorageProviderMetadata.bucketName,
59
+ media.mediaStorageProviderMetadata.region
60
+ );
76
61
  }
77
- return lov;
62
+ });
78
63
  }
79
-
80
- async create(createDto: any) {
81
- createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({
82
- where: {
83
- id: createDto['fieldMetadataId']
84
- },
85
- });
86
- createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({
87
- where: {
88
- id: createDto['modelMetadataId']
89
- },
90
- });
91
- createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({
92
- where: {
93
- id: createDto['mediaStorageProviderMetadataId']
94
- },
64
+ if (data.groupRecords) {
65
+ data.groupRecords.forEach((group) => {
66
+ group.groupData.records.forEach((media) => {
67
+ if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {
68
+ media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;
69
+ }
70
+ else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {
71
+ media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);
72
+ }
95
73
  });
96
- const media = this.mediaRepo.create(createDto);
97
- return this.mediaRepo.save(media);
74
+ });
98
75
  }
76
+ return data
77
+ }
78
+ async upload(createDto: any, files: Array<Express.Multer.File>) {
99
79
 
100
- async upload(createDto: any, files: Array<Express.Multer.File>) {
101
-
102
- if (!files) {
103
- throw new NotFoundException(`File Not Found`);
104
-
105
- }
106
- const savedMedias = [];
107
- for (let i = 0; i < files.length; i++) {
108
-
109
-
110
- createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({
111
- where: {
112
- id: createDto['fieldMetadataId']
113
- },
114
- });
115
- createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({
116
- where: {
117
- id: createDto['modelMetadataId']
118
- },
119
- });
120
- createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({
121
- where: {
122
- id: createDto['mediaStorageProviderMetadataId']
123
- },
124
- });
80
+ if (!files) {
81
+ throw new NotFoundException(`File Not Found`);
125
82
 
126
- const file = files[i];
127
-
128
- switch (createDto.mediaStorageProviderMetadata.type) {
129
- case MediaStorageProviderType.Filesystem:
130
- const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(file));
131
- await this.fileService.copyFile(file.path, fileStoragePath);
132
- createDto['relativeUri'] = this.getFileName(file);
133
- break;
134
- case MediaStorageProviderType.AwsS3:
135
- const fileName = this.getFileName(file);
136
- let awsFileUrl;
137
- if (createDto.mediaStorageProviderMetadata.isPublic === true) {
138
- awsFileUrl = await this.fileService.copyToS3(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName,);
139
- } else {
140
- awsFileUrl = await this.fileService.copyToS3WithPublic(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName,);
141
- }
142
- // createDto['relativeUri'] = this.getAwsS3FullFilePath(awsFileUrl, createDto.mediaStorageProviderMetadata.bucketName, createDto.mediaStorageProviderMetadata.region);
143
- createDto['relativeUri'] = awsFileUrl
144
- break;
145
- default:
146
- break;
147
- }
148
- await this.fileService.deleteFile(file.path);
149
-
150
- const media = this.mediaRepo.create(createDto);
151
- const savedMedia = await this.mediaRepo.save(media);
152
- savedMedias.push(savedMedia)
153
- }
154
- return savedMedias
155
83
  }
156
-
157
- async deleteMany(ids: number[]): Promise<any> {
158
- if (!ids || ids.length === 0) {
159
- throw new Error('At least one ID is required for deletion');
160
- }
161
- const removedEntities = [];
162
- for (let i = 0; i < ids.length; i++) {
163
- const id = ids[i]
164
- const entity = await this.modelMetadataRepo.findOne({
165
- where: {
166
- //@ts-ignore
167
- id: id,
168
- }
169
- });
170
- // if (!entity) {
171
- // throw new Error(`Entity with id ${id} not found`);
172
- // }
173
- removedEntities.push(await this.modelMetadataRepo.remove(entity));
174
- }
175
-
176
- return removedEntities
84
+ const savedMedias = [];
85
+ for (let i = 0; i < files.length; i++) {
86
+
87
+
88
+ createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({
89
+ where: {
90
+ id: createDto['fieldMetadataId']
91
+ },
92
+ });
93
+ createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({
94
+ where: {
95
+ id: createDto['modelMetadataId']
96
+ },
97
+ });
98
+ createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({
99
+ where: {
100
+ id: createDto['mediaStorageProviderMetadataId']
101
+ },
102
+ });
103
+
104
+ const file = files[i];
105
+
106
+ switch (createDto.mediaStorageProviderMetadata.type) {
107
+ case MediaStorageProviderType.Filesystem:
108
+ const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(file));
109
+ await this.fileService.copyFile(file.path, fileStoragePath);
110
+ createDto['relativeUri'] = this.getFileName(file);
111
+ break;
112
+ case MediaStorageProviderType.AwsS3:
113
+ const fileName = this.getFileName(file);
114
+ let awsFileUrl;
115
+ if (createDto.mediaStorageProviderMetadata.isPublic === true) {
116
+ awsFileUrl = await this.fileService.copyToS3(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName,);
117
+ } else {
118
+ awsFileUrl = await this.fileService.copyToS3WithPublic(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName,);
119
+ }
120
+ // createDto['relativeUri'] = this.getAwsS3FullFilePath(awsFileUrl, createDto.mediaStorageProviderMetadata.bucketName, createDto.mediaStorageProviderMetadata.region);
121
+ createDto['relativeUri'] = awsFileUrl
122
+ break;
123
+ default:
124
+ break;
125
+ }
126
+ await this.fileService.deleteFile(file.path);
127
+
128
+ const media = this.repo.create(createDto);
129
+ const savedMedia = await this.repo.save(media);
130
+ savedMedias.push(savedMedia)
177
131
  }
178
-
179
- async remove(id: number) {
180
- // const lov = await this.findOne(id);
181
- const media = await this.mediaRepo.findOne({
182
- where: {
183
- id: id,
184
- },
185
- relations: ['mediaStorageProviderMetadata', 'fieldMetadata', 'fieldMetadata.model','fieldMetadata.mediaStorageProvider'],
186
- });
187
- const modelEntity = await this.modelMetadataRepo.findOne({
188
- where: {
189
- id: media.entityId,
190
- }
191
- }
192
- );
193
- // if (media.mediaStorageProviderMetadata.type === 'filesystem') {
194
- // const fileStorageProvider = new FileStorageProvider(this.configService, this.fileService, this);
195
-
196
- // await fileStorageProvider.delete(media, media.fieldMetadata);
197
-
198
- // } else if (media.mediaStorageProviderMetadata.type === 'aws-s3') {
199
- // const fileStorageProvider = new FileS3StorageProvider(this.configService, this.fileService, this);
200
- // await fileStorageProvider.delete(media, media.fieldMetadata);
201
-
202
- // } else {
203
- // }
204
- const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;
205
- const storageProvider = getMediaStorageProvider(this.configService, this.fileService, this, storageProviderType);
206
- await storageProvider.delete(modelEntity, media.fieldMetadata);
207
-
208
- return this.mediaRepo.remove(media);
132
+ return savedMedias
133
+ }
134
+
135
+ async remove(id: number) {
136
+ // const lov = await this.findOne(id);
137
+ const media = await this.repo.findOne({
138
+ where: {
139
+ id: id,
140
+ },
141
+ relations: ['mediaStorageProviderMetadata', 'fieldMetadata', 'fieldMetadata.model', 'fieldMetadata.mediaStorageProvider'],
142
+ });
143
+ const modelEntity = await this.modelMetadataRepo.findOne({
144
+ where: {
145
+ id: media.entityId,
146
+ }
209
147
  }
148
+ );
149
+ // if (media.mediaStorageProviderMetadata.type === 'filesystem') {
150
+ // const fileStorageProvider = new FileStorageProvider(this.configService, this.fileService, this);
210
151
 
211
- async delete(id: number) {
212
- if (!id) {
213
- throw new BadRequestException('Id is required for update');
214
- }
215
- const entity = await this.mediaRepo.findOne({
216
- where: {
217
- //@ts-ignore
218
- id: id,
219
- }
220
- });
221
- if (!entity) {
222
- throw new NotFoundException(`Entity with id ${id} not found`);
223
- }
224
- return this.mediaRepo.remove(entity);
225
- }
152
+ // await fileStorageProvider.delete(media, media.fieldMetadata);
226
153
 
227
- // async deleteByEntityId(entityId: number) {
228
- // if (!entityId) {
229
- // throw new BadRequestException('Entity id is required for deletion');
230
- // }
231
- // const entities = await this.mediaRepo.find({
232
- // where: {
233
- // entityId: entityId,
234
- // }
235
- // });
236
- // return this.mediaRepo.remove(entities);
237
- // }
154
+ // } else if (media.mediaStorageProviderMetadata.type === 'aws-s3') {
155
+ // const fileStorageProvider = new FileS3StorageProvider(this.configService, this.fileService, this);
156
+ // await fileStorageProvider.delete(media, media.fieldMetadata);
238
157
 
239
- // async findByEntityId(entityId: number) {
240
- // return this.mediaRepo.find({
241
- // where: {
242
- // entityId: entityId,
243
- // }
244
- // });
158
+ // } else {
245
159
  // }
160
+ const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;
161
+ const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);
162
+ await storageProvider.delete(modelEntity, media.fieldMetadata);
246
163
 
247
- async findByEntityIdAndFieldIdAndModelMetadataId(entityId: number, fieldMetadataId: number, modelMetadataId: number, relations = {}) {
248
- return await this.mediaRepo.find({
249
- where: {
250
- modelMetadata: {
251
- id: modelMetadataId
252
- },
253
- fieldMetadata: {
254
- id: fieldMetadataId
255
- },
256
- entityId: entityId,
257
- },
258
- relations: relations,
259
- });
260
- }
261
-
262
- async deleteByEntityIdAndFieldIdAndModelMetadataId(entityId: number, fieldMetadataId: number, modelMetadataId: number) {
263
- const entities = await this.mediaRepo.find({
264
- where: {
265
- modelMetadata: {
266
- id: modelMetadataId
267
- },
268
- fieldMetadata: {
269
- id: fieldMetadataId
270
- },
271
- entityId: entityId,
272
- }
273
- });
274
- return this.mediaRepo.remove(entities);
275
- }
164
+ return this.repo.remove(media);
165
+ }
166
+ //TODO: Move this to a app builder config
276
167
 
277
- //TODO: Move this to a app builder config
168
+ private getFileSysytemFullFilePath(fileName: string): string {
169
+ return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;
170
+ }
278
171
 
279
- private getFileSysytemFullFilePath(fileName: string): string {
280
- return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;
281
- }
282
172
 
173
+ private getAwsS3FullFilePath(awsMediaurl: string, bucketName: string, regionName: string): string {
174
+ // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg
175
+ return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;
176
+ }
283
177
 
284
- private getAwsS3FullFilePath(awsMediaurl: string, bucketName: string, regionName: string): string {
285
- // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg
286
- return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;
287
- }
178
+ private getFileName(file: Express.Multer.File): string {
179
+ return `${file.filename}-${file.originalname}`;
180
+ }
288
181
 
289
- private getFileName(file: Express.Multer.File): string {
290
- return `${file.filename}-${file.originalname}`;
291
- }
292
- }
182
+ }
@@ -1,13 +1,14 @@
1
- import { Inject, Logger } from "@nestjs/common";
1
+ import { Inject, Injectable, Logger } from "@nestjs/common";
2
2
  import { ConfigService, ConfigType } from "@nestjs/config";
3
3
  import { MediaStorageProvider } from "src/interfaces";
4
4
  import { FileService } from "src/services/file.service";
5
- import { MediaService } from "../media.service";
6
5
  import { Media } from "src/entities/media.entity";
7
6
  import { CommonEntity } from "src/entities/common.entity";
8
7
  import { FieldMetadata } from "src/entities/field-metadata.entity";
9
8
  import appBuilderConfig from "src/config/app-builder.config";
9
+ import { MediaRepository } from "src/repository/media.repository";
10
10
 
11
+ @Injectable()
11
12
  export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
12
13
  private logger = new Logger(FileS3StorageProvider.name);
13
14
 
@@ -16,13 +17,13 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
16
17
  // private readonly appBuilderConfiguration: ConfigType<typeof appBuilderConfig>,
17
18
  private readonly configService: ConfigService,
18
19
  readonly fileService: FileService,
19
- readonly mediaService: MediaService
20
+ readonly mediaRepository: MediaRepository
20
21
  ) { }
21
22
  async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
22
23
  if (!(entity instanceof CommonEntity)) {
23
24
  throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
24
25
  }
25
- const media = await this.mediaService.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
26
+ const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
26
27
  // Add the full URL to the media
27
28
  media.forEach(m => {
28
29
  m['_full_url'] = this.getFullFilePath(m);
@@ -47,7 +48,7 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
47
48
  await this.fileService.deleteFile(file.path);
48
49
 
49
50
  // Create an entry in the media table
50
- const mediaEntity = await this.mediaService.create({
51
+ const mediaEntity = await this.mediaRepository.createMedia({
51
52
  entityId: entity.id,
52
53
  modelMetadataId: mediaFieldMetadata.model.id,
53
54
  relativeUri: awsFileUrl,
@@ -67,8 +68,8 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
67
68
  if (!(entity instanceof CommonEntity)) {
68
69
  throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
69
70
  }
70
- const existingMedia = await this.mediaService.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id,['mediaStorageProviderMetadata']);
71
- this.mediaService.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
71
+ const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id,['mediaStorageProviderMetadata']);
72
+ this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
72
73
  existingMedia.forEach(media => {
73
74
  this.fileService.deleteFromS3(media.relativeUri, mediaFieldMetadata.mediaStorageProvider.bucketName); //TODO
74
75
  });
@@ -1,13 +1,13 @@
1
- import { Inject, Logger } from "@nestjs/common";
1
+ import { Inject, Injectable, Logger } from "@nestjs/common";
2
2
  import { ConfigService, ConfigType } from "@nestjs/config";
3
3
  import { MediaStorageProvider } from "src/interfaces";
4
4
  import { FileService } from "src/services/file.service";
5
- import { MediaService } from "../media.service";
6
5
  import { Media } from "src/entities/media.entity";
7
6
  import { CommonEntity } from "src/entities/common.entity";
8
7
  import { FieldMetadata } from "src/entities/field-metadata.entity";
9
- import appBuilderConfig from "src/config/app-builder.config";
8
+ import { MediaRepository } from "src/repository/media.repository";
10
9
 
10
+ @Injectable()
11
11
  export class FileStorageProvider<T> implements MediaStorageProvider<T> {
12
12
  private logger = new Logger(FileStorageProvider.name);
13
13
 
@@ -16,13 +16,15 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
16
16
  // private readonly appBuilderConfiguration: ConfigType<typeof appBuilderConfig>,
17
17
  private readonly configService: ConfigService,
18
18
  readonly fileService: FileService,
19
- readonly mediaService: MediaService
19
+ readonly mediaRepository: MediaRepository
20
+
20
21
  ) { }
22
+
21
23
  async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
22
24
  if (!(entity instanceof CommonEntity)) {
23
25
  throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
24
26
  }
25
- const media = await this.mediaService.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
27
+ const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
26
28
  // Add the full URL to the media
27
29
  media.forEach(m => {
28
30
  m['_full_url'] = `${process.env.BASE_URL}/${this.getFullFilePath(m.relativeUri)}`;
@@ -42,7 +44,7 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
42
44
  this.fileService.deleteFile(file.path);
43
45
 
44
46
  // Create an entry in the media table
45
- const mediaEntity = await this.mediaService.create({
47
+ const mediaEntity = await this.mediaRepository.createMedia({
46
48
  entityId: entity.id,
47
49
  modelMetadataId: mediaFieldMetadata.model.id,
48
50
  relativeUri: this.getFileName(file),
@@ -62,8 +64,8 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
62
64
  if (!(entity instanceof CommonEntity)) {
63
65
  throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
64
66
  }
65
- const existingMedia = await this.mediaService.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id,['mediaStorageProviderMetadata']);
66
- this.mediaService.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
67
+ const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id,['mediaStorageProviderMetadata']);
68
+ this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
67
69
  existingMedia.forEach(media => {
68
70
  this.fileService.deleteFile(this.getFullFilePath(media.relativeUri));
69
71
  });
@@ -1,22 +1,16 @@
1
+ import { ModuleRef } from "@nestjs/core";
1
2
  import { MediaStorageProviderType } from "src/dtos/create-media-storage-provider-metadata.dto";
2
- import { FileStorageProvider } from "./file-storage-provider";
3
- import { MediaStorageProvider } from "src/interfaces";
4
- import { ConfigService } from "@nestjs/config";
5
- import { FileService } from "src/services/file.service";
6
- import { MediaService } from "../media.service";
7
- import { CommonEntity } from "src/entities/common.entity";
8
3
  import { FileS3StorageProvider } from "./file-s3-storage-provider";
4
+ import { FileStorageProvider } from "./file-storage-provider";
9
5
 
10
- export function getMediaStorageProvider<T>(
11
- configService: ConfigService,
12
- fileService: FileService,
13
- mediaService: MediaService,
14
- type: MediaStorageProviderType): MediaStorageProvider<T> {
6
+ export async function getMediaStorageProvider<T>(
7
+ moduleRef: ModuleRef,
8
+ type: MediaStorageProviderType): Promise<any> {
15
9
  switch(type) {
16
10
  case MediaStorageProviderType.Filesystem:
17
- return new FileStorageProvider<T>(configService, fileService, mediaService);
11
+ return await moduleRef.get(FileStorageProvider,{ strict: false });
18
12
  case MediaStorageProviderType.AwsS3:
19
- return new FileS3StorageProvider<T>(configService, fileService, mediaService);
13
+ return await moduleRef.get(FileS3StorageProvider,{ strict: false });
20
14
  default:
21
15
  throw new Error(`Unknown media storage provider type ${type}`);
22
16
  }
@@ -1,13 +1,11 @@
1
1
  import { Injectable } from '@nestjs/common';
2
2
  import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
3
- import { DiscoveryService } from "@nestjs/core";
3
+ import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
4
  import { EntityManager, Repository } from 'typeorm';
5
5
  import { CRUDService } from 'src/services/crud.service';
6
6
  import { ModelMetadataService } from 'src/services/model-metadata.service';
7
7
  import { ModuleMetadataService } from 'src/services/module-metadata.service';
8
- import { MediaStorageProviderMetadataService } from 'src/services/media-storage-provider-metadata.service';
9
8
  import { ConfigService } from '@nestjs/config';
10
- import { MediaService } from "src/services/media.service";
11
9
  import { FileService } from "src/services/file.service";
12
10
  import { CrudHelperService } from "src/services/crud-helper.service";
13
11
 
@@ -23,18 +21,18 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
23
21
  constructor(
24
22
  readonly modelMetadataService: ModelMetadataService,
25
23
  readonly moduleMetadataService: ModuleMetadataService,
26
- readonly mediaStorageProviderService: MediaStorageProviderMetadataService,
27
24
  readonly configService: ConfigService,
28
25
  readonly fileService: FileService,
29
- readonly mediaService: MediaService,
30
26
  readonly discoveryService: DiscoveryService,
31
27
  readonly crudHelperService: CrudHelperService,
32
28
  @InjectEntityManager()
33
29
  readonly entityManager: EntityManager,
34
30
  @InjectRepository(MenuItemMetadata, 'default')
35
31
  readonly repo: Repository<MenuItemMetadata>,
32
+ readonly moduleRef: ModuleRef
33
+
36
34
  ) {
37
- super(modelMetadataService, moduleMetadataService, mediaStorageProviderService, configService, fileService, mediaService, discoveryService, crudHelperService, entityManager, repo, 'menuItemMetadata', 'app-builder');
35
+ super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'menuItemMetadata', 'app-builder',moduleRef);
38
36
  }
39
37
 
40
38