import { minioClient } from "../../connect/blobConnection.ts"; type MulterFile = { fieldname: string; originalname: string; encoding: string; mimetype: string; size: number; buffer: Buffer; }; const bucketName = "assets-public-bucket"; const publicReadPolicy = { Version: "2012-10-17", Statement: [ { Effect: "Allow", Principal: { AWS: "*" }, Action: ["s3:GetObject"], Resource: [`arn:aws:s3:::${bucketName}/*`], }, ], }; async function ensureBucketExists() { const exists = await minioClient.bucketExists(bucketName); if (!exists) { await minioClient.makeBucket(bucketName, "local-region"); console.log("Bucket created"); } } async function ensureFolderExists(folderName: string) { const folderPrefix = folderName.endsWith("/") ? folderName : `${folderName}/`; const objects = minioClient.listObjects(bucketName, folderPrefix, true); for await (const _ of objects) return; await minioClient.putObject(bucketName, folderPrefix, Buffer.from("")); } async function setPublicPolicy() { await minioClient.setBucketPolicy(bucketName, JSON.stringify(publicReadPolicy)); } export async function uploadProjectThumbnail(file: MulterFile, folderName: string): Promise { try { const folderName = "models"; const objectName = `${folderName}/${Date.now()}_${file.originalname}`; await ensureBucketExists(); await ensureFolderExists(folderName); await minioClient.putObject(bucketName, objectName, file.buffer, file.size, { "Content-Type": file.mimetype, }); await setPublicPolicy(); const encodedName = encodeURIComponent(objectName); const blobUrl = `${process.env.MinIO_USESSL === "true" ? "https" : "http"}://${process.env.MinIO_URL}:${process.env.MINIO_PORT}/${bucketName}/${encodedName}`; return blobUrl; } catch (err) { console.error("Upload failed:", err); throw new Error("Thumbnail upload failed"); } }