Initialisation du backend de Thé Tip Top

This commit is contained in:
2026-06-03 17:36:02 +02:00
commit 8d5f73fc9c
28 changed files with 4125 additions and 0 deletions

114
src/routes/admin.routes.js Normal file
View File

@@ -0,0 +1,114 @@
const express = require("express");
const {
getStats,
getUsers,
getEmailingContacts,
createEmployee,
drawWinner,
getGrandPrizeWinner,
} = require("../controllers/admin.controller");
const authMiddleware = require("../middlewares/auth.middleware");
const roleMiddleware = require("../middlewares/role.middleware");
const validate = require("../middlewares/validate.middleware");
const { createEmployeeSchema } = require("../validations/admin.validation");
const router = express.Router();
router.use(authMiddleware);
router.use(roleMiddleware("ADMIN"));
/**
* @swagger
* /api/admin/stats:
* get:
* summary: Tableau de bord administrateur
* tags:
* - Admin
* security:
* - bearerAuth: []
* responses:
* 200:
* description: Statistiques du jeu concours
*/
router.get("/stats", getStats);
/**
* @swagger
* /api/admin/users:
* get:
* summary: Liste des clients inscrits
* tags:
* - Admin
* security:
* - bearerAuth: []
* responses:
* 200:
* description: Liste des utilisateurs clients
*/
router.get("/users", getUsers);
/**
* @swagger
* /api/admin/emailing:
* get:
* summary: Liste des contacts ayant accepté l'emailing
* tags:
* - Admin
* security:
* - bearerAuth: []
* responses:
* 200:
* description: Contacts marketing opt-in
*/
router.get("/emailing", getEmailingContacts);
/**
* @swagger
* /api/admin/employees:
* post:
* summary: Création d'un employé
* tags:
* - Admin
* security:
* - bearerAuth: []
* responses:
* 201:
* description: Employé créé
*/
router.post("/employees", validate(createEmployeeSchema), createEmployee);
/**
* @swagger
* /api/admin/draw:
* post:
* summary: Tirage au sort du grand gagnant
* tags:
* - Admin
* security:
* - bearerAuth: []
* responses:
* 200:
* description: Gagnant tiré au sort
*/
router.post("/draw", drawWinner);
/**
* @swagger
* /api/admin/draw:
* get:
* summary: Consulter le gagnant du gros lot
* tags:
* - Admin
* security:
* - bearerAuth: []
* responses:
* 200:
* description: Gagnant du gros lot
* 404:
* description: Aucun gagnant encore tiré
*/
router.get("/draw", getGrandPrizeWinner);
module.exports = router;

69
src/routes/auth.routes.js Normal file
View File

@@ -0,0 +1,69 @@
const express = require("express");
const { register, login, me } = require("../controllers/auth.controller");
const authMiddleware = require("../middlewares/auth.middleware");
const validate = require("../middlewares/validate.middleware");
const { registerSchema, loginSchema } = require("../validations/auth.validation");
const router = express.Router();
/**
* @swagger
* /api/auth/register:
* post:
* summary: Inscription d'un utilisateur
* tags:
* - Auth
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* properties:
* firstname:
* type: string
* lastname:
* type: string
* email:
* type: string
* password:
* type: string
* responses:
* 201:
* description: Utilisateur créé
*/
router.post("/register", validate(registerSchema), register);
/**
* @swagger
* /api/auth/login:
* post:
* summary: Connexion utilisateur
* tags:
* - Auth
* requestBody:
* required: true
* responses:
* 200:
* description: Connexion réussie
*/
router.post("/login", validate(loginSchema), login);
/**
* @swagger
* /api/auth/me:
* get:
* summary: Informations de l'utilisateur connecté
* tags:
* - Auth
* security:
* - bearerAuth: []
* responses:
* 200:
* description: Profil utilisateur
*/
router.get("/me", authMiddleware, me);
module.exports = router;

View File

@@ -0,0 +1,76 @@
const express = require("express");
const {
getGainByTicketCode,
deliverClaim,
} = require("../controllers/employee.controller");
const authMiddleware = require("../middlewares/auth.middleware");
const roleMiddleware = require("../middlewares/role.middleware");
const router = express.Router();
/**
* @swagger
* /api/employee/ticket/{code}:
* get:
* summary: Rechercher le gain associé à un ticket
* tags:
* - Employee
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: code
* required: true
* schema:
* type: string
* description: Code du ticket à 10 caractères
* responses:
* 200:
* description: Gain trouvé
* 400:
* description: Ticket non encore utilisé par un client
* 404:
* description: Ticket introuvable
*/
router.get(
"/ticket/:code",
authMiddleware,
roleMiddleware("EMPLOYEE", "ADMIN"),
getGainByTicketCode
);
/**
* @swagger
* /api/employee/claim/{id}/deliver:
* patch:
* summary: Marquer un lot comme remis en boutique
* tags:
* - Employee
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: integer
* description: ID de la réclamation
* responses:
* 200:
* description: Lot remis avec succès
* 400:
* description: Gain expiré ou non valide
* 404:
* description: Réclamation introuvable
* 409:
* description: Lot déjà remis
*/
router.patch(
"/claim/:id/deliver",
authMiddleware,
roleMiddleware("EMPLOYEE", "ADMIN"),
deliverClaim
);
module.exports = router;

41
src/routes/game.routes.js Normal file
View File

@@ -0,0 +1,41 @@
const express = require("express");
const { participate, myGains } = require("../controllers/game.controller");
const authMiddleware = require("../middlewares/auth.middleware");
const validate = require("../middlewares/validate.middleware");
const { participateSchema } = require("../validations/game.validation");
const router = express.Router();
/**
* @swagger
* /api/game/participate:
* post:
* summary: Participer au jeu concours
* tags:
* - Game
* security:
* - bearerAuth: []
* responses:
* 201:
* description: Participation enregistrée
*/
router.post("/participate", authMiddleware, validate(participateSchema), participate);
/**
* @swagger
* /api/game/my-gains:
* get:
* summary: Historique des gains du participant
* tags:
* - Game
* security:
* - bearerAuth: []
* responses:
* 200:
* description: Liste des gains
*/
router.get("/my-gains", authMiddleware, myGains);
module.exports = router;