Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions magma-app/src/main/java/fr/insee/rmes/config/OpenApiYamlConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package fr.insee.rmes.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@RestController
public class OpenApiYamlConfig {

private static final String VERSION_GESTION = "2.0.0";
private static final String VERSION_DIFFUSION = "2.0.0";

@Value("${fr.insee.rmes.magma.display.geo:true}")
private boolean displayGeo;

@GetMapping(value = "/openapi.yaml", produces = "text/plain;charset=UTF-8")
public ResponseEntity<String> openApiYaml() throws IOException {
String gestionContent = loadYamlWithVersion("openapi-gestion.yaml", VERSION_GESTION);
String diffusionContent = loadYamlWithVersion("openapi-diffusion.yaml", VERSION_DIFFUSION);

Yaml yaml = new Yaml();
Map<String, Object> gestion = yaml.load(gestionContent);
Map<String, Object> diffusion = yaml.load(diffusionContent);

DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
options.setPrettyFlow(true);
Yaml dumper = new Yaml(options);

return ResponseEntity.ok()
.contentType(MediaType.TEXT_PLAIN)
.body(dumper.dump(buildMergedYaml(gestion, diffusion)));
}

private String loadYamlWithVersion(String fileName, String version) throws IOException {
String content = StreamUtils.copyToString(new ClassPathResource(fileName).getInputStream(), StandardCharsets.UTF_8);
return content.replace("${version}", version);
}

@SuppressWarnings("unchecked")
private Map<String, Object> buildMergedYaml(Map<String, Object> gestion, Map<String, Object> diffusion) {
Map<String, Object> merged = new LinkedHashMap<>();
merged.put("openapi", "3.1.0");
merged.put("info", buildInfo(gestion));
if (diffusion.containsKey("externalDocs")) {
merged.put("externalDocs", diffusion.get("externalDocs"));
}
merged.put("servers", gestion.get("servers"));
merged.put("security", gestion.get("security"));
merged.put("tags", mergeTags(gestion, diffusion));
merged.put("paths", mergePaths(gestion, diffusion));
merged.put("components", mergeComponents(
(Map<String, Object>) gestion.getOrDefault("components", Collections.emptyMap()),
(Map<String, Object>) diffusion.getOrDefault("components", Collections.emptyMap())));
return merged;
}

@SuppressWarnings("unchecked")
private Map<String, Object> buildInfo(Map<String, Object> gestion) {
Map<String, Object> info = new LinkedHashMap<>((Map<String, Object>) gestion.get("info"));
info.put("title", "Magma API");
info.put("description", "API Gestion et Diffusion des métadonnées de l'Insee");
info.put("version", "Gestion " + VERSION_GESTION + " / Diffusion " + VERSION_DIFFUSION);
return info;
}

@SuppressWarnings("unchecked")
private List<Map<String, Object>> mergeTags(Map<String, Object> gestion, Map<String, Object> diffusion) {
List<Map<String, Object>> gestionTags = (List<Map<String, Object>>) gestion.getOrDefault("tags", Collections.emptyList());
List<Map<String, Object>> diffusionTags = (List<Map<String, Object>>) diffusion.getOrDefault("tags", Collections.emptyList());
return Stream.concat(gestionTags.stream(), diffusionTags.stream())
.filter(tag -> displayGeo || !((String) tag.get("name")).startsWith("geo"))
.collect(Collectors.toList());
}

@SuppressWarnings("unchecked")
private Map<String, Object> mergePaths(Map<String, Object> gestion, Map<String, Object> diffusion) {
Map<String, Object> mergedPaths = new LinkedHashMap<>();
mergedPaths.putAll((Map<String, Object>) gestion.getOrDefault("paths", Collections.emptyMap()));
((Map<String, Object>) diffusion.getOrDefault("paths", Collections.emptyMap())).forEach((path, value) -> {
if (displayGeo || !path.startsWith("/geo")) {
mergedPaths.put(path, value);
}
});
return mergedPaths;
}

@SuppressWarnings("unchecked")
private Map<String, Object> mergeComponents(Map<String, Object> gestion, Map<String, Object> diffusion) {
Map<String, Object> result = new LinkedHashMap<>();
Set<String> allKeys = new LinkedHashSet<>(gestion.keySet());
allKeys.addAll(diffusion.keySet());
for (String key : allKeys) {
if (gestion.containsKey(key) && diffusion.containsKey(key)) {
Map<String, Object> mergedSection = new LinkedHashMap<>();
mergedSection.putAll((Map<String, Object>) gestion.get(key));
mergedSection.putAll((Map<String, Object>) diffusion.get(key));
result.put(key, mergedSection);
} else {
result.put(key, gestion.getOrDefault(key, diffusion.get(key)));
}
}
return result;
}

}
7 changes: 5 additions & 2 deletions magma-app/src/main/resources/magma-app.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ fr.insee.rmes.magma.force.ssl=false
springdoc.swagger-ui.path= /
fr.insee.rmes.security.enabled=true
springdoc.swagger-ui.enabled=true
springdoc.swagger-ui.url=/openapi.yaml
spring.profile.active=dev
fr.insee.rmes.magma.bauhaus.url=

Expand All @@ -27,7 +28,7 @@ fr.insee.rmes.springdoc.issuer-description=Keycloak
fr.insee.rmes.springdoc.contact-name=DR59-SNDIL
fr.insee.rmes.springdoc.contact-email=un-email-fonctionnel@insee.fr
fr.insee.rmes.springdoc.contact-url=https://www.insee.fr/fr/accueil
fr.insee.rmes.security.whitelist-matchers=/swagger-ui/index.html,/v3/api-docs/**,/swagger-ui/**,/swagger-ui.html,/actuator/**,/error,/,/swagger-ui-magma.html
fr.insee.rmes.security.whitelist-matchers=/swagger-ui/index.html,/v3/api-docs/**,/swagger-ui/**,/swagger-ui.html,/actuator/**,/error,/,/swagger-ui-magma.html,/openapi.yaml,/*.schema.json

#Configuration du jeton JWT
# Security configuration
Expand Down Expand Up @@ -109,10 +110,12 @@ fr.insee.rmes.magma.links.baseURI = documents/page
#ONTOLOGIES
fr.insee.rmes.magma.ontologies.baseURI = ontologies/insee/base

## propriétées magma diffusion
## propriétés magma
fr.insee.rmes.magma.api.sparqlEndpoint=
fr.insee.rmes.magma.api.freemarker.locale-language=fr
properties.logger.prefix-for-properties=fr.insee,debug, trace, info, logging, spring, server, keycloak, application, management, springdoc, properties, minio, elastic
spring.jackson.mapper.sort-properties-alphabetically=false
fr.insee.rmes.magma.api.geographie.types-autorises=Commune,CommuneAssociee,CommuneDeleguee,Canton,CantonOuVille,Arrondissement,ArrondissementMunicipal,Departement,Pays,Region,Intercommunalite,District,AireDAttractionDesVilles2020,BassinDeVie2022,CollectiviteDOutreMer,CirconscriptionTerritoriale,Iris,QuartierPrioritaireDeLaPolitiqueDeLaVille2024,ZoneDEmploi2020,UniteUrbaine2020

## affichage des end-points géographie (/geo) dans le Swagger
fr.insee.rmes.magma.display.geo=false
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
fr.insee.rmes.magma.api.sparqlEndpoint=
#springdoc.swagger-ui.urls[0].url=/openapi-diffusion.yaml
#springdoc.swagger-ui.urls[0].name=API Diffusion
#springdoc.swagger-ui.urls[1].url=/openapi-gestion.yaml
#springdoc.swagger-ui.urls[1].name=API Gestion
fr.insee.rmes.magma.api.freemarker.locale-language=fr
properties.logger.prefix-for-properties=fr,debug, trace, info, logging, spring, server, management, springdoc, properties
spring.jackson.mapper.sort-properties-alphabetically=false
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package fr.insee.rmes.magma.gestion.api;

import fr.insee.rmes.magma.gestion.api.requestprocessor.RequestProcessorGestion;
import fr.insee.rmes.magma.gestion.model.DataSet;
import fr.insee.rmes.magma.gestion.model.Dataset;
import fr.insee.rmes.magma.gestion.model.Distribution;
import fr.insee.rmes.magma.gestion.queries.parameters.DatasetsRequestParametizer;
import fr.insee.rmes.magma.gestion.services.DatasetsService;
import fr.insee.rmes.magma.gestion.utils.DatasetByIdDTO;
import fr.insee.rmes.magma.gestion.utils.DatasetByIdSummaryDTO;
import fr.insee.rmes.magma.gestion.utils.DatasetDTO;
import fr.insee.rmes.magma.gestion.utils.DistributionDTO;
import org.springframework.http.ResponseEntity;
Expand All @@ -27,19 +26,19 @@ public DatasetsEndpoints(RequestProcessorGestion requestProcessor, DatasetsServi
}

@Override
public ResponseEntity<List<DataSet>> getListDatasets(@Nullable String dateMiseAJour) {
public ResponseEntity<List<Dataset>> getListDatasets(@Nullable String dateMiseAJour) {
List<DatasetDTO> dtos = requestProcessor.queryToFindAllDatasets()
.with(new DatasetsRequestParametizer(dateMiseAJour))
.executeQuery()
.listResult(DatasetDTO.class)
.result();

List<DataSet> dataSets = datasetsService.transformDatasetDTOsToDataSets(dtos);
List<Dataset> dataSets = datasetsService.transformDatasetDTOsToDataSets(dtos);
return ResponseEntity.ok(dataSets);
}

@Override
public ResponseEntity<DataSet> getDataSetById(String id) {
public ResponseEntity<Dataset> getDataSetById(String id) {
DatasetByIdDTO dto = requestProcessor.queryToFindDatasetById()
.with(new DatasetsRequestParametizer(id, null))
.executeQuery()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

import fr.insee.rmes.magma.gestion.api.requestprocessor.RequestProcessorGestion;
import fr.insee.rmes.magma.gestion.model.Indicateur;
import fr.insee.rmes.magma.gestion.model.OperationById;
import fr.insee.rmes.magma.gestion.model.SerieById;
import fr.insee.rmes.magma.gestion.model.Operation;
import fr.insee.rmes.magma.gestion.model.Serie;
import fr.insee.rmes.magma.gestion.old.model.operation.OperationById;
import fr.insee.rmes.magma.gestion.queries.parameters.IndicateurRequestParametizer;
import fr.insee.rmes.magma.gestion.queries.parameters.SeriesOperationsRequestParametizer;
import fr.insee.rmes.magma.gestion.services.SeriesOperationsService;
Expand All @@ -28,19 +29,19 @@ public SeriesOperationsEndpoints(RequestProcessorGestion requestProcessor, Serie
}

@Override
public ResponseEntity<List<SerieById>> getAllSeries(String dateMiseAJour) {
public ResponseEntity<List<Serie>> getAllSeries(String dateMiseAJour) {
String date = dateMiseAJour != null ? dateMiseAJour : "none";
List<SeriesDTO> dtos = requestProcessor.queryToFindAllSeries()
.with(new SeriesOperationsRequestParametizer(null, null, date))
.executeQuery()
.listResult(SeriesDTO.class)
.result();
List<SerieById> series = seriesOperationsService.transformSeriesDTOsToSeries(dtos);
List<Serie> series = seriesOperationsService.transformSeriesDTOsToSeries(dtos);
return ResponseEntity.ok(series);
}

@Override
public ResponseEntity<SerieById> getSerieById(String id) {
public ResponseEntity<Serie> getSerieById(String id) {
SeriesDTO seriesDTO = requestProcessor.queryToFindSerieById()
.with(new SeriesOperationsRequestParametizer(id, null))
.executeQuery()
Expand All @@ -49,12 +50,12 @@ public ResponseEntity<SerieById> getSerieById(String id) {
if (seriesDTO == null) {
return ResponseEntity.notFound().build();
}
SerieById serieById = seriesOperationsService.transformSeriesDTOToSerieById(seriesDTO);
Serie serieById = seriesOperationsService.transformSeriesDTOToSerieById(seriesDTO);
return EndpointsUtils.toResponseEntity(serieById);
}

@Override
public ResponseEntity<OperationById> getOperationByCode(String id) {
public ResponseEntity<Operation> getOperationByCode(String id) {
OperationDTO operationDTO = requestProcessor.queryToFindOperationByCode()
.with(new SeriesOperationsRequestParametizer(null, id))
.executeQuery()
Expand All @@ -63,8 +64,8 @@ public ResponseEntity<OperationById> getOperationByCode(String id) {
if (operationDTO == null) {
return ResponseEntity.notFound().build();
}
OperationById operationById = seriesOperationsService.transformOperationDTOToOperationById(operationDTO);
return EndpointsUtils.toResponseEntity(operationById);
Operation operation = seriesOperationsService.transformOperationDTOToOperation(operationDTO);
return EndpointsUtils.toResponseEntity(operation);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
package fr.insee.rmes.magma.gestion.services;

import fr.insee.rmes.magma.gestion.model.DataSet;
import fr.insee.rmes.magma.gestion.model.Dataset;
import fr.insee.rmes.magma.gestion.model.Distribution;
import fr.insee.rmes.magma.gestion.utils.DatasetByIdDTO;
import fr.insee.rmes.magma.gestion.utils.DatasetByIdSummaryDTO;
import fr.insee.rmes.magma.gestion.utils.DatasetDTO;
import fr.insee.rmes.magma.gestion.utils.DistributionDTO;

import java.util.List;

public interface DatasetsService {

List<DataSet> transformDatasetDTOsToDataSets(List<DatasetDTO> dtos);
List<Dataset> transformDatasetDTOsToDataSets(List<DatasetDTO> dtos);

DataSet transformDatasetByIdDTOToDataSet(DatasetByIdDTO dto);
Dataset transformDatasetByIdDTOToDataSet(DatasetByIdDTO dto);

List<Distribution> transformDistributionDTOsToDistributions(List<DistributionDTO> dtos);

Expand Down
Loading