Initial commit
This commit is contained in:
commit
24f0a28a3c
25 changed files with 3190 additions and 0 deletions
146
routes/admin.js
Normal file
146
routes/admin.js
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
import { DBAccess } from "../db/index.js";
|
||||
import { Router } from "express";
|
||||
const router = Router();
|
||||
|
||||
router.use(function (req, res, next) {
|
||||
if (req.session.isAdmin) {
|
||||
next();
|
||||
} else {
|
||||
throw new Error("Вы не являетесь администраторром");
|
||||
}
|
||||
});
|
||||
|
||||
router.get("/", async function (req, res, next) {
|
||||
res.render("admin/index", { title: "Администратор" });
|
||||
});
|
||||
|
||||
router.get("/voters", async function (req, res, next) {
|
||||
const voters = await DBAccess.getVoters();
|
||||
res.json(voters);
|
||||
});
|
||||
|
||||
router.get("/voters/:id/promote/:vgid", async function (req, res, next) {
|
||||
const isAcceptJson = req.accepts("json");
|
||||
const { id, vgid } = req.params;
|
||||
try {
|
||||
if (id == req.session.userid) {
|
||||
throw new Error("Нельзя изменить свою группу");
|
||||
}
|
||||
await DBAccess.promoteVoter(id, vgid, req.session.vgroup_id == vgid);
|
||||
if (isAcceptJson) {
|
||||
res.json({ status: "ok" });
|
||||
} else {
|
||||
res.redirect("/admin");
|
||||
}
|
||||
} catch (e) {
|
||||
if (isAcceptJson) {
|
||||
res.json({ status: "error", error: e.message });
|
||||
} else {
|
||||
res.render("admin/index", { title: "Администратор", flashes: ["Ошибка изменения группы", e.message] });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
router.post("/voters/create", async function (req, res, next) {
|
||||
const { login, password, full_name } = req.body;
|
||||
try {
|
||||
await DBAccess.createVoter(login, password, full_name, false);
|
||||
res.redirect("/admin");
|
||||
} catch (e) {
|
||||
res.render("admin/index", { title: "Администратор", flashes: ["Ошибка создания пользователя", e.message] });
|
||||
}
|
||||
});
|
||||
|
||||
router.get("/voters/:id/delete", async function (req, res, next) {
|
||||
const isAcceptJson = req.accepts("json");
|
||||
const { id } = req.params;
|
||||
try {
|
||||
if (id == req.session.userid) {
|
||||
throw new Error("Нельзя удалить самого себя");
|
||||
}
|
||||
await DBAccess.deleteVoter(id);
|
||||
if (isAcceptJson) {
|
||||
res.json({ status: "ok" });
|
||||
} else {
|
||||
res.redirect("/admin");
|
||||
}
|
||||
} catch (e) {
|
||||
if (isAcceptJson) {
|
||||
res.json({ status: "error", error: e.message });
|
||||
} else {
|
||||
res.render("admin/index", { title: "Администратор", flashes: ["Ошибка удаления пользователя", e.message] });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
router.get("/vgroups", async function (req, res, next) {
|
||||
const vgroups = await DBAccess.getVgroups();
|
||||
res.json(vgroups);
|
||||
});
|
||||
|
||||
router.post("/vgroups/create", async function (req, res, next) {
|
||||
const { name, description } = req.body;
|
||||
if (name.length < 3) {
|
||||
res.render("admin/index", { title: "Администратор", flashes: ["Минимальная длина названия группы - три символа"] });
|
||||
} else {
|
||||
const vgroup = await DBAccess.createVgroup(name, description || "");
|
||||
if (vgroup) {
|
||||
res.redirect("/admin");
|
||||
} else {
|
||||
res.render("admin/index", { title: "Администратор", flashes: ["Ошибка создания группы"] });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
router.get("/vgroups/:id/delete", async function (req, res, next) {
|
||||
const isAcceptJson = req.accepts("json");
|
||||
const { id } = req.params;
|
||||
try {
|
||||
if (id == req.session.vgroup_id) {
|
||||
throw new Error("Нельзя удалить свою группу");
|
||||
}
|
||||
await DBAccess.deleteVgroup(id);
|
||||
if (isAcceptJson) {
|
||||
res.json({ status: "ok" });
|
||||
} else {
|
||||
res.redirect("/admin");
|
||||
}
|
||||
} catch (e) {
|
||||
if (isAcceptJson) {
|
||||
res.json({ status: "error", error: e.message });
|
||||
} else {
|
||||
res.render("admin/index", { title: "Администратор", flashes: ["Ошибка удаления группы", e.message] });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
router.get("/votes", async function (req, res, next) {
|
||||
const votes = await DBAccess.getVotes();
|
||||
res.json(votes);
|
||||
});
|
||||
|
||||
router.get("/votes/groupped", async function (req, res, next) {
|
||||
const grouppedVotes = await DBAccess.getGrouppedVotes();
|
||||
res.json(grouppedVotes);
|
||||
});
|
||||
|
||||
router.get("/votes/:id/delete", async function (req, res, next) {
|
||||
const isAcceptJson = req.accepts("json");
|
||||
const { id } = req.params;
|
||||
try {
|
||||
await DBAccess.deleteVote(id);
|
||||
if (isAcceptJson) {
|
||||
res.json({ status: "ok" });
|
||||
} else {
|
||||
res.redirect("/admin");
|
||||
}
|
||||
} catch (e) {
|
||||
if (isAcceptJson) {
|
||||
res.json({ status: "error", error: e.message });
|
||||
} else {
|
||||
res.render("admin/index", { title: "Администратор", flashes: ["Ошибка удаления голоса", e.message] });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
53
routes/gateway.js
Normal file
53
routes/gateway.js
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
import { DBAccess } from '../db/index.js';
|
||||
import { Router } from 'express';
|
||||
const router = Router();
|
||||
|
||||
router.get('/', async function (req, res, next) {
|
||||
if (req.session.userid) {
|
||||
res.redirect("/");
|
||||
} else {
|
||||
res.render("gateway/index", { title: "Гейтвей" });
|
||||
}
|
||||
});
|
||||
|
||||
router.get("/logout", async function (req, res, next) {
|
||||
req.session.destroy(e => e && console.error(e));
|
||||
res.redirect("/");
|
||||
});
|
||||
|
||||
router.post("/login", async function (req, res, next) {
|
||||
const { login, password } = req.body;
|
||||
const voter = await DBAccess.validateVoter(login, password);
|
||||
console.dir(voter);
|
||||
if (voter) {
|
||||
req.session.userid = voter.id;
|
||||
req.session.login = voter.login;
|
||||
req.session.isAdmin = voter.is_admin;
|
||||
req.session.vgroup_id = voter.vgroup_id;
|
||||
req.session.full_name = voter.full_name;
|
||||
res.redirect("/");
|
||||
} else {
|
||||
res.render("gateway/index", { title: "Гейтвей", flashes: ["Неверный логин или пароль"] });
|
||||
}
|
||||
});
|
||||
|
||||
router.post("/register", async function (req, res, next) {
|
||||
const { login, password, full_name } = req.body;
|
||||
if (!login || !password || !full_name || login.length < 5 || password.length < 4 || full_name.length < 4) {
|
||||
res.render("gateway/index", { title: "Гейтвей", flashes: ["Проверьте данные"] });
|
||||
} else if (await DBAccess.findVoterByLogin(login)) {
|
||||
res.render("gateway/index", { title: "Гейтвей", flashes: ["Пользователь с таким логином уже существует"] });
|
||||
} else {
|
||||
const firstUser = await DBAccess.countVoters() === 0;
|
||||
const voter = await DBAccess.createVoter(login, password, full_name, firstUser);
|
||||
console.dir(voter);
|
||||
req.session.userid = voter.id;
|
||||
req.session.login = voter.login;
|
||||
req.session.isAdmin = voter.is_admin;
|
||||
req.session.vgroup_id = voter.vgroup_id;
|
||||
req.session.full_name = voter.full_name;
|
||||
res.redirect("/");
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
14
routes/index.js
Normal file
14
routes/index.js
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
import { Router } from 'express';
|
||||
const router = Router();
|
||||
|
||||
router.get('/', async function (req, res, next) {
|
||||
if (req.session.isAdmin) {
|
||||
res.redirect("/admin");
|
||||
} else if (req.session.userid) {
|
||||
res.redirect("/userspace");
|
||||
} else {
|
||||
res.redirect("/gateway");
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
71
routes/userspace.js
Normal file
71
routes/userspace.js
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
import { DBAccess } from '../db/index.js';
|
||||
import { Router } from 'express';
|
||||
const router = Router();
|
||||
|
||||
router.use(function (req, res, next) {
|
||||
console.dir(req.session);
|
||||
if (req.session.login) {
|
||||
next();
|
||||
} else {
|
||||
throw new Error("Необходима авторизация");
|
||||
}
|
||||
});
|
||||
|
||||
router.get('/', function (req, res, next) {
|
||||
res.render("userspace/index", {
|
||||
title: "Голосование", user: {
|
||||
login: req.session.login,
|
||||
full_name: req.session.full_name,
|
||||
vgroup_id: parseInt(req.session.vgroup_id),
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
router.post("/vote", async function (req, res, next) {
|
||||
const bData = req.body || [];
|
||||
try {
|
||||
const userVotedTihsMonth = await DBAccess.didUserBotedThisMonth(req.session.userid);
|
||||
if (userVotedTihsMonth) {
|
||||
throw new Error("Вы уже голосовали в этом месяце");
|
||||
}
|
||||
|
||||
if (bData.length === 0) {
|
||||
throw new Error("Нет данных для голосования");
|
||||
} else {
|
||||
const data = (req.body || []).reduce((acc, item) => {
|
||||
acc[item.dbmap] = item.value;
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
data.voter_id = parseInt(req.session.userid);
|
||||
const vote = DBAccess.createVote(data);
|
||||
if (vote) {
|
||||
res.json({ status: "ok" });
|
||||
} else {
|
||||
throw new Error("Ошибка голосования");
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
res.json({ status: "error", message: e.message });
|
||||
}
|
||||
});
|
||||
|
||||
router.get("/votes", async function (req, res, next) {
|
||||
const userVotes = await DBAccess.getVotesByVoterId(parseInt(req.session.userid));
|
||||
res.render("userspace/votes", {
|
||||
title: "История",
|
||||
user: {
|
||||
login: req.session.login,
|
||||
full_name: req.session.full_name,
|
||||
vgroup_id: parseInt(req.session.vgroup_id),
|
||||
},
|
||||
votes: userVotes.map(v => {
|
||||
return {
|
||||
...v,
|
||||
date: new Date(v.vote_date).toLocaleString("ru-RU"),
|
||||
}
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
export default router;
|
||||
Loading…
Add table
Add a link
Reference in a new issue