// /components/files/fileService.js const path = require('path'); const config = require('../../config/config'); const { uploadToTempBucket, commitTempFile, generatePresignedUrl, deleteFromBucket } = require('../../utils/s3Client'); const AppError = require('../../utils/AppError'); const uploadTempFile = async (fileBuffer, originalName, mimeType) => { if (!fileBuffer || !originalName) { throw new AppError('FILE_REQUIRED'); } const ext = path.extname(originalName); const uniquePrefix = `${Date.now()}-${Math.round(Math.random() * 1E9)}`; const tempFileName = `temp-${uniquePrefix}${ext}`; const result = await uploadToTempBucket(fileBuffer, tempFileName, mimeType); return { tempFileName: result.tempFileName, originalName, mimeType, bucket: result.bucket }; }; const getPresignedUrl = async (filename, bucket = null) => { if (!filename) { throw new AppError('VALIDATION_FAILED', null, 'Filename is required'); } const targetBucket = bucket || config.S3_TEMP_BUCKET; const signedUrl = await generatePresignedUrl(filename, targetBucket); return { filename, bucket: targetBucket, presignedUrl: signedUrl, signedUrl, expiresInSeconds: config.SIGNED_URL_EXPIRES_IN }; }; const commitFile = async (tempFileName, targetFileName = null, targetBucket = 'certificates') => { return commitTempFile(tempFileName, targetFileName, targetBucket); }; const deleteFile = async (filename, bucket = null) => { return deleteFromBucket(filename, bucket || config.S3_TEMP_BUCKET); }; module.exports = { uploadTempFile, getPresignedUrl, commitFile, deleteFile };