Initial commit: GBCM Server API with DTOs, interfaces and enums
This commit is contained in:
82
.gitignore
vendored
Normal file
82
.gitignore
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
# 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
|
||||
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
|
||||
|
||||
# IntelliJ IDEA
|
||||
.idea/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
out/
|
||||
|
||||
# Eclipse
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
bin/
|
||||
|
||||
# NetBeans
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
|
||||
# VS Code
|
||||
.vscode/
|
||||
|
||||
# Mac
|
||||
.DS_Store
|
||||
|
||||
# Windows
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
Desktop.ini
|
||||
|
||||
# Generated sources
|
||||
src/gen/
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.temp
|
||||
152
README.md
Normal file
152
README.md
Normal file
@@ -0,0 +1,152 @@
|
||||
# GBCM Server API
|
||||
|
||||
Contrats d'API et DTOs pour la plateforme GBCM (Global Business Consulting and Management).
|
||||
|
||||
## Description
|
||||
|
||||
Ce module contient les définitions d'interfaces, DTOs (Data Transfer Objects), énumérations et exceptions partagées entre le client et le serveur GBCM.
|
||||
|
||||
## Technologies
|
||||
|
||||
- **Java 17** - Langage de programmation
|
||||
- **Jakarta Validation 3.0** - Validation des données
|
||||
- **Jakarta REST 3.1** - Annotations REST
|
||||
- **Jackson** - Sérialisation JSON
|
||||
- **Swagger/OpenAPI 3** - Documentation API
|
||||
- **Maven** - Gestion des dépendances
|
||||
|
||||
## Structure du projet
|
||||
|
||||
```
|
||||
src/main/java/com/gbcm/server/api/
|
||||
├── dto/ # Data Transfer Objects
|
||||
│ ├── auth/ # DTOs authentification
|
||||
│ ├── user/ # DTOs utilisateurs
|
||||
│ ├── coaching/ # DTOs coaching
|
||||
│ ├── workshop/ # DTOs ateliers
|
||||
│ ├── billing/ # DTOs facturation
|
||||
│ └── common/ # DTOs communs
|
||||
├── interfaces/ # Interfaces de service
|
||||
│ ├── AuthService.java
|
||||
│ ├── UserService.java
|
||||
│ ├── CoachingService.java
|
||||
│ └── WorkshopService.java
|
||||
├── enums/ # Énumérations
|
||||
│ ├── UserRole.java
|
||||
│ ├── ServiceType.java
|
||||
│ └── PaymentStatus.java
|
||||
└── exceptions/ # Exceptions métier
|
||||
├── GBCMException.java
|
||||
├── AuthenticationException.java
|
||||
└── ValidationException.java
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
git clone https://git.lions.dev/gbcm/gbcm-server-api.git
|
||||
cd gbcm-server-api
|
||||
mvn clean install
|
||||
```
|
||||
|
||||
## Utilisation
|
||||
|
||||
Ce module est une dépendance partagée utilisée par :
|
||||
- `gbcm-client-impl-quarkus` - Interface web
|
||||
- `gbcm-server-impl-quarkus` - Implémentation serveur
|
||||
- `gbcm-mobile-app` - Application mobile (via REST)
|
||||
|
||||
### Ajout de la dépendance
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.gbcm</groupId>
|
||||
<artifactId>gbcm-server-api</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
## DTOs Principaux
|
||||
|
||||
### Authentification
|
||||
- `LoginRequestDTO` - Requête de connexion
|
||||
- `LoginResponseDTO` - Réponse de connexion
|
||||
- `UserDTO` - Informations utilisateur
|
||||
|
||||
### Services
|
||||
- `WorkshopDTO` - Informations atelier
|
||||
- `CoachingSessionDTO` - Session de coaching
|
||||
- `InvoiceDTO` - Facturation
|
||||
|
||||
## Interfaces de Service
|
||||
|
||||
### AuthService
|
||||
- `login()` - Authentification
|
||||
- `logout()` - Déconnexion
|
||||
- `refreshToken()` - Rafraîchissement token
|
||||
- `validateToken()` - Validation token
|
||||
|
||||
### UserService
|
||||
- `createUser()` - Création utilisateur
|
||||
- `updateUser()` - Mise à jour
|
||||
- `getUserById()` - Récupération par ID
|
||||
|
||||
## Énumérations
|
||||
|
||||
### UserRole
|
||||
- `ADMIN` - Administrateur
|
||||
- `COACH` - Coach/Consultant
|
||||
- `CLIENT` - Client
|
||||
- `PROSPECT` - Prospect
|
||||
- `MANAGER` - Manager
|
||||
|
||||
## Validation
|
||||
|
||||
Toutes les DTOs incluent des annotations de validation Jakarta :
|
||||
- `@NotNull`, `@NotBlank` - Champs obligatoires
|
||||
- `@Email` - Format email
|
||||
- `@Size` - Taille des chaînes
|
||||
- `@Valid` - Validation en cascade
|
||||
|
||||
## Documentation OpenAPI
|
||||
|
||||
La documentation API est générée automatiquement via les annotations Swagger :
|
||||
- Descriptions des endpoints
|
||||
- Schémas des DTOs
|
||||
- Exemples de requêtes/réponses
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
mvn test
|
||||
```
|
||||
|
||||
## Build
|
||||
|
||||
```bash
|
||||
# Build standard
|
||||
mvn clean package
|
||||
|
||||
# Installation locale
|
||||
mvn clean install
|
||||
|
||||
# Déploiement (si configuré)
|
||||
mvn deploy
|
||||
```
|
||||
|
||||
## Versioning
|
||||
|
||||
Ce module suit le versioning sémantique :
|
||||
- `MAJOR.MINOR.PATCH`
|
||||
- Changements breaking = MAJOR
|
||||
- Nouvelles fonctionnalités = MINOR
|
||||
- Corrections de bugs = PATCH
|
||||
|
||||
## Support
|
||||
|
||||
- Email: support@gbcm.com
|
||||
- Documentation: https://docs.gbcm.com/api
|
||||
|
||||
## Licence
|
||||
|
||||
Propriétaire - GBCM LLC © 2024
|
||||
95
pom.xml
Normal file
95
pom.xml
Normal file
@@ -0,0 +1,95 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.gbcm</groupId>
|
||||
<artifactId>gbcm-server-api</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>GBCM Server API</name>
|
||||
<description>Contrats d'API et DTOs pour les services GBCM</description>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
<!-- Versions -->
|
||||
<jakarta.validation.version>3.0.2</jakarta.validation.version>
|
||||
<jakarta.ws.rs.version>3.1.0</jakarta.ws.rs.version>
|
||||
<jackson.version>2.15.2</jackson.version>
|
||||
<swagger.version>2.2.15</swagger.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!-- Jakarta Validation -->
|
||||
<dependency>
|
||||
<groupId>jakarta.validation</groupId>
|
||||
<artifactId>jakarta.validation-api</artifactId>
|
||||
<version>${jakarta.validation.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Jakarta REST -->
|
||||
<dependency>
|
||||
<groupId>jakarta.ws.rs</groupId>
|
||||
<artifactId>jakarta.ws.rs-api</artifactId>
|
||||
<version>${jakarta.ws.rs.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Jackson Annotations -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Swagger Annotations -->
|
||||
<dependency>
|
||||
<groupId>io.swagger.core.v3</groupId>
|
||||
<artifactId>swagger-annotations</artifactId>
|
||||
<version>${swagger.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Test Dependencies -->
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter</artifactId>
|
||||
<version>5.10.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.11.0</version>
|
||||
</plugin>
|
||||
|
||||
<!-- OpenAPI Generator Plugin -->
|
||||
<plugin>
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<version>7.0.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>generate</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<inputSpec>${project.basedir}/src/main/resources/META-INF/openapi.yaml</inputSpec>
|
||||
<generatorName>java</generatorName>
|
||||
<configOptions>
|
||||
<sourceFolder>src/gen/java/main</sourceFolder>
|
||||
</configOptions>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,77 @@
|
||||
package com.gbcm.server.api.dto.auth;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.Email;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
/**
|
||||
* DTO pour les requêtes de connexion
|
||||
*/
|
||||
@Schema(description = "Requête de connexion utilisateur")
|
||||
public class LoginRequestDTO {
|
||||
|
||||
@Schema(description = "Adresse email de l'utilisateur", example = "user@gbcm.com")
|
||||
@JsonProperty("email")
|
||||
@NotBlank(message = "L'email est obligatoire")
|
||||
@Email(message = "Format d'email invalide")
|
||||
private String email;
|
||||
|
||||
@Schema(description = "Mot de passe", example = "password123")
|
||||
@JsonProperty("password")
|
||||
@NotBlank(message = "Le mot de passe est obligatoire")
|
||||
@Size(min = 6, max = 100, message = "Le mot de passe doit contenir entre 6 et 100 caractères")
|
||||
private String password;
|
||||
|
||||
@Schema(description = "Se souvenir de moi", example = "true")
|
||||
@JsonProperty("rememberMe")
|
||||
private boolean rememberMe = false;
|
||||
|
||||
// Constructeurs
|
||||
public LoginRequestDTO() {}
|
||||
|
||||
public LoginRequestDTO(String email, String password) {
|
||||
this.email = email;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public LoginRequestDTO(String email, String password, boolean rememberMe) {
|
||||
this.email = email;
|
||||
this.password = password;
|
||||
this.rememberMe = rememberMe;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "LoginRequestDTO{" +
|
||||
"email='" + email + '\'' +
|
||||
", rememberMe=" + rememberMe +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
118
src/main/java/com/gbcm/server/api/dto/auth/LoginResponseDTO.java
Normal file
118
src/main/java/com/gbcm/server/api/dto/auth/LoginResponseDTO.java
Normal file
@@ -0,0 +1,118 @@
|
||||
package com.gbcm.server.api.dto.auth;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.gbcm.server.api.dto.user.UserDTO;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* DTO pour les réponses de connexion
|
||||
*/
|
||||
@Schema(description = "Réponse de connexion utilisateur")
|
||||
public class LoginResponseDTO {
|
||||
|
||||
@Schema(description = "Succès de la connexion", example = "true")
|
||||
@JsonProperty("success")
|
||||
private boolean success;
|
||||
|
||||
@Schema(description = "Message de réponse", example = "Connexion réussie")
|
||||
@JsonProperty("message")
|
||||
private String message;
|
||||
|
||||
@Schema(description = "Token d'authentification JWT")
|
||||
@JsonProperty("token")
|
||||
private String token;
|
||||
|
||||
@Schema(description = "Date d'expiration du token")
|
||||
@JsonProperty("expiresAt")
|
||||
private LocalDateTime expiresAt;
|
||||
|
||||
@Schema(description = "Informations utilisateur")
|
||||
@JsonProperty("user")
|
||||
private UserDTO user;
|
||||
|
||||
@Schema(description = "Token de rafraîchissement")
|
||||
@JsonProperty("refreshToken")
|
||||
private String refreshToken;
|
||||
|
||||
// Constructeurs
|
||||
public LoginResponseDTO() {}
|
||||
|
||||
public LoginResponseDTO(boolean success, String message) {
|
||||
this.success = success;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public static LoginResponseDTO success(String token, LocalDateTime expiresAt, UserDTO user) {
|
||||
LoginResponseDTO response = new LoginResponseDTO(true, "Connexion réussie");
|
||||
response.setToken(token);
|
||||
response.setExpiresAt(expiresAt);
|
||||
response.setUser(user);
|
||||
return response;
|
||||
}
|
||||
|
||||
public static LoginResponseDTO failure(String message) {
|
||||
return new LoginResponseDTO(false, message);
|
||||
}
|
||||
|
||||
// Getters et Setters
|
||||
public boolean isSuccess() {
|
||||
return success;
|
||||
}
|
||||
|
||||
public void setSuccess(boolean success) {
|
||||
this.success = success;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
public void setToken(String token) {
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
public LocalDateTime getExpiresAt() {
|
||||
return expiresAt;
|
||||
}
|
||||
|
||||
public void setExpiresAt(LocalDateTime expiresAt) {
|
||||
this.expiresAt = expiresAt;
|
||||
}
|
||||
|
||||
public UserDTO getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(UserDTO user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public String getRefreshToken() {
|
||||
return refreshToken;
|
||||
}
|
||||
|
||||
public void setRefreshToken(String refreshToken) {
|
||||
this.refreshToken = refreshToken;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "LoginResponseDTO{" +
|
||||
"success=" + success +
|
||||
", message='" + message + '\'' +
|
||||
", token='" + (token != null ? "[PROTECTED]" : null) + '\'' +
|
||||
", expiresAt=" + expiresAt +
|
||||
", user=" + user +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
178
src/main/java/com/gbcm/server/api/dto/user/UserDTO.java
Normal file
178
src/main/java/com/gbcm/server/api/dto/user/UserDTO.java
Normal file
@@ -0,0 +1,178 @@
|
||||
package com.gbcm.server.api.dto.user;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.gbcm.server.api.enums.UserRole;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.Email;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* DTO pour les informations utilisateur
|
||||
*/
|
||||
@Schema(description = "Informations utilisateur")
|
||||
public class UserDTO {
|
||||
|
||||
@Schema(description = "Identifiant unique", example = "1")
|
||||
@JsonProperty("id")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "Prénom", example = "John")
|
||||
@JsonProperty("firstName")
|
||||
@NotBlank(message = "Le prénom est obligatoire")
|
||||
private String firstName;
|
||||
|
||||
@Schema(description = "Nom de famille", example = "Doe")
|
||||
@JsonProperty("lastName")
|
||||
@NotBlank(message = "Le nom est obligatoire")
|
||||
private String lastName;
|
||||
|
||||
@Schema(description = "Adresse email", example = "john.doe@gbcm.com")
|
||||
@JsonProperty("email")
|
||||
@NotBlank(message = "L'email est obligatoire")
|
||||
@Email(message = "Format d'email invalide")
|
||||
private String email;
|
||||
|
||||
@Schema(description = "Numéro de téléphone", example = "+1234567890")
|
||||
@JsonProperty("phone")
|
||||
private String phone;
|
||||
|
||||
@Schema(description = "Rôle utilisateur")
|
||||
@JsonProperty("role")
|
||||
@NotNull(message = "Le rôle est obligatoire")
|
||||
private UserRole role;
|
||||
|
||||
@Schema(description = "Statut actif", example = "true")
|
||||
@JsonProperty("active")
|
||||
private boolean active = true;
|
||||
|
||||
@Schema(description = "Date de création")
|
||||
@JsonProperty("createdAt")
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Schema(description = "Date de dernière modification")
|
||||
@JsonProperty("updatedAt")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@Schema(description = "Date de dernière connexion")
|
||||
@JsonProperty("lastLoginAt")
|
||||
private LocalDateTime lastLoginAt;
|
||||
|
||||
// Constructeurs
|
||||
public UserDTO() {}
|
||||
|
||||
public UserDTO(String firstName, String lastName, String email, UserRole role) {
|
||||
this.firstName = firstName;
|
||||
this.lastName = lastName;
|
||||
this.email = email;
|
||||
this.role = role;
|
||||
}
|
||||
|
||||
// Méthodes utilitaires
|
||||
public String getFullName() {
|
||||
return firstName + " " + lastName;
|
||||
}
|
||||
|
||||
public String getInitials() {
|
||||
String firstInitial = firstName != null && !firstName.isEmpty() ?
|
||||
firstName.substring(0, 1).toUpperCase() : "";
|
||||
String lastInitial = lastName != null && !lastName.isEmpty() ?
|
||||
lastName.substring(0, 1).toUpperCase() : "";
|
||||
return firstInitial + lastInitial;
|
||||
}
|
||||
|
||||
// Getters et Setters
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getFirstName() {
|
||||
return firstName;
|
||||
}
|
||||
|
||||
public void setFirstName(String firstName) {
|
||||
this.firstName = firstName;
|
||||
}
|
||||
|
||||
public String getLastName() {
|
||||
return lastName;
|
||||
}
|
||||
|
||||
public void setLastName(String lastName) {
|
||||
this.lastName = lastName;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getPhone() {
|
||||
return phone;
|
||||
}
|
||||
|
||||
public void setPhone(String phone) {
|
||||
this.phone = phone;
|
||||
}
|
||||
|
||||
public UserRole getRole() {
|
||||
return role;
|
||||
}
|
||||
|
||||
public void setRole(UserRole role) {
|
||||
this.role = role;
|
||||
}
|
||||
|
||||
public boolean isActive() {
|
||||
return active;
|
||||
}
|
||||
|
||||
public void setActive(boolean active) {
|
||||
this.active = active;
|
||||
}
|
||||
|
||||
public LocalDateTime getCreatedAt() {
|
||||
return createdAt;
|
||||
}
|
||||
|
||||
public void setCreatedAt(LocalDateTime createdAt) {
|
||||
this.createdAt = createdAt;
|
||||
}
|
||||
|
||||
public LocalDateTime getUpdatedAt() {
|
||||
return updatedAt;
|
||||
}
|
||||
|
||||
public void setUpdatedAt(LocalDateTime updatedAt) {
|
||||
this.updatedAt = updatedAt;
|
||||
}
|
||||
|
||||
public LocalDateTime getLastLoginAt() {
|
||||
return lastLoginAt;
|
||||
}
|
||||
|
||||
public void setLastLoginAt(LocalDateTime lastLoginAt) {
|
||||
this.lastLoginAt = lastLoginAt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "UserDTO{" +
|
||||
"id=" + id +
|
||||
", firstName='" + firstName + '\'' +
|
||||
", lastName='" + lastName + '\'' +
|
||||
", email='" + email + '\'' +
|
||||
", role=" + role +
|
||||
", active=" + active +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
107
src/main/java/com/gbcm/server/api/enums/UserRole.java
Normal file
107
src/main/java/com/gbcm/server/api/enums/UserRole.java
Normal file
@@ -0,0 +1,107 @@
|
||||
package com.gbcm.server.api.enums;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonValue;
|
||||
|
||||
/**
|
||||
* Énumération des rôles utilisateur dans GBCM
|
||||
*/
|
||||
public enum UserRole {
|
||||
|
||||
/**
|
||||
* Administrateur système - Accès complet
|
||||
*/
|
||||
ADMIN("ADMIN", "Administrateur", "Accès complet au système"),
|
||||
|
||||
/**
|
||||
* Coach/Consultant - Gestion des clients et programmes
|
||||
*/
|
||||
COACH("COACH", "Coach", "Gestion des clients et programmes de coaching"),
|
||||
|
||||
/**
|
||||
* Client - Accès aux services souscrits
|
||||
*/
|
||||
CLIENT("CLIENT", "Client", "Accès aux services et programmes souscrits"),
|
||||
|
||||
/**
|
||||
* Prospect - Accès limité pour découverte
|
||||
*/
|
||||
PROSPECT("PROSPECT", "Prospect", "Accès limité aux ressources de découverte"),
|
||||
|
||||
/**
|
||||
* Manager - Gestion opérationnelle
|
||||
*/
|
||||
MANAGER("MANAGER", "Manager", "Gestion opérationnelle et supervision");
|
||||
|
||||
private final String code;
|
||||
private final String displayName;
|
||||
private final String description;
|
||||
|
||||
UserRole(String code, String displayName, String description) {
|
||||
this.code = code;
|
||||
this.displayName = displayName;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
@JsonValue
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trouve un rôle par son code
|
||||
*/
|
||||
public static UserRole fromCode(String code) {
|
||||
if (code == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (UserRole role : values()) {
|
||||
if (role.code.equalsIgnoreCase(code)) {
|
||||
return role;
|
||||
}
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException("Rôle inconnu: " + code);
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le rôle a des privilèges administrateur
|
||||
*/
|
||||
public boolean isAdmin() {
|
||||
return this == ADMIN;
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le rôle peut gérer des clients
|
||||
*/
|
||||
public boolean canManageClients() {
|
||||
return this == ADMIN || this == COACH || this == MANAGER;
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le rôle peut accéder aux services
|
||||
*/
|
||||
public boolean canAccessServices() {
|
||||
return this == CLIENT || this == COACH || this == ADMIN || this == MANAGER;
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le rôle peut voir les rapports
|
||||
*/
|
||||
public boolean canViewReports() {
|
||||
return this == ADMIN || this == MANAGER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return displayName;
|
||||
}
|
||||
}
|
||||
144
src/main/java/com/gbcm/server/api/interfaces/AuthService.java
Normal file
144
src/main/java/com/gbcm/server/api/interfaces/AuthService.java
Normal file
@@ -0,0 +1,144 @@
|
||||
package com.gbcm.server.api.interfaces;
|
||||
|
||||
import com.gbcm.server.api.dto.auth.LoginRequestDTO;
|
||||
import com.gbcm.server.api.dto.auth.LoginResponseDTO;
|
||||
import com.gbcm.server.api.dto.user.UserDTO;
|
||||
import com.gbcm.server.api.exceptions.AuthenticationException;
|
||||
import com.gbcm.server.api.exceptions.GBCMException;
|
||||
|
||||
import jakarta.ws.rs.*;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
/**
|
||||
* Interface de service pour l'authentification
|
||||
*/
|
||||
@Path("/auth")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Tag(name = "Authentication", description = "Services d'authentification et autorisation")
|
||||
public interface AuthService {
|
||||
|
||||
/**
|
||||
* Connexion utilisateur
|
||||
*/
|
||||
@POST
|
||||
@Path("/login")
|
||||
@Operation(
|
||||
summary = "Connexion utilisateur",
|
||||
description = "Authentifie un utilisateur avec email et mot de passe"
|
||||
)
|
||||
@ApiResponse(responseCode = "200", description = "Connexion réussie")
|
||||
@ApiResponse(responseCode = "401", description = "Identifiants invalides")
|
||||
@ApiResponse(responseCode = "400", description = "Données de requête invalides")
|
||||
LoginResponseDTO login(
|
||||
@Parameter(description = "Informations de connexion", required = true)
|
||||
LoginRequestDTO loginRequest
|
||||
) throws AuthenticationException, GBCMException;
|
||||
|
||||
/**
|
||||
* Déconnexion utilisateur
|
||||
*/
|
||||
@POST
|
||||
@Path("/logout")
|
||||
@Operation(
|
||||
summary = "Déconnexion utilisateur",
|
||||
description = "Invalide le token d'authentification"
|
||||
)
|
||||
@ApiResponse(responseCode = "200", description = "Déconnexion réussie")
|
||||
@ApiResponse(responseCode = "401", description = "Token invalide")
|
||||
void logout(
|
||||
@Parameter(description = "Token d'authentification", required = true)
|
||||
@HeaderParam("Authorization") String authToken
|
||||
) throws AuthenticationException;
|
||||
|
||||
/**
|
||||
* Rafraîchissement du token
|
||||
*/
|
||||
@POST
|
||||
@Path("/refresh")
|
||||
@Operation(
|
||||
summary = "Rafraîchissement du token",
|
||||
description = "Génère un nouveau token d'authentification"
|
||||
)
|
||||
@ApiResponse(responseCode = "200", description = "Token rafraîchi")
|
||||
@ApiResponse(responseCode = "401", description = "Token de rafraîchissement invalide")
|
||||
LoginResponseDTO refreshToken(
|
||||
@Parameter(description = "Token de rafraîchissement", required = true)
|
||||
@FormParam("refreshToken") String refreshToken
|
||||
) throws AuthenticationException;
|
||||
|
||||
/**
|
||||
* Validation du token
|
||||
*/
|
||||
@GET
|
||||
@Path("/validate")
|
||||
@Operation(
|
||||
summary = "Validation du token",
|
||||
description = "Vérifie la validité d'un token d'authentification"
|
||||
)
|
||||
@ApiResponse(responseCode = "200", description = "Token valide")
|
||||
@ApiResponse(responseCode = "401", description = "Token invalide ou expiré")
|
||||
UserDTO validateToken(
|
||||
@Parameter(description = "Token d'authentification", required = true)
|
||||
@HeaderParam("Authorization") String authToken
|
||||
) throws AuthenticationException;
|
||||
|
||||
/**
|
||||
* Demande de réinitialisation de mot de passe
|
||||
*/
|
||||
@POST
|
||||
@Path("/forgot-password")
|
||||
@Operation(
|
||||
summary = "Mot de passe oublié",
|
||||
description = "Envoie un email de réinitialisation de mot de passe"
|
||||
)
|
||||
@ApiResponse(responseCode = "200", description = "Email envoyé")
|
||||
@ApiResponse(responseCode = "404", description = "Utilisateur non trouvé")
|
||||
void forgotPassword(
|
||||
@Parameter(description = "Adresse email", required = true)
|
||||
@FormParam("email") String email
|
||||
) throws GBCMException;
|
||||
|
||||
/**
|
||||
* Réinitialisation du mot de passe
|
||||
*/
|
||||
@POST
|
||||
@Path("/reset-password")
|
||||
@Operation(
|
||||
summary = "Réinitialisation du mot de passe",
|
||||
description = "Réinitialise le mot de passe avec un token de réinitialisation"
|
||||
)
|
||||
@ApiResponse(responseCode = "200", description = "Mot de passe réinitialisé")
|
||||
@ApiResponse(responseCode = "400", description = "Token invalide ou expiré")
|
||||
void resetPassword(
|
||||
@Parameter(description = "Token de réinitialisation", required = true)
|
||||
@FormParam("resetToken") String resetToken,
|
||||
@Parameter(description = "Nouveau mot de passe", required = true)
|
||||
@FormParam("newPassword") String newPassword
|
||||
) throws GBCMException;
|
||||
|
||||
/**
|
||||
* Changement de mot de passe
|
||||
*/
|
||||
@PUT
|
||||
@Path("/change-password")
|
||||
@Operation(
|
||||
summary = "Changement de mot de passe",
|
||||
description = "Change le mot de passe d'un utilisateur authentifié"
|
||||
)
|
||||
@ApiResponse(responseCode = "200", description = "Mot de passe changé")
|
||||
@ApiResponse(responseCode = "401", description = "Non autorisé")
|
||||
@ApiResponse(responseCode = "400", description = "Ancien mot de passe incorrect")
|
||||
void changePassword(
|
||||
@Parameter(description = "Token d'authentification", required = true)
|
||||
@HeaderParam("Authorization") String authToken,
|
||||
@Parameter(description = "Ancien mot de passe", required = true)
|
||||
@FormParam("oldPassword") String oldPassword,
|
||||
@Parameter(description = "Nouveau mot de passe", required = true)
|
||||
@FormParam("newPassword") String newPassword
|
||||
) throws AuthenticationException, GBCMException;
|
||||
}
|
||||
Reference in New Issue
Block a user