96 lines
3.0 KiB
JavaScript
96 lines
3.0 KiB
JavaScript
import azureBlob from "@azure/storage-blob";
|
|
import e from "express";
|
|
import getStream from "into-stream";
|
|
import { newError } from "./services.js";
|
|
|
|
// SETUP
|
|
const containerURL = `https://${process.env.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net/img/`;
|
|
const container = "img";
|
|
const OneMB = 1024 * 1024;
|
|
const uploadOptions = { bufferSize: 4 * OneMB, maxBuffers: 2 };
|
|
const sharedKeyCredential = new azureBlob.StorageSharedKeyCredential(
|
|
process.env.AZURE_STORAGE_ACCOUNT_NAME,
|
|
process.env.AZURE_STORAGE_ACCOUNT_KEY
|
|
);
|
|
const pipeline = azureBlob.newPipeline(sharedKeyCredential);
|
|
const blobServiceClient = new azureBlob.BlobServiceClient(
|
|
`https://${process.env.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net`,
|
|
pipeline
|
|
);
|
|
|
|
// CODE
|
|
export async function renameBlob(blobURL) {
|
|
try {
|
|
const blobName = blobURL.replace(containerURL, "");
|
|
const containerClient = blobServiceClient.getContainerClient(container);
|
|
const tempBlob = containerClient.getBlobClient(blobName);
|
|
const newBlob = containerClient.getBlobClient(removePrefix(blobName));
|
|
|
|
await newBlob.syncCopyFromURL(tempBlob.url);
|
|
return newBlob.url;
|
|
} catch (e) {
|
|
throw newError("Unable to save image", 500);
|
|
}
|
|
}
|
|
|
|
export async function uploadBlob(request, resp) {
|
|
const blobName = makeTempBlobName(request.file.originalname);
|
|
const stream = getStream(request.file.buffer);
|
|
const containerClient = blobServiceClient.getContainerClient(container);
|
|
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
|
|
const response = {
|
|
imgURL: `https://${process.env.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net/img/${blobName}`,
|
|
};
|
|
|
|
try {
|
|
await blockBlobClient
|
|
.uploadStream(
|
|
stream,
|
|
uploadOptions.bufferSize,
|
|
uploadOptions.maxBuffers,
|
|
{ blobHTTPHeaders: { blobContentType: "image/jpeg" } }
|
|
)
|
|
.then(() => {
|
|
setDeleteTempBlobTimer(blobName, containerClient, 1);
|
|
resp.send(response);
|
|
});
|
|
} catch (err) {
|
|
console.log(err);
|
|
throw newError("Unable to save image", 500);
|
|
}
|
|
}
|
|
|
|
export function removePrefix(string) {
|
|
const newString = string.replace("TEMP_", "");
|
|
return newString;
|
|
}
|
|
|
|
export function makeTempBlobName(originalName) {
|
|
const identifier = Math.random().toString().replace(/0\./, "");
|
|
return `TEMP_${identifier}-${originalName}`;
|
|
}
|
|
|
|
export function setDeleteTempBlobTimer(blobName, containerClient, minutes) {
|
|
let blob = containerClient.getBlobClient(blobName);
|
|
setTimeout(() => {
|
|
blob.delete();
|
|
}, 1000 * 60 * minutes);
|
|
}
|
|
|
|
export async function deleteImage(url) {
|
|
if (!url || url === "" || url === "empty") {
|
|
return;
|
|
} else {
|
|
try {
|
|
const containerClient = blobServiceClient.getContainerClient(container);
|
|
const containerUrl = containerClient.url + "/";
|
|
const blobName = url.replace(containerUrl, "");
|
|
console.log(`BLOB NAME = ${blobName}`);
|
|
const blob = containerClient.getBlobClient(blobName);
|
|
await blob.delete();
|
|
} catch (error) {
|
|
console.log(error);
|
|
}
|
|
}
|
|
}
|