@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.
- package/dist/controllers/media.controller.d.ts +27 -10
- package/dist/controllers/media.controller.d.ts.map +1 -1
- package/dist/controllers/media.controller.js +117 -42
- package/dist/controllers/media.controller.js.map +1 -1
- package/dist/dtos/create-media.dto.d.ts +5 -2
- package/dist/dtos/create-media.dto.d.ts.map +1 -1
- package/dist/dtos/create-media.dto.js +45 -17
- package/dist/dtos/create-media.dto.js.map +1 -1
- package/dist/dtos/update-media.dto.d.ts +13 -4
- package/dist/dtos/update-media.dto.d.ts.map +1 -1
- package/dist/dtos/update-media.dto.js +85 -4
- package/dist/dtos/update-media.dto.js.map +1 -1
- package/dist/entities/media.entity.d.ts +6 -6
- package/dist/entities/media.entity.d.ts.map +1 -1
- package/dist/entities/media.entity.js +20 -26
- package/dist/entities/media.entity.js.map +1 -1
- package/dist/repository/media.repository.d.ts +16 -0
- package/dist/repository/media.repository.d.ts.map +1 -0
- package/dist/repository/media.repository.js +90 -0
- package/dist/repository/media.repository.js.map +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +7 -2
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +154 -38
- package/dist/services/action-metadata.service.d.ts +3 -6
- package/dist/services/action-metadata.service.d.ts.map +1 -1
- package/dist/services/action-metadata.service.js +7 -11
- package/dist/services/action-metadata.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +3 -6
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +5 -6
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/media.service.d.ts +32 -22
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +64 -134
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +3 -3
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +28 -9
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +3 -3
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +28 -9
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/index.d.ts +2 -5
- package/dist/services/mediaStorageProviders/index.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/index.js +4 -4
- package/dist/services/mediaStorageProviders/index.js.map +1 -1
- package/dist/services/menu-item-metadata.service.d.ts +3 -6
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +7 -11
- package/dist/services/menu-item-metadata.service.js.map +1 -1
- package/dist/services/mq-message-queue.service.d.ts +3 -6
- package/dist/services/mq-message-queue.service.d.ts.map +1 -1
- package/dist/services/mq-message-queue.service.js +7 -11
- package/dist/services/mq-message-queue.service.js.map +1 -1
- package/dist/services/mq-message.service.d.ts +3 -6
- package/dist/services/mq-message.service.d.ts.map +1 -1
- package/dist/services/mq-message.service.js +7 -11
- package/dist/services/mq-message.service.js.map +1 -1
- package/dist/services/permission-metadata.service.d.ts +3 -6
- package/dist/services/permission-metadata.service.d.ts.map +1 -1
- package/dist/services/permission-metadata.service.js +7 -11
- package/dist/services/permission-metadata.service.js.map +1 -1
- package/dist/services/role-metadata.service.d.ts +3 -6
- package/dist/services/role-metadata.service.d.ts.map +1 -1
- package/dist/services/role-metadata.service.js +8 -12
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/setting.service.d.ts +8 -11
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +15 -19
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/user.service.d.ts +8 -11
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +14 -18
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +9 -12
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +15 -19
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +6 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/controllers/media.controller.ts +97 -68
- package/src/dtos/create-media.dto.ts +57 -33
- package/src/dtos/update-media.dto.ts +61 -3
- package/src/entities/media.entity.ts +29 -31
- package/src/repository/media.repository.ts +74 -0
- package/src/seeders/module-metadata-seeder.service.ts +7 -2
- package/src/seeders/seed-data/solid-core-metadata.json +160 -42
- package/src/services/action-metadata.service.ts +4 -6
- package/src/services/crud.service.ts +5 -9
- package/src/services/media.service.ts +160 -270
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +8 -7
- package/src/services/mediaStorageProviders/file-storage-provider.ts +10 -8
- package/src/services/mediaStorageProviders/index.ts +7 -13
- package/src/services/menu-item-metadata.service.ts +4 -6
- package/src/services/mq-message-queue.service.ts +4 -6
- package/src/services/mq-message.service.ts +5 -8
- package/src/services/permission-metadata.service.ts +4 -6
- package/src/services/role-metadata.service.ts +4 -6
- package/src/services/setting.service.ts +18 -20
- package/src/services/user.service.ts +11 -14
- package/src/services/view-metadata.service.ts +10 -12
- package/src/solid-core.module.ts +6 -0
|
@@ -1,292 +1,182 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import {
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
62
|
+
});
|
|
78
63
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
228
|
-
//
|
|
229
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
|
|
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
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
}
|
|
178
|
+
private getFileName(file: Express.Multer.File): string {
|
|
179
|
+
return `${file.filename}-${file.originalname}`;
|
|
180
|
+
}
|
|
288
181
|
|
|
289
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
71
|
-
this.
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
66
|
-
this.
|
|
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
|
-
|
|
12
|
-
|
|
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
|
|
11
|
+
return await moduleRef.get(FileStorageProvider,{ strict: false });
|
|
18
12
|
case MediaStorageProviderType.AwsS3:
|
|
19
|
-
return
|
|
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,
|
|
35
|
+
super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'menuItemMetadata', 'app-builder',moduleRef);
|
|
38
36
|
}
|
|
39
37
|
|
|
40
38
|
|