All checks were successful
Build and Deploy Nuxt / build (push) Successful in 1m20s
107 lines
3.5 KiB
JavaScript
107 lines
3.5 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
|
|
const Campaign = require('../models/Campaign');
|
|
const Folder = require('../models/Folder');
|
|
const Note = require('../models/Note');
|
|
|
|
async function userOwnsCampaign(campaignId, userId) {
|
|
const campaign = await Campaign.findOne({ _id: campaignId, createdBy: userId }).lean();
|
|
return Boolean(campaign);
|
|
}
|
|
|
|
router.get('/list', async (req, res) => {
|
|
try {
|
|
const { campaign } = req.query;
|
|
if (!campaign) return res.json({ status: 'error', msg: 'errors.missing-data' });
|
|
|
|
const hasAccess = await userOwnsCampaign(campaign, req.user.id);
|
|
if (!hasAccess) return res.json({ status: 'error', msg: 'unauthorized' });
|
|
|
|
const folders = await Folder.find({ campaign })
|
|
.select('_id name date')
|
|
.sort({ date: -1 })
|
|
.lean();
|
|
|
|
res.json({ status: 'ok', folders });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.json({ status: 'error', msg: 'errors.internal' });
|
|
}
|
|
});
|
|
|
|
router.post('/create', async (req, res) => {
|
|
try {
|
|
const { name, campaign } = req.body;
|
|
if (!name || !campaign) return res.json({ status: 'error', msg: 'errors.missing-data' });
|
|
|
|
const hasAccess = await userOwnsCampaign(campaign, req.user.id);
|
|
if (!hasAccess) return res.json({ status: 'error', msg: 'unauthorized' });
|
|
|
|
const newFolder = new Folder({
|
|
name: name.trim(),
|
|
campaign
|
|
});
|
|
await newFolder.save();
|
|
res.json({ status: 'ok', folder: newFolder });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.json({ status: 'error', msg: 'errors.internal' });
|
|
}
|
|
});
|
|
|
|
router.post('/delete', async (req, res) => {
|
|
try {
|
|
const { id } = req.body;
|
|
if (!id) return res.json({ status: 'error', msg: 'errors.missing-data' });
|
|
|
|
const folder = await Folder.findById(id);
|
|
if (!folder) return res.json({ status: 'error', msg: 'errors.notfound' });
|
|
|
|
const hasAccess = await userOwnsCampaign(folder.campaign, req.user.id);
|
|
if (!hasAccess) return res.json({ status: 'error', msg: 'unauthorized' });
|
|
|
|
async function moveRecursive(folderId) {
|
|
const subfolders = await Folder.find({ parentFolder: folderId }).select('_id').lean();
|
|
await Note.updateMany(
|
|
{ folder: folderId },
|
|
{ $set: { folder: null, date: Date.now() } }
|
|
);
|
|
await Folder.deleteOne({ _id: folderId });
|
|
for (const sub of subfolders) {
|
|
await moveRecursive(sub._id);
|
|
}
|
|
}
|
|
|
|
await moveRecursive(id);
|
|
|
|
res.json({ status: 'ok' });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.json({ status: 'error', msg: 'errors.internal' });
|
|
}
|
|
});
|
|
|
|
router.post('/rename', async (req, res) => {
|
|
try {
|
|
const { id, name } = req.body;
|
|
if (!id || !name) return res.json({ status: 'error', msg: 'errors.missing-data' });
|
|
|
|
const folder = await Folder.findById(id);
|
|
if (!folder) return res.json({ status: 'error', msg: 'errors.notfound' });
|
|
|
|
const hasAccess = await userOwnsCampaign(folder.campaign, req.user.id);
|
|
if (!hasAccess) return res.json({ status: 'error', msg: 'unauthorized' });
|
|
|
|
folder.name = name.trim();
|
|
await folder.save();
|
|
|
|
res.json({ status: 'ok', folder });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.json({ status: 'error', msg: 'errors.internal' });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|