180 lines
6.5 KiB
Java
180 lines
6.5 KiB
Java
package dev.lions.btpxpress.adapter.http;
|
|
|
|
import dev.lions.btpxpress.application.service.ClientService;
|
|
import dev.lions.btpxpress.domain.core.entity.Client;
|
|
import dev.lions.btpxpress.domain.core.entity.Permission;
|
|
import dev.lions.btpxpress.domain.shared.dto.ClientCreateDTO;
|
|
import dev.lions.btpxpress.infrastructure.security.RequirePermission;
|
|
import io.quarkus.security.Authenticated;
|
|
import jakarta.inject.Inject;
|
|
import jakarta.validation.Valid;
|
|
import jakarta.validation.constraints.NotNull;
|
|
import jakarta.ws.rs.*;
|
|
import jakarta.ws.rs.core.MediaType;
|
|
import jakarta.ws.rs.core.Response;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
import org.eclipse.microprofile.openapi.annotations.Operation;
|
|
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
|
|
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
|
|
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
/**
|
|
* Resource REST pour la gestion des clients - Architecture 2025 MIGRATION: Préservation exacte de
|
|
* toutes les API endpoints et contrats
|
|
*/
|
|
@Path("/api/v1/clients")
|
|
@Produces(MediaType.APPLICATION_JSON)
|
|
@Consumes(MediaType.APPLICATION_JSON)
|
|
@Tag(name = "Clients", description = "Gestion des clients")
|
|
// @Authenticated - Désactivé pour les tests
|
|
public class ClientResource {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(ClientResource.class);
|
|
|
|
@Inject ClientService clientService;
|
|
|
|
// === ENDPOINTS DE LECTURE - API CONTRACTS PRÉSERVÉS EXACTEMENT ===
|
|
|
|
@GET
|
|
@RequirePermission(Permission.CLIENTS_READ)
|
|
@Operation(summary = "Récupérer tous les clients")
|
|
@APIResponse(responseCode = "200", description = "Liste des clients récupérée avec succès")
|
|
public Response getAllClients(
|
|
@Parameter(description = "Numéro de page (0-based)") @QueryParam("page") @DefaultValue("0")
|
|
int page,
|
|
@Parameter(description = "Taille de la page") @QueryParam("size") @DefaultValue("20")
|
|
int size) {
|
|
|
|
logger.debug("GET /clients - page: {}, size: {}", page, size);
|
|
|
|
List<Client> clients;
|
|
if (page == 0 && size == 20) {
|
|
clients = clientService.findAll();
|
|
} else {
|
|
clients = clientService.findAll(page, size);
|
|
}
|
|
|
|
return Response.ok(clients).build();
|
|
}
|
|
|
|
@GET
|
|
@Path("/{id}")
|
|
@RequirePermission(Permission.CLIENTS_READ)
|
|
@Operation(summary = "Récupérer un client par ID")
|
|
@APIResponse(responseCode = "200", description = "Client trouvé")
|
|
@APIResponse(responseCode = "404", description = "Client non trouvé")
|
|
public Response getClientById(@Parameter(description = "ID du client") @PathParam("id") UUID id) {
|
|
|
|
logger.debug("GET /clients/{}", id);
|
|
|
|
Client client = clientService.findByIdRequired(id);
|
|
return Response.ok(client).build();
|
|
}
|
|
|
|
@GET
|
|
@Path("/search")
|
|
@Operation(summary = "Rechercher des clients")
|
|
@APIResponse(responseCode = "200", description = "Résultats de recherche")
|
|
public Response searchClients(
|
|
@Parameter(description = "Nom du client") @QueryParam("nom") String nom,
|
|
@Parameter(description = "Entreprise") @QueryParam("entreprise") String entreprise,
|
|
@Parameter(description = "Ville") @QueryParam("ville") String ville,
|
|
@Parameter(description = "Email") @QueryParam("email") String email) {
|
|
|
|
logger.debug(
|
|
"GET /clients/search - nom: {}, entreprise: {}, ville: {}, email: {}",
|
|
nom,
|
|
entreprise,
|
|
ville,
|
|
email);
|
|
|
|
List<Client> clients;
|
|
|
|
// Logique de recherche exacte préservée
|
|
if (email != null && !email.trim().isEmpty()) {
|
|
clients = clientService.findByEmail(email).map(List::of).orElse(List.of());
|
|
} else if (nom != null && !nom.trim().isEmpty()) {
|
|
clients = clientService.searchByNom(nom);
|
|
} else if (entreprise != null && !entreprise.trim().isEmpty()) {
|
|
clients = clientService.searchByEntreprise(entreprise);
|
|
} else if (ville != null && !ville.trim().isEmpty()) {
|
|
clients = clientService.searchByVille(ville);
|
|
} else {
|
|
clients = clientService.findAll();
|
|
}
|
|
|
|
return Response.ok(clients).build();
|
|
}
|
|
|
|
// === ENDPOINTS D'ÉCRITURE - API CONTRACTS PRÉSERVÉS EXACTEMENT ===
|
|
|
|
@POST
|
|
@RequirePermission(Permission.CLIENTS_CREATE)
|
|
@Operation(summary = "Créer un nouveau client")
|
|
@APIResponse(responseCode = "201", description = "Client créé avec succès")
|
|
@APIResponse(responseCode = "400", description = "Données invalides")
|
|
public Response createClient(@Valid @NotNull ClientCreateDTO clientDTO) {
|
|
logger.debug("POST /clients");
|
|
logger.info(
|
|
"Données reçues: nom={}, prenom={}, email={}",
|
|
clientDTO.getNom(),
|
|
clientDTO.getPrenom(),
|
|
clientDTO.getEmail());
|
|
|
|
try {
|
|
Client createdClient = clientService.createFromDTO(clientDTO);
|
|
return Response.status(Response.Status.CREATED).entity(createdClient).build();
|
|
} catch (Exception e) {
|
|
logger.error("Erreur lors de la création du client: {}", e.getMessage(), e);
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
@PUT
|
|
@Path("/{id}")
|
|
@RequirePermission(Permission.CLIENTS_UPDATE)
|
|
@Operation(summary = "Mettre à jour un client")
|
|
@APIResponse(responseCode = "200", description = "Client mis à jour avec succès")
|
|
@APIResponse(responseCode = "404", description = "Client non trouvé")
|
|
@APIResponse(responseCode = "400", description = "Données invalides")
|
|
public Response updateClient(
|
|
@Parameter(description = "ID du client") @PathParam("id") UUID id,
|
|
@Valid @NotNull Client client) {
|
|
|
|
logger.debug("PUT /clients/{}", id);
|
|
|
|
Client updatedClient = clientService.update(id, client);
|
|
return Response.ok(updatedClient).build();
|
|
}
|
|
|
|
@DELETE
|
|
@Path("/{id}")
|
|
@RequirePermission(Permission.CLIENTS_DELETE)
|
|
@Operation(summary = "Supprimer un client")
|
|
@APIResponse(responseCode = "204", description = "Client supprimé avec succès")
|
|
@APIResponse(responseCode = "404", description = "Client non trouvé")
|
|
public Response deleteClient(@Parameter(description = "ID du client") @PathParam("id") UUID id) {
|
|
|
|
logger.debug("DELETE /clients/{}", id);
|
|
|
|
clientService.delete(id);
|
|
return Response.noContent().build();
|
|
}
|
|
|
|
// === ENDPOINTS STATISTIQUES - API CONTRACTS PRÉSERVÉS EXACTEMENT ===
|
|
|
|
@GET
|
|
@Path("/count")
|
|
@Operation(summary = "Compter le nombre de clients")
|
|
@APIResponse(responseCode = "200", description = "Nombre de clients")
|
|
public Response countClients() {
|
|
logger.debug("GET /clients/count");
|
|
|
|
long count = clientService.count();
|
|
return Response.ok(count).build();
|
|
}
|
|
}
|