migration to DigitalOcean

File storage migrated to DigitalOcean Storage
This commit is contained in:
2020-11-11 19:42:22 +01:00
parent 66dc739870
commit cc72671911
10 changed files with 243 additions and 124 deletions

View File

@@ -1,101 +0,0 @@
const azureBlob = require("@azure/storage-blob");
const getStream = require("into-stream");
const { newError } = require("./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
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);
}
}
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);
}
}
function removePrefix(string) {
const newString = string.replace("TEMP_", "");
return newString;
}
function makeTempBlobName(originalName) {
const identifier = Math.random().toString().replace(/0\./, "");
return `TEMP_${identifier}-${originalName}`;
}
function setDeleteTempBlobTimer(blobName, containerClient, minutes) {
let blob = containerClient.getBlobClient(blobName);
setTimeout(() => {
blob.delete();
}, 1000 * 60 * minutes);
}
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);
}
}
}
exports.renameBlob = renameBlob;
exports.uploadBlob = uploadBlob;
exports.removePrefix = removePrefix;
exports.makeTempBlobName = makeTempBlobName;
exports.setDeleteTempBlobTimer = setDeleteTempBlobTimer;
exports.deleteImage = deleteImage;

View File

@@ -5,7 +5,7 @@ const Dish = require("../models/dish.js");
const User = require("../models/users.js");
const Restaurant = require("../models/restaurant.js");
const { fetchMultipleRestaurants } = require("./databaseServices.js");
const { deleteImage } = require("./azureServices.js");
const { deleteImage } = require("./oceanServices.js");
async function createUser(request) {
const password = await hashPass(request.body.password);

View File

@@ -2,7 +2,7 @@ const Restaurant = require("../models/restaurant.js");
const Dish = require("../models/dish.js");
const User = require("../models/users.js");
const Payments = require("../models/payments.js");
const { deleteImage } = require("./azureServices.js");
const { deleteImage } = require("./oceanServices.js");
const {
appendDishToLunchSet,
removeDishFromLunchSet,

106
services/oceanServices.js Normal file
View File

@@ -0,0 +1,106 @@
const getStream = require("into-stream");
const { s3_key, s3_secret } = require('../config/index.js');
const aws = require('aws-sdk');
const spacesEndpoint = new aws.Endpoint('fra1.digitaloceanspaces.com');
const s3 = new aws.S3({
endpoint: spacesEndpoint,
accessKeyId: s3_key,
secretAccessKey: s3_secret
});
const { newError } = require("./services.js");
// SETUP
// CODE
async function renameBlob(blobURL) {
try {
const containerURL = "https://menuicdn.fra1.digitaloceanspaces.com/";
const key = blobURL.replace(containerURL, "");
s3.copyObject({
CopySource: "menuicdn/" + key,
Bucket: "menuicdn",
Key: removePrefix(key)
}, (err) => {
if (err) {
console.log(err)
} else {
deleteImage(blobURL)
}
});
const newUrl = containerURL + removePrefix(key);
return newUrl;
} catch (e) {
throw newError("Unable to save image", 500);
}
}
async function uploadBlob(request, resp) {
const blobName = makeTempBlobName(request.file.originalname);
const stream = getStream(request.file.buffer);
const response = {
imgURL: `https://menuicdn.fra1.digitaloceanspaces.com/${blobName}`,
};
try {
s3.upload({
Bucket: 'menuicdn',
Body: stream,
Key: blobName,
ACL: 'public-read',
ContentType: request.file.mimetype
}, (err, data) => {{
setDeleteTempBlobTimer(blobName, 15);
resp.send(response);
}
});
} catch (err) {
throw newError("Unable to save image", 500);
}
}
function removePrefix(string) {
const newString = string.replace("TEMP_", "");
return newString;
}
function makeTempBlobName(originalName) {
const identifier = Math.random().toString().replace(/0\./, "");
return `TEMP_${identifier}-${originalName}`;
}
function setDeleteTempBlobTimer(blobName, minutes) {
setTimeout(() => {
s3.deleteObject({
Key: blobName,
Bucket: "menuicdn"
}, (err) => {
console.log(err)
});
}, 1000 * 60 * minutes);
}
async function deleteImage(url) {
if (!url || url === "" || url === "empty") {
return;
} else {
try {
const containerUrl = "https://menuicdn.fra1.digitaloceanspaces.com/";
const key = url.replace(containerUrl, "");
s3.deleteObject({
Key: key,
Bucket: "menuicdn"
}, (err) => {
console.log(err)
})
} catch (error) {
console.log(error);
}
}
}
exports.renameBlob = renameBlob;
exports.uploadBlob = uploadBlob;
exports.removePrefix = removePrefix;
exports.makeTempBlobName = makeTempBlobName;
exports.setDeleteTempBlobTimer = setDeleteTempBlobTimer;
exports.deleteImage = deleteImage;

View File

@@ -3,7 +3,7 @@ const Dish = require("../models/dish.js");
const User = require("../models/users.js");
const mongoose = require("mongoose");
const sanitizer = require("string-sanitizer");
const { renameBlob } = require("./azureServices.js");
const { renameBlob } = require("./oceanServices.js");
const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const { jwtSecret } = require("../config/index.js");