kutt/server/handlers/users.handler.js
2024-11-19 07:58:57 +03:30

185 lines
4.3 KiB
JavaScript

const bcrypt = require("bcryptjs");
const query = require("../queries");
const utils = require("../utils");
const mail = require("../mail");
const env = require("../env");
async function get(req, res) {
const domains = await query.domain.get({ user_id: req.user.id });
const data = {
apikey: req.user.apikey,
email: req.user.email,
domains: domains.map(utils.sanitize.domain)
};
return res.status(200).send(data);
};
async function remove(req, res) {
await query.user.remove(req.user);
if (req.isHTML) {
utils.deleteCurrentToken(res);
res.setHeader("HX-Trigger-After-Swap", "redirectToHomepage");
res.render("partials/settings/delete_account", {
success: "Account has been deleted. Logging out..."
});
return;
}
return res.status(200).send("OK");
};
async function removeByAdmin(req, res) {
const user = await query.user.find({ id: req.params.id });
if (!user) {
const message = "Could not find the user.";
if (req.isHTML) {
return res.render("partials/admin/dialog/message", {
layout: false,
message
});
} else {
return res.status(400).send({ message });
}
}
await query.user.remove(user);
if (req.isHTML) {
res.setHeader("HX-Reswap", "outerHTML");
res.setHeader("HX-Trigger", "reloadMainTable");
res.render("partials/admin/dialog/delete_user_success", {
email: user.email,
});
return;
}
return res.status(200).send({ message: "User has been deleted successfully." });
};
async function getAdmin(req, res) {
const { limit, skip, all } = req.context;
const { role, search } = req.query;
const userId = req.user.id;
const verified = utils.parseBooleanQuery(req.query.verified);
const banned = utils.parseBooleanQuery(req.query.banned);
const domains = utils.parseBooleanQuery(req.query.domains);
const links = utils.parseBooleanQuery(req.query.links);
const match = {
...(role && { role }),
...(verified !== undefined && { verified }),
...(banned !== undefined && { banned }),
};
const [data, total] = await Promise.all([
query.user.getAdmin(match, { limit, search, domains, links, skip }),
query.user.totalAdmin(match, { search, domains, links })
]);
const users = data.map(utils.sanitize.user_admin);
if (req.isHTML) {
res.render("partials/admin/users/table", {
total,
total_formatted: total.toLocaleString("en-US"),
limit,
skip,
users,
})
return;
}
return res.send({
total,
limit,
skip,
data: users,
});
};
async function ban(req, res) {
const { id } = req.params;
const update = {
banned_by_id: req.user.id,
banned: true
};
// 1. check if user exists
const user = await query.user.find({ id });
if (!user) {
throw new CustomError("No user has been found.", 400);
}
if (user.banned) {
throw new CustomError("User has been banned already.", 400);
}
const tasks = [];
// 2. ban user
tasks.push(query.user.update({ id }, update));
// 3. ban user links
if (req.body.links) {
tasks.push(query.link.update({ user_id: id }, update));
}
// 4. ban user domains
if (req.body.domains) {
tasks.push(query.domain.update({ user_id: id }, update));
}
// 5. wait for all tasks to finish
await Promise.all(tasks).catch((err) => {
throw new CustomError("Couldn't ban entries.");
});
// 6. send response
if (req.isHTML) {
res.setHeader("HX-Reswap", "outerHTML");
res.setHeader("HX-Trigger", "reloadMainTable");
res.render("partials/admin/dialog/ban_user_success", {
email: user.email,
});
return;
}
return res.status(200).send({ message: "Banned user successfully." });
}
async function create(req, res) {
const salt = await bcrypt.genSalt(12);
req.body.password = await bcrypt.hash(req.body.password, salt);
const user = await query.user.create(req.body);
if (req.body.verification_email && !user.banned && !user.verified) {
await mail.verification(user);
}
if (req.isHTML) {
res.setHeader("HX-Trigger", "reloadMainTable");
res.render("partials/admin/dialog/create_user_success", {
email: user.email,
});
return;
}
return res.status(201).send({ message: "The user has been created successfully." });
}
module.exports = {
ban,
create,
get,
getAdmin,
remove,
removeByAdmin,
}