DESKTOP-SMCIPAV\falko 5 месяцев назад
Родитель
Сommit
9fe6e961fc

+ 5 - 5
angular-client/angular.json

@@ -27,12 +27,12 @@
               "src/favicon.ico",
               "src/assets",
               "src/manifest.webmanifest",
-              "src/robots.txt",
-              "src/sitemap.xml"
+              "src/robots.txt",      
+              "src/sitemap.xml"      
             ],
             "styles": [
-              "node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
-              "node_modules/leaflet/dist/leaflet.css",
+              "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
+               "./node_modules/leaflet/dist/leaflet.css", 
               "src/styles.scss"
             ],
             "scripts": []
@@ -108,7 +108,7 @@
             "browserTarget": "fatboar:build:production",
             "serverTarget": "fatboar:server:production",
             "routes": [
-              "/",
+              "/",                   
               "/concours",
               "/menus",
               "/contact"

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
angular-client/dist/fatboar/browser/index.html


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
angular-client/dist/fatboar/browser/main-es2015.101b11336af2ad24c9d0.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
angular-client/dist/fatboar/browser/main-es5.101b11336af2ad24c9d0.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
angular-client/dist/fatboar/server/main.js


+ 97 - 34
angular-client/server.ts

@@ -4,25 +4,29 @@ import * as express from 'express';
 import { join } from 'path';
 import { AppServerModule } from './src/main.server';
 import { APP_BASE_HREF } from '@angular/common';
-import { existsSync, readFileSync } from 'fs';
+import { existsSync } from 'fs';
 
-// Simulation DOM (nécessaire pour certaines librairies côté serveur)
+// Pour simuler le DOM côté serveur (utile pour les librairies qui accèdent à window/document)
 const domino = require('domino');
+const fs = require('fs');
+const path = require('path');
+
+// Dossiers de build
 const distFolder = join(process.cwd(), 'dist/fatboar/browser');
 const indexHtml = existsSync(join(distFolder, 'index.html')) ? 'index.html' : 'index';
-const template = readFileSync(join(distFolder, indexHtml)).toString();
+const template = fs.readFileSync(join(distFolder, indexHtml)).toString();
 
-// Simuler un DOM global pour les libs (Leaflet, Material, etc.)
+// Simule le DOM pour SSR
 const win = domino.createWindow(template);
 global['window'] = win;
 global['document'] = win.document;
 global['navigator'] = win.navigator;
-global['CSS'] = null;
+global['CSS'] = null; // Certaines libs vérifient CSS
 
 export function app() {
   const server = express();
 
-  // Moteur de rendu Angular Universal
+  // Configure le moteur de rendu Angular Universal
   server.engine('html', ngExpressEngine({
     bootstrap: AppServerModule,
   }));
@@ -30,50 +34,31 @@ export function app() {
   server.set('view engine', 'html');
   server.set('views', distFolder);
 
-  // Fichiers statiques (CSS, JS, images…)
-  server.get('*.*', express.static(distFolder, { maxAge: '1y' }));
+  // Sert les fichiers statiques (assets, images, etc.)
+  server.get('*.*', express.static(distFolder, {
+    maxAge: '1y'
+  }));
 
-  // Routes SEO
+  // Sert sitemap.xml pour le SEO
   server.get('/sitemap.xml', (req, res) => {
     res.header('Content-Type', 'application/xml');
     res.sendFile(join(distFolder, 'sitemap.xml'));
   });
 
+  // Sert robots.txt pour le SEO
   server.get('/robots.txt', (req, res) => {
     res.sendFile(join(distFolder, 'robots.txt'));
   });
 
-  // Toutes les autres routes => rendu SSR
+  // Sert toutes les autres routes via Angular Universal
   server.get('*', (req, res) => {
     res.render(indexHtml, {
       req,
       providers: [
         { provide: APP_BASE_HREF, useValue: req.baseUrl },
+        // Fournit l'URL canonique pour les balises <link rel="canonical">
         { provide: 'CANONICAL_URL', useValue: `https://angular-dev.foodgame.fr${req.originalUrl}` }
       ]
-    }, (err, html) => {
-      if (err) {
-        console.error(err);
-        return res.status(500).send(err);
-      }
-
-      // Injection Preboot pour capturer les interactions avant bootstrap Angular
-      const prebootScript = `
-        <script src="https://unpkg.com/preboot"></script>
-        <script>preboot.init({ appRoot: 'app-root' });</script>
-      `;
-
-      // Injection des CSS directement dans le SSR pour éviter le flash
-      const styles = `
-        <link rel="stylesheet" href="styles.css">
-        <link rel="stylesheet" href="assets/theme.css">
-      `;
-
-      res.send(
-        html
-          .replace('</head>', `${styles}</head>`)
-          .replace('</body>', `${prebootScript}</body>`)
-      );
     });
   });
 
@@ -88,7 +73,7 @@ function run() {
   });
 }
 
-// Exécuter le serveur si lancé directement
+// Démarre le serveur si ce fichier est lancé directement
 declare const __non_webpack_require__: NodeRequire;
 const mainModule = __non_webpack_require__.main;
 const moduleFilename = mainModule && mainModule.filename || '';
@@ -97,3 +82,81 @@ if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
 }
 
 export * from './src/main.server';
+
+// import 'zone.js/dist/zone-node';
+// import { ngExpressEngine } from '@nguniversal/express-engine';
+// import * as express from 'express';
+// import { join } from 'path';
+// import { AppServerModule } from './src/main.server';
+// import { APP_BASE_HREF } from '@angular/common';
+// import { existsSync } from 'fs';
+
+// const domino = require('domino');
+// const fs = require('fs');
+// const path = require('path');
+
+// const distFolder = join(process.cwd(), 'dist/fatboar/browser');
+// const indexHtml = existsSync(join(distFolder, 'index.html')) ? 'index.html' : 'index';
+// const template = fs.readFileSync(join(distFolder, indexHtml)).toString();
+
+// const win = domino.createWindow(template);
+// global['window'] = win;
+// global['document'] = win.document;
+// global['navigator'] = win.navigator;
+// global['CSS'] = null;
+
+// export function app() {
+//   const server = express();
+
+//   server.engine('html', ngExpressEngine({
+//     bootstrap: AppServerModule,
+//   }));
+
+//   server.set('view engine', 'html');
+//   server.set('views', distFolder);
+
+//   // Fichiers statiques
+//   server.get('*.*', express.static(distFolder, {
+//     maxAge: '1y'
+//   }));
+
+//   // Routes SEO (déplacées depuis Express)
+//   server.get('/sitemap.xml', (req, res) => {
+//     res.header('Content-Type', 'application/xml');
+//     res.sendFile(join(distFolder, 'sitemap.xml'));
+//   });
+
+//   server.get('/robots.txt', (req, res) => {
+//     res.sendFile(join(distFolder, 'robots.txt'));
+//   });
+
+//   // Toutes les autres routes
+//   server.get('*', (req, res) => {
+//     res.render(indexHtml, {
+//       req,
+//       providers: [
+//         { provide: APP_BASE_HREF, useValue: req.baseUrl },
+//         { provide: 'CANONICAL_URL', useValue: `https://angular-dev.foodgame.fr${req.originalUrl}` }
+//       ]
+//     });
+//   });
+
+//   return server;
+// }
+
+// function run() {
+//   const port = process.env.PORT || 4000;
+//   const server = app();
+//   server.listen(port, () => {
+//     console.log(`Node Express server listening on http://localhost:${port}`);
+//   });
+// }
+
+// declare const __non_webpack_require__: NodeRequire;
+// const mainModule = __non_webpack_require__.main;
+// const moduleFilename = mainModule && mainModule.filename || '';
+// if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
+//   run();
+// }
+
+// export * from './src/main.server';

+ 3 - 9
angular-client/src/app/app.server.module.ts

@@ -1,7 +1,6 @@
 import { NgModule } from '@angular/core';
-import { ServerModule, ServerTransferStateModule } from '@angular/platform-server';
+import { ServerModule } from '@angular/platform-server';
 import { FlexLayoutServerModule } from '@angular/flex-layout/server';
-import { PrebootModule } from 'preboot';
 
 import { AppModule } from './app.module';
 import { AppComponent } from './app.component';
@@ -10,13 +9,8 @@ import { AppComponent } from './app.component';
   imports: [
     AppModule,
     ServerModule,
-    FlexLayoutServerModule,
-    ServerTransferStateModule, // transfère les styles et données pour éviter le flash
-    PrebootModule.withConfig({
-      appRoot: 'app-root',
-      replay: true
-    })
+    FlexLayoutServerModule
   ],
   bootstrap: [AppComponent]
 })
-export class AppServerModule {}
+export class AppServerModule {}

+ 33 - 199
angular-client/src/app/services/auth.service.ts

@@ -10,19 +10,40 @@ import { AlertMessageComponent } from 'src/app/components/shared/alert-message/a
 import { map, tap } from 'rxjs/operators';
 import * as jwt_decode from 'jwt-decode';
 import { isPlatformBrowser } from '@angular/common';
-import { StorageService } from 'src/app/services/storage.service'; // Assurez-vous de créer ce service
+import { StorageService } from 'src/app/services/storage.service';
 
 @Injectable({
   providedIn: 'root'
 })
 export class AuthService {
   private apiUrl = environment.apiUrl;
+
+  // Définir un utilisateur par défaut pour éviter les null
+  private defaultUser: User = {
+    _id: '',
+    firstname: '',
+    lastname: '',
+    email: '',
+    role: '',
+    googleId: '',
+    birthday: new Date(0),
+    phonenumber: 0,
+    adress: '',
+    isActive: false,
+    isGain: false,
+    register_date: new Date(0),
+    gains: []
+  };
+
   private currentUserSubject: BehaviorSubject<User> = new BehaviorSubject<User>(null);
   public currentUser: Observable<User> = this.currentUserSubject.asObservable();
+
   private tokenSubject: BehaviorSubject<Token>;
   public token: Observable<Token>;
+
   private user_infoSubject: BehaviorSubject<User>;
   public user_info: Observable<User>;
+
   private messageSource = new BehaviorSubject('default message');
   currentMessage = this.messageSource.asObservable();
 
@@ -33,9 +54,14 @@ export class AuthService {
     private storageService: StorageService,
     @Inject(PLATFORM_ID) private platformId: Object
   ) {
-    this.tokenSubject = new BehaviorSubject<Token>(JSON.parse(this.storageService.getItem('token')));
+    this.tokenSubject = new BehaviorSubject<Token>(
+      JSON.parse(this.storageService.getItem('token'))
+    );
     this.token = this.tokenSubject.asObservable();
-    this.user_infoSubject = new BehaviorSubject<User>(JSON.parse(this.storageService.getItem('user')));
+
+    // Utiliser defaultUser si rien en storage
+    const storedUser = JSON.parse(this.storageService.getItem('user'));
+    this.user_infoSubject = new BehaviorSubject<User>(storedUser || this.defaultUser);
     this.user_info = this.user_infoSubject.asObservable();
   }
 
@@ -63,8 +89,8 @@ export class AuthService {
   signInWithGoogle(): Observable<User> {
     return this.http.get<User>(`${this.apiUrl}/api/auth/google`).pipe(
       map(user => {
-        console.log('je suis present', user);
         this.storageService.setItem('user', JSON.stringify(user));
+        this.user_infoSubject.next(user);
         return user;
       })
     );
@@ -112,7 +138,7 @@ export class AuthService {
     this.storageService.removeItem('token');
     this.tokenSubject.next(null);
     this.storageService.removeItem('user');
-    this.user_infoSubject.next(null);
+    this.user_infoSubject.next(this.defaultUser); // Mettre un user vide
     this.router.navigate(['/login']);
     if (isPlatformBrowser(this.platformId)) {
       setTimeout(() => {
@@ -122,12 +148,12 @@ export class AuthService {
   }
 
   getUserInfo(): Observable<User> {
-    let decodedToken: payloadToken = jwt_decode(this.tokenSubject.value.token); 
+    let decodedToken: payloadToken = jwt_decode(this.tokenSubject.value.token);
     return this.http.get<User>(`https://api-preprod.foodgame.fr/api/users/${decodedToken.userId}`)
       .pipe(map(user => {
         this.storageService.setItem('user', JSON.stringify(user));
         this.user_infoSubject.next(user);
-        return user; 
+        return user;
       }));
   }
 
@@ -139,195 +165,3 @@ export class AuthService {
     });
   }
 }
-
-
-// import { environment } from 'src/environments/environment';
-// import { User } from './../models/userResponse';
-// import { Token, payloadToken } from './../models/token';
-// import { Injectable } from '@angular/core';
-// import { HttpClient, HttpHeaders } from '@angular/common/http';
-// import { BehaviorSubject, Observable, throwError } from 'rxjs';
-// import { Router } from '@angular/router';
-// import { MatSnackBar } from '@angular/material/snack-bar';
-// import { AlertMessageComponent } from 'src/app/components/shared/alert-message/alert-message.component'
-// import { catchError, map, tap } from 'rxjs/operators';
-// import * as jwt_decode from 'jwt-decode';
-
-
-
-// @Injectable({
-//   providedIn: 'root'
-// })
-// export class AuthService {
-
-//   //url api
-//   private apiUrl = environment.apiUrl
-
-//   private currentUserSubject: BehaviorSubject<User> = new BehaviorSubject<User>(null);
-//   public currentUser: Observable<User> = this.currentUserSubject.asObservable();
-
-  
-
-
-//   private tokenSubject: BehaviorSubject<Token>;
-//   public token: Observable<Token>;
-
-//   private user_infoSubject: BehaviorSubject<User>;
-//   public user_info: Observable<User>;
-
-//   private messageSource = new BehaviorSubject('default message');
-//   currentMessage = this.messageSource.asObservable();
-
-//   constructor(private http: HttpClient, public router: Router, public snackBar: MatSnackBar) {
-
-//     this.tokenSubject = new BehaviorSubject<Token>(JSON.parse(localStorage.getItem('token')));
-//     this.token = this.tokenSubject.asObservable();
-
-//     this.user_infoSubject = new BehaviorSubject<User>(JSON.parse(localStorage.getItem('user')));
-//     this.user_info = this.user_infoSubject.asObservable();
-    
-//   }
-
-//   changeMessage(message: string) {
-//     this.messageSource.next(message)
-//   }
-
-//   //get token
-//   public get tokenValue(): Token {
-//     return this.tokenSubject.value;
-//   }
-
-//   //get user Info
-//   public get userValue(): User {
-//     return this.user_infoSubject.value;
-//   }
-
-//   // login get  token on login 
-//   signIn(credentials): Observable<Token> {
-//      //debugger;
-//     console.log("url ========",this.apiUrl);
-
-//     return this.http.post<Token>(`${this.apiUrl}/api/auth/login`, credentials)
-//       .pipe(map(token => {
-//         // store jwt token in local storage 
-//         localStorage.setItem('token', JSON.stringify(token));
-//         this.tokenSubject.next(token);
-//         return token;
-//       }));
-//   }
-
-
-//   // Méthode pour s'authentifier avec Google
-//   signInWithGoogle(): Observable<User> {
-//     return this.http.get<User>(`${this.apiUrl}/api/auth/google`).pipe(
-//       map(user => {
-//         console.log('je suis present', user )
-//         localStorage.setItem('user', JSON.stringify(user));
-//         return user;
-//       })
-//     );
-//   }
-  
-//   // signInWithGoogle(): Observable<string> {
-//   //   return this.http.get<any>(`${this.apiUrl}/api/auth/google/callback`).pipe(
-//   //     map(response => response.token),
-//   //     catchError(error => {
-//   //       console.log(error);
-//   //       // Gérer l'erreur
-//   //       throw error;
-//   //     })
-//   //   );
-//   // }
-//     // login get  token on login admin
-//     signInAdmin(credentials): Observable<Token> {
-//        //debugger;
-//       console.log("url ========",this.apiUrl);
-  
-//       return this.http.post<Token>(`${this.apiUrl}/api/auth/admin`, credentials)
-//         .pipe(map(token => {
-//           // store jwt token in local storage 
-//           localStorage.setItem('token', JSON.stringify(token));
-//           this.tokenSubject.next(token);
-//           return token;
-//         }));
-//     }
-
-
-
-//   // iscription get  token on login 
-//   signUP(data): Observable<Token> {
-
-//     return this.http.post<Token>(`${this.apiUrl}/api/auth/signup`, data)
-//       .pipe(map(token => {
-//         // store jwt token in local storage 
-//         localStorage.setItem('token', JSON.stringify(token));
-//         this.tokenSubject.next(token);
-//         return token;
-//       }));
-//   }
-
-
-
-// // mot de passe oublie 
-// lostPassword(email): Observable<any> {
-//   return this.http.put<any>(`${this.apiUrl}/api/auth/forgot-password`, email)
-// }
-
-
-// // réinitialiser mot de passe  
-// resetPassword(data): Observable<any> {
-//   return this.http.put<any>(`${this.apiUrl}/api/auth/reset-password`, data)
-// }
-
-//   // isLoggedIn
-//   public isLoggedIn() {
-//     return localStorage.getItem('token') !== null;
-//   }
-
-//   getCurrentUser(): Observable<User> {
-//     return this.http.get<User>('/api/auth/user').pipe(
-//       tap((user) => {
-//         this.currentUserSubject.next(user);
-//       })
-//     );
-//   }
-
-//   //logout
-//   public logout() {
-//     // remove token from local storage 
-//     localStorage.removeItem('token');
-//     this.tokenSubject.next(null);
-//     // remove user from local storage 
-//     localStorage.removeItem('user');
-//     this.user_infoSubject.next(null);
-//     this.router.navigate(['/login']);
-//     setTimeout(() => {
-//       document.location.reload()
-//     },1000)
-//   }
-
-//    // 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, {
-//       data: message,
-//       panelClass: ['blue-snackbar'],
-//       duration: 10000
-//     });
-//   }
-
-
-// }