Demo

FileService

File uploads, metadata, and storage (local or S3), including pre-signed download URLs.

Inject

TSXinject
1import { 2 ContainerRegistryManager, 3 FileService, 4 Inject, 5 Service, 6} from "@quan-erp/shared-backend-core"; 7 8@Service() 9export class MyPluginService { 10 @Inject(FileService, ContainerRegistryManager.BUILTIN_PLUGIN) 11 private fileService: FileService; 12}

addFile(options)

Moves a temp upload into storage (local folder or S3) and inserts a FileEntity row. Returns the saved FileEntity (including generated filename).

  • tempFilePath: string — path from multer / temp upload
  • originalName: string — original client filename (used for extension)
  • mimeType: string
  • metadata: Record<string, any>
  • creatorId: number — uploading user id
  • type: FileStorageType — local or S3
  • fileAccess: FileAccess — access policy
  • accessRole: number[] — roles allowed when access is role-gated
  • compression?: number — optional compression hint
TSXaddFile
1import { 2 ContainerRegistryManager, 3 FileAccess, 4 FileService, 5 FileStorageType, 6 Inject, 7 Service, 8} from "@quan-erp/shared-backend-core"; 9 10@Service() 11export class AttachmentService { 12 @Inject(FileService, ContainerRegistryManager.BUILTIN_PLUGIN) 13 private fileService: FileService; 14 15 async storeUpload(tempPath: string, userId: number) { 16 return this.fileService.addFile({ 17 tempFilePath: tempPath, 18 originalName: "invoice.pdf", 19 mimeType: "application/pdf", 20 metadata: { source: "invoice-upload" }, 21 creatorId: userId, 22 type: FileStorageType.LOCAL, 23 fileAccess: FileAccess.PRIVATE, 24 accessRole: [], 25 }); 26 } 27}

Other methods

  • findFile(filename: string): Promise<FileEntity | null> — metadata by stored filename
  • getFiles(skip: number, limit: number) — paginated file list
  • deleteFile(id: number) — remove storage object and DB row
  • generatePreSignedUrl(file: string, expiresInSeconds: number, mimeType: string): Promise<string> — temporary download URL (S3 / signed access)
TSXdownload
1import { 2 ContainerRegistryManager, 3 FileService, 4 Inject, 5 Service, 6} from "@quan-erp/shared-backend-core"; 7 8@Service() 9export class FileLinkService { 10 @Inject(FileService, ContainerRegistryManager.BUILTIN_PLUGIN) 11 private fileService: FileService; 12 13 async temporaryLink(filename: string, mimeType: string) { 14 return this.fileService.generatePreSignedUrl( 15 filename, 16 60 * 15, 17 mimeType 18 ); 19 } 20}