Skip to content

Commit

Permalink
Revoit le useCase des visites de l'API...
Browse files Browse the repository at this point in the history
... on utilise les "moments" plutôt que java.util.Date,
on met les requêtes dans des repositories,
on crée des constantes et enum pour les valeurs prédéfinies,
et on factorise ce qui peut l'être

Change-Id: Ie66f7fdbe9e8b916d8dff68728a6fd3fa6b070e5
  • Loading branch information
hboAtol committed Aug 2, 2023
1 parent da28b4e commit 9cca1ea
Show file tree
Hide file tree
Showing 13 changed files with 1,156 additions and 921 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package fr.sdis83.remocra.repository;

import org.jooq.DSLContext;

import javax.inject.Inject;

import static fr.sdis83.remocra.db.model.remocra.tables.HydrantAnomalies.HYDRANT_ANOMALIES;

public class HydrantAnomalieRepository {

private final DSLContext context;




@Inject
public HydrantAnomalieRepository(DSLContext context) {
this.context = context;
}

public void insertAnomalie(Long peiId, long anomalieId) {
context
.insertInto(HYDRANT_ANOMALIES)
.set(HYDRANT_ANOMALIES.HYDRANT, peiId)
.set(HYDRANT_ANOMALIES.ANOMALIES, anomalieId)
.execute();
}
}

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package fr.sdis83.remocra.repository;

import fr.sdis83.remocra.authn.CurrentUser;
import fr.sdis83.remocra.authn.UserInfo;
import fr.sdis83.remocra.db.model.remocra.tables.pojos.TypeHydrantAnomalie;
import org.jooq.DSLContext;

import javax.inject.Inject;
import javax.inject.Provider;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

import static fr.sdis83.remocra.db.model.remocra.Tables.HYDRANT_ANOMALIES;
import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_HYDRANT_ANOMALIE;
import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_HYDRANT_ANOMALIE_NATURE;
import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_HYDRANT_ANOMALIE_NATURE_SAISIES;
import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_HYDRANT_NATURE;
import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_HYDRANT_SAISIE;

public class TypeHydrantAnomalieRepository {
private final DSLContext context;

@Inject
@CurrentUser
Provider<UserInfo> currentUser;

@Inject
public TypeHydrantAnomalieRepository(DSLContext context) {
this.context = context;
}

public List<TypeHydrantAnomalie> getAll() {
return context.selectFrom(TYPE_HYDRANT_ANOMALIE).fetchInto(TypeHydrantAnomalie.class);
}

public int getNbAnomaliesChecked(String codeTypeVisite, String codeTypeHydrantNature, List<String> controlees) {
return context
.selectCount()
.from(TYPE_HYDRANT_ANOMALIE)
.join(TYPE_HYDRANT_ANOMALIE_NATURE).on(TYPE_HYDRANT_ANOMALIE_NATURE.ANOMALIE.eq(TYPE_HYDRANT_ANOMALIE.ID))
.join(TYPE_HYDRANT_ANOMALIE_NATURE_SAISIES).on(TYPE_HYDRANT_ANOMALIE_NATURE_SAISIES.TYPE_HYDRANT_ANOMALIE_NATURE.eq(TYPE_HYDRANT_ANOMALIE_NATURE.ID))
.join(TYPE_HYDRANT_SAISIE).on(TYPE_HYDRANT_SAISIE.ID.eq(TYPE_HYDRANT_ANOMALIE_NATURE_SAISIES.SAISIES))
.join(TYPE_HYDRANT_NATURE).on(TYPE_HYDRANT_ANOMALIE_NATURE.NATURE.eq(TYPE_HYDRANT_NATURE.ID))
.where(TYPE_HYDRANT_SAISIE.CODE.equalIgnoreCase(codeTypeVisite)
.and(TYPE_HYDRANT_NATURE.CODE.eq(codeTypeHydrantNature))
.and(TYPE_HYDRANT_ANOMALIE.CODE.in(controlees)))
.fetchOneInto(Integer.class);
}

public List<TypeHydrantAnomalie> getAnomaliesSysteme() {
return context
.selectFrom(TYPE_HYDRANT_ANOMALIE)
.where(TYPE_HYDRANT_ANOMALIE.CRITERE.isNull())
.fetchInto(TypeHydrantAnomalie.class);
}

public void deleteAnomaliesNonSysteme(Long peiId) {
Collection<Long> anomaliesSysteme = getAnomaliesSysteme()
.stream()
.map(TypeHydrantAnomalie::getId)
.collect(Collectors.toList());

// Suppression des anomalies (hors anomalies système) enregistrées de cet hydrant
context
.deleteFrom(HYDRANT_ANOMALIES)
.where(HYDRANT_ANOMALIES.HYDRANT.eq(peiId).and(HYDRANT_ANOMALIES.ANOMALIES.notIn(anomaliesSysteme)))
.execute();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.sdis83.remocra.db.model.remocra.tables.pojos.TypeHydrantNature;
import fr.sdis83.remocra.web.model.referentielsCommuns.ReferentielModel;
import org.jooq.Condition;
import org.jooq.DSLContext;
Expand All @@ -10,6 +11,7 @@
import javax.inject.Inject;
import java.util.List;

import static fr.sdis83.remocra.db.model.remocra.Tables.HYDRANT;
import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_HYDRANT_NATURE;
import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_HYDRANT;

Expand Down Expand Up @@ -40,4 +42,11 @@ private Integer count() {
return context.fetchCount(TYPE_HYDRANT_NATURE);
}

public TypeHydrantNature getById(Long id) {
return context
.selectFrom(TYPE_HYDRANT_NATURE)
.where(TYPE_HYDRANT_NATURE.ID.eq(id))
.fetchOneInto(TypeHydrantNature.class);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.sdis83.remocra.web.model.referentielsCommuns.NameModel;
import fr.sdis83.remocra.db.model.remocra.tables.pojos.TypeHydrantSaisie;
import fr.sdis83.remocra.web.model.referentielsCommuns.ReferentielModel;
import org.jooq.DSLContext;

Expand All @@ -22,16 +22,30 @@ public TypeHydrantSaisieRepository(DSLContext context) {

public String getAll(Integer start, Integer limit) throws JsonProcessingException {

List<ReferentielModel> list = context
.selectFrom(TYPE_HYDRANT_SAISIE)
.limit((limit == null || limit < 0) ? this.count() : limit)
.offset((start == null || start < 0) ? 0 : start)
.fetchInto(ReferentielModel.class);
List<ReferentielModel> list = context
.selectFrom(TYPE_HYDRANT_SAISIE)
.limit((limit == null || limit < 0) ? this.count() : limit)
.offset((start == null || start < 0) ? 0 : start)
.fetchInto(ReferentielModel.class);

return new ObjectMapper().writeValueAsString(list);
}
return new ObjectMapper().writeValueAsString(list);
}

private Integer count() {
return context.fetchCount(TYPE_HYDRANT_SAISIE);
}

public TypeHydrantSaisie getByCode(String codeTypeVisite) {
return context
.selectFrom(TYPE_HYDRANT_SAISIE)
.where(TYPE_HYDRANT_SAISIE.CODE.equalIgnoreCase(codeTypeVisite))
.fetchOneInto(TypeHydrantSaisie.class);
}

public TypeHydrantSaisie getById(Long id) {
return context
.selectFrom(TYPE_HYDRANT_SAISIE)
.where(TYPE_HYDRANT_SAISIE.ID.eq(id))
.fetchOneInto(TypeHydrantSaisie.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import fr.sdis83.remocra.db.model.tracabilite.tables.Hydrant;
import fr.sdis83.remocra.db.model.tracabilite.tables.HydrantVisite;
import fr.sdis83.remocra.repository.PeiRepository;
import fr.sdis83.remocra.usecase.utils.DateUtils;
import fr.sdis83.remocra.usecase.utils.UseCaseUtils;
import fr.sdis83.remocra.util.GlobalConstants;
import fr.sdis83.remocra.web.exceptions.ResponseException;
import fr.sdis83.remocra.web.model.pei.PeiDiffModel;
Expand Down Expand Up @@ -355,14 +357,14 @@ protected List<HydrantAccessibilite> listHydrantsAccessibilite(List<String> list
throw new IllegalArgumentException("null argument given : listPei");
}

Long userId = currentUser.get().userId();
String userType = currentUser.get().type();
UseCaseUtils.OrganismeIdType organisme = new UseCaseUtils.OrganismeIdType(currentUser.get().userId(), currentUser.get().type());


return context.select(HYDRANT.ID, HYDRANT.NUMERO, HYDRANT.MAINTENANCE_DECI, HYDRANT.SP_DECI, HYDRANT_PIBI.SERVICE_EAUX)
.from(HYDRANT)
.leftJoin(HYDRANT_PIBI).on(HYDRANT_PIBI.ID.eq(HYDRANT.ID))
.where(listPei.isEmpty() ? DSL.noCondition() : HYDRANT.NUMERO.in(listPei))
.fetch(new RecordMapper<Record5<Long, String, Long, Long, Long>, HydrantAccessibilite>() {
.fetch(new RecordMapper<>() {
@Override
public HydrantAccessibilite map(Record5<Long, String, Long, Long, Long> record) {
return new HydrantAccessibilite(
Expand All @@ -376,68 +378,18 @@ public HydrantAccessibilite map(Record5<Long, String, Long, Long, Long> record)
}

private boolean computeAccessibilite(Record5<Long, String, Long, Long, Long> record) {
return isApiAdmin(userType)
|| isMaintenanceDECI(record.value3(), userId, userType)
|| isServicePublicDECI(record.value4(), userId, userType)
|| isServiceEaux(record.value5(), userId, userType);
return UseCaseUtils.isApiAdmin(organisme)
|| UseCaseUtils.isMaintenanceDECI(record.value3(), organisme)
|| UseCaseUtils.isServicePublicDECI(record.value4(), organisme)
|| UseCaseUtils.isServiceEaux(record.value5(), organisme);

}
});
}

/**
* Fonction utilitaire permettant de savoir si l'organisme est la maintenance DECI du PEI
*
* @param hydrantMaintenanceDeciId Id de l'organisme reponsable de la "maintenance DECI"
* @param userId id de l'organisme utilisant l'API
* @param userType type de l'organisme utilisant l'API
* @return boolean
*/
public static boolean isMaintenanceDECI(Long hydrantMaintenanceDeciId, Long userId, String userType) {
return hydrantMaintenanceDeciId != null && hydrantMaintenanceDeciId.equals(userId) && (
GlobalConstants.SERVICE_EAUX.equalsIgnoreCase(userType)
|| GlobalConstants.PRESTATAIRE_TECHNIQUE.equalsIgnoreCase(userType)
|| GlobalConstants.COMMUNE.equalsIgnoreCase(userType)
|| GlobalConstants.EPCI.equalsIgnoreCase(userType)
);
}

/**
* Fonction utilitaire permettant de savoir si l'organisme est le service public DECI du PEI
*
* @param hydrantServicePublicDeciId Id de l'organisme public marqué comme "service public DECI"
* @param userId id de l'organisme utilisant l'API
* @param userType type de l'organisme utilisant l'API
* @return boolean
*/
public boolean isServicePublicDECI(Long hydrantServicePublicDeciId, Long userId, String userType) {
return hydrantServicePublicDeciId != null && hydrantServicePublicDeciId.equals(userId) && (GlobalConstants.COMMUNE.equalsIgnoreCase(userType)
|| GlobalConstants.EPCI.equalsIgnoreCase(userType));
}

/**
* Fonction utilitaire permettant de savoir si l'organisme est le service des eaux du PEI
*
* @param hydrantServiceEauxId Id du service des eaux du PEI
* @param userId id de l'organisme utilisant l'API
* @param userType type de l'organisme utilisant l'API
* @return boolean
*/
public boolean isServiceEaux(Long hydrantServiceEauxId, Long userId, String userType) {
return hydrantServiceEauxId != null && hydrantServiceEauxId.equals(userId) && GlobalConstants.SERVICE_EAUX.equalsIgnoreCase(userType);
}

/**
* Vérifie si l'organisme connecté est le profil API_ADMIN
* TODO implémenter
*
* @param userType String
* @return boolean
*/
public boolean isApiAdmin(String userType) {
// Not yet implemented
return false;
}

/**
* Détermine si le PEI spécifié est accessible à l'utilisateur courant
Expand All @@ -458,24 +410,23 @@ public boolean isPeiAccessible(String numeroPei) {
*/
public boolean userCanEditPei(String numero) {

Long userId = currentUser.get().userId();
String userType = currentUser.get().type();
UseCaseUtils.OrganismeIdType organisme = new UseCaseUtils.OrganismeIdType(currentUser.get().userId(), currentUser.get().type());

if (isApiAdmin(userType)) {
if (UseCaseUtils.isApiAdmin(organisme)) {
return true;
}

HydrantAccessibilite hydrantAccessibilite = listHydrantsAccessibilite(Collections.singletonList(numero)).get(0);

if (isApiAdmin(userType)) {
if (UseCaseUtils.isApiAdmin(organisme)) {
return true;
}

if (isMaintenanceDECI(hydrantAccessibilite.getMaintenanceDECI(), userId, userType)) {
if (UseCaseUtils.isMaintenanceDECI(hydrantAccessibilite.getMaintenanceDECI(),organisme)) {
return true;
}

if (isServicePublicDECI(hydrantAccessibilite.getServicePublicDECI(), userId, userType)) {
if (UseCaseUtils.isServicePublicDECI(hydrantAccessibilite.getServicePublicDECI(), organisme)) {
return true;
}

Expand All @@ -489,16 +440,18 @@ public boolean userCanEditPei(String numero) {
* @return String les PEI en question au format JSON
*/
public String diff(String dateString) throws ResponseException {
ZonedDateTime moment;
ZonedDateTime moment = null;
boolean valide = true;
if (dateString != null) {
String pattern = "yyyy-MM-dd HH:mm:ss";
try {
// on passe par un ZoneDateTime pour gérer la différence de fuseau, en BDD on est sur de l'UTC
moment = ZonedDateTime.parse(dateString, DateTimeFormatter.ofPattern(pattern).withZone(ZoneId.systemDefault()));
moment = DateUtils.getMoment(dateString);
} catch (DateTimeParseException dtpe) {
throw new ResponseException(Response.Status.BAD_REQUEST, "1010 : La date spécifiée n'existe pas ou ne respecte pas le format YYYY-MM-DD hh:mm:ss");
valide = false;
}
} else {
valide = false;
}
if (!valide) {
throw new ResponseException(Response.Status.BAD_REQUEST, "1010 : La date spécifiée n'existe pas ou ne respecte pas le format YYYY-MM-DD hh:mm:ss");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package fr.sdis83.remocra.usecase.utils;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
* Classe utilitaire pour tous les objets "date"
* On passe par une représentation en ZoneDateTime pour gérer la différence de fuseau,
* en BDD on est sur de l'UTC mais sur le front et les appels, on veut l'heure en GMT+1
*/
public class DateUtils {
/**
* Pattern attendu pour les chaînes représentatives d'une date (moment)
*/
public static final String PATTERN = "yyyy-MM-dd HH:mm:ss";

/**
* Retourne un moment (ZoneDateTime) à partir d'une chaîne de date à l'heure "naturelle"
* @param dateString String
* @return ZonedDateTime
* @throws DateTimeParseException si le format PATTERN n'est pas respecté
*/
public static ZonedDateTime getMoment(String dateString) throws DateTimeParseException {
return ZonedDateTime.parse(dateString, DateTimeFormatter.ofPattern(PATTERN).withZone(ZoneId.systemDefault()));
}
}
Loading

0 comments on commit 9cca1ea

Please sign in to comment.