dev #17

Merged
Thibaut merged 5 commits from dev into master 2025-02-04 15:11:17 +00:00
9 changed files with 38 additions and 15 deletions

View File

@ -139,6 +139,12 @@
<groupId>io.quarkus</groupId> <groupId>io.quarkus</groupId>
<artifactId>quarkus-mailer</artifactId> <artifactId>quarkus-mailer</artifactId>
</dependency> </dependency>
<dependency>
<groupId>net.sf.jmimemagic</groupId>
<artifactId>jmimemagic</artifactId>
<version>0.1.5</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>

View File

@ -48,7 +48,7 @@ public class MembreModel {
Genre genre; Genre genre;
@Schema(description = "Le numéro de licence du membre.", example = "12345") @Schema(description = "Le numéro de licence du membre.", example = "12345")
int licence; Integer licence;
@Schema(description = "Le pays du membre.", example = "FR") @Schema(description = "Le pays du membre.", example = "FR")
String country; String country;

View File

@ -21,6 +21,7 @@ import jakarta.inject.Inject;
import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.hibernate.reactive.mutiny.Mutiny; import org.hibernate.reactive.mutiny.Mutiny;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -211,6 +212,7 @@ public class AffiliationService {
membreModel.setClub(club); membreModel.setClub(club);
membreModel.setRole(member.getRole()); membreModel.setRole(member.getRole());
membreModel.setEmail(member.getEmail()); membreModel.setEmail(member.getEmail());
membreModel.setCountry("FR");
return Panache.withTransaction(() -> return Panache.withTransaction(() ->
combRepository.persist(membreModel) combRepository.persist(membreModel)
.chain(m -> sequenceRepository.getNextValueInTransaction(SequenceType.Licence) .chain(m -> sequenceRepository.getNextValueInTransaction(SequenceType.Licence)
@ -235,10 +237,13 @@ public class AffiliationService {
}).call(m -> Panache.withTransaction(() -> combRepository.persist(m))); }).call(m -> Panache.withTransaction(() -> combRepository.persist(m)));
} }
}) })
.call(m -> (m.getUserId() == null) ? keycloakService.initCompte(m.getId()) : .call(m -> ((m.getUserId() == null) ? keycloakService.initCompte(m.getId()) :
keycloakService.setClubGroupMembre(m, club)) keycloakService.setClubGroupMembre(m, club).map(__ -> m.getUserId()))
.call(m -> Panache.withTransaction(() -> licenceRepository.persist( .call(userId -> keycloakService.setAutoRoleMembre(userId, m.getRole(), m.getGrade_arbitrage())))
new LicenceModel(null, m, saison, null, true)))); .call(m -> m.getLicences().stream().anyMatch(l -> l.getSaison() == saison) ?
Uni.createFrom().nullItem() :
Panache.withTransaction(() -> licenceRepository.persist(
new LicenceModel(null, m, saison, null, true))));
} }
public Uni<?> accept(AffiliationRequestSaveForm form) { public Uni<?> accept(AffiliationRequestSaveForm form) {
@ -271,11 +276,11 @@ public class AffiliationService {
.chain(() -> { .chain(() -> {
ClubModel club = new ClubModel(); ClubModel club = new ClubModel();
club.setName(form.getName()); club.setName(form.getName());
club.setCountry("fr"); club.setCountry("FR");
club.setSIRET(form.getSiret()); club.setSIRET(form.getSiret());
club.setRNA(form.getRna()); club.setRNA(form.getRna());
club.setAddress(form.getAddress()); club.setAddress(form.getAddress());
club.setAffiliations(List.of(new AffiliationModel(null, club, model.getSaison()))); club.setAffiliations(new ArrayList<>());
return Panache.withTransaction(() -> clubRepository.persist(club) return Panache.withTransaction(() -> clubRepository.persist(club)
.chain(c -> sequenceRepository.getNextValueInTransaction(SequenceType.Affiliation) .chain(c -> sequenceRepository.getNextValueInTransaction(SequenceType.Affiliation)
.invoke(c::setNo_affiliation) .invoke(c::setNo_affiliation)
@ -306,7 +311,7 @@ public class AffiliationService {
return Uni.createFrom().nullItem() return Uni.createFrom().nullItem()
.chain(() -> { .chain(() -> {
club.setName(form.getName()); club.setName(form.getName());
club.setCountry("fr"); club.setCountry("FR");
club.setSIRET(form.getSiret()); club.setSIRET(form.getSiret());
club.setRNA(form.getRna()); club.setRNA(form.getRna());
club.setAddress(form.getAddress()); club.setAddress(form.getAddress());

View File

@ -207,9 +207,8 @@ public class KeycloakService {
throw new KeycloakException("User name is null"); throw new KeycloakException("User name is null");
})).chain(membreModel -> creatUser(membreModel).chain(user -> { })).chain(membreModel -> creatUser(membreModel).chain(user -> {
LOGGER.infof("Set user id %s to membre %s", user.getId(), membreModel.getId()); LOGGER.infof("Set user id %s to membre %s", user.getId(), membreModel.getId());
return membreService.setUserId(membreModel.getId(), user.getId()); return membreService.setUserId(membreModel.getId(), user.getId()).map(__ -> user.getId());
})) }));
.map(__ -> "OK");
} }
private Uni<UserRepresentation> creatUser(MembreModel membreModel) { private Uni<UserRepresentation> creatUser(MembreModel membreModel) {

View File

@ -270,6 +270,7 @@ public class MembreService {
model.setFname(input.getFname()); model.setFname(input.getFname());
model.setLname(input.getLname()); model.setLname(input.getLname());
model.setEmail(input.getEmail()); model.setEmail(input.getEmail());
model.setLicence(null);
model.setGenre(input.getGenre()); model.setGenre(input.getGenre());
model.setCountry(input.getCountry()); model.setCountry(input.getCountry());
model.setBirth_date(input.getBirth_date()); model.setBirth_date(input.getBirth_date());

View File

@ -23,6 +23,7 @@ import org.eclipse.microprofile.openapi.annotations.responses.APIResponses;
import org.eclipse.microprofile.openapi.annotations.tags.Tag; import org.eclipse.microprofile.openapi.annotations.tags.Tag;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Objects;
import java.util.function.Consumer; import java.util.function.Consumer;
@Tag(name = "Membre", description = "Gestion des membres") @Tag(name = "Membre", description = "Gestion des membres")
@ -119,7 +120,9 @@ public class MembreEndpoints {
@APIResponse(responseCode = "500", description = "Erreur interne du serveur") @APIResponse(responseCode = "500", description = "Erreur interne du serveur")
}) })
public Uni<Response> getPhoto(@PathParam("id") long id) throws URISyntaxException { public Uni<Response> getPhoto(@PathParam("id") long id) throws URISyntaxException {
return Utils.getMediaFile(id, media, "ppMembre", membreService.getById(id).onItem().invoke(checkPerm)); return Utils.getMediaFile(id, media, "ppMembre", membreService.getById(id).onItem()
.call(m -> Objects.equals(m.getUserId(), securityCtx.getSubject()) ?
Uni.createFrom().nullItem() : Uni.createFrom().item(m).invoke(checkPerm)));
} }
@GET @GET

View File

@ -5,6 +5,10 @@ import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import jodd.net.MimeTypes; import jodd.net.MimeTypes;
import net.sf.jmimemagic.Magic;
import net.sf.jmimemagic.MagicException;
import net.sf.jmimemagic.MagicMatchNotFoundException;
import net.sf.jmimemagic.MagicParseException;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import java.io.*; import java.io.*;
@ -76,7 +80,12 @@ public class Utils {
return "OK"; return "OK";
try (InputStream is = new BufferedInputStream(new ByteArrayInputStream(input))) { try (InputStream is = new BufferedInputStream(new ByteArrayInputStream(input))) {
String mimeType = URLConnection.guessContentTypeFromStream(is); String mimeType;
try {
mimeType = Magic.getMagicMatch(input, false).getMimeType();
} catch (MagicParseException | MagicMatchNotFoundException | MagicException e) {
mimeType = URLConnection.guessContentTypeFromStream(is);
}
String[] detectedExtensions = MimeTypes.findExtensionsByMimeTypes(mimeType, false); String[] detectedExtensions = MimeTypes.findExtensionsByMimeTypes(mimeType, false);
if (detectedExtensions.length == 0) if (detectedExtensions.length == 0)
throw new IOException("Fail to detect file extension for MIME type " + mimeType); throw new IOException("Fail to detect file extension for MIME type " + mimeType);

View File

@ -77,7 +77,7 @@ export function MemberPage() {
function PhotoCard({data}) { function PhotoCard({data}) {
return <div className="card mb-4"> return <div className="card mb-4">
<div className="card-header">Licence n°{data.licence}</div> <div className="card-header">{data.licence ? "Licence n°"+data.licence : "Pas de licence"}</div>
<div className="card-body text-center"> <div className="card-body text-center">
<div className="input-group mb-3"> <div className="input-group mb-3">
<img <img

View File

@ -75,7 +75,7 @@ export function MemberPage() {
function PhotoCard({data}) { function PhotoCard({data}) {
return <div className="card mb-4"> return <div className="card mb-4">
<div className="card-header">Licence n°{data.licence}</div> <div className="card-header">{data.licence ? "Licence n°"+data.licence : "Pas de licence"}</div>
<div className="card-body text-center"> <div className="card-body text-center">
<div className="input-group mb-3"> <div className="input-group mb-3">
<img <img