From 1cd4a1ff97ede4052ccc0fd9975d29ddfc97e345 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Tue, 12 Aug 2025 18:56:04 +0200 Subject: [PATCH] feat: licence state filter membreList --- .../ffsaf/data/model/LicenceModel.java | 2 +- .../ffsaf/domain/service/MembreService.java | 109 +++++++++++++----- .../ffsaf/rest/MembreAdminEndpoints.java | 5 +- .../ffsaf/rest/MembreClubEndpoints.java | 5 +- src/main/webapp/src/pages/MemberList.jsx | 28 ++++- 5 files changed, 107 insertions(+), 42 deletions(-) diff --git a/src/main/java/fr/titionfire/ffsaf/data/model/LicenceModel.java b/src/main/java/fr/titionfire/ffsaf/data/model/LicenceModel.java index 75bb228..9249442 100644 --- a/src/main/java/fr/titionfire/ffsaf/data/model/LicenceModel.java +++ b/src/main/java/fr/titionfire/ffsaf/data/model/LicenceModel.java @@ -30,7 +30,7 @@ public class LicenceModel { @Schema(description = "La saison de la licence.", example = "2025") int saison; - @Schema(description = "Nom du médecin sur certificat médical.", example = "M. Jean") + @Schema(description = "Nom du médecin sur certificat médical.", example = "M. Jean") // TODO Update for date String certificate; @Schema(description = "Licence validée", example = "true") diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java index 72e54ef..0c632c7 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java @@ -78,46 +78,93 @@ public class MembreService { final static String FIND_NAME_REQUEST = "unaccent(fname) ILIKE unaccent(?1) OR unaccent(lname) ILIKE unaccent(?1) " + "OR unaccent(fname || ' ' || lname) ILIKE unaccent(?1) OR unaccent(lname || ' ' || fname) ILIKE unaccent(?1)"; - public Uni> searchAdmin(int limit, int page, String search, String club) { - if (search == null) - search = ""; - search = "%" + search.replaceAll(" ", "% %") + "%"; - - PanacheQuery query; - - if (club == null || club.isBlank()) { - query = repository.find(FIND_NAME_REQUEST, Sort.ascending("fname", "lname"), search) - .page(Page.ofSize(limit)); - } else { - if (club.equals("null")) { - query = repository.find( - "club IS NULL AND (" + FIND_NAME_REQUEST + ")", - Sort.ascending("fname", "lname"), search).page(Page.ofSize(limit)); - } else { - query = repository.find( - "LOWER(club.name) LIKE LOWER(?2) AND (" + FIND_NAME_REQUEST + ")", - Sort.ascending("fname", "lname"), search, club + "%").page(Page.ofSize(limit)); - } - } - return getPageResult(query, limit, page); - } - - public Uni> search(int limit, int page, String search, String subject) { + public Uni> searchAdmin(int limit, int page, String search, String club, int licenceRequest) { if (search == null) search = ""; search = "%" + search.replaceAll(" ", "% %") + "%"; String finalSearch = search; - return repository.find("userId = ?1", subject).firstResult() - .chain(membreModel -> { - PanacheQuery query = repository.find( - "club = ?2 AND (" + FIND_NAME_REQUEST + ")", - Sort.ascending("fname", "lname"), finalSearch, membreModel.getClub()) - .page(Page.ofSize(limit)); + + Uni> baseUni; + if (licenceRequest == 0 || licenceRequest == 1) + baseUni = licenceRepository.list("saison = ?1", Utils.getSaison()); + else if (licenceRequest == 2) + baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE", Utils.getSaison()); + else if (licenceRequest == 5) + baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE AND LENGTH(certificate) >= 3", Utils.getSaison()); + else if (licenceRequest == 6) + baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE AND LENGTH(certificate) <= 2", Utils.getSaison()); + else if (licenceRequest == 3) + baseUni = licenceRepository.list("saison = ?1 AND validate = TRUE", Utils.getSaison()); + else + baseUni = Uni.createFrom().item(new ArrayList<>()); + + return baseUni + .map(l -> l.stream().map(l2 -> l2.getMembre().getId()).toList()) + .chain(ids -> { + PanacheQuery query; + + String idf = ((licenceRequest == 0 || licenceRequest == 4) ? "NOT IN" : "IN"); + + if (club == null || club.isBlank()) { + LOGGER.info(ids); + query = repository.find( + "id " + idf + " ?2 AND (" + FIND_NAME_REQUEST + ")", + Sort.ascending("fname", "lname"), finalSearch, ids) + .page(Page.ofSize(limit)); + } else { + if (club.equals("null")) { + query = repository.find( + "id " + idf + " ?2 AND club IS NULL AND (" + FIND_NAME_REQUEST + ")", + Sort.ascending("fname", "lname"), finalSearch, ids).page(Page.ofSize(limit)); + } else { + query = repository.find( + "id " + idf + " ?3 AND LOWER(club.name) LIKE LOWER(?2) AND (" + FIND_NAME_REQUEST + ")", + Sort.ascending("fname", "lname"), finalSearch, club + "%", ids) + .page(Page.ofSize(limit)); + } + } return getPageResult(query, limit, page); }); } + public Uni> search(int limit, int page, String search, int licenceRequest, String subject) { + if (search == null) + search = ""; + search = "%" + search.replaceAll(" ", "% %") + "%"; + + String finalSearch = search; + + Uni> baseUni; + if (licenceRequest == 0 || licenceRequest == 1) + baseUni = licenceRepository.list("saison = ?1", Utils.getSaison()); + else if (licenceRequest == 2) + baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE", Utils.getSaison()); + else if (licenceRequest == 5) + baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE AND LENGTH(certificate) >= 3", Utils.getSaison()); + else if (licenceRequest == 6) + baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE AND LENGTH(certificate) <= 2", Utils.getSaison()); + else if (licenceRequest == 3) + baseUni = licenceRepository.list("saison = ?1 AND validate = TRUE", Utils.getSaison()); + else + baseUni = Uni.createFrom().item(new ArrayList<>()); + + return baseUni + .map(l -> l.stream().map(l2 -> l2.getMembre().getId()).toList()) + .chain(ids -> { + String idf = ((licenceRequest == 0 || licenceRequest == 4) ? "NOT IN" : "IN"); + + return repository.find("userId = ?1", subject).firstResult() + .chain(membreModel -> { + PanacheQuery query = repository.find( + "id " + idf + " ?3 AND club = ?2 AND (" + FIND_NAME_REQUEST + ")", + Sort.ascending("fname", "lname"), finalSearch, membreModel.getClub(), ids) + .page(Page.ofSize(limit)); + return getPageResult(query, limit, page); + }); + }); + } + private Uni> getPageResult(PanacheQuery query, int limit, int page) { return Uni.createFrom().item(new PageResult()) .invoke(result -> result.setPage(page)) diff --git a/src/main/java/fr/titionfire/ffsaf/rest/MembreAdminEndpoints.java b/src/main/java/fr/titionfire/ffsaf/rest/MembreAdminEndpoints.java index 82865fd..5fb8f82 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/MembreAdminEndpoints.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/MembreAdminEndpoints.java @@ -57,12 +57,13 @@ public class MembreAdminEndpoints { @Parameter(description = "Nombre max de résulta (max 50)") @QueryParam("limit") Integer limit, @Parameter(description = "Page à consulter") @QueryParam("page") Integer page, @Parameter(description = "Text à rechercher") @QueryParam("search") String search, - @Parameter(description = "Club à filter") @QueryParam("club") String club) { + @Parameter(description = "Club à filter") @QueryParam("club") String club, + @Parameter(description = "Etat de la demande de licence: 0 -> sans demande, 1 -> avec demande ou validée, 2 -> toute les demande non validée, 3 -> validée, 4 -> tout, 5 -> demande complete, 6 -> demande incomplete") @QueryParam("licenceRequest") int licenceRequest) { if (limit == null) limit = 50; if (page == null || page < 1) page = 1; - return membreService.searchAdmin(limit, page - 1, search, club); + return membreService.searchAdmin(limit, page - 1, search, club, licenceRequest); } @GET diff --git a/src/main/java/fr/titionfire/ffsaf/rest/MembreClubEndpoints.java b/src/main/java/fr/titionfire/ffsaf/rest/MembreClubEndpoints.java index 2c6a3ce..4dcc4e1 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/MembreClubEndpoints.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/MembreClubEndpoints.java @@ -49,12 +49,13 @@ public class MembreClubEndpoints { public Uni> getFindClub( @Parameter(description = "Nombre max de résulta (max 50)") @QueryParam("limit") Integer limit, @Parameter(description = "Page à consulter") @QueryParam("page") Integer page, - @Parameter(description = "Text à rechercher") @QueryParam("search") String search) { + @Parameter(description = "Text à rechercher") @QueryParam("search") String search, + @Parameter(description = "Etat de la demande de licence: 0 -> sans demande, 1 -> avec demande ou validée, 2 -> toute les demande non validée, 3 -> validée, 4 -> tout, 5 -> demande complete, 6 -> demande incomplete") @QueryParam("licenceRequest") int licenceRequest) { if (limit == null) limit = 50; if (page == null || page < 1) page = 1; - return membreService.search(limit, page - 1, search, securityCtx.getSubject()); + return membreService.search(limit, page - 1, search, licenceRequest, securityCtx.getSubject()); } @GET diff --git a/src/main/webapp/src/pages/MemberList.jsx b/src/main/webapp/src/pages/MemberList.jsx index 1bfc32a..54a568f 100644 --- a/src/main/webapp/src/pages/MemberList.jsx +++ b/src/main/webapp/src/pages/MemberList.jsx @@ -21,15 +21,16 @@ export function MemberList({source}) { const [licenceData, setLicenceData] = useState([]); const [showLicenceState, setShowLicenceState] = useState(false); const [clubFilter, setClubFilter] = useState(""); + const [stateFilter, setStateFilter] = useState(4) const [lastSearch, setLastSearch] = useState(""); const setLoading = useLoadingSwitcher() - const {data, error, refresh} = useFetch(`/member/find/${source}?page=${page}`, setLoading, 1) + const {data, error, refresh} = useFetch(`/member/find/${source}?page=${page}&licenceRequest=${stateFilter}`, setLoading, 1) useEffect(() => { - refresh(`/member/find/${source}?page=${page}&search=${lastSearch}&club=${clubFilter}`); - }, [hash, clubFilter]); + refresh(`/member/find/${source}?page=${page}&search=${lastSearch}&club=${clubFilter}&licenceRequest=${stateFilter}`); + }, [hash, clubFilter, stateFilter]); useEffect(() => { if (!data) @@ -73,7 +74,7 @@ export function MemberList({source}) { if (search === lastSearch) return; setLastSearch(search); - refresh(`/member/find/${source}?page=${page}&search=${search}&club=${clubFilter}`); + refresh(`/member/find/${source}?page=${page}&search=${search}&club=${clubFilter}&licenceRequest=${stateFilter}`); } return <> @@ -92,12 +93,16 @@ export function MemberList({source}) {
+ {source === "admin" && + }
Filtre
+ clubFilter={clubFilter} setClubFilter={setClubFilter} source={source} + stateFilter={stateFilter} setStateFilter={setStateFilter}/>
@@ -381,7 +386,7 @@ function MakeRow({member, showLicenceState, navigate, source}) { let allClub = [] -function FiltreBar({showLicenceState, setShowLicenceState, data, clubFilter, setClubFilter, source}) { +function FiltreBar({showLicenceState, setShowLicenceState, data, clubFilter, setClubFilter, source, stateFilter, setStateFilter}) { useEffect(() => { if (!data) return; @@ -394,6 +399,17 @@ function FiltreBar({showLicenceState, setShowLicenceState, data, clubFilter, set
{source !== "club" && } +
+ +
}