Skip to content

Commit

Permalink
ajout service algotheses
Browse files Browse the repository at this point in the history
  • Loading branch information
julg committed Sep 25, 2024
1 parent 2892494 commit 0c6e36a
Show file tree
Hide file tree
Showing 6 changed files with 338 additions and 22 deletions.
49 changes: 49 additions & 0 deletions src/main/java/fr/abes/theses/export/controller/ToolController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package fr.abes.theses.export.controller;

import fr.abes.theses.export.service.DbRequest;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.net.URI;
import java.util.List;
import java.util.Optional;

@Slf4j
@RestController
@RequestMapping("/api/v1/tool/")
public class ToolController {

@Autowired
DbRequest dbRequest;

// @GetMapping(value = "algoTheses",produces = "application/vnd.ms-excel")
@GetMapping(value = "algoTheses")
public ResponseEntity algoTheses(
@RequestParam @Parameter(name = "etat", description = "Code du problème, multivalué possible", example = "52") Optional<List<Integer>> etat,
@RequestParam @Parameter(name = "type", description = "Type d'intervention, multivalué possible", example = "amelioration") Optional<List<String>> type,
@RequestParam @Parameter(name = "codeetab", description = "Code de l'établissement", example = "NICE") Optional<List<String>> codeetab,
@RequestParam @Parameter(name = "nnt", description = "Numéro national de thèse", example = "2020MONT1234") Optional<List<String>> nnt,
@RequestParam @Parameter(name = "ppn", description = "Identifiant de la notice", example = "236863509") Optional<List<String>> ppn,
@RequestParam @Parameter(name = "utilisateur", description = "Type d'utilisateur", example = "reseau") Optional<List<String>> utilisateur,
@RequestParam @Parameter(name = "rcr", description = "Identifiant de la bibliothèque", example = "751052105") Optional<List<String>> rcr,
@RequestParam @Parameter(name = "sort", description = "Ordre de tri avec noms du (ou des) champ(s)", example = "type,codeEtab,ppn") Optional<List<String>> sort,
@RequestParam @Parameter(name = "annee", description = "Année de soutenance", example = "1985") Optional<String> annee,
@RequestParam @Parameter(name = "rownum", description = "Nombre de lignes à renvoyer", example = "1000") Optional<String> rownum
) {
return new ResponseEntity<>(dbRequest.getDiagnosticAlgoTheses(
etat,
type,
codeetab,
nnt,
ppn,
utilisateur,
rcr,
sort,
annee,
rownum), HttpStatus.OK);
}
}
24 changes: 24 additions & 0 deletions src/main/java/fr/abes/theses/export/model/Diagnostic.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package fr.abes.theses.export.model;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@AllArgsConstructor
@Getter
@Setter
public class Diagnostic {

private Integer etat;
private String type;
private String codeEtab;
private String nnt;
private String ppn;
private String utilisateur;
private String rcr;
private String annee;
private String gravite;
private String libelle;
private String consigne;

}
43 changes: 32 additions & 11 deletions src/main/java/fr/abes/theses/export/service/DbConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,51 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
public class DbConfig {

@Bean
@Primary
public DataSourceProperties dataSourceProperties() {
@ConfigurationProperties("spring.theses.datasource")
public DataSourceProperties dataSourceThesesProperties() {
return new DataSourceProperties();
}

// ci-dessous : obligation d'utiliser une OracleDataSource sinon impossible
// de caster le ResultSet Hikari en ResulSet Oracle dans le TheseRowMapper
// et donc impossible d'utiliser le getOpaque (spécifique à OracleResultSet)
// pour récuperer le XMLType

@Bean
@Primary
@ConfigurationProperties("spring.db.datasource")
public DataSource dataSourceLecture() {
public DataSource dataSourceTheses() {

return DataSourceBuilder.create().url(dataSourceProperties().getUrl())
.username(dataSourceProperties().getUsername()).password(dataSourceProperties().getPassword())
return DataSourceBuilder.create().url(dataSourceThesesProperties().getUrl())
.username(dataSourceThesesProperties().getUsername()).password(dataSourceThesesProperties().getPassword())
.type(OracleDataSource.class).build();
}


@Bean
@ConfigurationProperties("spring.basexml.datasource")
public DataSourceProperties dataSourceBaseXmlProperties() {
return new DataSourceProperties();
}

@Bean
public DataSource dataSourceBaseXml() {

return DataSourceBuilder.create().url(dataSourceBaseXmlProperties().getUrl())
.username(dataSourceBaseXmlProperties().getUsername()).password(dataSourceBaseXmlProperties().getPassword())
.type(OracleDataSource.class).build();
}

@Bean
public JdbcTemplate jdbcTemplateTheses() {
return new JdbcTemplate(dataSourceTheses());
}

@Bean
public JdbcTemplate jdbcTemplateBaseXml() {
return new JdbcTemplate(dataSourceBaseXml());
}

}
137 changes: 134 additions & 3 deletions src/main/java/fr/abes/theses/export/service/DbRequest.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,149 @@
package fr.abes.theses.export.service;

import fr.abes.theses.export.model.Diagnostic;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Component
@Configuration
public class DbRequest {

@Autowired
private JdbcTemplate jdbcTemplate;
private final JdbcTemplate jdbcTemplateTheses;
private final JdbcTemplate jdbcTemplateBaseXml;
private final TraitementParams traitementParams;
public DbRequest(JdbcTemplate jdbcTemplateTheses,
JdbcTemplate jdbcTemplateBaseXml,
TraitementParams traitementParams) {
this.jdbcTemplateTheses = jdbcTemplateTheses;
this.jdbcTemplateBaseXml = jdbcTemplateBaseXml;
this.traitementParams = traitementParams;
}

public String findTefByNntOrNumsujet (String nntOrNumsujet) {


String sql = "select d.doc from PORTAIL.document d where d.nnt=? or d.numsujet=?";
return jdbcTemplate.queryForObject(sql, new TefMapper(), nntOrNumsujet,nntOrNumsujet);
return jdbcTemplateTheses.queryForObject(sql, new TefMapper(), nntOrNumsujet,nntOrNumsujet);
}

public List<Diagnostic> getDiagnosticAlgoTheses (Optional<List<Integer>> etats,
Optional<List<String>> types,
Optional<List<String>> codeEtab,
Optional<List<String>> nnt,
Optional<List<String>> ppn,
Optional<List<String>> utilisateur,
Optional<List<String>> rcr,
Optional<List<String>> sort,
Optional<String> annee,
Optional<String> rownum) {


StringBuilder sql = new StringBuilder("SELECT etat, type, codeetab, nnt, ppn, utilisateur, rcr, annee, gravite, libelle, consigne " +
"FROM theses_algo WHERE 1=1");

List<Object> params = new ArrayList<>();

ajouteParamIntegerDansRequete(sql, params, "etat",etats);
ajouteParamStringDansRequete(sql, params, "type", types);
ajouteParamStringDansRequete(sql, params, "codeetab", codeEtab);
ajouteParamStringDansRequete(sql, params, "nnt", nnt);
ajouteParamStringDansRequete(sql, params, "ppn", ppn);
ajouteParamStringDansRequete(sql, params, "utilisateur", utilisateur);
ajouteParamStringDansRequete(sql, params, "rcr", rcr);
ajouteRownum(sql, params, rownum);
ajouteAnneeDansRequete(sql, params, annee);
ajouteOrdre(sql, sort);

List<Diagnostic> liste = jdbcTemplateBaseXml.query(sql.toString(), params.toArray(), (rs, rowNum) ->
new Diagnostic(
rs.getInt("etat"),
rs.getString("type"),
rs.getString("codeetab"),
rs.getString("nnt"),
rs.getString("ppn"),
rs.getString("utilisateur"),
rs.getString("rcr"),
rs.getString("annee"),
rs.getString("gravite"),
rs.getString("libelle"),
rs.getString("consigne")
)
);

return liste;
}

private void ajouteParamIntegerDansRequete (StringBuilder sql, List<Object> paramsRequete, String nomParam, Optional<List<Integer>> params) {

if (params.isPresent()) {

String inClause = params.get().stream()
.map(type -> nomParam + " = ?")
.collect(Collectors.joining(" OR "));
sql.append(" AND (" + inClause + ")");
paramsRequete.addAll(params.get());
}
}
private void ajouteParamStringDansRequete (StringBuilder sql, List<Object> paramsRequete, String nomParam, Optional<List<String>> params) {

if (params.isPresent()) {

String clause = params.get().stream()
.map(type -> nomParam + " = ?")
.collect(Collectors.joining(" OR "));
sql.append(" AND (" + clause + ")");
paramsRequete.addAll(params.get());
}
}

private void ajouteAnneeDansRequete (StringBuilder sql, List<Object> paramsRequete, Optional<String> annee) {

if (annee.isPresent() && annee.get().matches("\\d{4}")) {

sql.append(" AND annee >= ?");
paramsRequete.add(annee.get());
}
}
private void ajouteRownum (StringBuilder sql, List<Object> paramsRequete, Optional<String> rownum) {

if (rownum.isPresent() && Integer.parseInt(rownum.get()) > 0 && Integer.parseInt(rownum.get()) < 100000) {
sql.append(" AND rownum <= ?");
paramsRequete.add(rownum.get());
}
else {
sql.append(" AND rownum <= 100");
}
}

private void ajouteOrdre (StringBuilder sql, Optional<List<String>> sort) {

List<String> validColumns = Arrays.asList("etat", "type", "codeetab", "nnt", "ppn", "utilisateur", "rcr", "annee", "gravite", "libelle", "consigne"); // Ajouter toutes les colonnes valides

if (sort.isPresent() && !sort.get().isEmpty()) {

String orderClause = sort.get().stream()
.map(value -> {
String column = value.trim();

if (!validColumns.contains(column)) {
throw new IllegalArgumentException("Colonne non valide pour le tri : " + column);
}

return column + " ASC";
})
.collect(Collectors.joining(", "));

sql.append(" ORDER BY " + orderClause);
}
}
}
84 changes: 84 additions & 0 deletions src/main/java/fr/abes/theses/export/service/TraitementParams.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package fr.abes.theses.export.service;

import org.springframework.stereotype.Component;

@Component
public class TraitementParams {

/**
* Pour pouvoir gérer une liste potentielle de params, les params sont placés
* entre parenthèses pour pouvoir utilise IN
* @param valeur
* @return
*/
public String getParamInteger(String valeur) {
String val = "";
if (valeur != null) {
val = valeur;
val = "'" + val.replaceAll(",", "','");
if (val.lastIndexOf(',') == val.length()) {
val = val.substring(0, val.length() - 1);
}
val += "'";
val = "(" + val + ")";
}
return val;
}

/**
* Pour pouvoir gérer une liste potentielle de params, les params sont placés
* entre parenthèses pour pouvoir utilise IN + ajout de guillemets simple car le(s) param(s)
* est (sont) de type String
* @param valeur
* @return
*/
public String getParamString(String valeur) {
String val = "";
if (valeur != null) {
val = valeur;
if (val.lastIndexOf(',') == val.length()) {
val = val.substring(0, val.length() - 1);
}
val = "(" + val + ")";
}
return val;
}

public String getSort(String valeur) {
String sort = "";
if(valeur!=null)
{
sort = valeur;
if (sort.lastIndexOf(',') == sort.length()) {
sort = sort.substring(0, sort.length() - 1);
}
}
return sort;
}

public String getAnnee (String valeur) {

String annee = "";
if (valeur != null) {
annee = valeur;
if (annee.length() == 4 && Integer.parseInt(annee) > 0) {
annee = "'" + annee + "'";
} else {
annee = "";
}
}
return annee;
}

public String getRownum (String valeur) {
String rownum = "1000000";
if (valeur != null) {
if (Integer.parseInt(valeur) > 0) {
rownum = valeur;
}
}
return rownum;
}


}
Loading

0 comments on commit 0c6e36a

Please sign in to comment.