synt_backend
Version:
Synt light-weight node backend service
155 lines (146 loc) • 4.79 kB
JavaScript
import { Router } from "express";
const router = Router();
const db = require("./../mysql/models/index");
const Sequelize = require("sequelize");
const userHelper = require("./../helpers/user");
import { setMeetingItemResults } from "../helpers/format";
import * as ValidationHelper from "./../helpers/validations";
router.post("/:MeetingItemId/voting", toggleVoting);
router.post("/:MeetingItemId/vote", postVote);
async function toggleVoting(req, res) {
const { t } = req;
const { MeetingItemId } = req.params;
// verify vme and get vme
let user = await userHelper.getAuthUser(req);
let VmeValidation = await ValidationHelper.validateVme(t, user.VMEId); //TODO: Validate user roles
if (!VmeValidation.success) {
return res.json(VmeValidation);
}
const { VME } = VmeValidation;
db.MeetingItem.update(
{ is_voting: Sequelize.literal("NOT is_voting") },
{ where: { id: MeetingItemId } }
);
// confirm budget if possible
db.MeetingItem.findOne({
where: { id: MeetingItemId },
include: [
{ model: db.FixedMeetingItem },
{
model: db.User,
as: "Users",
include: [
{
model: db.LotPhase,
include: [{ model: db.Lot, where: { VMEId: VME.id } }],
},
],
},
],
}).then((MeetingItem) => {
if (MeetingItem.FixedMeetingItem.template === "budget_amount") {
MeetingItem = setMeetingItemResults(MeetingItem);
// need to confirm budget or unconfirm
db.Meeting.findOne({
where: { id: MeetingItem.MeetingId },
attributes: ["FinancialYearId"],
}).then((Meeting) => {
db.FinancialYear.update(
{ is_budget_amount_confirmed: MeetingItem.passed },
{ where: { id: Meeting.FinancialYearId } }
);
});
}
if (MeetingItem.FixedMeetingItem.template === "budget_frequency") {
MeetingItem = setMeetingItemResults(MeetingItem);
// need to confirm budget or unconfirm
db.Meeting.findOne({
where: { id: MeetingItem.MeetingId },
attributes: ["FinancialYearId"],
}).then((Meeting) => {
db.FinancialYear.update(
{ is_budget_frequency_confirmed: MeetingItem.passed },
{ where: { id: Meeting.FinancialYearId } }
);
});
} else if (MeetingItem.FixedMeetingItem.template === "guarantee_fund") {
MeetingItem = setMeetingItemResults(MeetingItem);
// need to confirm budget or unconfirm
db.Meeting.findOne({
where: { id: MeetingItem.MeetingId },
attributes: ["FinancialYearId"],
}).then((Meeting) => {
db.FinancialYear.update(
{ is_guarantee_fund_confirmed: MeetingItem.passed },
{ where: { id: Meeting.FinancialYearId } }
);
});
} else if (MeetingItem.FixedMeetingItem.template === "reserve_capital") {
MeetingItem = setMeetingItemResults(MeetingItem);
// need to confirm budget or unconfirm
db.Meeting.findOne({
where: { id: MeetingItem.MeetingId },
attributes: ["FinancialYearId"],
}).then((Meeting) => {
db.FinancialYear.update(
{ is_reserve_capital_confirmed: MeetingItem.passed },
{ where: { id: Meeting.FinancialYearId } }
);
});
}
});
return res.json({ success: true });
}
async function postVote(req, res) {
const { t } = req;
const { MeetingItemId } = req.params;
const { is_pro } = req.body;
if (typeof is_pro === "undefined") {
return res.json({
success: false,
error: t(
"api.meetingItems.errors.isProMissing",
"To vote for/against must be known."
),
});
}
let UserId;
if (req.body.UserId) {
// public flow
UserId = req.body.UserId;
const MeetingUser = await db.MeetingUser.findOne({
where: { power_of_attorney_token: req.body.token },
});
if (MeetingUser && MeetingUser.UserId !== UserId) {
// safety no voting without token
return res.json({
success: false,
error: t("api.meetingItems.errors.noPermission", "No permission."),
});
}
} else {
let User = await userHelper.getAuthUser(req);
UserId = User.id || false;
}
if (UserId) {
db.MeetingItemUser.findOrCreate({
where: { MeetingItemId, UserId },
}).then((response) => {
let MeetingItemUser = response[0];
MeetingItemUser.is_pro = is_pro;
/*
for (const key of Object.keys(pivotData)) {
MeetingItemUser[key] = pivotData[key];
}
*/
MeetingItemUser.save();
});
} else {
return res.json({
success: false,
error: t("api.meetingItems.errors.noPermission", "No permission."),
});
}
return res.json({ success: true });
}
module.exports = router;