feat: check for email duplication when create or update membre

This commit is contained in:
Thibaut Valentin 2025-08-13 15:16:39 +02:00
parent f75e805cc0
commit 7bd5e7baa5

View File

@ -78,7 +78,8 @@ 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<PageResult<SimpleMembre>> searchAdmin(int limit, int page, String search, String club, int licenceRequest) {
public Uni<PageResult<SimpleMembre>> searchAdmin(int limit, int page, String search, String club,
int licenceRequest) {
if (search == null)
search = "";
search = "%" + search.replaceAll(" ", "% %") + "%";
@ -91,9 +92,11 @@ public class MembreService {
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());
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());
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
@ -128,7 +131,8 @@ public class MembreService {
});
}
public Uni<PageResult<SimpleMembre>> search(int limit, int page, String search, int licenceRequest, String subject) {
public Uni<PageResult<SimpleMembre>> search(int limit, int page, String search, int licenceRequest,
String subject) {
if (search == null)
search = "";
search = "%" + search.replaceAll(" ", "% %") + "%";
@ -141,9 +145,11 @@ public class MembreService {
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());
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());
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
@ -317,6 +323,11 @@ public class MembreService {
public Uni<String> update(long id, FullMemberForm membre) {
return update(repository.findById(id)
.call(__ -> repository.count("email LIKE ?1 AND id != ?2", membre.getEmail(), id)
.invoke(Unchecked.consumer(c -> {
if (c > 0)
throw new DBadRequestException("Email déjà utiliser");
})))
.chain(membreModel -> clubRepository.findById(membre.getClub())
.map(club -> new Pair<>(membreModel, club)))
.onItem().transform(pair -> {
@ -334,6 +345,11 @@ public class MembreService {
public Uni<String> update(long id, FullMemberForm membre, SecurityCtx securityCtx) {
return update(repository.findById(id)
.call(__ -> repository.count("email LIKE ?1 AND id != ?2", membre.getEmail(), id)
.invoke(Unchecked.consumer(c -> {
if (c > 0)
throw new DBadRequestException("Email déjà utiliser");
})))
.invoke(Unchecked.consumer(membreModel -> {
if (!securityCtx.isInClubGroup(membreModel.getClub().getId()))
throw new DForbiddenException();
@ -420,6 +436,10 @@ public class MembreService {
public Uni<Long> add(FullMemberForm input) {
return clubRepository.findById(input.getClub())
.call(__ -> repository.count("email LIKE ?1", input.getEmail())
.invoke(Unchecked.consumer(c -> {
if (c > 0) throw new DBadRequestException("Email déjà utiliser");
})))
.chain(clubModel -> {
MembreModel model = getMembreModel(input, clubModel);
return Panache.withTransaction(() -> repository.persist(model));
@ -432,6 +452,10 @@ public class MembreService {
public Uni<Long> add(FullMemberForm input, String subject) {
return repository.find("userId = ?1", subject).firstResult()
.call(__ -> repository.count("email LIKE ?1", input.getEmail())
.invoke(Unchecked.consumer(c -> {
if (c > 0) throw new DBadRequestException("Email déjà utiliser");
})))
.call(membreModel ->
repository.count(
"unaccent(lname) ILIKE unaccent(?2) AND unaccent(fname) ILIKE unaccent(?2) AND club = ?3",