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.
@@ -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
- baseUrl: `${configs_1.config.FILE_STORAGE_LOCAL_BASE_URL}`
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 = "uploads", publicBaseUrl = `https://storage.googleapis.com/${options.bucketName}`, credentials, } = options;
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 = new Date();
20
- const year = now.getFullYear().toString();
21
- const month = (now.getMonth() + 1).toString().padStart(2, "0");
22
- const day = now.getDate().toString().padStart(2, "0");
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 = `${basePath}/${field_ref}/${field_module}/${year}/${month}/${day}/${uniqueName}`;
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 = `${publicBaseUrl}/${objectPath}`;
51
+ const assetUrl = `${finalPublicBaseUrl}/${uniqueName}`;
42
52
  return {
43
53
  assetPath,
44
54
  assetUrl,
45
55
  filename: uniqueName,
46
- folderName: {
47
- day: Number(day),
48
- month: Number(month),
49
- year: Number(year)
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;AAa7B,MAAM,8BAA8B,GAAG,CAAC,OAAuC,EAAE,EAAE;IAEtF,MAAM,EACF,UAAU,EACV,QAAQ,GAAG,SAAS,EACpB,aAAa,GAAG,kCAAkC,OAAO,CAAC,UAAU,EAAE,EACtE,WAAW,GACd,GAAG,OAAO,CAAC;IAEZ,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE1C;;;OAGG;IACH,MAAM,UAAU,GAAG,KAAK,EAEtB,EACE,SAAS,EACT,YAAY,EACZ,MAAM,EACN,QAAQ,GAIX,EAAsC,EAAE;QAErC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,GAAG,IAAA,mBAAU,GAAE,GAAG,GAAG,EAAE,CAAC,CAAE,mCAAmC;QAChF,MAAM,UAAU,GAAG,GAAG,QAAQ,IAAI,SAAS,IAAI,YAAY,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;QACpG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAErC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACpB,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE;gBACN,WAAW,EAAE,0BAA0B;aAC1C;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,CAAC;QAC7B,MAAM,QAAQ,GAAG,GAAG,aAAa,IAAI,UAAU,EAAE,CAAC;QAElD,OAAO;YACH,SAAS;YACT,QAAQ;YACR,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE;gBACR,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;gBACpB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;aACrB;SACJ,CAAC;IACN,CAAC,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,CAAC;AAE1B,CAAC,CAAC;AArEW,QAAA,8BAA8B,kCAqEzC","sourcesContent":["import { Storage } from \"@google-cloud/storage\";\nimport path from \"path\";\nimport { randomUUID } from \"crypto\";\n\nimport { FileModuleRef } from \"./FileService\";\n\nimport { FileStorageProviderResult } from \"./FileStorageProviderRegistry\"\n\nexport interface FileGoogleCloudProviderOptions {\n bucketName: string;\n basePath?: string; // e.g. \"uploads\"\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 = \"uploads\",\n publicBaseUrl = `https://storage.googleapis.com/${options.bucketName}`,\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 fileName,\n }: T & {\n buffer: Buffer;\n fileName: string;\n }): Promise<FileStorageProviderResult> => {\n\n const now = new Date();\n const year = now.getFullYear().toString();\n const month = (now.getMonth() + 1).toString().padStart(2, \"0\");\n const day = now.getDate().toString().padStart(2, \"0\");\n\n const ext = path.extname(fileName);\n const base = path.basename(fileName, ext);\n const uniqueName = `${randomUUID()}${ext}`; // `${base}-${randomUUID()}${ext}`;\n const objectPath = `${basePath}/${field_ref}/${field_module}/${year}/${month}/${day}/${uniqueName}`;\n const file = bucket.file(objectPath);\n\n await file.save(buffer, {\n resumable: false,\n metadata: {\n contentType: \"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 = `${publicBaseUrl}/${objectPath}`;\n\n return {\n assetPath,\n assetUrl,\n filename: uniqueName,\n folderName: {\n day: Number(day),\n month: Number(month),\n year: Number(year)\n }\n };\n };\n\n return { uploadFile };\n\n};\n"]}
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
- baseUrl?: string;
5
+ skipFoldernameByModuleRef?: boolean;
6
+ skipFoldernameByDate?: boolean;
7
+ publicBaseUrl?: string;
6
8
  }
7
- export declare const FileLocalStorageProvider: (options?: FileLocalProviderOptions) => {
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 = new Date();
23
- const year = now.getFullYear().toString();
24
- const month = (now.getMonth() + 1).toString().padStart(2, "0");
25
- const day = now.getDate().toString().padStart(2, "0");
26
- const dir = path_1.default.join(basePath, field_ref, field_module, year, month, day);
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 = `${baseUrl}/${field_ref}/${field_module}/${year}/${month}/${day}/${uniqueName}`;
43
+ const assetUrl = `${finalPublicBaseUrl}/${uniqueName}`;
35
44
  return {
36
45
  assetPath,
37
46
  assetUrl,
38
47
  filename: uniqueName,
39
- folderName: {
40
- day: Number(day),
41
- month: Number(month),
42
- year: Number(year)
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;AACxB,mCAAoC;AAW7B,MAAM,wBAAwB,GAAG,CAAC,OAAkC,EAAE,EAAE;IAE3E,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,UAAU,CAAC;IAE/C,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE;QAC9B,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,UAAU,GAAG,KAAK,EAEtB,EACE,SAAS,EACT,YAAY,EACZ,MAAM,EACN,QAAQ,GAIX,EAAsC,EAAE;QAErC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3E,SAAS,CAAC,GAAG,CAAC,CAAC;QAEf,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,6CAA6C;QAC7C,MAAM,UAAU,GAAG,GAAG,IAAA,mBAAU,GAAE,GAAG,GAAG,EAAE,CAAC,CAAC,mCAAmC;QAC/E,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAE5C,MAAM,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE9C,MAAM,SAAS,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,GAAG,OAAO,IAAI,SAAS,IAAI,YAAY,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;QAEjG,OAAO;YACH,SAAS;YACT,QAAQ;YACR,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE;gBACR,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;gBACpB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;aACrB;SACJ,CAAC;IACN,CAAC,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,CAAC;AAE1B,CAAC,CAAC;AAzDW,QAAA,wBAAwB,4BAyDnC","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\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 baseUrl?: string; // e.g. \"/uploads\" or \"[http://localhost:3000/uploads](http://localhost:3000/uploads)\"\n}\n\nexport const FileLocalStorageProvider = (options?: FileLocalProviderOptions) => {\n\n const basePath = options?.basePath ?? path.join(process.cwd(), \"uploads\");\n const baseUrl = options?.baseUrl ?? \"/uploads\";\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 fileName,\n }: T & {\n buffer: Buffer;\n fileName: string;\n }): Promise<FileStorageProviderResult> => {\n\n const now = new Date();\n const year = now.getFullYear().toString();\n const month = (now.getMonth() + 1).toString().padStart(2, \"0\");\n const day = now.getDate().toString().padStart(2, \"0\");\n\n const dir = path.join(basePath, field_ref, field_module, year, month, day);\n ensureDir(dir);\n\n const ext = path.extname(fileName);\n // const base = path.basename(fileName, ext);\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 = `${baseUrl}/${field_ref}/${field_module}/${year}/${month}/${day}/${uniqueName}`;\n\n return {\n assetPath,\n assetUrl,\n filename: uniqueName,\n folderName: {\n day: Number(day),\n month: Number(month),\n year: Number(year)\n }\n };\n };\n\n return { uploadFile };\n\n};\n"]}
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.folderName.day;
146
- const foldernameMonth = uploadResult.folderName.month;
147
- const foldernameYear = uploadResult.folderName.year;
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;