Migrate to Postgres over Mongo

This commit is contained in:
Elijah Dunemask 2021-11-18 00:21:58 +00:00
parent 23b1033085
commit 94e416fd35
23 changed files with 534 additions and 466 deletions

View file

@ -1,86 +1,107 @@
const express = require("express");
const axios = require("axios");
// Local Imports & Configs
const asUser = require("../api/user");
const upload = require("../api/upload");
const storage = require("../api/storage");
const config = require("../config.json");
// Establish path and create router
// Absolute Router Path /api/stash
const router = express.Router();
const cairoMiddleware = (req, res, next) => {
if (req.token == null) return next();
else
axios
.get(`${process.env.CAIRO_URL}/api/user/info`, {
headers: { authorization: `Bearer ${req.token}` },
})
.then((authRes) => {
if (authRes.data && authRes.data.id) {
asUser.load(authRes.data.id).then((user) => {
req.user = user;
next();
});
} else res.status(500).json(authRes.data);
})
.catch((e) => {
if (e.response)
return res
.status(401)
.send(`Auth server responded with: ${e.response.status}`);
console.error(e);
res.sendStatus(500);
});
};
const authMiddleware = (req, res, next) => {
if (req.token == null) return res.sendStatus(401);
next();
};
router.use(cairoMiddleware);
router.get("/files", authMiddleware, (req, res) =>
asUser.getOwnedFiles(req.user.cairoId, req.user.owned).then((files) => {
res.status(200).json(files);
})
);
router.post("/upload", authMiddleware, (req, res) => {
upload.userUpload(req, res, (err) => {
if (err || req.file == null) return res.sendStatus(500);
asUser.uploadFile(req.user.cairoId, req.file).then((file) => {
if (file != null) return res.json(file);
upload.cancelUpload(req.file.path);
return res.sendStatus(500);
});
});
// Imports
const router = require("express").Router();
const storageUtil = require("../utils/storage-util");
const crudFiles = require("../crud/files");
const crudUsers = require("../crud/users");
// Constants
const bucket = "uploads";
const container = (req) => req.user.cairo_id;
const uploadField = "user-selected-file";
const upload = storageUtil.buildBucketUpload(bucket, uploadField, container);
const upsertMiddleware = [authMiddleware, bodyParserMiddleware];
const uploadMiddleware = [authMiddleware, urlEncodedMiddleware, upload];
router.get("/files", authMiddleware, (req, res) => {
crudFiles.queryOwnedFiles(req.user.cairo_id).then((files) => res.json(files));
});
router.post("/delete", authMiddleware, (req, res) => {
if (!req.body || !(req.body instanceof Array)) return res.sendStatus(400);
asUser.deleteFiles(req.user.cairoId, req.body).then((failed) => {
if (!failed) return res.sendStatus(200);
res.status(500).json(failed);
});
router.post("/upload", uploadMiddleware, async (req, res) => {
const users = await crudUsers.queryUserByCairoId(req.user.cairo_id);
const user = users[0];
user.used_storage = parseInt(user.used_storage);
user.storage = parseInt(user.storage);
if (req.file.size + user.used_storage > user.storage) {
storageUtil.cancelUpload(req, req.file.filename);
return res.sendStatus(500);
}
const fileInsert = crudFiles.insertFile(
req.user.cairo_id,
req.file.filename,
req.file.originalname,
req.file.size
);
const userInsert = crudUsers.updateUsedStorage(
req.user.cairo_id,
req.file.size + user.used_storage
);
Promise.all([fileInsert, userInsert])
.then((results) => res.json(results[0][0]))
.catch((err) => res.sendStatus(500));
});
router.get("/download", (req, res) => {
if (!req.query || (!req.query.target && !req.query.zipTarget))
return res.sendStatus(404);
const userId = req.user == null ? null : req.user.cairoId;
if (req.query.target)
return storage.getFile(userId, req.query.target).then((file) => {
if (file) return res.download(file.path);
return res.sendStatus(404);
});
return res.sendStatus(404);
router.post("/delete", upsertMiddleware, (req, res) => {
if (!req.body || !Array.isArray(req.body))
return res.sendStatus(400).send("Files must be an array!");
const files = req.body;
// Technically this should be checked to see if they own it/can edit it
// but timecrunch so will fix later
const queries = files.map((fileId) =>
crudFiles.deleteFile(fileId).then((files) => {
try {
storageUtil.deleteUpload(bucket, req.user.cairo_id, files[0].filename);
return files[0];
} catch (err) {
logError("STASH", `Could not delete file(s)`, files);
return { filesize: 0 };
}
})
);
Promise.all(queries)
.then((results) => {
var deletedData = 0;
results.forEach((file) => (deletedData += file.filesize));
crudUsers
.updateUsedStorage(
req.user.cairo_id,
Math.max(parseInt(req.user.used_storage) - deletedData, 0)
)
.catch((err) =>
logError(
"STASH",
"Could not update storage for ",
req.user.cairo_id,
err
)
);
res.sendStatus(200);
})
.catch((err) => res.status(500).json([]));
// Delete the file
});
router.post("/public", authMiddleware, async (req, res) => {
if (!req.body || !(req.body instanceof Array)) return res.sendStatus(400);
const failed = asUser.publicfyFiles(req.user.cairoId, req.body);
if (!failed) return res.sendStatus(200);
res.status(500).json(failed);
router.get("/download", authOptMiddleware, async (req, res) => {
if (!req.query || !req.query.target) return res.sendStatus(404);
const files = await crudFiles.getFile(req.query.target);
if (files.length !== 1) return res.sendStatus(404);
const file = files[0];
file.view = file.view ?? [];
file.edit = file.edit ?? [];
var fpath = storageUtil.fetchUpload(bucket, file.owner, file.filename);
if (file.public) return res.download(fpath); // Send if public
if (!req.user) return res.sendStatus(401);
const userId = req.user.cairo_id;
if (file.owner === userId) return res.download(fpath); // Send if owner
if (file.edit.includes(userId) || file.view.includes(userId))
return res.download(fpath); // Send if view/edit
return res.sendStatus(401);
});
router.post("/public", upsertMiddleware, async (req, res) => {
if (!req.body || !Array.isArray(req.body))
return res.sendStatus(400).send("Files must be an array!");
req.body.forEach((fileId) => crudFiles.setPublic(fileId));
res.sendStatus(200);
});
module.exports = router;