formation 1 anno fa
parent
commit
56fcf05386

+ 1 - 6
Jenkinsfile

@@ -1,4 +1,4 @@
-node {
+
 node {
     env.NODEJS_HOME = "${tool 'NodeJS'}"
     // on linux / mac
@@ -12,11 +12,6 @@ node {
         checkout scm
     }
      
-    stage('Stop Containers') {
-    stage('checkout') {
-        deleteDir()
-        checkout scm
-    }
      
     stage('Stop Containers') {
         sh 'docker ps | grep "workflow_" -v | awk -F " " \'{ if(NR>1) print $1}\' |xargs docker kill |xargs docker rm || true'

+ 1 - 8
angular-client/src/app/components/auth/gain/gain-list/gain-list.component.html

@@ -1,13 +1,8 @@
- <!-- table of users -->
-
-
-
+<!-- table of users -->
 
     <table *ngIf="lots" mat-table  [dataSource]="lots" class="tablegain">
 
 
-
-      <!-- *ngIf="lots" -->
       <!-- index -->
       <ng-container matColumnDef="index">
         <th mat-header-cell *matHeaderCellDef> Numéro </th>
@@ -58,5 +53,3 @@
       (page)="handlePage($event)">
     </mat-paginator> -->
 
-
-

+ 6 - 4
angular-client/src/app/components/auth/gain/gain-list/gain-list.component.ts

@@ -11,6 +11,10 @@ export class GainListComponent implements OnInit  {
 
   constructor() { }
 
+  ngOnInit() {
+    this.dataSource.data = this.lots;
+  }
+
   @Input() lots : Ticket[]=[];
 
 
@@ -29,9 +33,7 @@ export class GainListComponent implements OnInit  {
     // })
   
   }
-   ngOnInit() {
-    this.dataSource.data = this.lots;
-  }
+   
   
   
-}
+}

+ 68 - 36
angular-client/src/app/components/auth/gain/gain.component.ts

@@ -8,52 +8,84 @@ import { ActivatedRoute } from '@angular/router';
 @Component({
   selector: 'app-gain',
   templateUrl: './gain.component.html',
-  styleUrls: ['./gain.component.scss']
+  styleUrls: ['./gain.component.scss'],
 })
 export class GainComponent implements OnInit {
+  token: string; // JWT token extrait de l'URL
+  @Input() lots: Ticket[] = []; // Liste des gains
+  user: User; // Informations utilisateur
 
-  token: string;
-
-  constructor(private authService : AuthService, private route: ActivatedRoute,  private userService : UsersService)
-   { }
-
-  //  @Input() lots;
-   @Input() lots:Ticket[];
-  user : User;
+  constructor(
+    private authService: AuthService,
+    private route: ActivatedRoute,
+    private userService: UsersService
+  ) {}
 
   ngOnInit(): void {
-     this.getInfoUser()
-     // Récupérer le token JWT de l'URL
-     this.route.queryParams.subscribe(params => {
-      this.token = params['token'];
-  });
+    // Charger les informations utilisateur et initialiser les gains
+    this.getInfoUser();
 
+    // Extraire le token JWT depuis les paramètres de l'URL
+    this.route.queryParams.subscribe((params) => {
+      this.token = params['token'];
+    });
   }
 
-  getInfoUser(){
-     this.authService.getUserInfo().subscribe( (user) =>{ this.user = user, this.lots = user.gains})
+  /**
+   * Récupère les informations utilisateur depuis l'API AuthService
+   */
+  getInfoUser(): void {
+    this.authService.getUserInfo().subscribe(
+      (user) => {
+        this.user = user;
+        this.lots = user.gains || []; // Initialiser les gains à partir des données utilisateur
+      },
+      (err) => {
+        console.error('Erreur lors de la récupération des informations utilisateur :', err);
+        this.authService.openSnackBar('Impossible de charger les informations utilisateur.');
+      }
+    );
   }
 
-
-  receiveCode($event : Ticket){
-    let id = this.authService.userValue._id
-    this.userService.verifyLotUser(id, $event).subscribe( (res) => {
-      if(res) {
-      this.lots = [];
-      this.lots.push(res);
+  /**
+   * Vérifie un gain et met à jour la liste des gains
+   * @param $event Ticket - Le ticket à vérifier
+   */
+  receiveCode($event: Ticket): void {
+    const userId = this.authService.userValue._id; // ID utilisateur récupéré depuis AuthService
+  
+    // Vérifier le ticket avec l'API UsersService
+    this.userService.verifyLotUser(userId, $event).subscribe(
+      (res) => {
+        if (res) {
+          // Ajouter le ticket vérifié à la liste locale
+          this.lots = [...this.lots, res];
+  
+          // Mettre à jour les gains côté serveur
+          this.userService.updateUserGains(userId, this.lots).subscribe(
+            () => {
+              console.log('Gains sauvegardés avec succès dans le backend.');
+              this.authService.openSnackBar('Gain ajouté avec succès !');
+  
+              // Recharger les informations utilisateur pour s'assurer que les gains sont à jour
+              this.getInfoUser();
+            },
+            (err) => {
+              console.error('Erreur lors de la sauvegarde des gains :', err);
+              this.authService.openSnackBar(
+                `Erreur lors de la sauvegarde des gains : ${err.error?.message || 'Erreur inconnue.'}`
+              );
+            }
+          );
+        }
+      },
+      (err) => {
+        console.error('Erreur lors de la vérification du ticket :', err);
+        this.authService.openSnackBar(err.error?.message || 'Erreur lors de la vérification du ticket.');
       }
-    },
-
-    err => {
-      console.log(err.error.message)
-      this.authService.openSnackBar(err.error.message)
+    );
+  
+    console.log('Liste des gains après ajout :', this.lots);
   }
-      ); 
-       console.log(' Retour de la requete',this.lots)
-  }
-
-
-
-
-
+  
 }

+ 12 - 25
angular-client/src/app/services/auth.service.ts

@@ -163,33 +163,20 @@ resetPassword(data): Observable<any> {
     },1000)
   }
 
-  getUserInfo(): Observable<User> {
-    let token = this.tokenSubject.value.token;
-    if (token) {
-      // User is authenticated locally
-      let decodedToken: payloadToken = jwt_decode(token);
-      return this.http.get<User>(`${this.apiUrl}/api/users/${decodedToken.userId}`).pipe(
-        map(user => {
-          // Store user info in local storage
-          localStorage.setItem('user', JSON.stringify(user));
-          this.user_infoSubject.next(user);
-          return user;
-        })
-      );
-    } else {
-      // User is authenticated via Google
-      return this.http.get<User>(`${this.apiUrl}/api/auth/google`).pipe(
-        map(user => {
-          // Store user info in local storage
-          localStorage.setItem('user', JSON.stringify(user));
-          this.user_infoSubject.next(user);
-          return user;
-        })
-      );
-    }
+   // get info user 
+   getUserInfo(): Observable<User> {
+    
+    let decodedToken : payloadToken = jwt_decode(this.tokenSubject.value.token); 
+    return this.http.get<User>(`${this.apiUrl}/api/users/${decodedToken.userId}`)
+      .pipe(map(user => {
+        // store user info in local storage 
+        localStorage.setItem('user', JSON.stringify(user));
+        this.user_infoSubject.next(user);
+        return user; 
+      }));
+    
   }
   
-  
 
   openSnackBar(message: string) {
     this.snackBar.openFromComponent(AlertMessageComponent, {

+ 1 - 1
angular-client/src/app/services/statistic.service.ts

@@ -28,7 +28,7 @@ private headers = new HttpHeaders(
 getStatistic(): Observable<StatisticResponse> {
 //  return this.http.get<StatisticResponse>('assets/data/stat.json');
 const options = { headers: this.headers};
- let data = this.http.get<StatisticResponse>('https://api-prod.foodgame.fr/api/tickets/stats',options);
+ let data = this.http.get<StatisticResponse>(`${this.apiUrl}/api/tickets/stats`,options);
  console.log(JSON.stringify(data));
  return data;
  

+ 5 - 0
angular-client/src/app/services/users.service.ts

@@ -51,6 +51,11 @@ verifyLotUser(id:string, code: Ticket): Observable <Ticket> {
   
 }
 
+updateUserGains(userId: string, gains: Ticket[]) {
+  return this.http.put(`${this.apiUrl}/api/users/${userId}/gains`, { gains });
+}
+
+
 
 }
 

+ 55 - 47
express-server/controllers/gain.js

@@ -4,52 +4,60 @@ const { User } = require('../models/user.model');
 
 
 //consulter les gains
-exports.gain = async (req, res, next) => {
-
+exports.gain = async (req, res) => {
     try {
-        
-        // génère une exception
-        if (!req.query.id) { throw new Error(`Identifiant utilisateur introuvable`) }
-        if (!req.body.code) { throw new Error(`Code introuvable`) }
-        if (isNaN(req.body.code)) { throw new Error(`Votre code n'est pas un chiffre`) }
-        if (req.body.code.toString().length != 10) { throw new Error(`Votre code est différent de 10 chiffres`) }
-
-        
-        User.findById(req.query.id)
-            .then((user) => {
-
-                Ticket.findOne({ code: req.body.code })
-                      .then((ticket) => {
-                        
-                        if (ticket) {
-                            if (ticket.isUsed === false) {
-
-                                ticket.isUsed = true;
-                                ticket.date_used = new Date();
-                                res.send(ticket);
-                                
-
-                                ticket.save()
-                                      .then((ticket) => {
-                                        user.isGain = true;
-                                        // user.gains.push(ticket);
-                                        user.save()
-                                            .then(() => res.status(200).send(ticket))
-                                            .catch(() => res.status(500).json({ success: false, message: `Erreur dans le serveur` }))
-                                    })
-                                      .catch(() => res.status(500).json({ success: false, message: `Erreur dans le serveur` }))
-
-                            } else { res.status(400).json({ success: false, message: `Le code a déjà été utilisé` }) }
-                        } else { res.status(400).json({ success: false, message: `Le code est erroné` }) }
-
-                    })
-                       .catch(() => res.status(500).json({ success: false, message: `Erreur dans le serveur` }));
-                       return;
-
-            })
-            .catch(() => res.status(404).json({ success: false, message: `Utilisateur non trouvé` }))
-
+      // Vérifications initiales
+      const userId = req.query.id;
+      const ticketCode = req.body.code;
+  
+      if (!userId) {
+        return res.status(400).json({ success: false, message: `Identifiant utilisateur introuvable` });
+      }
+  
+      if (!ticketCode) {
+        return res.status(400).json({ success: false, message: `Code introuvable` });
+      }
+  
+      if (isNaN(ticketCode)) {
+        return res.status(400).json({ success: false, message: `Votre code n'est pas un chiffre` });
+      }
+  
+      if (ticketCode.toString().length !== 10) {
+        return res.status(400).json({ success: false, message: `Votre code est différent de 10 chiffres` });
+      }
+  
+      // Récupérer l'utilisateur
+      const user = await User.findById(userId);
+      if (!user) {
+        return res.status(404).json({ success: false, message: `Utilisateur non trouvé` });
+      }
+  
+      // Vérifier l'existence du ticket
+      const ticket = await Ticket.findOne({ code: ticketCode });
+      if (!ticket) {
+        return res.status(400).json({ success: false, message: `Le code est erroné` });
+      }
+  
+      // Vérifier si le ticket a déjà été utilisé
+      if (ticket.isUsed) {
+        return res.status(400).json({ success: false, message: `Le code a déjà été utilisé` });
+      }
+  
+      // Mettre à jour le ticket
+      ticket.isUsed = true;
+      ticket.date_used = new Date();
+      await ticket.save();
+  
+      // Ajouter le ticket à l'utilisateur et sauvegarder
+      user.isGain = true;
+      user.gains.push(ticket);
+      await user.save();
+  
+      // Répondre avec le ticket mis à jour
+      return res.status(200).json({ success: true, ticket });
+    } catch (err) {
+      console.error('Erreur dans le traitement du gain :', err.message);
+      return res.status(500).json({ success: false, message: `Erreur dans le serveur` });
     }
-    catch (err) { res.status(400).json({ success: false, message: err.message }) }
-    
-};
+  };
+