Skip to content

Commit

Permalink
i dont remember my changes
Browse files Browse the repository at this point in the history
  • Loading branch information
AlbanSdl committed May 16, 2024
1 parent 005aef7 commit e5341c2
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 86 deletions.
6 changes: 3 additions & 3 deletions web/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ model Borrow {
id Int @id @default(autoincrement())
userLogin String
joyconsTaken Int
borrowOpeningId Int @unique
returnOpeningId Int @unique
borrowOpeningId String @unique
returnOpeningId String @unique
createdAt DateTime @default(now())
user User @relation(fields: [userLogin], references: [login])
Expand All @@ -25,7 +25,7 @@ model Borrow {
}

model Opening {
id Int @id @default(autoincrement())
id String @id @default(uuid())
date DateTime?
code String?
codeGeneratedAt DateTime?
Expand Down
52 changes: 23 additions & 29 deletions web/src/apiRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
CODE_LIFETIME,
generateCode,
generateNewCode,
sendDiscordWebhook,
setLastTimeChestWasAlive,
} from "./utils";

Expand Down Expand Up @@ -65,7 +66,8 @@ apiRouter.post("/sesame", async (request: Request, response: Response) => {
});

apiRouter.get("/ping", async (request: Request, response: Response) => {
setLastTimeChestWasAlive(Date.now());
const interval: number = Number(request.body.interval) || undefined;
setLastTimeChestWasAlive(Date.now(), interval);
return response.status(200).send("Good news ! (Me too)");
});

Expand All @@ -83,34 +85,26 @@ apiRouter.get("/reports", async (request: Request, response: Response) => {
if (borrows.length) {
logger.info(`Generating reports for ${borrows.length} users !`);
const count = borrows.reduce((acc, borrow) => acc + borrow.joyconsTaken, 0);
fetch(process.env.DISCORD_WEBHOOK_URL, {
method: "POST",
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
content: null,
embeds: [
{
title: "⚠️ Emprunts non rendus",
description: `🚨 ${count} joycon${count > 1 ? "s" : ""} n'${
count > 1 ? "ont" : "a"
} pas été rendu${count > 1 ? "s" : ""} !`,
color: 11468800,
fields: borrows.map((borrow) => ({
name: `${borrow.user.firstName} ${
borrow.user.lastName
}`,
value: `${borrow.joyconsTaken} joycon${
borrow.joyconsTaken > 1 ? "s" : ""
} non rendu(s)\nContacte le : ${
borrow.user.mail
}`,
})),
timestamp: new Date().toISOString(),
},
],
attachments: [],
}),
});
sendDiscordWebhook([
{
title: "⚠️ Emprunts non rendus",
description: `🚨 ${count} joycon${count > 1 ? "s" : ""} n'${
count > 1 ? "ont" : "a"
} pas été rendu${count > 1 ? "s" : ""} !`,
color: 11468800,
fields: borrows.map((borrow) => ({
name: `${borrow.user.firstName} ${borrow.user.lastName}`,
value: `${borrow.joyconsTaken} joycon${
borrow.joyconsTaken > 1 ? "s" : ""
} non rendu(s)\nContacte le : ${
borrow.user.mail
}\n[Génère un nouveau code de retour](https://turboswitch.assos.utt.fr/forceOpen?id=${
borrow.returnOpeningId
})`,
})),
timestamp: new Date(),
},
]);
}
return response.status(200).send("Generating reports");
});
Expand Down
76 changes: 70 additions & 6 deletions web/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@ import jwt from "jsonwebtoken";
import { prisma, prismaUtils } from "./prisma";
import { Prisma } from "@prisma/client";

export type DiscordEmbed = {
title: string;
description: string;
color: number;
fields: {
name: string;
value: string;
}[];
timestamp: Date;
};

export function authenticate(request: Request) {
if (!request.cookies["token"]) {
return null;
Expand Down Expand Up @@ -144,15 +155,68 @@ export async function generateNewCode(borrowId: number) {
return code;
}

export function sendDiscordWebhook(embeds: DiscordEmbed[]) {
return fetch(process.env.DISCORD_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
content: null,
embeds: embeds.map((embed) => ({
...embed,
timestamp: embed.timestamp.toISOString(),
})),
attachments: [],
}),
});
}

let lastTimeChestWasAlive = 0;
export function setLastTimeChestWasAlive(time: number) {
let sendInterval = Number.parseInt(process.env.TIME_BEFORE_CHEST_DEATH) * 1000;
let lastChestAlive = false;

function checkChestAlive() {
if (chestAlive() !== lastChestAlive) {
lastChestAlive = !lastChestAlive;
if (lastChestAlive) {
// Chest is up
sendDiscordWebhook([
{
title: "✅ Le coffre est de nouveau en ligne",
color: 2985934,
description: "*Niceeeeuuuhh* 🎉🎉🎉",
fields: [],
timestamp: new Date(),
},
]);
} else {
// Chest is down
sendDiscordWebhook([
{
title: "⚠️ Le coffre est hors ligne !",
color: 16711680,
description:
"*<@&1209413150424825876> vérifiez l'état du coffre et des piles !*",
fields: [],
timestamp: new Date(),
},
]);
}
}
}

export function setLastTimeChestWasAlive(time: number, sendInSecs?: number) {
lastTimeChestWasAlive = time;
sendInterval =
((sendInSecs || Number.parseInt(process.env.TIME_BEFORE_CHEST_DEATH)) + 2) *
1000;
setTimeout(checkChestAlive, sendInterval);
}
export function getLastTimeChestWasAlive() {
if (process.env.CHEST_ALWAYS_ALIVE === 'true') {
return Date.now();
}
return lastTimeChestWasAlive;

export function chestAlive() {
return (
process.env.CHEST_ALWAYS_ALIVE === "true" ||
Date.now() - lastTimeChestWasAlive < sendInterval
);
}

export const CODE_LIFETIME = Number(process.env.CODE_LIFETIME) * 1000;
Expand Down
115 changes: 67 additions & 48 deletions web/src/webRouter.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,49 @@
import { NextFunction, Request, Response, Router } from "express";
import { Request, Response, Router } from "express";
import path from "path";
import { XMLParser } from "fast-xml-parser";
import jwt from "jsonwebtoken";
import { prisma } from "./prisma";
import {
authenticate, formatOpening,
authenticate,
chestAlive,
formatOpening,
generateCode,
generateNewCode,
getJoyconsLeft,
getLastTimeChestWasAlive,
getWaitingOpening, OPENING_INCLUDE_BEFORE_FORMATTING,
getWaitingOpening,
OPENING_INCLUDE_BEFORE_FORMATTING,
} from "./utils";

const webRouter = Router();

function chestAlive() {
return Date.now() - getLastTimeChestWasAlive() < Number.parseInt(process.env.TIME_BEFORE_CHEST_DEATH) * 1000;
}

webRouter.get("/borrow", async (request: Request, response: Response) => {
if (!chestAlive()) return response.redirect('/down');
if (!chestAlive()) return response.redirect("/down");
const login = authenticate(request);
if (!authenticate(request)) return response.redirect('/login');
if (await getWaitingOpening(login)) return response.redirect('/code');
if (!authenticate(request)) return response.redirect("/login");
if (await getWaitingOpening(login)) return response.redirect("/code");
const joyconsLeft = await getJoyconsLeft();
return response.render(path.join(__dirname, '../www/borrow.html'), { joyconsLeft });
return response.render(path.join(__dirname, "../www/borrow.html"), {
joyconsLeft,
});
});

webRouter.get("/code", async (request: Request, response: Response) => {
const login = authenticate(request);
if (!login) return response.redirect('/login');
if (!chestAlive()) return response.redirect('/down');
if (!await getWaitingOpening(login)) return response.redirect('/');
if (!login) return response.redirect("/login");
if (!chestAlive()) return response.redirect("/down");
if (!(await getWaitingOpening(login))) return response.redirect("/");
const opening = await getWaitingOpening(login);
const newCode = await generateNewCode(opening.id);
return response.render(path.join(__dirname, "../www/getCode.html"), { code: newCode, joycons: opening.borrow.joyconsTaken, type: opening.type });
return response.render(path.join(__dirname, "../www/getCode.html"), {
code: newCode,
joycons: opening.borrow.joyconsTaken,
type: opening.type,
});
});

webRouter.get("/login", async (request: Request, response: Response) => {
if (!chestAlive()) return response.redirect('/down');
if (authenticate(request)) return response.redirect('/');
if (!chestAlive()) return response.redirect("/down");
if (authenticate(request)) return response.redirect("/");
if (!request.query["ticket"]) {
return response.sendFile(path.join(__dirname, "../www/login.html"));
}
Expand Down Expand Up @@ -100,16 +104,16 @@ webRouter.get("/login/cas", async (request: Request, response: Response) => {
);
});

webRouter.get('/logout', async (request: Request, response: Response) => {
return response.clearCookie('token').redirect('/');
webRouter.get("/logout", async (request: Request, response: Response) => {
return response.clearCookie("token").redirect("/");
});

webRouter.post("/borrow", async (request: Request, response: Response) => {
const login = authenticate(request);
if (!login) return response.redirect('/login');
if (!chestAlive()) return response.redirect('/down');
if (await getWaitingOpening(login)) return response.redirect('/code');
if (!request.body.joycons) return response.redirect('/borrow');
if (!login) return response.redirect("/login");
if (!chestAlive()) return response.redirect("/down");
if (await getWaitingOpening(login)) return response.redirect("/code");
if (!request.body.joycons) return response.redirect("/borrow");
const joycons = Number.parseInt(request.body.joycons);
if (Number.isNaN(joycons)) {
return response.redirect("/borrow");
Expand All @@ -132,49 +136,64 @@ webRouter.post("/borrow", async (request: Request, response: Response) => {
user: { connect: { login } },
},
});
return response.redirect('/code');
return response.redirect("/code");
});

webRouter.get('/forceOpen', async (request: Request, response: Response) => {
if (!chestAlive()) return response.redirect('/down');
if (!request.query['id']) return response.redirect('/');
const opening = formatOpening(await prisma.opening.findUnique({
where: { id: Number.parseInt(request.query.id as string), date: null, borrow: null },
...OPENING_INCLUDE_BEFORE_FORMATTING
}));
webRouter.get("/forceOpen", async (request: Request, response: Response) => {
if (!chestAlive()) return response.redirect("/down");
if (!request.query["id"]) return response.redirect("/");
const opening = formatOpening(
await prisma.opening.findUnique({
where: {
id: Number.parseInt(request.query.id as string),
date: null,
borrow: null,
},
...OPENING_INCLUDE_BEFORE_FORMATTING,
})
);
if (!opening) {
return response.redirect('/');
return response.redirect("/");
}
const newCode = await generateNewCode(Number.parseInt(request.query.id as string));
response.render(path.join(__dirname, '../www/getCode.html'), { code: newCode, joycons: opening.borrow.joyconsTaken, type: opening.type });
const newCode = await generateNewCode(
Number.parseInt(request.query.id as string)
);
response.render(path.join(__dirname, "../www/getCode.html"), {
code: newCode,
joycons: opening.borrow.joyconsTaken,
type: opening.type,
});
});

webRouter.get("/down", async (request: Request, response: Response) => {
if (chestAlive()) return response.redirect('/');
if (chestAlive()) return response.redirect("/");
response.sendFile(path.join(__dirname, "../www/down.html"));
});

webRouter.get('/legal', async (request: Request, response: Response) => {
webRouter.get("/legal", async (request: Request, response: Response) => {
return response.sendFile(path.join(__dirname, "../www/legal.html"));
});

webRouter.get('/cancel', async (request: Request, response: Response) => {
if (!chestAlive()) return response.redirect('/down');
webRouter.get("/cancel", async (request: Request, response: Response) => {
if (!chestAlive()) return response.redirect("/down");
const login = authenticate(request);
if (!login) return response.redirect('/login');
if (!login) return response.redirect("/login");
const opening = await getWaitingOpening(login);
if (opening && opening.type === 'borrow') {
await prisma.opening.update({ where: { id: opening.id }, data: { code: null, codeGeneratedAt: null } });
if (opening && opening.type === "borrow") {
await prisma.opening.update({
where: { id: opening.id },
data: { code: null, codeGeneratedAt: null },
});
}
return response.redirect('/');
return response.redirect("/");
});

webRouter.get('/', async (request: Request, response: Response) => {
if (!chestAlive()) return response.redirect('/down');
webRouter.get("/", async (request: Request, response: Response) => {
if (!chestAlive()) return response.redirect("/down");
const login = authenticate(request);
if (!login) return response.redirect('/login');
if (await getWaitingOpening(login)) return response.redirect('/code');
return response.redirect('/borrow');
if (!login) return response.redirect("/login");
if (await getWaitingOpening(login)) return response.redirect("/code");
return response.redirect("/borrow");
});

webRouter.use(async (request: Request, response: Response) => {
Expand Down

0 comments on commit e5341c2

Please sign in to comment.