67 lines
1.9 KiB
TypeScript
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");
|
|
}
|
|
}
|