Files
Dwinzo-Backend-V0.0/src/shared/services/blob/blobServices.ts

67 lines
1.9 KiB
TypeScript

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<string> {
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");
}
}