Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions backend/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import emailRoutes from './src/routes/email.routes';
import newsRoutes from './src/routes/news.routes';
import discordRoutes from './src/routes/discord.routes';
import tentRoutes from './src/routes/tent.routes';
import busRoutes from './src/routes/bus.routes';
import { server_port } from './src/utils/secret';
import { initUser } from './src/database/initdb/initUser'
import { initRoles } from './src/database/initdb/initrole'
Expand Down Expand Up @@ -59,6 +60,7 @@ async function startServer() {
app.use('/api/news',authenticateUser, newsRoutes);
app.use('/api/discord',authenticateUser, discordRoutes);
app.use('/api/tent',authenticateUser, tentRoutes);
app.use('/api/bus',authenticateUser, busRoutes);
app.use("/api/uploads/imgnews", express.static(path.join(__dirname, "/uploads/imgnews")));
app.use("/api/uploads/foodmenu", express.static(path.join(__dirname, "/uploads/foodmenu")));
app.use("/api/uploads/plannings", express.static(path.join(__dirname, "/uploads/plannings")));
Expand Down
59 changes: 59 additions & 0 deletions backend/src/controllers/bus.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// src/controllers/bus.controller.ts
import { Request, Response } from "express";
import * as bus_service from "../services/bus.service";
import { sendEmail } from "../services/email.service";
import { Error, Ok } from "../utils/responses";
import { generateEmailHtml } from "./email.controller";

interface MulterRequest extends Request {
file?: Express.Multer.File;
}

export const sendBusAttributionEmails = async (req: Request, res: Response) => {
try {
const attributions = await bus_service.getAllBusAttributions();

if (!attributions.length) {
Error(res, { msg: "Aucune attribution de bus trouvée." });
return;
}

for (const attr of attributions) {
const htmlEmail = generateEmailHtml("templateAttributionBus", {
bus: attr.bus, time: attr.departure_time
});

const emailOptions = {
from: "integration@utt.fr",
to: [attr.email],
cc: [],
bcc: [],
subject: `Attribution Bus - ${attr.firstName ?? ""} ${attr.lastName ?? ""}`,
text: `Votre bus attribué est le numéro ${attr.bus}`,
html: htmlEmail || "",
};

await sendEmail(emailOptions);
}

Ok(res, { msg: "Emails d'attribution bus envoyés avec succès !" });
} catch (err) {
console.error(err);
Error(res, { msg: "Erreur lors de l'envoi des emails d'attribution bus." });
}
};

export const uploadbusCSV = async (req: MulterRequest, res: Response) => {
try {
const file = req.file;
if (!file) {
Error(res, { msg: "Fichier CSV manquant." });
}

await bus_service.importBusFromCSV(file.path);
Ok(res,{ msg: "Importation réalisée avec succès." });
} catch (error) {
console.error("Erreur import CSV :", error);
Error(res, { msg: "Échec de l'importation." });
}
};
10 changes: 5 additions & 5 deletions backend/src/controllers/news.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const createNews = async (req: Request, res: Response) => {
target,
image_url);
Ok(res, { msg: "Actu créée avec succès", data: news });
return;
;
} catch (err) {
console.error(err);
Error(res, { msg: "Erreur lors de la création de l'actu" });
Expand Down Expand Up @@ -81,7 +81,7 @@ export const publishNews = async (req: Request, res: Response) => {

if(recipients.length === 0){
Error(res, {msg : "No recipients"});
return

}

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

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

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

Ok(res, { msg: "Actu mise à jour avec succès", data: updated });
return;
;
} catch (err) {
console.error(err);
Error(res, { msg: "Erreur lors de la mise à jour de l'actu" });
Expand Down
20 changes: 10 additions & 10 deletions backend/src/controllers/role.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const updateUserPreferences = async (req: Request, res: Response) => {
const { roleIds } = req.body;

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

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

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

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

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

if (!userId || !Array.isArray(roleIds)) {
return Error(res, { msg: "userId et roleIds requis" });
Error(res, { msg: "userId et roleIds requis" });
}

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

if (!userId || !roleId) {
return Error(res, { msg: "userId et roleId requis" });
Error(res, { msg: "userId et roleId requis" });
}

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

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

if (!roleId || typeof points !== "number") {
return Error(res, { msg: "roleId et points requis" });
Error(res, { msg: "roleId et points requis" });
}

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

if (!roleId || typeof points !== "number") {
return Error(res, { msg: "roleId et points requis" });
Error(res, { msg: "roleId et points requis" });
}

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

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

Ok(res, { data: role });
} catch (error) {
Expand Down
10 changes: 5 additions & 5 deletions backend/src/controllers/tent.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const createTent = async (req: Request, res: Response) => {
const userId1 = req.user?.userId; // Créateur = utilisateur connecté

if (!userId1 || !userId2) {
return Error(res, { msg: "Identifiants utilisateurs manquants." });
Error(res, { msg: "Identifiants utilisateurs manquants." });
}

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

if (!userId1) {
return Error(res, { msg: "Identifiants utilisateurs manquants." });
Error(res, { msg: "Identifiants utilisateurs manquants." });
}

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

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

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

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

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

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

// Génération du contenu HTML
Expand Down
1 change: 1 addition & 0 deletions backend/src/database/migrations/0022_light_omega_red.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TABLE "bus_attribution" ADD COLUMN "departure_time" text NOT NULL;
Loading