migration to DigitalOcean
File storage migrated to DigitalOcean Storage
This commit is contained in:
@@ -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;
|
||||
@@ -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);
|
||||
|
||||
@@ -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
106
services/oceanServices.js
Normal 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;
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user