package dev.lions.unionflow.server.resource; import dev.lions.unionflow.server.api.dto.kyc.KycDossierRequest; import dev.lions.unionflow.server.api.dto.kyc.KycDossierResponse; import dev.lions.unionflow.server.service.KycAmlService; import io.quarkus.security.identity.SecurityIdentity; import jakarta.annotation.security.RolesAllowed; import jakarta.inject.Inject; import jakarta.validation.Valid; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import java.util.List; import java.util.Map; import java.util.UUID; /** * Endpoints KYC/AML — gestion des dossiers d'identification et évaluation risque LCB-FT. */ @Path("/api/kyc") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class KycResource { @Inject KycAmlService kycAmlService; @Inject SecurityIdentity identity; /** Soumet ou met à jour un dossier KYC pour un membre. */ @POST @Path("/dossiers") @RolesAllowed({"ADMIN_ORGANISATION", "TRESORIER", "SUPER_ADMIN"}) public Response soumettre(@Valid KycDossierRequest request) { KycDossierResponse response = kycAmlService.soumettreOuMettreAJour(request, identity.getPrincipal().getName()); return Response.status(Response.Status.CREATED).entity(response).build(); } /** Récupère le dossier KYC actif d'un membre. */ @GET @Path("/membres/{membreId}") @RolesAllowed({"ADMIN_ORGANISATION", "TRESORIER", "SUPER_ADMIN"}) public Response getDossierActif(@PathParam("membreId") UUID membreId) { return kycAmlService.getDossierActif(membreId) .map(d -> Response.ok(d).build()) .orElse(Response.status(Response.Status.NOT_FOUND) .entity(Map.of("error", "Aucun dossier KYC actif pour ce membre.")) .build()); } /** Évalue le score de risque LCB-FT du membre. */ @POST @Path("/membres/{membreId}/evaluer-risque") @RolesAllowed({"ADMIN_ORGANISATION", "TRESORIER", "SUPER_ADMIN"}) public Response evaluerRisque(@PathParam("membreId") UUID membreId) { KycDossierResponse response = kycAmlService.evaluerRisque(membreId); return Response.ok(response).build(); } /** Valide manuellement un dossier KYC (agent habilité). */ @POST @Path("/dossiers/{dossierId}/valider") @RolesAllowed({"SUPER_ADMIN", "ADMIN_ORGANISATION"}) public Response valider( @PathParam("dossierId") UUID dossierId, @QueryParam("validateurId") UUID validateurId, @QueryParam("notes") String notes) { KycDossierResponse response = kycAmlService.valider( dossierId, validateurId, notes, identity.getPrincipal().getName()); return Response.ok(response).build(); } /** Refuse un dossier KYC avec motif. */ @POST @Path("/dossiers/{dossierId}/refuser") @RolesAllowed({"SUPER_ADMIN", "ADMIN_ORGANISATION"}) public Response refuser( @PathParam("dossierId") UUID dossierId, @QueryParam("validateurId") UUID validateurId, @QueryParam("motif") String motif) { KycDossierResponse response = kycAmlService.refuser( dossierId, validateurId, motif, identity.getPrincipal().getName()); return Response.ok(response).build(); } /** Liste les dossiers KYC en attente de validation. */ @GET @Path("/dossiers/en-attente") @RolesAllowed({"SUPER_ADMIN", "ADMIN_ORGANISATION"}) public List getDossiersEnAttente() { return kycAmlService.getDossiersEnAttente(); } /** Liste les membres PEP (Personnes Exposées Politiquement). */ @GET @Path("/pep") @RolesAllowed({"SUPER_ADMIN"}) public List getPep() { return kycAmlService.getDossiersPep(); } /** Pièces d'identité expirant dans les 30 jours. */ @GET @Path("/pieces-expirant-bientot") @RolesAllowed({"SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER"}) public List getPiecesExpirant() { return kycAmlService.getPiecesExpirantDansLes30Jours(); } }