storemw-core-api 1.0.35 → 1.0.37
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/file/fileController.js +13 -8
- package/dist/controllers/file/fileController.js.map +1 -1
- package/dist/models/file/FileModel.d.ts +13 -2
- package/dist/services/file/FileGoogleCloudStorageProvider.d.ts +5 -1
- package/dist/services/file/FileGoogleCloudStorageProvider.js +28 -15
- package/dist/services/file/FileGoogleCloudStorageProvider.js.map +1 -1
- package/dist/services/file/FileLocalStorageProvider.d.ts +7 -3
- package/dist/services/file/FileLocalStorageProvider.js +27 -15
- package/dist/services/file/FileLocalStorageProvider.js.map +1 -1
- package/dist/services/file/FileService.d.ts +2 -0
- package/dist/services/file/FileService.js +8 -5
- package/dist/services/file/FileService.js.map +1 -1
- package/dist/services/file/FileStorageProviderRegistry.d.ts +12 -5
- package/dist/services/file/FileStorageProviderRegistry.js.map +1 -1
- package/dist/services/item/ItemProductService.js +45 -23
- package/dist/services/item/ItemProductService.js.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +692 -691
|
@@ -50,21 +50,26 @@ const uploadFiles = async (req, res, next) => {
|
|
|
50
50
|
const storageProviderName = configs_1.config.FILE_STORAGE_PROVIDER_NAME;
|
|
51
51
|
const storageProviderOptions = {
|
|
52
52
|
basePath: `${configs_1.config.FILE_STORAGE_LOCAL_BASE_PATH}`,
|
|
53
|
-
|
|
53
|
+
publicBaseUrl: `${configs_1.config.FILE_STORAGE_LOCAL_BASE_URL}`,
|
|
54
|
+
skipFoldernameByModuleRef: false,
|
|
55
|
+
skipFoldernameByDate: false
|
|
54
56
|
};
|
|
57
|
+
// google cloud storage
|
|
58
|
+
// const storageProviderName = "gcloud"
|
|
59
|
+
// const storageProviderOptions = {
|
|
60
|
+
// bucketName: `chinlai-erp-delivery`,
|
|
61
|
+
// basePath: `today`,
|
|
62
|
+
// credentials: `${path.resolve(process.cwd(), "config/chinlai-erp-api-253ac2637a8e.json")}`,
|
|
63
|
+
// publicBaseUrl: `https://storage.googleapis.com/${process.env.GCLOUD_BUCKET}`,
|
|
64
|
+
// skipFoldernameByModuleRef: true,
|
|
65
|
+
// skipFoldernameByDate: true
|
|
66
|
+
// }
|
|
55
67
|
const imageCompressionOptions = configs_1.config.FILE_UPLOAD_IMAGE_MAX_WIDTH && configs_1.config.FILE_UPLOAD_IMAGE_QUALITY
|
|
56
68
|
? {
|
|
57
69
|
maxWidth: Number(configs_1.config.FILE_UPLOAD_IMAGE_MAX_WIDTH),
|
|
58
70
|
quality: Number(configs_1.config.FILE_UPLOAD_IMAGE_QUALITY),
|
|
59
71
|
}
|
|
60
72
|
: undefined;
|
|
61
|
-
// google cloud storage
|
|
62
|
-
// const storageProviderName = "gcloud"
|
|
63
|
-
// const storageProviderOptions = {
|
|
64
|
-
// bucketName: process.env.GCLOUD_BUCKET!,
|
|
65
|
-
// credentials: process.env.GCLOUD_KEY_FILE!,
|
|
66
|
-
// publicBaseUrl: `https://storage.googleapis.com/${process.env.GCLOUD_BUCKET}`
|
|
67
|
-
// }
|
|
68
73
|
const fileService = (0, services_1.FileService)({
|
|
69
74
|
...(0, utils_1.getDefaultServiceProps)(req),
|
|
70
75
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileController.js","sourceRoot":"","sources":["../../../src/controllers/file/fileController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Request, Response, NextFunction } from \"express\";\n\nimport { getDefaultServiceProps, sendSuccess, sendError, HTTP_STATUS } from \"@/utils\"\n\nimport { FileService, FileUploadProps, FileImageCompressionOptions } from \"@/services\"\nimport {\n schemaFileDeletePayload,\n schemaFileUploadPayload,\n} from \"@/schema/payload\";\n\nimport { QueryList } from \"@/schema/middleware/route\";\n\nimport { config } from \"@/configs\";\n\nconst getRootName = (toSingular: boolean) => {\n\n let rootName = toSingular ? \"file\" : \"files\";\n\n return rootName\n}\n\n/** file/:fileId : get file */\nexport const getFile = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n try {\n\n const { fileId } = req.params;\n // const requestQuery = req.query as unknown as QueryList;\n // const requestDocumentType = documentType as FileServiceProps[\"documentType\"];\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n })\n\n const data = await fileService.getFile({ id: Number(fileId) })\n\n return sendSuccess(res, data, \"Retrieved successfully\", getRootName(true));\n\n } catch (error: any) {\n next(error)\n }\n}\n\n/** files : upload files */\nexport const uploadFiles = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n\n try {\n\n let reqBody = req.body\n let reqFiles = req.files\n\n const request = schemaFileUploadPayload.parse({\n field_ref: reqBody.field_ref,\n field_module: reqBody.field_module,\n description: reqBody.description,\n tagName: reqBody.tag_name,\n label: reqBody.label,\n refId: Number(reqBody.ref_id),\n files: Array.isArray(reqFiles) ? reqFiles.map((file: any) => ({\n originalname: file.originalname,\n mimetype: file.mimetype,\n size: file.size,\n buffer: file.buffer,\n })) : [],\n });\n\n // hardcode here\n // local storage\n const storageProviderName = config.FILE_STORAGE_PROVIDER_NAME as FileUploadProps[\"storageProviderName\"]\n const storageProviderOptions = {\n basePath: `${config.FILE_STORAGE_LOCAL_BASE_PATH}`,\n baseUrl: `${config.FILE_STORAGE_LOCAL_BASE_URL}`\n }\n const imageCompressionOptions: FileImageCompressionOptions | undefined\n = config.FILE_UPLOAD_IMAGE_MAX_WIDTH && config.FILE_UPLOAD_IMAGE_QUALITY\n ? {\n maxWidth: Number(config.FILE_UPLOAD_IMAGE_MAX_WIDTH),\n quality: Number(config.FILE_UPLOAD_IMAGE_QUALITY),\n }\n : undefined;\n\n // google cloud storage\n // const storageProviderName = \"gcloud\"\n // const storageProviderOptions = {\n // bucketName: process.env.GCLOUD_BUCKET!,\n // credentials: process.env.GCLOUD_KEY_FILE!,\n // publicBaseUrl: `https://storage.googleapis.com/${process.env.GCLOUD_BUCKET}`\n // }\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n });\n\n const payload: FileUploadProps = {\n field_ref: reqBody.field_ref,\n field_module: reqBody.field_module,\n description: request.description,\n label: request.label,\n tagName: request.tagName ?? \"\",\n refId: request.refId ?? 0,\n storageProviderName,\n storageProviderOptions,\n ...(imageCompressionOptions ? { imageCompressionOptions } : {}),\n files: request.files.map(file => ({\n buffer: file.buffer,\n originalName: file.originalname,\n mimeType: file.mimetype,\n sizeBytes: file.size,\n })),\n };\n\n const response = await fileService.uploadFiles(payload);\n\n return sendSuccess(res, response, \"Files uploaded successfully\");\n\n } catch (error) {\n next(error);\n }\n};\n\n/** file/:fileId : update file */\nexport const updateFile = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n\n const { fileId } = req.params;\n // const requestDocumentType = req.body.scope.target as FileServiceProps[\"documentType\"]\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n })\n\n let response: any = {}\n\n let reqScope = req.body.scope\n let reqPayload = req.body.payload\n\n\n // const { schemaUpdate, key } = documentSalesMap[requestDocumentType as keyof typeof documentSalesMap];\n\n // const request = schemaUpdate.parse({\n // scope: { target: reqScope.target, action: reqScope.action },\n // payload: {\n // ...buildDocumentPayloadFromRequest(reqPayload),\n // profile: buildDocumentProfileFromRequest(reqPayload.profile),\n // shipping: buildDocumentProfileOtherFromRequest(reqPayload.shipping),\n // billing: buildDocumentProfileOtherFromRequest(reqPayload.billing),\n // ...(reqPayload?.items ? { items: buildDocumentItemsFromRequest(reqPayload.items) } : {}),\n // ...(reqPayload?.totals ? { totals: buildDocumentTotalsFromRequest(reqPayload.totals) } : {}),\n // },\n // });\n\n // const payload: DocumentUpdateProps = {\n // documentId: Number(documentId),\n // documentType: requestDocumentType,\n // data: {\n // ...buildDocumentPayloadToService(request.payload),\n // [key]: {\n // profile: buildDocumentProfileToService(request.payload.profile),\n // shipping: buildDocumentProfileOtherToService(request.payload.shipping),\n // billing: buildDocumentProfileOtherToService(request.payload.billing),\n // ...(request.payload?.items ? { items: buildDocumentItemsToService(request.payload.items) } : {}),\n // ...(request.payload?.totals ? { totals: buildDocumentTotalsToService(request.payload.totals) } : {}),\n // },\n // } as any,\n // };\n\n // const result = await fileService.updateFile(payload);\n\n // response = {\n // [getRootName(true)]: result,\n // };\n\n sendSuccess(res, response, `File updated successfully`)\n\n } catch (error: any) {\n next(error)\n }\n};\n\n/** files : list files */\nexport const listFiles = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n\n try {\n\n const requestQuery = req.query as unknown as QueryList;\n // const requestDocumentType = req.params.documentType as FileServiceProps[\"documentType\"];\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n })\n\n const { data, total } = await fileService.listFiles({\n ...requestQuery,\n });\n\n let response = {\n [`${getRootName(false)}`]: data,\n total,\n }\n\n return sendSuccess(res, response, \"Retrieved successfully\");\n\n } catch (error: any) {\n next(error)\n }\n};\n\n/** files/delete : delete files */\nexport const deleteFiles = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n\n try {\n\n // const requestDocumentType = req.body.scope.target as FileServiceProps[\"documentType\"]\n // const requestQuery = req.query as unknown as QueryList;\n // const requestFileId = Number(req.params.fileId)\n\n const request = schemaFileDeletePayload.parse(req.body)\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n })\n\n const payload = {\n fileIds: request.payload.ids.map(i => BigInt(i))\n }\n\n const data = await fileService.removeFiles(payload);\n\n return sendSuccess(res, data, \"Deleted\", getRootName(false));\n\n } catch (error: any) {\n next(error)\n }\n};\n\n/** file/data_types : get file data types */\n// export const getFileDataTypes = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n\n// try {\n\n// const requestQuery = req.query as unknown as QueryList;\n// // const requestDocumentType = req.params.documentType as FileServiceProps[\"documentType\"];\n\n// const fileService = FileService({\n// ...getDefaultServiceProps(req),\n// })\n\n// const data = fileService.getFileDataTypes();\n\n// let response = {\n// data_types: data\n// }\n\n// return sendSuccess(res, response, \"Retrieved successfully\");\n\n// } catch (error: any) {\n// next(error)\n// }\n// };\n"]}
|
|
1
|
+
{"version":3,"file":"fileController.js","sourceRoot":"","sources":["../../../src/controllers/file/fileController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Request, Response, NextFunction } from \"express\";\n\nimport path from \"path\";\n\nimport { getDefaultServiceProps, sendSuccess, sendError, HTTP_STATUS } from \"@/utils\"\n\nimport { FileService, FileUploadProps, FileImageCompressionOptions } from \"@/services\"\nimport {\n schemaFileDeletePayload,\n schemaFileUploadPayload,\n} from \"@/schema/payload\";\n\nimport { QueryList } from \"@/schema/middleware/route\";\n\nimport { config } from \"@/configs\";\n\nconst getRootName = (toSingular: boolean) => {\n\n let rootName = toSingular ? \"file\" : \"files\";\n\n return rootName\n}\n\n/** file/:fileId : get file */\nexport const getFile = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n try {\n\n const { fileId } = req.params;\n // const requestQuery = req.query as unknown as QueryList;\n // const requestDocumentType = documentType as FileServiceProps[\"documentType\"];\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n })\n\n const data = await fileService.getFile({ id: Number(fileId) })\n\n return sendSuccess(res, data, \"Retrieved successfully\", getRootName(true));\n\n } catch (error: any) {\n next(error)\n }\n}\n\n/** files : upload files */\nexport const uploadFiles = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n\n try {\n\n let reqBody = req.body\n let reqFiles = req.files\n\n const request = schemaFileUploadPayload.parse({\n field_ref: reqBody.field_ref,\n field_module: reqBody.field_module,\n description: reqBody.description,\n tagName: reqBody.tag_name,\n label: reqBody.label,\n refId: Number(reqBody.ref_id),\n files: Array.isArray(reqFiles) ? reqFiles.map((file: any) => ({\n originalname: file.originalname,\n mimetype: file.mimetype,\n size: file.size,\n buffer: file.buffer,\n })) : [],\n });\n\n // hardcode here\n // local storage\n const storageProviderName = config.FILE_STORAGE_PROVIDER_NAME as FileUploadProps[\"storageProviderName\"]\n const storageProviderOptions = {\n basePath: `${config.FILE_STORAGE_LOCAL_BASE_PATH}`,\n publicBaseUrl: `${config.FILE_STORAGE_LOCAL_BASE_URL}`,\n skipFoldernameByModuleRef: false,\n skipFoldernameByDate: false\n }\n\n // google cloud storage\n // const storageProviderName = \"gcloud\"\n // const storageProviderOptions = {\n // bucketName: `chinlai-erp-delivery`,\n // basePath: `today`,\n // credentials: `${path.resolve(process.cwd(), \"config/chinlai-erp-api-253ac2637a8e.json\")}`,\n // publicBaseUrl: `https://storage.googleapis.com/${process.env.GCLOUD_BUCKET}`,\n // skipFoldernameByModuleRef: true,\n // skipFoldernameByDate: true\n // }\n\n const imageCompressionOptions: FileImageCompressionOptions | undefined\n = config.FILE_UPLOAD_IMAGE_MAX_WIDTH && config.FILE_UPLOAD_IMAGE_QUALITY\n ? {\n maxWidth: Number(config.FILE_UPLOAD_IMAGE_MAX_WIDTH),\n quality: Number(config.FILE_UPLOAD_IMAGE_QUALITY),\n }\n : undefined;\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n });\n\n const payload: FileUploadProps = {\n field_ref: reqBody.field_ref,\n field_module: reqBody.field_module,\n description: request.description,\n label: request.label,\n tagName: request.tagName ?? \"\",\n refId: request.refId ?? 0,\n storageProviderName,\n storageProviderOptions,\n ...(imageCompressionOptions ? { imageCompressionOptions } : {}),\n files: request.files.map(file => ({\n buffer: file.buffer,\n originalName: file.originalname,\n mimeType: file.mimetype,\n sizeBytes: file.size,\n })),\n };\n\n const response = await fileService.uploadFiles(payload);\n\n return sendSuccess(res, response, \"Files uploaded successfully\");\n\n } catch (error) {\n next(error);\n }\n};\n\n/** file/:fileId : update file */\nexport const updateFile = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n\n const { fileId } = req.params;\n // const requestDocumentType = req.body.scope.target as FileServiceProps[\"documentType\"]\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n })\n\n let response: any = {}\n\n let reqScope = req.body.scope\n let reqPayload = req.body.payload\n\n\n // const { schemaUpdate, key } = documentSalesMap[requestDocumentType as keyof typeof documentSalesMap];\n\n // const request = schemaUpdate.parse({\n // scope: { target: reqScope.target, action: reqScope.action },\n // payload: {\n // ...buildDocumentPayloadFromRequest(reqPayload),\n // profile: buildDocumentProfileFromRequest(reqPayload.profile),\n // shipping: buildDocumentProfileOtherFromRequest(reqPayload.shipping),\n // billing: buildDocumentProfileOtherFromRequest(reqPayload.billing),\n // ...(reqPayload?.items ? { items: buildDocumentItemsFromRequest(reqPayload.items) } : {}),\n // ...(reqPayload?.totals ? { totals: buildDocumentTotalsFromRequest(reqPayload.totals) } : {}),\n // },\n // });\n\n // const payload: DocumentUpdateProps = {\n // documentId: Number(documentId),\n // documentType: requestDocumentType,\n // data: {\n // ...buildDocumentPayloadToService(request.payload),\n // [key]: {\n // profile: buildDocumentProfileToService(request.payload.profile),\n // shipping: buildDocumentProfileOtherToService(request.payload.shipping),\n // billing: buildDocumentProfileOtherToService(request.payload.billing),\n // ...(request.payload?.items ? { items: buildDocumentItemsToService(request.payload.items) } : {}),\n // ...(request.payload?.totals ? { totals: buildDocumentTotalsToService(request.payload.totals) } : {}),\n // },\n // } as any,\n // };\n\n // const result = await fileService.updateFile(payload);\n\n // response = {\n // [getRootName(true)]: result,\n // };\n\n sendSuccess(res, response, `File updated successfully`)\n\n } catch (error: any) {\n next(error)\n }\n};\n\n/** files : list files */\nexport const listFiles = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n\n try {\n\n const requestQuery = req.query as unknown as QueryList;\n // const requestDocumentType = req.params.documentType as FileServiceProps[\"documentType\"];\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n })\n\n const { data, total } = await fileService.listFiles({\n ...requestQuery,\n });\n\n let response = {\n [`${getRootName(false)}`]: data,\n total,\n }\n\n return sendSuccess(res, response, \"Retrieved successfully\");\n\n } catch (error: any) {\n next(error)\n }\n};\n\n/** files/delete : delete files */\nexport const deleteFiles = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n\n try {\n\n // const requestDocumentType = req.body.scope.target as FileServiceProps[\"documentType\"]\n // const requestQuery = req.query as unknown as QueryList;\n // const requestFileId = Number(req.params.fileId)\n\n const request = schemaFileDeletePayload.parse(req.body)\n\n const fileService = FileService({\n ...getDefaultServiceProps(req),\n })\n\n const payload = {\n fileIds: request.payload.ids.map(i => BigInt(i))\n }\n\n const data = await fileService.removeFiles(payload);\n\n return sendSuccess(res, data, \"Deleted\", getRootName(false));\n\n } catch (error: any) {\n next(error)\n }\n};\n\n/** file/data_types : get file data types */\n// export const getFileDataTypes = async (req: Request, res: Response, next: NextFunction): Promise<any> => {\n\n// try {\n\n// const requestQuery = req.query as unknown as QueryList;\n// // const requestDocumentType = req.params.documentType as FileServiceProps[\"documentType\"];\n\n// const fileService = FileService({\n// ...getDefaultServiceProps(req),\n// })\n\n// const data = fileService.getFileDataTypes();\n\n// let response = {\n// data_types: data\n// }\n\n// return sendSuccess(res, response, \"Retrieved successfully\");\n\n// } catch (error: any) {\n// next(error)\n// }\n// };\n"]}
|
|
@@ -31,6 +31,7 @@ export declare const ModelFileFields: {
|
|
|
31
31
|
batch_code: "batch_code";
|
|
32
32
|
refer_id_1: "refer_id_1";
|
|
33
33
|
refer_id_2: "refer_id_2";
|
|
34
|
+
storage_provider_name: "storage_provider_name";
|
|
34
35
|
};
|
|
35
36
|
export type ModelFile = files;
|
|
36
37
|
export type ModelFileOmitFields = typeof primaryKey | DefaultOmitFields;
|
|
@@ -61,7 +62,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
61
62
|
accountId: number;
|
|
62
63
|
actionUserId: number;
|
|
63
64
|
}) => {
|
|
64
|
-
primaryKey: "createdatetime" | "createuserid" | "updatedatetime" | "updateuserid" | "isdelete" | "istrash" | "accountid" | "remark" | "description" | "file_id" | "field_module" | "field_ref" | "tag_name" | "asset_path" | "asset_url" | "file_label" | "file_name" | "content_type" | "foldername_year" | "foldername_month" | "foldername_day" | "input_type" | "input_file_size_bytes" | "input_file_name" | "file_size_bytes" | "file_compress_format" | "batch_code" | "refer_id_1" | "refer_id_2";
|
|
65
|
+
primaryKey: "createdatetime" | "createuserid" | "updatedatetime" | "updateuserid" | "isdelete" | "istrash" | "accountid" | "remark" | "description" | "file_id" | "field_module" | "field_ref" | "tag_name" | "asset_path" | "asset_url" | "file_label" | "file_name" | "content_type" | "foldername_year" | "foldername_month" | "foldername_day" | "input_type" | "input_file_size_bytes" | "input_file_name" | "file_size_bytes" | "file_compress_format" | "batch_code" | "refer_id_1" | "refer_id_2" | "storage_provider_name";
|
|
65
66
|
getFields: (prefix?: string, excludeKeywords?: string[]) => Promise<{
|
|
66
67
|
name: string;
|
|
67
68
|
type: string;
|
|
@@ -98,6 +99,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
98
99
|
batch_code: string | null;
|
|
99
100
|
refer_id_1: bigint;
|
|
100
101
|
refer_id_2: bigint;
|
|
102
|
+
storage_provider_name: string | null;
|
|
101
103
|
}>;
|
|
102
104
|
createMany: ({ dataList, disableRollback, }: {
|
|
103
105
|
dataList: Omit<any, DefaultOmitFields>[];
|
|
@@ -132,6 +134,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
132
134
|
batch_code: string | null;
|
|
133
135
|
refer_id_1: bigint;
|
|
134
136
|
refer_id_2: bigint;
|
|
137
|
+
storage_provider_name: string | null;
|
|
135
138
|
}[]>;
|
|
136
139
|
get: ({ id, where, include, }: {
|
|
137
140
|
id?: number;
|
|
@@ -167,6 +170,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
167
170
|
batch_code: string | null;
|
|
168
171
|
refer_id_1: bigint;
|
|
169
172
|
refer_id_2: bigint;
|
|
173
|
+
storage_provider_name: string | null;
|
|
170
174
|
} | null>;
|
|
171
175
|
list: ({ where, orderBy, offset, limit, include }?: any) => Promise<{
|
|
172
176
|
createdatetime: Date | null;
|
|
@@ -198,12 +202,13 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
198
202
|
batch_code: string | null;
|
|
199
203
|
refer_id_1: bigint;
|
|
200
204
|
refer_id_2: bigint;
|
|
205
|
+
storage_provider_name: string | null;
|
|
201
206
|
}[]>;
|
|
202
207
|
count: ({ where }?: {
|
|
203
208
|
where?: Record<string, any>;
|
|
204
209
|
}) => Promise<number>;
|
|
205
210
|
aggregate: ({ field, operation, where, }: {
|
|
206
|
-
field: "createdatetime" | "createuserid" | "updatedatetime" | "updateuserid" | "isdelete" | "istrash" | "accountid" | "remark" | "description" | "file_id" | "field_module" | "field_ref" | "tag_name" | "asset_path" | "asset_url" | "file_label" | "file_name" | "content_type" | "foldername_year" | "foldername_month" | "foldername_day" | "input_type" | "input_file_size_bytes" | "input_file_name" | "file_size_bytes" | "file_compress_format" | "batch_code" | "refer_id_1" | "refer_id_2";
|
|
211
|
+
field: "createdatetime" | "createuserid" | "updatedatetime" | "updateuserid" | "isdelete" | "istrash" | "accountid" | "remark" | "description" | "file_id" | "field_module" | "field_ref" | "tag_name" | "asset_path" | "asset_url" | "file_label" | "file_name" | "content_type" | "foldername_year" | "foldername_month" | "foldername_day" | "input_type" | "input_file_size_bytes" | "input_file_name" | "file_size_bytes" | "file_compress_format" | "batch_code" | "refer_id_1" | "refer_id_2" | "storage_provider_name";
|
|
207
212
|
operation?: "sum" | "avg" | "min" | "max" | "count";
|
|
208
213
|
where?: Record<string, any>;
|
|
209
214
|
}) => Promise<number>;
|
|
@@ -240,6 +245,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
240
245
|
batch_code: string | null;
|
|
241
246
|
refer_id_1: bigint;
|
|
242
247
|
refer_id_2: bigint;
|
|
248
|
+
storage_provider_name: string | null;
|
|
243
249
|
}>;
|
|
244
250
|
disableRollback?: Boolean;
|
|
245
251
|
}) => Promise<{
|
|
@@ -272,6 +278,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
272
278
|
batch_code: string | null;
|
|
273
279
|
refer_id_1: bigint;
|
|
274
280
|
refer_id_2: bigint;
|
|
281
|
+
storage_provider_name: string | null;
|
|
275
282
|
}>;
|
|
276
283
|
updateMany: ({ dataList, disableRollback, }: {
|
|
277
284
|
dataList: {
|
|
@@ -306,6 +313,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
306
313
|
batch_code: string | null;
|
|
307
314
|
refer_id_1: bigint;
|
|
308
315
|
refer_id_2: bigint;
|
|
316
|
+
storage_provider_name: string | null;
|
|
309
317
|
}>;
|
|
310
318
|
}[];
|
|
311
319
|
disableRollback?: boolean;
|
|
@@ -339,6 +347,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
339
347
|
batch_code: string | null;
|
|
340
348
|
refer_id_1: bigint;
|
|
341
349
|
refer_id_2: bigint;
|
|
350
|
+
storage_provider_name: string | null;
|
|
342
351
|
}[]>;
|
|
343
352
|
trash: ({ ids }: {
|
|
344
353
|
ids: number[];
|
|
@@ -372,6 +381,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
372
381
|
batch_code: string | null;
|
|
373
382
|
refer_id_1: bigint;
|
|
374
383
|
refer_id_2: bigint;
|
|
384
|
+
storage_provider_name: string | null;
|
|
375
385
|
}[]>;
|
|
376
386
|
remove: ({ ids, where }: {
|
|
377
387
|
ids?: number[];
|
|
@@ -406,6 +416,7 @@ export declare const FileModel: ({ prisma, accountId, actionUserId }: {
|
|
|
406
416
|
batch_code: string | null;
|
|
407
417
|
refer_id_1: bigint;
|
|
408
418
|
refer_id_2: bigint;
|
|
419
|
+
storage_provider_name: string | null;
|
|
409
420
|
}[]>;
|
|
410
421
|
raw: <T = any>(query: string, params?: any[]) => Promise<T[]>;
|
|
411
422
|
rawExec: (query: string, params?: any[]) => Promise<number>;
|
|
@@ -3,12 +3,16 @@ import { FileStorageProviderResult } from "./FileStorageProviderRegistry";
|
|
|
3
3
|
export interface FileGoogleCloudProviderOptions {
|
|
4
4
|
bucketName: string;
|
|
5
5
|
basePath?: string;
|
|
6
|
+
skipFoldernameByModuleRef?: boolean;
|
|
7
|
+
skipFoldernameByDate?: boolean;
|
|
6
8
|
publicBaseUrl?: string;
|
|
7
9
|
credentials?: string;
|
|
8
10
|
}
|
|
9
11
|
export declare const FileGoogleCloudStorageProvider: (options: FileGoogleCloudProviderOptions) => {
|
|
10
|
-
uploadFile: <T extends FileModuleRef>({ field_ref, field_module, buffer, fileName, }: T & {
|
|
12
|
+
uploadFile: <T extends FileModuleRef>({ field_ref, field_module, buffer, mimeType, foldernameDate, fileName, }: T & {
|
|
11
13
|
buffer: Buffer;
|
|
14
|
+
mimeType: string;
|
|
15
|
+
foldernameDate?: string;
|
|
12
16
|
fileName: string;
|
|
13
17
|
}) => Promise<FileStorageProviderResult>;
|
|
14
18
|
};
|
|
@@ -7,28 +7,38 @@ exports.FileGoogleCloudStorageProvider = void 0;
|
|
|
7
7
|
const storage_1 = require("@google-cloud/storage");
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const crypto_1 = require("crypto");
|
|
10
|
+
const utils_1 = require("../../utils");
|
|
10
11
|
const FileGoogleCloudStorageProvider = (options) => {
|
|
11
|
-
const { bucketName, basePath = "
|
|
12
|
+
const { bucketName, basePath = "", skipFoldernameByModuleRef = false, skipFoldernameByDate = false, publicBaseUrl, credentials, } = options;
|
|
12
13
|
const storage = new storage_1.Storage(credentials ? { keyFilename: credentials } : undefined);
|
|
13
14
|
const bucket = storage.bucket(bucketName);
|
|
14
15
|
/**
|
|
15
16
|
* Upload file to Google Cloud Storage.
|
|
16
17
|
* Files will be stored under: basePath/ref/module/YYYY/MM/DD/
|
|
17
18
|
*/
|
|
18
|
-
const uploadFile = async ({ field_ref, field_module, buffer, fileName, }) => {
|
|
19
|
-
const now =
|
|
20
|
-
const year = now.
|
|
21
|
-
const month =
|
|
22
|
-
const day = now.
|
|
19
|
+
const uploadFile = async ({ field_ref, field_module, buffer, mimeType, foldernameDate, fileName, }) => {
|
|
20
|
+
const now = (0, utils_1.dayjs)(foldernameDate).isValid() ? (0, utils_1.dayjs)(foldernameDate) : (0, utils_1.dayjs)();
|
|
21
|
+
const year = now.format("YYYY");
|
|
22
|
+
const month = now.format("MM");
|
|
23
|
+
const day = now.format("DD");
|
|
24
|
+
let finalPublicBaseUrl = `https://storage.googleapis.com/${bucketName}`;
|
|
25
|
+
let dirParts = [];
|
|
26
|
+
if (skipFoldernameByModuleRef === false) {
|
|
27
|
+
dirParts.push(field_ref, field_module);
|
|
28
|
+
}
|
|
29
|
+
if (skipFoldernameByDate === false) {
|
|
30
|
+
dirParts.push(year, month, day);
|
|
31
|
+
}
|
|
32
|
+
const finalBasePath = path_1.default.join(basePath, ...dirParts);
|
|
33
|
+
finalPublicBaseUrl = [finalPublicBaseUrl, basePath, ...dirParts].filter(Boolean).join('/');
|
|
23
34
|
const ext = path_1.default.extname(fileName);
|
|
24
|
-
const base = path_1.default.basename(fileName, ext);
|
|
25
35
|
const uniqueName = `${(0, crypto_1.randomUUID)()}${ext}`; // `${base}-${randomUUID()}${ext}`;
|
|
26
|
-
const objectPath = `${
|
|
36
|
+
const objectPath = `${finalBasePath}/${uniqueName}`;
|
|
27
37
|
const file = bucket.file(objectPath);
|
|
28
38
|
await file.save(buffer, {
|
|
29
39
|
resumable: false,
|
|
30
40
|
metadata: {
|
|
31
|
-
contentType: "application/octet-stream",
|
|
41
|
+
contentType: mimeType || "application/octet-stream",
|
|
32
42
|
},
|
|
33
43
|
});
|
|
34
44
|
try {
|
|
@@ -38,16 +48,19 @@ const FileGoogleCloudStorageProvider = (options) => {
|
|
|
38
48
|
console.warn("⚠️ Failed to make file public:", err);
|
|
39
49
|
}
|
|
40
50
|
const assetPath = objectPath;
|
|
41
|
-
const assetUrl = `${
|
|
51
|
+
const assetUrl = `${finalPublicBaseUrl}/${uniqueName}`;
|
|
42
52
|
return {
|
|
43
53
|
assetPath,
|
|
44
54
|
assetUrl,
|
|
45
55
|
filename: uniqueName,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
56
|
+
basePath: finalBasePath,
|
|
57
|
+
...(skipFoldernameByDate === false ? {
|
|
58
|
+
folderName: {
|
|
59
|
+
day: Number(day),
|
|
60
|
+
month: Number(month),
|
|
61
|
+
year: Number(year)
|
|
62
|
+
}
|
|
63
|
+
} : {})
|
|
51
64
|
};
|
|
52
65
|
};
|
|
53
66
|
return { uploadFile };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileGoogleCloudStorageProvider.js","sourceRoot":"","sources":["../../../src/services/file/FileGoogleCloudStorageProvider.ts"],"names":[],"mappings":";;;;;;AAAA,mDAAgD;AAChD,gDAAwB;AACxB,mCAAoC;
|
|
1
|
+
{"version":3,"file":"FileGoogleCloudStorageProvider.js","sourceRoot":"","sources":["../../../src/services/file/FileGoogleCloudStorageProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Storage } from \"@google-cloud/storage\";\nimport path from \"path\";\nimport { randomUUID } from \"crypto\";\n\nimport { dayjs } from \"@/utils\";\n\nimport { FileModuleRef } from \"./FileService\";\n\nimport { FileStorageProviderResult } from \"./FileStorageProviderRegistry\"\n\nexport interface FileGoogleCloudProviderOptions {\n bucketName: string;\n basePath?: string; // e.g. \"uploads\"\n skipFoldernameByModuleRef?: boolean; // skip the folder [ref]/[module]\n skipFoldernameByDate?: boolean; // skip the yyyy/mm/dd folder structure\n publicBaseUrl?: string; // e.g. \"[https://storage.googleapis.com/](https://storage.googleapis.com/)<bucket>\"\n credentials?: string; // path to service account key JSON\n}\n\nexport const FileGoogleCloudStorageProvider = (options: FileGoogleCloudProviderOptions) => {\n\n const {\n bucketName,\n basePath = \"\",\n skipFoldernameByModuleRef = false,\n skipFoldernameByDate = false,\n publicBaseUrl,\n credentials,\n } = options;\n\n const storage = new Storage(credentials ? { keyFilename: credentials } : undefined);\n const bucket = storage.bucket(bucketName);\n\n /**\n * Upload file to Google Cloud Storage.\n * Files will be stored under: basePath/ref/module/YYYY/MM/DD/\n */\n const uploadFile = async <\n T extends FileModuleRef\n >({\n field_ref,\n field_module,\n buffer,\n mimeType,\n foldernameDate,\n fileName,\n }: T & {\n buffer: Buffer;\n mimeType: string;\n foldernameDate?: string; // organize the foldername y/m/d using this date\n fileName: string;\n }): Promise<FileStorageProviderResult> => {\n\n const now = dayjs(foldernameDate).isValid() ? dayjs(foldernameDate) : dayjs();\n const year = now.format(\"YYYY\");\n const month = now.format(\"MM\");\n const day = now.format(\"DD\");\n\n let finalPublicBaseUrl = `https://storage.googleapis.com/${bucketName}`\n let dirParts = []\n\n if (skipFoldernameByModuleRef === false) {\n dirParts.push(field_ref, field_module)\n }\n\n if (skipFoldernameByDate === false) {\n dirParts.push(year, month, day)\n }\n\n const finalBasePath = path.join(basePath, ...dirParts)\n finalPublicBaseUrl = [finalPublicBaseUrl, basePath, ...dirParts].filter(Boolean).join('/');\n\n const ext = path.extname(fileName);\n const uniqueName = `${randomUUID()}${ext}`; // `${base}-${randomUUID()}${ext}`;\n const objectPath = `${finalBasePath}/${uniqueName}`;\n const file = bucket.file(objectPath);\n\n await file.save(buffer, {\n resumable: false,\n metadata: {\n contentType: mimeType || \"application/octet-stream\",\n },\n });\n\n try {\n await file.makePublic();\n } catch (err) {\n console.warn(\"⚠️ Failed to make file public:\", err);\n }\n\n const assetPath = objectPath;\n const assetUrl = `${finalPublicBaseUrl}/${uniqueName}`;\n\n return {\n assetPath,\n assetUrl,\n filename: uniqueName,\n basePath: finalBasePath,\n ...(skipFoldernameByDate === false ? {\n folderName: {\n day: Number(day),\n month: Number(month),\n year: Number(year)\n }\n } : {})\n };\n };\n\n return { uploadFile };\n\n};\n"]}
|
|
@@ -2,11 +2,15 @@ import { FileModuleRef } from "./FileService";
|
|
|
2
2
|
import { FileStorageProviderResult } from "./FileStorageProviderRegistry";
|
|
3
3
|
export interface FileLocalProviderOptions {
|
|
4
4
|
basePath?: string;
|
|
5
|
-
|
|
5
|
+
skipFoldernameByModuleRef?: boolean;
|
|
6
|
+
skipFoldernameByDate?: boolean;
|
|
7
|
+
publicBaseUrl?: string;
|
|
6
8
|
}
|
|
7
|
-
export declare const FileLocalStorageProvider: (options
|
|
8
|
-
uploadFile: <T extends FileModuleRef>({ field_ref, field_module, buffer, fileName, }: T & {
|
|
9
|
+
export declare const FileLocalStorageProvider: (options: FileLocalProviderOptions) => {
|
|
10
|
+
uploadFile: <T extends FileModuleRef>({ field_ref, field_module, buffer, mimeType, foldernameDate, fileName, }: T & {
|
|
9
11
|
buffer: Buffer;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
foldernameDate?: string;
|
|
10
14
|
fileName: string;
|
|
11
15
|
}) => Promise<FileStorageProviderResult>;
|
|
12
16
|
};
|
|
@@ -6,10 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.FileLocalStorageProvider = void 0;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const utils_1 = require("../../utils");
|
|
9
10
|
const crypto_1 = require("crypto");
|
|
10
11
|
const FileLocalStorageProvider = (options) => {
|
|
11
|
-
const basePath = options?.basePath ?? path_1.default.join(process.cwd(), "uploads");
|
|
12
|
-
const baseUrl = options?.baseUrl ?? "/uploads";
|
|
12
|
+
const { basePath = options?.basePath ?? path_1.default.join(process.cwd(), "uploads"), skipFoldernameByModuleRef = false, skipFoldernameByDate = false, publicBaseUrl = options?.publicBaseUrl ?? `/uploads`, } = options;
|
|
13
13
|
const ensureDir = (dir) => {
|
|
14
14
|
if (!fs_1.default.existsSync(dir))
|
|
15
15
|
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
@@ -18,29 +18,41 @@ const FileLocalStorageProvider = (options) => {
|
|
|
18
18
|
* Upload file to local storage.
|
|
19
19
|
* Files will be stored under: basePath/ref/module/YYYY/MM/DD/
|
|
20
20
|
*/
|
|
21
|
-
const uploadFile = async ({ field_ref, field_module, buffer, fileName, }) => {
|
|
22
|
-
const now =
|
|
23
|
-
const year = now.
|
|
24
|
-
const month =
|
|
25
|
-
const day = now.
|
|
26
|
-
|
|
21
|
+
const uploadFile = async ({ field_ref, field_module, buffer, mimeType, foldernameDate, fileName, }) => {
|
|
22
|
+
const now = (0, utils_1.dayjs)(foldernameDate).isValid() ? (0, utils_1.dayjs)(foldernameDate) : (0, utils_1.dayjs)();
|
|
23
|
+
const year = now.format("YYYY");
|
|
24
|
+
const month = now.format("MM");
|
|
25
|
+
const day = now.format("DD");
|
|
26
|
+
let finalPublicBaseUrl = `${publicBaseUrl}`;
|
|
27
|
+
let dirParts = [];
|
|
28
|
+
if (skipFoldernameByModuleRef === false) {
|
|
29
|
+
dirParts.push(field_ref, field_module);
|
|
30
|
+
}
|
|
31
|
+
if (skipFoldernameByDate === false) {
|
|
32
|
+
dirParts.push(year, month, day);
|
|
33
|
+
}
|
|
34
|
+
const finalBasePath = path_1.default.join(basePath, ...dirParts);
|
|
35
|
+
const dir = finalBasePath;
|
|
36
|
+
finalPublicBaseUrl = [finalPublicBaseUrl, ...dirParts].filter(Boolean).join('/');
|
|
27
37
|
ensureDir(dir);
|
|
28
38
|
const ext = path_1.default.extname(fileName);
|
|
29
|
-
// const base = path.basename(fileName, ext);
|
|
30
39
|
const uniqueName = `${(0, crypto_1.randomUUID)()}${ext}`; // `${base}-${randomUUID()}${ext}`;
|
|
31
40
|
const filePath = path_1.default.join(dir, uniqueName);
|
|
32
41
|
await fs_1.default.promises.writeFile(filePath, buffer);
|
|
33
42
|
const assetPath = path_1.default.relative(process.cwd(), filePath);
|
|
34
|
-
const assetUrl = `${
|
|
43
|
+
const assetUrl = `${finalPublicBaseUrl}/${uniqueName}`;
|
|
35
44
|
return {
|
|
36
45
|
assetPath,
|
|
37
46
|
assetUrl,
|
|
38
47
|
filename: uniqueName,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
48
|
+
basePath: finalBasePath,
|
|
49
|
+
...(skipFoldernameByDate === false ? {
|
|
50
|
+
folderName: {
|
|
51
|
+
day: Number(day),
|
|
52
|
+
month: Number(month),
|
|
53
|
+
year: Number(year)
|
|
54
|
+
}
|
|
55
|
+
} : {})
|
|
44
56
|
};
|
|
45
57
|
};
|
|
46
58
|
return { uploadFile };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileLocalStorageProvider.js","sourceRoot":"","sources":["../../../src/services/file/FileLocalStorageProvider.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;
|
|
1
|
+
{"version":3,"file":"FileLocalStorageProvider.js","sourceRoot":"","sources":["../../../src/services/file/FileLocalStorageProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\n\nimport { dayjs } from \"@/utils\";\n\nimport { randomUUID } from \"crypto\";\n\nimport { FileModuleRef } from \"./FileService\";\n\nimport { FileStorageProviderResult } from \"./FileStorageProviderRegistry\"\n\nexport interface FileLocalProviderOptions {\n basePath?: string; // e.g. \"uploads\"\n skipFoldernameByModuleRef?: boolean; // skip the folder [ref]/[module]\n skipFoldernameByDate?: boolean; // skip the yyyy/mm/dd folder structure\n publicBaseUrl?: string; // e.g. \"/uploads\" or \"[http://localhost:3000/uploads](http://localhost:3000/uploads)\"\n}\n\nexport const FileLocalStorageProvider = (options: FileLocalProviderOptions) => {\n\n const {\n basePath = options?.basePath ?? path.join(process.cwd(), \"uploads\"),\n skipFoldernameByModuleRef = false,\n skipFoldernameByDate = false,\n publicBaseUrl = options?.publicBaseUrl ?? `/uploads`,\n } = options;\n\n const ensureDir = (dir: string) => {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n };\n\n /**\n * Upload file to local storage.\n * Files will be stored under: basePath/ref/module/YYYY/MM/DD/\n */\n const uploadFile = async <\n T extends FileModuleRef\n >({\n field_ref,\n field_module,\n buffer,\n mimeType,\n foldernameDate,\n fileName,\n }: T & {\n buffer: Buffer;\n mimeType: string;\n foldernameDate?: string; // organize the foldername y/m/d using this date\n fileName: string;\n }): Promise<FileStorageProviderResult> => {\n\n\n const now = dayjs(foldernameDate).isValid() ? dayjs(foldernameDate) : dayjs();\n const year = now.format(\"YYYY\");\n const month = now.format(\"MM\");\n const day = now.format(\"DD\");\n\n let finalPublicBaseUrl = `${publicBaseUrl}`\n let dirParts = []\n\n if (skipFoldernameByModuleRef === false) {\n dirParts.push(field_ref, field_module)\n }\n\n if (skipFoldernameByDate === false) {\n dirParts.push(year, month, day)\n }\n\n const finalBasePath = path.join(basePath, ...dirParts)\n const dir = finalBasePath\n finalPublicBaseUrl = [finalPublicBaseUrl, ...dirParts].filter(Boolean).join('/');\n\n ensureDir(dir);\n\n const ext = path.extname(fileName);\n const uniqueName = `${randomUUID()}${ext}`; // `${base}-${randomUUID()}${ext}`;\n const filePath = path.join(dir, uniqueName);\n\n await fs.promises.writeFile(filePath, buffer);\n\n const assetPath = path.relative(process.cwd(), filePath);\n const assetUrl = `${finalPublicBaseUrl}/${uniqueName}`;\n\n return {\n assetPath,\n assetUrl,\n filename: uniqueName,\n basePath: finalBasePath,\n ...(skipFoldernameByDate === false ? {\n folderName: {\n day: Number(day),\n month: Number(month),\n year: Number(year)\n }\n } : {})\n };\n };\n\n return { uploadFile };\n\n};\n"]}
|
|
@@ -33,6 +33,7 @@ export type File = {
|
|
|
33
33
|
inputFileName: string;
|
|
34
34
|
fileSizeBytes: number;
|
|
35
35
|
fileCompressFormat: string;
|
|
36
|
+
storageProviderName: string;
|
|
36
37
|
foldernameDay: number;
|
|
37
38
|
foldernameMonth: number;
|
|
38
39
|
foldernameYear: number;
|
|
@@ -105,5 +106,6 @@ export declare const FileService: (props: FileServiceProps) => {
|
|
|
105
106
|
batch_code: string | null;
|
|
106
107
|
refer_id_1: bigint;
|
|
107
108
|
refer_id_2: bigint;
|
|
109
|
+
storage_provider_name: string | null;
|
|
108
110
|
}[]>;
|
|
109
111
|
};
|
|
@@ -51,7 +51,8 @@ const getCreatePayload = (data) => {
|
|
|
51
51
|
[`${models_1.ModelFileFields.input_type}`]: data.inputType,
|
|
52
52
|
[`${models_1.ModelFileFields.refer_id_1}`]: data.referId1,
|
|
53
53
|
[`${models_1.ModelFileFields.refer_id_2}`]: data.referId2,
|
|
54
|
-
[`${models_1.ModelFileFields.remark}`]: data.remark
|
|
54
|
+
[`${models_1.ModelFileFields.remark}`]: data.remark,
|
|
55
|
+
[`${models_1.ModelFileFields.storage_provider_name}`]: data.storageProviderName,
|
|
55
56
|
};
|
|
56
57
|
};
|
|
57
58
|
const compressImageBuffer = async (buffer, mimeType, options = {}) => {
|
|
@@ -128,6 +129,7 @@ const FileService = (props) => {
|
|
|
128
129
|
field_ref,
|
|
129
130
|
field_module,
|
|
130
131
|
buffer: bufferToUpload,
|
|
132
|
+
mimeType,
|
|
131
133
|
fileName: fileOriginalName
|
|
132
134
|
});
|
|
133
135
|
const fieldRef = field_ref;
|
|
@@ -142,9 +144,9 @@ const FileService = (props) => {
|
|
|
142
144
|
const inputFileName = fileOriginalName ?? "";
|
|
143
145
|
const fileSizeBytes = outputSizeBytes ?? 0;
|
|
144
146
|
// const fileCompressFormat = ``
|
|
145
|
-
const foldernameDay = uploadResult
|
|
146
|
-
const foldernameMonth = uploadResult
|
|
147
|
-
const foldernameYear = uploadResult
|
|
147
|
+
const foldernameDay = uploadResult?.folderName?.day ?? "";
|
|
148
|
+
const foldernameMonth = uploadResult?.folderName?.month ?? "";
|
|
149
|
+
const foldernameYear = uploadResult?.folderName?.year ?? "";
|
|
148
150
|
const payload = {
|
|
149
151
|
data: {
|
|
150
152
|
fieldRef,
|
|
@@ -163,6 +165,7 @@ const FileService = (props) => {
|
|
|
163
165
|
inputFileName,
|
|
164
166
|
fileSizeBytes,
|
|
165
167
|
fileCompressFormat,
|
|
168
|
+
storageProviderName,
|
|
166
169
|
foldernameDay,
|
|
167
170
|
foldernameMonth,
|
|
168
171
|
foldernameYear,
|
|
@@ -262,7 +265,7 @@ const FileService = (props) => {
|
|
|
262
265
|
file_id: { in: fileIds }
|
|
263
266
|
}
|
|
264
267
|
});
|
|
265
|
-
console.log('filesToDelete', filesToDelete)
|
|
268
|
+
// console.log('filesToDelete', filesToDelete)
|
|
266
269
|
// 2️⃣ Delete the physical files
|
|
267
270
|
for (const file of filesToDelete) {
|
|
268
271
|
const assetPath = file.asset_path;
|