Skip to content

Commit

Permalink
Ajoute la récupération dynamique des caractéristiques des PEI
Browse files Browse the repository at this point in the history
Change-Id: Ic4f88917877bfc177b52af16551ea5ec5c49e0e2
  • Loading branch information
hboAtol committed Oct 3, 2023
1 parent 58f2b20 commit 173864d
Show file tree
Hide file tree
Showing 5 changed files with 279 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import fr.sdis83.remocra.db.model.remocra.tables.pojos.Parametre;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import org.jooq.DSLContext;

public class ParametreRepository {

private final DSLContext context;

@Inject
public ParametreRepository(DSLContext context) {
this.context = context;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import static fr.sdis83.remocra.db.model.remocra.Tables.GESTIONNAIRE;
import static fr.sdis83.remocra.db.model.remocra.Tables.HYDRANT;
import static fr.sdis83.remocra.db.model.remocra.Tables.HYDRANT_ANOMALIES;
import static fr.sdis83.remocra.db.model.remocra.Tables.HYDRANT_PENA;
import static fr.sdis83.remocra.db.model.remocra.Tables.HYDRANT_PIBI;
import static fr.sdis83.remocra.db.model.remocra.Tables.PARAM_CONF;
import static fr.sdis83.remocra.db.model.remocra.Tables.PROFIL_DROIT;
import static fr.sdis83.remocra.db.model.remocra.Tables.PROFIL_ORGANISME_UTILISATEUR_DROIT;
Expand All @@ -23,6 +25,7 @@
import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_HYDRANT_SAISIE;
import static fr.sdis83.remocra.db.model.remocra.Tables.UTILISATEUR;

import fr.sdis83.remocra.enums.PeiCaracteristique;
import fr.sdis83.remocra.util.GlobalConstants;
import fr.sdis83.remocra.web.model.authn.ParamConfModel;
import fr.sdis83.remocra.web.model.mobilemodel.TypeDroitModel;
Expand All @@ -41,10 +44,18 @@
import fr.sdis83.remocra.web.model.referentiel.TypeHydrantNatureDeciModel;
import fr.sdis83.remocra.web.model.referentiel.TypeHydrantNatureModel;
import fr.sdis83.remocra.web.model.referentiel.TypeHydrantSaisieModel;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject;
import org.jooq.DSLContext;
import org.jooq.Field;
import org.jooq.Record;
import org.jooq.RecordHandler;
import org.jooq.SelectOnConditionStep;
import org.jooq.impl.DSL;

public class ReferentielRepository {
Expand Down Expand Up @@ -310,4 +321,184 @@ public List<TypeDroitModel> getTypeDroitMobileList(Long idUtilisateur) {
.and(UTILISATEUR.ID.eq(idUtilisateur))
.fetchInto(TypeDroitModel.class);
}

/**
* Construit une Map des caractéristiques désirées pour les PEI ; On *veut* conserver l'ordre des
* caractéristiques pour affichage dans l'appli mobile.
*/
public Map<Long, List<PeiCaracteristiquePojo>> getPeiCaracteristiques(
List<PeiCaracteristique> pibiSelectedFields, List<PeiCaracteristique> penaSelectedFields) {

// Les PIBI
SelectOnConditionStep<Record> onClausePibi =
context
.select(buildSelectFields(pibiSelectedFields))
.from(HYDRANT)
.innerJoin(HYDRANT_PIBI)
.on(HYDRANT.ID.eq(HYDRANT_PIBI.ID));
onClausePibi = buildJoinClauses(pibiSelectedFields, onClausePibi);

Map<Long, List<PeiCaracteristiquePojo>> mapPeiCaracteristiques =
new HashMap<>(fetchAndMapResults(pibiSelectedFields, onClausePibi));

// Les PENA
SelectOnConditionStep<Record> onClausePena =
context
.select(buildSelectFields(penaSelectedFields))
.from(HYDRANT)
.innerJoin(HYDRANT_PENA)
.on(HYDRANT.ID.eq(HYDRANT_PENA.ID));
onClausePena = buildJoinClauses(pibiSelectedFields, onClausePena);

mapPeiCaracteristiques.putAll(fetchAndMapResults(pibiSelectedFields, onClausePena));

return mapPeiCaracteristiques;
}

/**
* Construit un Set des Fields qu'on a besoin de projeter
*
* @param selectedFields List<PeiCaracteristique>
* @return Set<Field<?>>
*/
private Set<Field<?>> buildSelectFields(List<PeiCaracteristique> selectedFields) {
Set<Field<?>> fieldsToSelect = new HashSet<>();
// On a besoin de l'ID pour construire la map à retourner
fieldsToSelect.add(HYDRANT.ID);
for (PeiCaracteristique selectedField : selectedFields) {
// à chaque objet correspond un champ en base
fieldsToSelect.add(getFieldFromCaracteristique(selectedField));
}
return fieldsToSelect;
}

/**
* Fetch les résultats de la requête, et map les résultats dans une Map<idHydrant,
* List<PeiCaracteristiquePojo>>
*
* @param selectedFields List<PeiCaracteristique>
* @param onClause SelectOnConditionStep
* @return Map<Long, List<PeiCaracteristiquePojo>>
*/
private Map<Long, List<PeiCaracteristiquePojo>> fetchAndMapResults(
List<PeiCaracteristique> selectedFields, SelectOnConditionStep<Record> onClause) {
Map<Long, List<PeiCaracteristiquePojo>> mapPeiCaracteristiques = new HashMap<>();
onClause.fetchInto(
(RecordHandler<Record>)
record -> {
List<PeiCaracteristiquePojo> peiCaracteristiques =
selectedFields.stream()
.map(
caracteristique -> {
Object value = record.get(getFieldFromCaracteristique(caracteristique));
return new PeiCaracteristiquePojo(caracteristique, value);
})
.collect(Collectors.toList());

mapPeiCaracteristiques.put(record.get(HYDRANT.ID), peiCaracteristiques);
});
return mapPeiCaracteristiques;
}

/**
* Construit les clauses "INNER JOIN" à rajouter à la requête en fonction des champs voulus por
* l'utilisateur. <br>
* S'assure qu'on n'a qu'une seule fois la même jointure
*
* @param selectedFields List<PeiCaracteristique>
* @param onClausePibi SelectOnConditionStep
* @return SelectOnConditionStep (mis à jour)
*/
private static SelectOnConditionStep<Record> buildJoinClauses(
List<PeiCaracteristique> selectedFields, SelectOnConditionStep<Record> onClausePibi) {
boolean jointureNature = false;
for (PeiCaracteristique caracteristique : selectedFields) {
switch (caracteristique) {
// Valeurs communes aux 2 types
case TYPE_PEI:
if (!jointureNature) {
onClausePibi =
onClausePibi
.innerJoin(TYPE_HYDRANT_NATURE)
.on(HYDRANT.NATURE.eq(TYPE_HYDRANT_NATURE.ID));
jointureNature = true;
}
onClausePibi =
onClausePibi
.innerJoin(TYPE_HYDRANT)
.on(TYPE_HYDRANT_NATURE.TYPE_HYDRANT.eq(TYPE_HYDRANT.ID));
break;
case NATURE_PEI:
if (!jointureNature) {
onClausePibi =
onClausePibi
.innerJoin(TYPE_HYDRANT_NATURE)
.on(HYDRANT.NATURE.eq(TYPE_HYDRANT_NATURE.ID));
jointureNature = true;
}
break;
// Valeurs spécifiques aux PIBI

// Valeurs spécifiques aux PENA

}
}
return onClausePibi;
}

/**
* Retourne le FIELD associé à la valeur d'un {@link PeiCaracteristique}
*
* @param caracteristique PeiCaracteristique
* @return Field<?>
*/
private Field<?> getFieldFromCaracteristique(PeiCaracteristique caracteristique) {
switch (caracteristique) {
// Valeurs communes aux 2 types
case TYPE_PEI:
return TYPE_HYDRANT.NOM;
case NATURE_PEI:
return TYPE_HYDRANT_NATURE.NOM;
case AUTORITE_POLICE:
return null;
case TYPE_DECI:
// TODO Pas sûr !
return HYDRANT.NATURE_DECI;
case SERVICE_PUBLIC:
case MAINTENANCE_CTP:
return null;

case COMPLEMENT:
return HYDRANT.COMPLEMENT;
case DATE_RECEPTION:
return HYDRANT.DATE_RECEP;
// Valeurs spécifiques aux PIBI
case DIAMETRE_NOMINAL:
return HYDRANT_PIBI.DIAMETRE;
// Valeurs spécifiques aux PENA
}
throw new IllegalArgumentException("Valeur '" + caracteristique + "' non prévue");
}

/**
* Classe permettant de représenter un type d'attribut (défini par PeiCaracteristique) et la
* valeur concernée (value)
*/
public static class PeiCaracteristiquePojo {
private final PeiCaracteristique caracteristique;
private final Object value;

public PeiCaracteristique getCaracteristique() {
return caracteristique;
}

public Object getValue() {
return value;
}

public PeiCaracteristiquePojo(PeiCaracteristique caracteristique, Object value) {
this.caracteristique = caracteristique;
this.value = value;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package fr.sdis83.remocra.usecase.referentiel;

import fr.sdis83.remocra.db.model.remocra.tables.pojos.Parametre;
import fr.sdis83.remocra.enums.PeiCaracteristique;
import fr.sdis83.remocra.repository.ParametreRepository;
import fr.sdis83.remocra.repository.ReferentielRepository;
import fr.sdis83.remocra.util.GlobalConstants;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject;

/**
* UseCase permettant de gérer la récupération dynamique des caractéristiques des PEI, et leur
* transformation en vue d'être affichées par l'appli mobile
*/
public class PeiCaracteristiquesUseCase {

@Inject ReferentielRepository referentielRepository;

@Inject ParametreRepository parametreRepository;

@Inject
public Map<Long, String> getPeiCaracteristiques() {
Map<String, Parametre> mapParametres =
parametreRepository.getParametres(
Set.of(
GlobalConstants.PARAMETRE_CARACTERISTIQUE_PIBI,
GlobalConstants.PARAMETRE_CARACTERISTIQUE_PENA));

String pibiSelectedCaracteristiques =
mapParametres.get(GlobalConstants.PARAMETRE_CARACTERISTIQUE_PIBI).getValeurParametre();
String penaSelectedCaracteristiques =
mapParametres.get(GlobalConstants.PARAMETRE_CARACTERISTIQUE_PENA).getValeurParametre();
Map<Long, List<ReferentielRepository.PeiCaracteristiquePojo>> map =
referentielRepository.getPeiCaracteristiques(
fromStringParameter(pibiSelectedCaracteristiques),
fromStringParameter(penaSelectedCaracteristiques));

// On transforme la liste de caractéristiques en HTML (liste à puces dans une DIV)
Map<Long, String> mapRetour = new HashMap<>();
map.forEach(
(key, value) -> {
String decorated =
"<div><ul>"
+ value.stream()
.map(
it ->
"<li>"
+ it.getCaracteristique().getLibelle()
+ " : "
+ it.getValue()
+ "</li>")
.collect(Collectors.joining())
+ "</ul></div>";
mapRetour.put(key, decorated);
});

return mapRetour;
}

private static List<PeiCaracteristique> fromStringParameter(String selectedCaracteristiques) {
return Arrays.stream(selectedCaracteristiques.split(","))
.map(String::trim)
.map(PeiCaracteristique::fromString)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,9 @@ public String getTypeDocument() {

/** Clé de la table "Parametre" pour la gestion des agents dans l'application mobile */
public static final String GESTION_AGENT = "GESTION_AGENT";

/** Paramètres utilisés dans le cadre de l'appli mobile */
public static final String PARAMETRE_CARACTERISTIQUE_PIBI = "CARACTERISTIQUE_PIBI";

public static final String PARAMETRE_CARACTERISTIQUE_PENA = "CARACTERISTIQUE_PENA";
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import fr.sdis83.remocra.repository.ParametreRepository;
import fr.sdis83.remocra.repository.ReferentielRepository;
import fr.sdis83.remocra.repository.UtilisateursRepository;
import fr.sdis83.remocra.usecase.referentiel.PeiCaracteristiquesUseCase;
import fr.sdis83.remocra.util.GlobalConstants;
import fr.sdis83.remocra.web.model.authn.ParamConfModel;
import fr.sdis83.remocra.web.model.mobilemodel.TypeDroitModel;
Expand All @@ -26,6 +27,7 @@
import fr.sdis83.remocra.web.model.referentiel.TypeHydrantSaisieModel;
import io.swagger.v3.oas.annotations.Operation;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.ws.rs.Consumes;
Expand All @@ -44,6 +46,8 @@ public class MobileReferentielEndpoint {
@Inject UtilisateursRepository utilisateursRepository;
@Inject ParametreRepository parametreRepository;

@Inject PeiCaracteristiquesUseCase peiCaracteristiquesUseCase;

@Inject @CurrentUser Provider<UserInfo> currentUser;

@GET
Expand Down Expand Up @@ -77,7 +81,8 @@ public Response getReferentiel() {
parametreRepository
.getParametre(GlobalConstants.GESTION_AGENT)
.getValeurParametre(),
utilisateursRepository.getNomPrenom(idUtilisateur)))
utilisateursRepository.getNomPrenom(idUtilisateur),
peiCaracteristiquesUseCase.getPeiCaracteristiques()))
.build();
}

Expand All @@ -103,6 +108,7 @@ static class ReferentielResponse {
// Renvoie la méthode de gestion des Agents
public final String gestionAgents;
public final String utilisateurConnecte;
public final Map<Long, String> peiCaracteristiques;

public ReferentielResponse(
List<CommuneModel> communes,
Expand All @@ -123,7 +129,8 @@ public ReferentielResponse(
List<ParamConfModel> paramsConf,
List<TypeDroitModel> typesDroit,
String gestionAgents,
String utilisateurConnecte) {
String utilisateurConnecte,
Map<Long, String> peiCaracteristiques) {
this.communes = communes;
this.hydrants = hydrants;
this.hydrantsAnomalies = hydrantsAnomalies;
Expand All @@ -143,6 +150,7 @@ public ReferentielResponse(
this.typesDroit = typesDroit;
this.gestionAgents = gestionAgents;
this.utilisateurConnecte = utilisateurConnecte;
this.peiCaracteristiques = peiCaracteristiques;
}
}
}

0 comments on commit 173864d

Please sign in to comment.