@solidxai/core 0.1.8-beta.1 → 0.1.8-beta.2
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/seeders/seed-data/solid-core-metadata.json +142 -85
- package/dist/services/field-metadata.service.d.ts +1 -3
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +6 -13
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/file/disk-file.service.d.ts +1 -0
- package/dist/services/file/disk-file.service.d.ts.map +1 -1
- package/dist/services/file/disk-file.service.js +11 -3
- package/dist/services/file/disk-file.service.js.map +1 -1
- package/dist/services/media.service.d.ts +0 -1
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +10 -11
- package/dist/services/media.service.js.map +1 -1
- package/package.json +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +142 -85
- package/src/services/field-metadata.service.ts +5 -12
- package/src/services/file/disk-file.service.ts +15 -7
- package/src/services/media.service.ts +12 -51
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { EntityManager, In } from 'typeorm';\nimport * as path from 'path';\nimport { DEFAULT_MEDIA_FILE_STORAGE_DIR } from \"src/services/settings/default-settings-provider.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nimport { ConfigService } from '@nestjs/config';\nimport { CRUDService } from 'src/services/crud.service';\nimport { DiskFileService, S3FileService } from 'src/services/file';\n\n\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { BasicFilterDto } from 'src/dtos/basic-filters.dto';\nimport { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';\nimport { Media } from 'src/entities/media.entity';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';\nimport { MediaRepository } from 'src/repository/media.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { getMediaStorageProvider } from \"./mediaStorageProviders\";\n\n\n@Injectable()\nexport class MediaService extends CRUDService<Media> {\n constructor(\n readonly configService: ConfigService,\n readonly diskFileService: DiskFileService,\n readonly s3FileService: S3FileService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(Media, 'default')\n // readonly repo: Repository<Media>,\n readonly repo: MediaRepository,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n // @InjectRepository(MediaStorageProviderMetadata)\n // private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly mediaStorageProviderMetadataRepo: MediaStorageProviderMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n readonly moduleRef: ModuleRef,\n ) {\n super(entityManager, repo, 'media', 'solid-core', moduleRef);\n }\n\n async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {\n const data = await super.find(basicFilterDto, solidRequestContext);\n if (data.records) {\n\n for (const media of data.records) {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${this.settingService.getConfigValue<SolidCoreSetting>(\"baseUrl\")}/${this.getFullFilePathForDisk(media.relativeUri)}`;\n } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(\n media.relativeUri,\n media.mediaStorageProviderMetadata.bucketName,\n media.mediaStorageProviderMetadata.region\n );\n }\n }\n // data.records.forEach((media: Media) => {\n // if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n // media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n // } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n // media.relativeUri = this.getAwsS3FullFilePath(\n // media.relativeUri,\n // media.mediaStorageProviderMetadata.bucketName,\n // media.mediaStorageProviderMetadata.region\n // );\n // }\n // });\n }\n if (data.groupRecords) {\n\n for (const group of data.groupRecords) {\n for (const media of group.groupData.records) {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${this.settingService.getConfigValue<SolidCoreSetting>(\"baseUrl\")}/${this.getFullFilePathForDisk(media.relativeUri)}`;\n }\n else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);\n }\n }\n }\n\n // data.groupRecords.forEach((group) => {\n // group.groupData.records.forEach((media) => {\n // if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n // media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n // }\n // else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n // media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);\n // }\n // });\n // });\n }\n return data\n }\n\n async upload(createDto: any, files: Array<Express.Multer.File>) {\n\n if (!files) {\n throw new NotFoundException(ERROR_MESSAGES.FILE_NOT_FOUND);\n\n }\n const savedMedias = [];\n for (let i = 0; i < files.length; i++) {\n\n createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({\n where: {\n id: createDto['fieldMetadataId']\n },\n });\n createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({\n where: {\n id: createDto['modelMetadataId']\n },\n });\n createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({\n where: {\n id: createDto['mediaStorageProviderMetadataId']\n },\n });\n\n const file = files[i];\n\n switch (createDto.mediaStorageProviderMetadata.type) {\n case MediaStorageProviderType.Filesystem:\n const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(file));\n await this.diskFileService.copy(file.path, fileStoragePath);\n createDto['relativeUri'] = this.getFileName(file);\n break;\n case MediaStorageProviderType.AwsS3:\n const fileName = this.getFileName(file);\n const bucketName = createDto.mediaStorageProviderMetadata.bucketName;\n\n // Read file from disk and upload to S3\n const fileData = await this.diskFileService.read(file.path);\n await this.s3FileService.write(`${bucketName}:${fileName}`, fileData, { contentType: file.mimetype });\n\n createDto['relativeUri'] = fileName;\n break;\n default:\n break;\n }\n // Delete temp file from disk\n await this.diskFileService.delete(file.path);\n\n const media = this.repo.create(createDto);\n const savedMedia = await this.repo.save(media);\n savedMedias.push(savedMedia)\n }\n return savedMedias\n }\n\n async remove(id: number) {\n // const lov = await this.findOne(id);\n const media = await this.repo.findOne({\n where: {\n id: id,\n },\n relations: ['mediaStorageProviderMetadata', 'fieldMetadata', 'fieldMetadata.model', 'fieldMetadata.mediaStorageProvider'],\n });\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n id: media.entityId,\n }\n }\n );\n // if (media.mediaStorageProviderMetadata.type === 'filesystem') {\n // const fileStorageProvider = new FileStorageProvider(this.configService, this.fileService, this);\n\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else if (media.mediaStorageProviderMetadata.type === 'aws-s3') {\n // const fileStorageProvider = new FileS3StorageProvider(this.configService, this.fileService, this);\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else {\n // }\n const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.delete(modelEntity, media.fieldMetadata);\n\n return this.repo.remove(media);\n }\n //TODO: Move this to a app builder config\n\n private getFullFilePathForDisk(fileName: string): string {\n const base = this.settingService.getConfigValue<SolidCoreSetting>(\"fileStorageDir\")\n || DEFAULT_MEDIA_FILE_STORAGE_DIR;\n if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {\n return fileName;\n }\n return `${base}/${fileName}`;\n }\n\n private getAwsS3FullFilePath(awsMediaurl: string, bucketName: string, regionName: string): string {\n // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg\n return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { EntityManager, In } from 'typeorm';\nimport * as path from 'path';\nimport { DEFAULT_MEDIA_FILE_STORAGE_DIR } from \"src/services/settings/default-settings-provider.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nimport { ConfigService } from '@nestjs/config';\nimport { CRUDService } from 'src/services/crud.service';\nimport { DiskFileService, S3FileService } from 'src/services/file';\n\n\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { BasicFilterDto } from 'src/dtos/basic-filters.dto';\nimport { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';\nimport { Media } from 'src/entities/media.entity';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';\nimport { MediaRepository } from 'src/repository/media.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { getMediaStorageProvider } from \"./mediaStorageProviders\";\n\n\n@Injectable()\nexport class MediaService extends CRUDService<Media> {\n constructor(\n readonly configService: ConfigService,\n readonly diskFileService: DiskFileService,\n readonly s3FileService: S3FileService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(Media, 'default')\n // readonly repo: Repository<Media>,\n readonly repo: MediaRepository,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n // @InjectRepository(MediaStorageProviderMetadata)\n // private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly mediaStorageProviderMetadataRepo: MediaStorageProviderMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n readonly moduleRef: ModuleRef,\n ) {\n super(entityManager, repo, 'media', 'solid-core', moduleRef);\n }\n\n async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {\n const data = await super.find(basicFilterDto, solidRequestContext);\n if (data.records) {\n\n for (const media of data.records) {\n const mediaStorageProvider = media.mediaStorageProviderMetadata;\n\n if (mediaStorageProvider?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = await this.diskFileService.getUrl(this.getFullFilePathForDisk(media.relativeUri));\n } else if (mediaStorageProvider?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = await this.s3FileService.getUrl(`${mediaStorageProvider.bucketName}:${media.relativeUri}`, { region: mediaStorageProvider.region });\n }\n }\n }\n if (data.groupRecords) {\n\n for (const group of data.groupRecords) {\n for (const media of group.groupData.records) {\n const mediaStorageProvider = media.mediaStorageProviderMetadata;\n\n if (mediaStorageProvider?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = await this.diskFileService.getUrl(this.getFullFilePathForDisk(media.relativeUri));\n }\n else if (mediaStorageProvider?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = await this.s3FileService.getUrl(`${mediaStorageProvider.bucketName}:${media.relativeUri}`, { region: mediaStorageProvider.region });\n }\n }\n }\n }\n return data\n }\n\n async upload(createDto: any, files: Array<Express.Multer.File>) {\n\n if (!files) {\n throw new NotFoundException(ERROR_MESSAGES.FILE_NOT_FOUND);\n\n }\n const savedMedias = [];\n for (let i = 0; i < files.length; i++) {\n\n createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({\n where: {\n id: createDto['fieldMetadataId']\n },\n });\n createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({\n where: {\n id: createDto['modelMetadataId']\n },\n });\n createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({\n where: {\n id: createDto['mediaStorageProviderMetadataId']\n },\n });\n\n const file = files[i];\n\n switch (createDto.mediaStorageProviderMetadata.type) {\n case MediaStorageProviderType.Filesystem:\n const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(file));\n await this.diskFileService.copy(file.path, fileStoragePath);\n createDto['relativeUri'] = this.getFileName(file);\n break;\n case MediaStorageProviderType.AwsS3:\n const fileName = this.getFileName(file);\n const bucketName = createDto.mediaStorageProviderMetadata.bucketName;\n\n // Read file from disk and upload to S3\n const fileData = await this.diskFileService.read(file.path);\n await this.s3FileService.write(`${bucketName}:${fileName}`, fileData, { contentType: file.mimetype });\n\n createDto['relativeUri'] = fileName;\n break;\n default:\n break;\n }\n // Delete temp file from disk\n await this.diskFileService.delete(file.path);\n\n const media = this.repo.create(createDto);\n const savedMedia = await this.repo.save(media);\n savedMedias.push(savedMedia)\n }\n return savedMedias\n }\n\n async remove(id: number) {\n // const lov = await this.findOne(id);\n const media = await this.repo.findOne({\n where: {\n id: id,\n },\n relations: ['mediaStorageProviderMetadata', 'fieldMetadata', 'fieldMetadata.model', 'fieldMetadata.mediaStorageProvider'],\n });\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n id: media.entityId,\n }\n }\n );\n const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.delete(modelEntity, media.fieldMetadata);\n\n return this.repo.remove(media);\n }\n\n private getFullFilePathForDisk(fileName: string): string {\n const base = this.settingService.getConfigValue<SolidCoreSetting>(\"fileStorageDir\")\n || DEFAULT_MEDIA_FILE_STORAGE_DIR;\n if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {\n return fileName;\n }\n return `${base}/${fileName}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidxai/core",
|
|
3
|
-
"version": "0.1.8-beta.
|
|
3
|
+
"version": "0.1.8-beta.2",
|
|
4
4
|
"description": "This module is a NestJS module containing all the required core providers required by a Solid application",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -9106,94 +9106,60 @@
|
|
|
9106
9106
|
},
|
|
9107
9107
|
"children": [
|
|
9108
9108
|
{
|
|
9109
|
-
"type": "
|
|
9109
|
+
"type": "field",
|
|
9110
9110
|
"attrs": {
|
|
9111
|
-
"name": "
|
|
9112
|
-
"label": "",
|
|
9113
|
-
"
|
|
9114
|
-
|
|
9115
|
-
|
|
9116
|
-
{
|
|
9117
|
-
"type": "column",
|
|
9118
|
-
"attrs": {
|
|
9119
|
-
"name": "col-1",
|
|
9120
|
-
"label": "",
|
|
9121
|
-
"className": "col-12"
|
|
9122
|
-
},
|
|
9123
|
-
"children": [
|
|
9124
|
-
{
|
|
9125
|
-
"type": "field",
|
|
9126
|
-
"attrs": {
|
|
9127
|
-
"name": "relativeUri",
|
|
9128
|
-
"label": "relativeUri",
|
|
9129
|
-
"widget": "image"
|
|
9130
|
-
}
|
|
9131
|
-
},
|
|
9132
|
-
{
|
|
9133
|
-
"type": "field",
|
|
9134
|
-
"attrs": {
|
|
9135
|
-
"name": "originalFileName",
|
|
9136
|
-
"label": "originalFileName"
|
|
9137
|
-
}
|
|
9138
|
-
},
|
|
9139
|
-
{
|
|
9140
|
-
"type": "field",
|
|
9141
|
-
"attrs": {
|
|
9142
|
-
"name": "mimeType",
|
|
9143
|
-
"label": "mimeType"
|
|
9144
|
-
}
|
|
9145
|
-
}
|
|
9146
|
-
]
|
|
9147
|
-
}
|
|
9148
|
-
]
|
|
9111
|
+
"name": "relativeUri",
|
|
9112
|
+
"label": "relativeUri",
|
|
9113
|
+
"widget": "image",
|
|
9114
|
+
"isSearchable": true
|
|
9115
|
+
}
|
|
9149
9116
|
},
|
|
9150
9117
|
{
|
|
9151
|
-
"type": "
|
|
9118
|
+
"type": "field",
|
|
9152
9119
|
"attrs": {
|
|
9153
|
-
"name": "
|
|
9154
|
-
"label": "",
|
|
9155
|
-
"
|
|
9156
|
-
}
|
|
9157
|
-
|
|
9158
|
-
|
|
9159
|
-
|
|
9160
|
-
|
|
9161
|
-
|
|
9162
|
-
|
|
9163
|
-
|
|
9164
|
-
|
|
9165
|
-
|
|
9166
|
-
|
|
9167
|
-
|
|
9168
|
-
|
|
9169
|
-
|
|
9170
|
-
|
|
9171
|
-
|
|
9172
|
-
|
|
9173
|
-
|
|
9174
|
-
|
|
9175
|
-
|
|
9176
|
-
|
|
9177
|
-
|
|
9178
|
-
|
|
9179
|
-
|
|
9180
|
-
|
|
9181
|
-
|
|
9182
|
-
|
|
9183
|
-
|
|
9184
|
-
|
|
9185
|
-
|
|
9186
|
-
|
|
9187
|
-
|
|
9188
|
-
|
|
9189
|
-
|
|
9190
|
-
|
|
9191
|
-
|
|
9192
|
-
|
|
9193
|
-
|
|
9194
|
-
|
|
9195
|
-
|
|
9196
|
-
]
|
|
9120
|
+
"name": "originalFileName",
|
|
9121
|
+
"label": "originalFileName",
|
|
9122
|
+
"isSearchable": true
|
|
9123
|
+
}
|
|
9124
|
+
},
|
|
9125
|
+
{
|
|
9126
|
+
"type": "field",
|
|
9127
|
+
"attrs": {
|
|
9128
|
+
"name": "mimeType",
|
|
9129
|
+
"label": "mimeType",
|
|
9130
|
+
"isSearchable": true
|
|
9131
|
+
}
|
|
9132
|
+
},
|
|
9133
|
+
{
|
|
9134
|
+
"type": "field",
|
|
9135
|
+
"attrs": {
|
|
9136
|
+
"name": "fileSize",
|
|
9137
|
+
"label": "fileSize"
|
|
9138
|
+
}
|
|
9139
|
+
},
|
|
9140
|
+
{
|
|
9141
|
+
"type": "field",
|
|
9142
|
+
"attrs": {
|
|
9143
|
+
"name": "modelMetadata",
|
|
9144
|
+
"label": "modelMetadata",
|
|
9145
|
+
"isSearchable": true
|
|
9146
|
+
}
|
|
9147
|
+
},
|
|
9148
|
+
{
|
|
9149
|
+
"type": "field",
|
|
9150
|
+
"attrs": {
|
|
9151
|
+
"name": "mediaStorageProviderMetadata",
|
|
9152
|
+
"label": "mediaStorageProviderMetadata",
|
|
9153
|
+
"isSearchable": true
|
|
9154
|
+
}
|
|
9155
|
+
},
|
|
9156
|
+
{
|
|
9157
|
+
"type": "field",
|
|
9158
|
+
"attrs": {
|
|
9159
|
+
"name": "fieldMetadata",
|
|
9160
|
+
"label": "fieldMetadata",
|
|
9161
|
+
"isSearchable": true
|
|
9162
|
+
}
|
|
9197
9163
|
}
|
|
9198
9164
|
]
|
|
9199
9165
|
}
|
|
@@ -10543,7 +10509,98 @@
|
|
|
10543
10509
|
"attrs": {
|
|
10544
10510
|
"name": "Card",
|
|
10545
10511
|
"cardWidget": "MqMessageKanbanCardWidget"
|
|
10546
|
-
}
|
|
10512
|
+
},
|
|
10513
|
+
"children": [
|
|
10514
|
+
{
|
|
10515
|
+
"type": "field",
|
|
10516
|
+
"attrs": {
|
|
10517
|
+
"name": "messageId",
|
|
10518
|
+
"isSearchable": true
|
|
10519
|
+
}
|
|
10520
|
+
},
|
|
10521
|
+
{
|
|
10522
|
+
"type": "field",
|
|
10523
|
+
"attrs": {
|
|
10524
|
+
"name": "messageBroker",
|
|
10525
|
+
"isSearchable": true
|
|
10526
|
+
}
|
|
10527
|
+
},
|
|
10528
|
+
{
|
|
10529
|
+
"type": "field",
|
|
10530
|
+
"attrs": {
|
|
10531
|
+
"name": "messageType",
|
|
10532
|
+
"isSearchable": true
|
|
10533
|
+
}
|
|
10534
|
+
},
|
|
10535
|
+
{
|
|
10536
|
+
"type": "field",
|
|
10537
|
+
"attrs": {
|
|
10538
|
+
"name": "stage",
|
|
10539
|
+
"isSearchable": true
|
|
10540
|
+
}
|
|
10541
|
+
},
|
|
10542
|
+
{
|
|
10543
|
+
"type": "field",
|
|
10544
|
+
"attrs": {
|
|
10545
|
+
"name": "startedAt",
|
|
10546
|
+
"isSearchable": true
|
|
10547
|
+
}
|
|
10548
|
+
},
|
|
10549
|
+
{
|
|
10550
|
+
"type": "field",
|
|
10551
|
+
"attrs": {
|
|
10552
|
+
"name": "finishedAt",
|
|
10553
|
+
"isSearchable": true
|
|
10554
|
+
}
|
|
10555
|
+
},
|
|
10556
|
+
{
|
|
10557
|
+
"type": "field",
|
|
10558
|
+
"attrs": {
|
|
10559
|
+
"name": "elapsedMillis",
|
|
10560
|
+
"isSearchable": true
|
|
10561
|
+
}
|
|
10562
|
+
},
|
|
10563
|
+
{
|
|
10564
|
+
"type": "field",
|
|
10565
|
+
"attrs": {
|
|
10566
|
+
"name": "retryCount"
|
|
10567
|
+
}
|
|
10568
|
+
},
|
|
10569
|
+
{
|
|
10570
|
+
"type": "field",
|
|
10571
|
+
"attrs": {
|
|
10572
|
+
"name": "retryInterval"
|
|
10573
|
+
}
|
|
10574
|
+
},
|
|
10575
|
+
{
|
|
10576
|
+
"type": "field",
|
|
10577
|
+
"attrs": {
|
|
10578
|
+
"name": "parentEntityId",
|
|
10579
|
+
"isSearchable": true
|
|
10580
|
+
}
|
|
10581
|
+
},
|
|
10582
|
+
{
|
|
10583
|
+
"type": "field",
|
|
10584
|
+
"attrs": {
|
|
10585
|
+
"name": "parentEntity",
|
|
10586
|
+
"isSearchable": true
|
|
10587
|
+
}
|
|
10588
|
+
},
|
|
10589
|
+
{
|
|
10590
|
+
"type": "field",
|
|
10591
|
+
"attrs": {
|
|
10592
|
+
"name": "error"
|
|
10593
|
+
}
|
|
10594
|
+
},
|
|
10595
|
+
{
|
|
10596
|
+
"type": "field",
|
|
10597
|
+
"attrs": {
|
|
10598
|
+
"name": "mqMessageQueue",
|
|
10599
|
+
"label": "Queue",
|
|
10600
|
+
"isSearchable": true
|
|
10601
|
+
}
|
|
10602
|
+
}
|
|
10603
|
+
]
|
|
10547
10604
|
}
|
|
10548
10605
|
]
|
|
10549
10606
|
}
|
|
@@ -18,7 +18,6 @@ import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
|
18
18
|
import qs from 'qs';
|
|
19
19
|
import { ResolveS3UrlDto } from 'src/dtos/resolve-s3-url.dto';
|
|
20
20
|
import { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';
|
|
21
|
-
import { ConfigService } from '@nestjs/config';
|
|
22
21
|
import { S3FileService } from './file';
|
|
23
22
|
import { MediaStorageProviderMetadata } from 'src/entities/media-storage-provider-metadata.entity';
|
|
24
23
|
|
|
@@ -27,7 +26,6 @@ import { MediaStorageProviderMetadata } from 'src/entities/media-storage-provide
|
|
|
27
26
|
export class FieldMetadataService implements OnApplicationBootstrap {
|
|
28
27
|
constructor(
|
|
29
28
|
private readonly fieldMetadataRepo: FieldMetadataRepository,
|
|
30
|
-
private readonly configService: ConfigService,
|
|
31
29
|
private readonly fileService: S3FileService,
|
|
32
30
|
private readonly mediaStorageProviderMetadataRepository: MediaStorageProviderMetadataRepository,
|
|
33
31
|
|
|
@@ -1291,7 +1289,6 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
1291
1289
|
}
|
|
1292
1290
|
|
|
1293
1291
|
async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
|
|
1294
|
-
let url = "";
|
|
1295
1292
|
const normalizedKey = this.normalizeS3Key(resolveS3UrlDto.s3Key);
|
|
1296
1293
|
|
|
1297
1294
|
let resolvedBucketName = resolveS3UrlDto.bucketName;
|
|
@@ -1308,14 +1305,11 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
1308
1305
|
}
|
|
1309
1306
|
this.logger.debug(`INSIDE::resolveS3Url:: resolvedBucketName: ${resolvedBucketName}`)
|
|
1310
1307
|
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
}
|
|
1315
|
-
|
|
1316
|
-
'S3_AWS_REGION_NAME',
|
|
1317
|
-
)}.amazonaws.com/${normalizedKey}`;
|
|
1318
|
-
}
|
|
1308
|
+
const expiryInSeconds = resolveS3UrlDto.isPrivate == "true" ? 60 * 60 : 0;
|
|
1309
|
+
const url = await this.fileService.getUrl(`${resolvedBucketName}:${normalizedKey}`, {
|
|
1310
|
+
expiresIn: expiryInSeconds,
|
|
1311
|
+
});
|
|
1312
|
+
|
|
1319
1313
|
return { url: url }
|
|
1320
1314
|
}
|
|
1321
1315
|
|
|
@@ -1332,4 +1326,3 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
1332
1326
|
}
|
|
1333
1327
|
}
|
|
1334
1328
|
|
|
1335
|
-
|
|
@@ -44,7 +44,7 @@ export class DiskFileService implements IFileService {
|
|
|
44
44
|
async write(filePath: string, data: Buffer | string, options?: WriteOptions): Promise<string> {
|
|
45
45
|
await this.ensureDirectoryExists(filePath);
|
|
46
46
|
await fsPromises.writeFile(filePath, data);
|
|
47
|
-
return
|
|
47
|
+
return this.buildUrl(filePath);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
/**
|
|
@@ -57,7 +57,7 @@ export class DiskFileService implements IFileService {
|
|
|
57
57
|
const writeStream = fs.createWriteStream(filePath);
|
|
58
58
|
await pipeline(stream, writeStream);
|
|
59
59
|
this.logger.debug(`File saved via stream: ${filePath}`);
|
|
60
|
-
return
|
|
60
|
+
return this.buildUrl(filePath);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
/**
|
|
@@ -97,13 +97,10 @@ export class DiskFileService implements IFileService {
|
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
/**
|
|
100
|
-
* Get an accessible URL
|
|
101
|
-
* For disk storage, returns the file path as-is
|
|
100
|
+
* Get an accessible URL for the file
|
|
102
101
|
*/
|
|
103
102
|
async getUrl(filePath: string, options?: UrlOptions): Promise<string> {
|
|
104
|
-
|
|
105
|
-
// The caller is responsible for constructing a full URL if needed
|
|
106
|
-
return filePath;
|
|
103
|
+
return this.buildUrl(filePath);
|
|
107
104
|
}
|
|
108
105
|
|
|
109
106
|
/**
|
|
@@ -117,4 +114,15 @@ export class DiskFileService implements IFileService {
|
|
|
117
114
|
await fsPromises.mkdir(dir, { recursive: true });
|
|
118
115
|
}
|
|
119
116
|
}
|
|
117
|
+
|
|
118
|
+
private buildUrl(filePath: string): string {
|
|
119
|
+
const normalizedBaseUrl = this.baseUrl.replace(/\/+$/, '');
|
|
120
|
+
const normalizedPath = filePath.replace(/^\/+/, '');
|
|
121
|
+
|
|
122
|
+
if (!normalizedBaseUrl) {
|
|
123
|
+
return `/${normalizedPath}`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return `${normalizedBaseUrl}/${normalizedPath}`;
|
|
127
|
+
}
|
|
120
128
|
}
|
|
@@ -53,51 +53,29 @@ export class MediaService extends CRUDService<Media> {
|
|
|
53
53
|
if (data.records) {
|
|
54
54
|
|
|
55
55
|
for (const media of data.records) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
media.relativeUri = this.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
media.mediaStorageProviderMetadata.region
|
|
63
|
-
);
|
|
56
|
+
const mediaStorageProvider = media.mediaStorageProviderMetadata;
|
|
57
|
+
|
|
58
|
+
if (mediaStorageProvider?.type === MediaStorageProviderType.Filesystem) {
|
|
59
|
+
media.relativeUri = await this.diskFileService.getUrl(this.getFullFilePathForDisk(media.relativeUri));
|
|
60
|
+
} else if (mediaStorageProvider?.type === MediaStorageProviderType.AwsS3) {
|
|
61
|
+
media.relativeUri = await this.s3FileService.getUrl(`${mediaStorageProvider.bucketName}:${media.relativeUri}`, { region: mediaStorageProvider.region });
|
|
64
62
|
}
|
|
65
63
|
}
|
|
66
|
-
// data.records.forEach((media: Media) => {
|
|
67
|
-
// if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {
|
|
68
|
-
// media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;
|
|
69
|
-
// } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {
|
|
70
|
-
// media.relativeUri = this.getAwsS3FullFilePath(
|
|
71
|
-
// media.relativeUri,
|
|
72
|
-
// media.mediaStorageProviderMetadata.bucketName,
|
|
73
|
-
// media.mediaStorageProviderMetadata.region
|
|
74
|
-
// );
|
|
75
|
-
// }
|
|
76
|
-
// });
|
|
77
64
|
}
|
|
78
65
|
if (data.groupRecords) {
|
|
79
66
|
|
|
80
67
|
for (const group of data.groupRecords) {
|
|
81
68
|
for (const media of group.groupData.records) {
|
|
82
|
-
|
|
83
|
-
|
|
69
|
+
const mediaStorageProvider = media.mediaStorageProviderMetadata;
|
|
70
|
+
|
|
71
|
+
if (mediaStorageProvider?.type === MediaStorageProviderType.Filesystem) {
|
|
72
|
+
media.relativeUri = await this.diskFileService.getUrl(this.getFullFilePathForDisk(media.relativeUri));
|
|
84
73
|
}
|
|
85
|
-
else if (
|
|
86
|
-
media.relativeUri = this.
|
|
74
|
+
else if (mediaStorageProvider?.type === MediaStorageProviderType.AwsS3) {
|
|
75
|
+
media.relativeUri = await this.s3FileService.getUrl(`${mediaStorageProvider.bucketName}:${media.relativeUri}`, { region: mediaStorageProvider.region });
|
|
87
76
|
}
|
|
88
77
|
}
|
|
89
78
|
}
|
|
90
|
-
|
|
91
|
-
// data.groupRecords.forEach((group) => {
|
|
92
|
-
// group.groupData.records.forEach((media) => {
|
|
93
|
-
// if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {
|
|
94
|
-
// media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;
|
|
95
|
-
// }
|
|
96
|
-
// else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {
|
|
97
|
-
// media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);
|
|
98
|
-
// }
|
|
99
|
-
// });
|
|
100
|
-
// });
|
|
101
79
|
}
|
|
102
80
|
return data
|
|
103
81
|
}
|
|
@@ -172,24 +150,12 @@ export class MediaService extends CRUDService<Media> {
|
|
|
172
150
|
}
|
|
173
151
|
}
|
|
174
152
|
);
|
|
175
|
-
// if (media.mediaStorageProviderMetadata.type === 'filesystem') {
|
|
176
|
-
// const fileStorageProvider = new FileStorageProvider(this.configService, this.fileService, this);
|
|
177
|
-
|
|
178
|
-
// await fileStorageProvider.delete(media, media.fieldMetadata);
|
|
179
|
-
|
|
180
|
-
// } else if (media.mediaStorageProviderMetadata.type === 'aws-s3') {
|
|
181
|
-
// const fileStorageProvider = new FileS3StorageProvider(this.configService, this.fileService, this);
|
|
182
|
-
// await fileStorageProvider.delete(media, media.fieldMetadata);
|
|
183
|
-
|
|
184
|
-
// } else {
|
|
185
|
-
// }
|
|
186
153
|
const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;
|
|
187
154
|
const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);
|
|
188
155
|
await storageProvider.delete(modelEntity, media.fieldMetadata);
|
|
189
156
|
|
|
190
157
|
return this.repo.remove(media);
|
|
191
158
|
}
|
|
192
|
-
//TODO: Move this to a app builder config
|
|
193
159
|
|
|
194
160
|
private getFullFilePathForDisk(fileName: string): string {
|
|
195
161
|
const base = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
|
|
@@ -200,11 +166,6 @@ export class MediaService extends CRUDService<Media> {
|
|
|
200
166
|
return `${base}/${fileName}`;
|
|
201
167
|
}
|
|
202
168
|
|
|
203
|
-
private getAwsS3FullFilePath(awsMediaurl: string, bucketName: string, regionName: string): string {
|
|
204
|
-
// https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg
|
|
205
|
-
return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
169
|
private getFileName(file: Express.Multer.File): string {
|
|
209
170
|
return `${file.filename}-${file.originalname}`;
|
|
210
171
|
}
|