Migrate to Postgres over Mongo
This commit is contained in:
parent
23b1033085
commit
94e416fd35
23 changed files with 534 additions and 466 deletions
|
@ -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;
|
||||
|
|
Reference in a new issue