UNPKG

synt_backend

Version:

Synt light-weight node backend service

155 lines (146 loc) 4.79 kB
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;