Skip to content

Commit 603d24b

Browse files
committed
Modified :
- Bus attribution schema (add departure_time) - Send email for bus attribution Fix : - Some fix (return case for surcharged function)
1 parent 195b91e commit 603d24b

File tree

23 files changed

+1684
-51
lines changed

23 files changed

+1684
-51
lines changed

backend/server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import emailRoutes from './src/routes/email.routes';
1818
import newsRoutes from './src/routes/news.routes';
1919
import discordRoutes from './src/routes/discord.routes';
2020
import tentRoutes from './src/routes/tent.routes';
21+
import busRoutes from './src/routes/bus.routes';
2122
import { server_port } from './src/utils/secret';
2223
import { initUser } from './src/database/initdb/initUser'
2324
import { initRoles } from './src/database/initdb/initrole'
@@ -59,6 +60,7 @@ async function startServer() {
5960
app.use('/api/news',authenticateUser, newsRoutes);
6061
app.use('/api/discord',authenticateUser, discordRoutes);
6162
app.use('/api/tent',authenticateUser, tentRoutes);
63+
app.use('/api/bus',authenticateUser, busRoutes);
6264
app.use("/api/uploads/imgnews", express.static(path.join(__dirname, "/uploads/imgnews")));
6365
app.use("/api/uploads/foodmenu", express.static(path.join(__dirname, "/uploads/foodmenu")));
6466
app.use("/api/uploads/plannings", express.static(path.join(__dirname, "/uploads/plannings")));
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// src/controllers/bus.controller.ts
2+
import { Request, Response } from "express";
3+
import * as bus_service from "../services/bus.service";
4+
import { sendEmail } from "../services/email.service";
5+
import { Error, Ok } from "../utils/responses";
6+
import { generateEmailHtml } from "./email.controller";
7+
8+
interface MulterRequest extends Request {
9+
file?: Express.Multer.File;
10+
}
11+
12+
export const sendBusAttributionEmails = async (req: Request, res: Response) => {
13+
try {
14+
const attributions = await bus_service.getAllBusAttributions();
15+
16+
if (!attributions.length) {
17+
Error(res, { msg: "Aucune attribution de bus trouvée." });
18+
return;
19+
}
20+
21+
for (const attr of attributions) {
22+
const htmlEmail = generateEmailHtml("templateAttributionBus", {
23+
bus: attr.bus, time: attr.departure_time
24+
});
25+
26+
const emailOptions = {
27+
28+
to: [attr.email],
29+
cc: [],
30+
bcc: [],
31+
subject: `Attribution Bus - ${attr.firstName ?? ""} ${attr.lastName ?? ""}`,
32+
text: `Votre bus attribué est le numéro ${attr.bus}`,
33+
html: htmlEmail || "",
34+
};
35+
36+
await sendEmail(emailOptions);
37+
}
38+
39+
Ok(res, { msg: "Emails d'attribution bus envoyés avec succès !" });
40+
} catch (err) {
41+
console.error(err);
42+
Error(res, { msg: "Erreur lors de l'envoi des emails d'attribution bus." });
43+
}
44+
};
45+
46+
export const uploadbusCSV = async (req: MulterRequest, res: Response) => {
47+
try {
48+
const file = req.file;
49+
if (!file) {
50+
Error(res, { msg: "Fichier CSV manquant." });
51+
}
52+
53+
await bus_service.importBusFromCSV(file.path);
54+
Ok(res,{ msg: "Importation réalisée avec succès." });
55+
} catch (error) {
56+
console.error("Erreur import CSV :", error);
57+
Error(res, { msg: "Échec de l'importation." });
58+
}
59+
};

backend/src/controllers/news.controller.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export const createNews = async (req: Request, res: Response) => {
2424
target,
2525
image_url);
2626
Ok(res, { msg: "Actu créée avec succès", data: news });
27-
return;
27+
;
2828
} catch (err) {
2929
console.error(err);
3030
Error(res, { msg: "Erreur lors de la création de l'actu" });
@@ -81,7 +81,7 @@ export const publishNews = async (req: Request, res: Response) => {
8181

8282
if(recipients.length === 0){
8383
Error(res, {msg : "No recipients"});
84-
return
84+
8585
}
8686

8787
const email = {
@@ -118,7 +118,7 @@ export const deleteNews = async (req: Request, res: Response) => {
118118
}
119119
await news_service.deleteNews(Number(newsId));
120120
Ok(res, { msg: "Actus supprimée avec succès !" });
121-
return;
121+
;
122122

123123
} catch (error) {
124124
Error(res, { msg: "Erreur lors de la suppression de l'actus" });
@@ -134,7 +134,7 @@ export const updateNews = async (req: Request, res: Response) => {
134134
try {
135135
const existing = await news_service.getNewsById(Number(id));
136136
if (!existing) {
137-
return Error(res, { msg: "Actu introuvable" });
137+
Error(res, { msg: "Actu introuvable" });
138138
}
139139

140140
// Supprimer l'ancienne image si une nouvelle est uploadée
@@ -151,7 +151,7 @@ export const updateNews = async (req: Request, res: Response) => {
151151
const updated = await news_service.updateNews(Number(id), updates);
152152

153153
Ok(res, { msg: "Actu mise à jour avec succès", data: updated });
154-
return;
154+
;
155155
} catch (err) {
156156
console.error(err);
157157
Error(res, { msg: "Erreur lors de la mise à jour de l'actu" });

backend/src/controllers/role.controller.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export const updateUserPreferences = async (req: Request, res: Response) => {
99
const { roleIds } = req.body;
1010

1111
if (!userId || !Array.isArray(roleIds)) {
12-
return Error(res, { msg: "Données invalides" });
12+
Error(res, { msg: "Données invalides" });
1313
}
1414

1515
await role_service.updateUserPreferences(userId, roleIds);
@@ -24,7 +24,7 @@ export const getUserPreferences = async (req: Request, res: Response) => {
2424
try {
2525
const userId = req.user?.userId;
2626

27-
if (!userId) return Error(res, { msg: "Utilisateur non authentifié" });
27+
if (!userId) Error(res, { msg: "Utilisateur non authentifié" });
2828

2929
const preferences = await role_service.getUserPreferences(userId);
3030
const roleIds = preferences.map((pref) => pref.roleId);
@@ -39,7 +39,7 @@ export const getUserPreferences = async (req: Request, res: Response) => {
3939
export const getUsersByRoleHandler = async (req: Request, res: Response) => {
4040
try {
4141
const { roleName } = req.params;
42-
if (!roleName) return Error(res, { msg: "Nom du rôle requis" });
42+
if (!roleName) Error(res, { msg: "Nom du rôle requis" });
4343

4444
const users = await role_service.getUsersByRoleName(roleName);
4545
Ok(res, { msg: "Utilisateurs récupérés", data: users });
@@ -55,7 +55,7 @@ export const addRoleToUser = async (req: Request, res: Response) => {
5555
const { userId, roleIds } = req.body;
5656

5757
if (!userId || !Array.isArray(roleIds)) {
58-
return Error(res, { msg: "userId et roleIds requis" });
58+
Error(res, { msg: "userId et roleIds requis" });
5959
}
6060

6161
for (const roleId of roleIds) {
@@ -78,7 +78,7 @@ export const deleteRoleToUser = async (req: Request, res: Response) => {
7878
const { userId, roleId } = req.body;
7979

8080
if (!userId || !roleId) {
81-
return Error(res, { msg: "userId et roleId requis" });
81+
Error(res, { msg: "userId et roleId requis" });
8282
}
8383

8484
await role_service.removeRoleFromUser(userId, roleId);
@@ -115,7 +115,7 @@ export const getRoles = async (req: Request, res: Response) => {
115115
export const getUserRoles = async (req: Request, res: Response) => {
116116
try {
117117
const { userId } = req.query;
118-
if (!userId) return Error(res, { msg: "userId requis" });
118+
if (!userId) Error(res, { msg: "userId requis" });
119119

120120
const roles = await role_service.getUserRoles(Number(userId));
121121
Ok(res, { data: roles });
@@ -135,7 +135,7 @@ export const addPointsToRole = async (req: Request, res: Response) => {
135135
const { roleId, points } = req.body;
136136

137137
if (!roleId || typeof points !== "number") {
138-
return Error(res, { msg: "roleId et points requis" });
138+
Error(res, { msg: "roleId et points requis" });
139139
}
140140

141141
await role_service.addPointsToRole(roleId, points);
@@ -152,7 +152,7 @@ export const removePointsFromRole = async (req: Request, res: Response) => {
152152
const { roleId, points } = req.body;
153153

154154
if (!roleId || typeof points !== "number") {
155-
return Error(res, { msg: "roleId et points requis" });
155+
Error(res, { msg: "roleId et points requis" });
156156
}
157157

158158
await role_service.removePointsFromRole(roleId, points);
@@ -178,10 +178,10 @@ export const getAllRolePoints = async (_req: Request, res: Response) => {
178178
export const getRolePoints = async (req: Request, res: Response) => {
179179
try {
180180
const { roleId } = req.params;
181-
if (!roleId) return Error(res, { msg: "roleId requis" });
181+
if (!roleId) Error(res, { msg: "roleId requis" });
182182

183183
const role = await role_service.getRolePoints(Number(roleId));
184-
if (!role) return Error(res, { msg: "Rôle introuvable" });
184+
if (!role) Error(res, { msg: "Rôle introuvable" });
185185

186186
Ok(res, { data: role });
187187
} catch (error) {

backend/src/controllers/tent.controller.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const createTent = async (req: Request, res: Response) => {
1010
const userId1 = req.user?.userId; // Créateur = utilisateur connecté
1111

1212
if (!userId1 || !userId2) {
13-
return Error(res, { msg: "Identifiants utilisateurs manquants." });
13+
Error(res, { msg: "Identifiants utilisateurs manquants." });
1414
}
1515

1616
try {
@@ -26,7 +26,7 @@ export const cancelTent = async (req: Request, res: Response) => {
2626
const userId1 = req.user?.userId;
2727

2828
if (!userId1) {
29-
return Error(res, { msg: "Identifiants utilisateurs manquants." });
29+
Error(res, { msg: "Identifiants utilisateurs manquants." });
3030
}
3131

3232
try {
@@ -39,7 +39,7 @@ export const cancelTent = async (req: Request, res: Response) => {
3939

4040
export const getUserTent = async (req: Request, res: Response) => {
4141
const userId = req.user?.userId;
42-
if (!userId) return Error(res, { msg: "Utilisateur non authentifié." });
42+
if (!userId) Error(res, { msg: "Utilisateur non authentifié." });
4343

4444
try {
4545
const tent = await tent_service.getTentByUser(userId);
@@ -63,7 +63,7 @@ export const toggleTentConfirmation = async (req: Request, res: Response) => {
6363
const { userId1, userId2, confirmed } = req.body;
6464

6565
if (!userId1 || !userId2 || typeof confirmed !== "boolean") {
66-
return Error(res, { msg: "Paramètres manquants ou invalides." });
66+
Error(res, { msg: "Paramètres manquants ou invalides." });
6767
}
6868

6969
try {
@@ -75,7 +75,7 @@ export const toggleTentConfirmation = async (req: Request, res: Response) => {
7575
const user2 = await getUserById(userId2);
7676

7777
if (!user1 || !user2) {
78-
return Error(res, { msg: "Impossible de récupérer les utilisateurs." });
78+
Error(res, { msg: "Impossible de récupérer les utilisateurs." });
7979
}
8080

8181
// Génération du contenu HTML
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE "bus_attribution" ADD COLUMN "departure_time" text NOT NULL;

0 commit comments

Comments
 (0)