diff --git a/src/main/java/com/gbcm/server/api/dto/auth/PasswordChangeDTO.java b/src/main/java/com/gbcm/server/api/dto/auth/PasswordChangeDTO.java new file mode 100644 index 0000000..48b55a2 --- /dev/null +++ b/src/main/java/com/gbcm/server/api/dto/auth/PasswordChangeDTO.java @@ -0,0 +1,188 @@ +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.NotBlank; +import jakarta.validation.constraints.Size; + +/** + * DTO pour les demandes de changement de mot de passe. + * Utilisé lorsqu'un utilisateur authentifié souhaite changer son mot de passe. + * + * @author GBCM Development Team + * @version 1.0 + * @since 1.0 + */ +@Schema(description = "Demande de changement de mot de passe") +public class PasswordChangeDTO { + + /** + * Mot de passe actuel de l'utilisateur. + * Obligatoire pour vérifier l'identité avant le changement. + */ + @Schema(description = "Mot de passe actuel de l'utilisateur", + example = "ancienMotDePasse123", + required = true) + @JsonProperty("currentPassword") + @NotBlank(message = "Le mot de passe actuel est obligatoire") + private String currentPassword; + + /** + * Nouveau mot de passe choisi par l'utilisateur. + * Doit respecter la politique de sécurité des mots de passe. + */ + @Schema(description = "Nouveau mot de passe", + example = "nouveauMotDePasse123", + required = true) + @JsonProperty("newPassword") + @NotBlank(message = "Le nouveau mot de passe est obligatoire") + @Size(min = 8, max = 100, message = "Le nouveau mot de passe doit contenir entre 8 et 100 caractères") + private String newPassword; + + /** + * Confirmation du nouveau mot de passe. + * Doit être identique au nouveau mot de passe. + */ + @Schema(description = "Confirmation du nouveau mot de passe", + example = "nouveauMotDePasse123", + required = true) + @JsonProperty("confirmPassword") + @NotBlank(message = "La confirmation du mot de passe est obligatoire") + @Size(min = 8, max = 100, message = "La confirmation doit contenir entre 8 et 100 caractères") + private String confirmPassword; + + /** + * Constructeur par défaut. + */ + public PasswordChangeDTO() {} + + /** + * Constructeur avec tous les paramètres. + * + * @param currentPassword le mot de passe actuel + * @param newPassword le nouveau mot de passe + * @param confirmPassword la confirmation du nouveau mot de passe + */ + public PasswordChangeDTO(String currentPassword, String newPassword, String confirmPassword) { + this.currentPassword = currentPassword; + this.newPassword = newPassword; + this.confirmPassword = confirmPassword; + } + + /** + * Retourne le mot de passe actuel. + * + * @return le mot de passe actuel + */ + public String getCurrentPassword() { + return currentPassword; + } + + /** + * Définit le mot de passe actuel. + * + * @param currentPassword le mot de passe actuel à définir + */ + public void setCurrentPassword(String currentPassword) { + this.currentPassword = currentPassword; + } + + /** + * Retourne le nouveau mot de passe. + * + * @return le nouveau mot de passe + */ + public String getNewPassword() { + return newPassword; + } + + /** + * Définit le nouveau mot de passe. + * + * @param newPassword le nouveau mot de passe à définir + */ + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + /** + * Retourne la confirmation du nouveau mot de passe. + * + * @return la confirmation du nouveau mot de passe + */ + public String getConfirmPassword() { + return confirmPassword; + } + + /** + * Définit la confirmation du nouveau mot de passe. + * + * @param confirmPassword la confirmation à définir + */ + public void setConfirmPassword(String confirmPassword) { + this.confirmPassword = confirmPassword; + } + + /** + * Vérifie si le nouveau mot de passe et sa confirmation correspondent. + * + * @return true si les mots de passe correspondent, false sinon + */ + public boolean isPasswordConfirmed() { + return newPassword != null && newPassword.equals(confirmPassword); + } + + /** + * Vérifie si tous les champs obligatoires sont remplis. + * + * @return true si tous les champs sont remplis, false sinon + */ + public boolean isComplete() { + return currentPassword != null && !currentPassword.trim().isEmpty() && + newPassword != null && !newPassword.trim().isEmpty() && + confirmPassword != null && !confirmPassword.trim().isEmpty(); + } + + /** + * Représentation textuelle de l'objet (sans les mots de passe pour la sécurité). + * + * @return une chaîne représentant l'objet + */ + @Override + public String toString() { + return "PasswordChangeDTO{" + + "hasCurrentPassword=" + (currentPassword != null && !currentPassword.isEmpty()) + + ", hasNewPassword=" + (newPassword != null && !newPassword.isEmpty()) + + ", hasConfirmPassword=" + (confirmPassword != null && !confirmPassword.isEmpty()) + + ", passwordsMatch=" + isPasswordConfirmed() + + '}'; + } + + /** + * Vérifie l'égalité avec un autre objet. + * + * @param obj l'objet à comparer + * @return true si les objets sont égaux, false sinon + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + + PasswordChangeDTO that = (PasswordChangeDTO) obj; + + return java.util.Objects.equals(currentPassword, that.currentPassword) && + java.util.Objects.equals(newPassword, that.newPassword) && + java.util.Objects.equals(confirmPassword, that.confirmPassword); + } + + /** + * Calcule le code de hachage de l'objet. + * + * @return le code de hachage + */ + @Override + public int hashCode() { + return java.util.Objects.hash(currentPassword, newPassword, confirmPassword); + } +}