From 9aff13a830f41bd1bb55053587e84ee798242882 Mon Sep 17 00:00:00 2001 From: dahoud Date: Mon, 6 Oct 2025 18:45:43 +0000 Subject: [PATCH] Initial commit: GBCM Client Quarkus implementation with PrimeFaces and Freya theme --- .gitignore | 105 ++++++++++ README.md | 144 +++++++++++++ pom.xml | 156 ++++++++++++++ .../com/gbcm/client/beans/auth/AuthBean.java | 195 ++++++++++++++++++ src/main/resources/application.properties | 47 +++++ src/main/webapp/WEB-INF/web.xml | 87 ++++++++ src/main/webapp/templates/layout.xhtml | 135 ++++++++++++ 7 files changed, 869 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/com/gbcm/client/beans/auth/AuthBean.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/templates/layout.xhtml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97054db --- /dev/null +++ b/.gitignore @@ -0,0 +1,105 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar + +# Gradle +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +# IntelliJ IDEA +.idea/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +# Eclipse +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +# NetBeans +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +# VS Code +.vscode/ + +# Mac +.DS_Store + +# Windows +Thumbs.db +ehthumbs.db +Desktop.ini + +# Quarkus +.quarkus/ + +# Node modules (si utilisé pour le build frontend) +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Logs +logs +*.log + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Temporary files +*.tmp +*.temp diff --git a/README.md b/README.md new file mode 100644 index 0000000..702f503 --- /dev/null +++ b/README.md @@ -0,0 +1,144 @@ +# GBCM Client Implementation - Quarkus + +Interface web pour la plateforme GBCM (Global Business Consulting and Management) développée avec Quarkus et PrimeFaces. + +## Description + +Ce module contient l'interface utilisateur web de la plateforme GBCM, permettant aux utilisateurs d'accéder aux services de consulting, coaching et gestion des ateliers. + +## Technologies + +- **Quarkus 3.6.0** - Framework Java moderne +- **PrimeFaces 13.0.0** - Composants JSF +- **Jakarta Faces 4.0** - Framework web +- **Freya Theme 5.0.0** - Thème PrimeFaces +- **Maven** - Gestion des dépendances + +## Prérequis + +- Java 17 ou supérieur +- Maven 3.8+ +- PostgreSQL 13+ (production) + +## Installation + +1. Cloner le repository +```bash +git clone https://git.lions.dev/gbcm/gbcm-client-impl-quarkus.git +cd gbcm-client-impl-quarkus +``` + +2. Installer les dépendances +```bash +mvn clean install +``` + +3. Configuration +Copier `application.properties.example` vers `application.properties` et configurer : +- URL du serveur API GBCM +- Base de données +- Paramètres de sécurité + +## Développement + +### Démarrage en mode développement +```bash +mvn quarkus:dev +``` + +L'application sera accessible sur http://localhost:8080/gbcm + +### Build de production +```bash +mvn clean package -Pnative +``` + +## Structure du projet + +``` +src/ +├── main/ +│ ├── java/com/gbcm/client/ +│ │ ├── beans/ # Managed Beans JSF +│ │ ├── converters/ # Convertisseurs +│ │ ├── validators/ # Validateurs +│ │ └── config/ # Configuration +│ ├── resources/ +│ │ ├── META-INF/resources/ # Ressources web +│ │ └── application.properties +│ └── webapp/ +│ ├── templates/ # Templates PrimeFaces +│ ├── pages/ # Pages JSF +│ └── WEB-INF/ +└── test/ # Tests unitaires +``` + +## Fonctionnalités + +### Authentification +- Connexion/déconnexion sécurisée +- Gestion des rôles (Admin, Coach, Client) +- Réinitialisation de mot de passe + +### Dashboard +- Tableaux de bord personnalisés par rôle +- Métriques et KPIs +- Notifications en temps réel + +### Gestion des Services +- Programmes Strategic Workshops +- Sessions de coaching individuel +- Coaching à la demande +- Projets spéciaux + +### Administration +- Gestion des utilisateurs +- Configuration système +- Rapports et analytics + +## API Integration + +Ce client communique avec l'API GBCM via REST : +- Base URL configurée dans `application.properties` +- Authentification JWT +- Gestion automatique des tokens + +## Tests + +```bash +# Tests unitaires +mvn test + +# Tests d'intégration +mvn verify +``` + +## Déploiement + +### Docker +```bash +docker build -t gbcm-client . +docker run -p 8080:8080 gbcm-client +``` + +### Production +1. Build de l'application +2. Configuration des variables d'environnement +3. Déploiement sur serveur d'application + +## Configuration + +### Variables d'environnement principales +- `GBCM_SERVER_API_URL` - URL de l'API serveur +- `DATABASE_URL` - URL de la base de données +- `JWT_SECRET` - Secret pour les tokens JWT + +## Support + +Pour toute question ou problème : +- Email: support@gbcm.com +- Documentation: https://docs.gbcm.com + +## Licence + +Propriétaire - GBCM LLC © 2024 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c10cde2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,156 @@ + + + 4.0.0 + + com.gbcm + gbcm-client-impl-quarkus + 1.0.0-SNAPSHOT + war + + GBCM Client Implementation - Quarkus + Interface web GBCM avec Quarkus et PrimeFaces + + + 17 + 17 + UTF-8 + + + 3.6.0 + 13.0.0 + 5.0.0 + 4.0.1 + + + + + + io.quarkus + quarkus-bom + ${quarkus.version} + pom + import + + + + + + + + io.quarkus + quarkus-undertow + + + io.quarkus + quarkus-rest-client-reactive-jackson + + + io.quarkus + quarkus-security + + + io.quarkus + quarkus-oidc + + + + + org.apache.myfaces.core + myfaces-impl + 4.0.1 + + + org.apache.myfaces.core + myfaces-api + 4.0.1 + + + + + org.primefaces + primefaces + ${primefaces.version} + jakarta + + + + + org.primefaces + freya + ${freya.version} + jakarta + + + + + io.quarkus + quarkus-arc + + + + + io.quarkus + quarkus-hibernate-validator + + + + + io.quarkus + quarkus-jackson + + + + + com.gbcm + gbcm-server-api + 1.0.0-SNAPSHOT + + + + + io.quarkus + quarkus-junit5 + test + + + + + + + io.quarkus + quarkus-maven-plugin + ${quarkus.version} + + + + build + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + false + + + + + + + + prime-repo + PrimeFaces Maven Repository + https://repository.primefaces.org + + + diff --git a/src/main/java/com/gbcm/client/beans/auth/AuthBean.java b/src/main/java/com/gbcm/client/beans/auth/AuthBean.java new file mode 100644 index 0000000..469d32c --- /dev/null +++ b/src/main/java/com/gbcm/client/beans/auth/AuthBean.java @@ -0,0 +1,195 @@ +package com.gbcm.client.beans.auth; + +import com.gbcm.client.service.GBCMServerClient; +import com.gbcm.server.api.dto.UserDTO; +import com.gbcm.server.api.dto.LoginRequestDTO; +import com.gbcm.server.api.dto.LoginResponseDTO; + +import jakarta.enterprise.context.SessionScoped; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import java.io.Serializable; + +/** + * Managed Bean pour la gestion de l'authentification + */ +@Named("authBean") +@SessionScoped +public class AuthBean implements Serializable { + + private static final long serialVersionUID = 1L; + + @Inject + private GBCMServerClient serverClient; + + // Propriétés de connexion + private String email; + private String password; + private boolean rememberMe; + + // Utilisateur connecté + private UserDTO currentUser; + private String authToken; + private boolean authenticated = false; + + /** + * Tentative de connexion + */ + public String login() { + try { + LoginRequestDTO loginRequest = new LoginRequestDTO(); + loginRequest.setEmail(email); + loginRequest.setPassword(password); + loginRequest.setRememberMe(rememberMe); + + LoginResponseDTO response = serverClient.login(loginRequest); + + if (response.isSuccess()) { + this.currentUser = response.getUser(); + this.authToken = response.getToken(); + this.authenticated = true; + + // Message de succès + FacesContext.getCurrentInstance().addMessage(null, + new FacesMessage(FacesMessage.SEVERITY_INFO, + "Connexion réussie", + "Bienvenue " + currentUser.getFirstName())); + + // Redirection selon le rôle + return redirectAfterLogin(); + } else { + FacesContext.getCurrentInstance().addMessage(null, + new FacesMessage(FacesMessage.SEVERITY_ERROR, + "Erreur de connexion", + response.getMessage())); + return null; + } + + } catch (Exception e) { + FacesContext.getCurrentInstance().addMessage(null, + new FacesMessage(FacesMessage.SEVERITY_ERROR, + "Erreur système", + "Impossible de se connecter au serveur")); + return null; + } + } + + /** + * Déconnexion + */ + public String logout() { + try { + if (authToken != null) { + serverClient.logout(authToken); + } + } catch (Exception e) { + // Log l'erreur mais continue la déconnexion + } + + // Nettoyage de la session + this.currentUser = null; + this.authToken = null; + this.authenticated = false; + this.email = null; + this.password = null; + this.rememberMe = false; + + // Invalidation de la session JSF + FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); + + return "/index?faces-redirect=true"; + } + + /** + * Redirection après connexion selon le rôle + */ + private String redirectAfterLogin() { + if (currentUser == null) { + return "/index?faces-redirect=true"; + } + + switch (currentUser.getRole()) { + case "ADMIN": + return "/pages/admin/dashboard?faces-redirect=true"; + case "COACH": + return "/pages/coaching/dashboard?faces-redirect=true"; + case "CLIENT": + return "/pages/dashboard/client?faces-redirect=true"; + default: + return "/pages/dashboard/home?faces-redirect=true"; + } + } + + /** + * Navigation vers le profil + */ + public String goToProfile() { + return "/pages/profile/edit?faces-redirect=true"; + } + + /** + * Navigation vers les paramètres + */ + public String goToSettings() { + return "/pages/settings/general?faces-redirect=true"; + } + + /** + * Vérification des permissions + */ + public boolean hasRole(String role) { + return authenticated && currentUser != null && + role.equals(currentUser.getRole()); + } + + public boolean isAdmin() { + return hasRole("ADMIN"); + } + + public boolean isCoach() { + return hasRole("COACH"); + } + + public boolean isClient() { + return hasRole("CLIENT"); + } + + // Getters et Setters + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public boolean isRememberMe() { + return rememberMe; + } + + public void setRememberMe(boolean rememberMe) { + this.rememberMe = rememberMe; + } + + public UserDTO getCurrentUser() { + return currentUser; + } + + public String getAuthToken() { + return authToken; + } + + public boolean isAuthenticated() { + return authenticated; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..fb6c0de --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,47 @@ +# GBCM Client Configuration +quarkus.application.name=gbcm-client +quarkus.application.version=1.0.0-SNAPSHOT + +# Server Configuration +quarkus.http.port=8080 +quarkus.http.host=0.0.0.0 + +# JSF Configuration +quarkus.servlet.context-path=/gbcm + +# Security Configuration +quarkus.security.auth.enabled=true + +# REST Client Configuration - GBCM Server API +gbcm.server.api.url=http://localhost:8081/api/v1 +quarkus.rest-client."com.gbcm.client.service.GBCMServerClient".url=${gbcm.server.api.url} + +# Database Configuration (for session storage) +quarkus.datasource.db-kind=postgresql +quarkus.datasource.username=gbcm_user +quarkus.datasource.password=gbcm_password +quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/gbcm_client + +# Hibernate Configuration +quarkus.hibernate-orm.database.generation=update +quarkus.hibernate-orm.log.sql=false + +# Logging Configuration +quarkus.log.level=INFO +quarkus.log.category."com.gbcm".level=DEBUG + +# Development Configuration +%dev.quarkus.log.level=DEBUG +%dev.quarkus.hibernate-orm.log.sql=true +%dev.quarkus.datasource.jdbc.url=jdbc:h2:mem:gbcm_client_dev;DB_CLOSE_DELAY=-1 +%dev.quarkus.datasource.db-kind=h2 + +# Production Configuration +%prod.quarkus.log.level=WARN +%prod.quarkus.datasource.jdbc.url=${DATABASE_URL} + +# PrimeFaces Configuration +primefaces.theme=freya +primefaces.font-awesome=true +primefaces.client-side-validation=true +primefaces.move-scripts-to-bottom=true diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..17ee39a --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,87 @@ + + + + GBCM Client Application + Interface web GBCM pour la gestion des services de consulting + + + + jakarta.faces.PROJECT_STAGE + Development + + + + jakarta.faces.STATE_SAVING_METHOD + server + + + + jakarta.faces.FACELETS_SKIP_COMMENTS + true + + + + + primefaces.THEME + freya + + + + primefaces.FONT_AWESOME + true + + + + primefaces.CLIENT_SIDE_VALIDATION + true + + + + + Faces Servlet + jakarta.faces.webapp.FacesServlet + 1 + + + + Faces Servlet + *.xhtml + + + + + + Protected Pages + /pages/dashboard/* + /pages/coaching/* + /pages/workshops/* + /pages/admin/* + + + user + coach + admin + + + + + + index.xhtml + + + + + 404 + /pages/error/404.xhtml + + + + 500 + /pages/error/500.xhtml + + + diff --git a/src/main/webapp/templates/layout.xhtml b/src/main/webapp/templates/layout.xhtml new file mode 100644 index 0000000..b7feae3 --- /dev/null +++ b/src/main/webapp/templates/layout.xhtml @@ -0,0 +1,135 @@ + + + + + + <ui:insert name="title">GBCM - Global Business Consulting and Management</ui:insert> + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + GBCM + +
+ +
+
    +
  • + +
  • +
  • + +
  • +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ + +
+ +
+ + +
+ + +

Aucun contenu spécifique défini pour cette page.

+
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+