Možnost hlasování o nových funkcích
This commit is contained in:
@@ -9,6 +9,7 @@ import path from 'path';
|
||||
import { getQr } from "./qr";
|
||||
import { generateToken, getLogin, getTrusted, verify } from "./auth";
|
||||
import { InsufficientPermissions, getDayOfWeekIndex } from "./utils";
|
||||
import { getUserVotes, updateFeatureVote } from "./voting";
|
||||
|
||||
const ENVIRONMENT = process.env.NODE_ENV || 'production';
|
||||
dotenv.config({ path: path.resolve(__dirname, `./.env.${ENVIRONMENT}`) });
|
||||
@@ -324,6 +325,24 @@ app.post("/api/updatePizzaFee", async (req, res, next) => {
|
||||
} catch (e: any) { next(e) }
|
||||
});
|
||||
|
||||
app.get("/api/getFeatureVotes", async (req, res) => {
|
||||
const login = getLogin(parseToken(req));
|
||||
const data = await getUserVotes(login);
|
||||
res.status(200).json(data);
|
||||
});
|
||||
|
||||
app.post("/api/updateFeatureVote", async (req, res, next) => {
|
||||
const login = getLogin(parseToken(req));
|
||||
if (req.body?.option == null || req.body?.active == null) {
|
||||
res.status(400).json({ error: "Chybné parametry volání" });
|
||||
}
|
||||
try {
|
||||
const data = await updateFeatureVote(login, req.body.option, req.body.active);
|
||||
io.emit("message", data);
|
||||
res.status(200).json(data);
|
||||
} catch (e: any) { next(e) }
|
||||
});
|
||||
|
||||
// Middleware pro zpracování chyb
|
||||
app.use((err: any, req: any, res: any, next: any) => {
|
||||
if (err instanceof InsufficientPermissions) {
|
||||
|
||||
56
server/src/voting.ts
Normal file
56
server/src/voting.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import { FeatureRequest } from "../../types";
|
||||
import getStorage from "./storage";
|
||||
|
||||
interface VotingData {
|
||||
[login: string]: FeatureRequest[],
|
||||
}
|
||||
|
||||
const storage = getStorage();
|
||||
const STORAGE_KEY = 'voting';
|
||||
|
||||
/**
|
||||
* Vrátí pole voleb, pro které uživatel aktuálně hlasuje.
|
||||
*
|
||||
* @param login login uživatele
|
||||
* @returns pole voleb
|
||||
*/
|
||||
export async function getUserVotes(login: string) {
|
||||
const data: VotingData = await storage.getData(STORAGE_KEY);
|
||||
return data[login];
|
||||
}
|
||||
|
||||
/**
|
||||
* Aktualizuje hlas uživatele pro konkrétní volbu.
|
||||
*
|
||||
* @param login login uživatele
|
||||
* @param option volba
|
||||
* @param active příznak, zda volbu přidat nebo odebrat
|
||||
* @returns aktuální data
|
||||
*/
|
||||
export async function updateFeatureVote(login: string, option: FeatureRequest, active: boolean): Promise<VotingData> {
|
||||
let data: VotingData = await storage.getData(STORAGE_KEY);
|
||||
if (data == null) {
|
||||
data = {};
|
||||
}
|
||||
if (!(login in data)) {
|
||||
data[login] = [];
|
||||
}
|
||||
const index = data[login].indexOf(option);
|
||||
if (index > -1) {
|
||||
if (active) {
|
||||
throw Error('Pro tuto možnost jste již hlasovali');
|
||||
} else {
|
||||
data[login].splice(index, 1);
|
||||
if (data[login].length === 0) {
|
||||
delete data[login];
|
||||
}
|
||||
}
|
||||
} else if (active) {
|
||||
if (data[login].length == 3) {
|
||||
throw Error('Je možné hlasovat pro maximálně 3 možnosti');
|
||||
}
|
||||
data[login].push(option);
|
||||
}
|
||||
await storage.setData(STORAGE_KEY, data);
|
||||
return data;
|
||||
}
|
||||
Reference in New Issue
Block a user