diff --git a/jars/client-api-gde/pom.xml b/jars/client-api-gde/pom.xml index 5d19f1e042..b635d49f2e 100644 --- a/jars/client-api-gde/pom.xml +++ b/jars/client-api-gde/pom.xml @@ -31,12 +31,6 @@ 6.0.0 - - 1.5.1.Final - - - 1.18.24 - 2.1.2 1.6.2 @@ -91,18 +85,6 @@ spring-context-support - - org.projectlombok - lombok - true - - - - org.mapstruct - mapstruct - ${mapstruct.version} - - io.swagger swagger-annotations @@ -144,22 +126,6 @@ ${java.version} ${java.version} - - - org.projectlombok - lombok - ${org.projectlombok.version} - - - org.mapstruct - mapstruct-processor - ${mapstruct.version} - - - - -Amapstruct.suppressGeneratorTimestamp=true - -Amapstruct.defaultComponentModel=spring - diff --git a/jars/client-api-gde/src/main/resources/openapi.yaml b/jars/client-api-gde/src/main/resources/openapi.yaml index 5e0c5bebb9..73ead55625 100644 --- a/jars/client-api-gde/src/main/resources/openapi.yaml +++ b/jars/client-api-gde/src/main/resources/openapi.yaml @@ -147,12 +147,6 @@ paths: type: integer format: int32 responses: - "422": - description: Unprocessable Entity - content: - '*/*': - schema: - $ref: '#/components/schemas/problem' "404": description: Not Found content: @@ -165,10 +159,10 @@ paths: application/json: schema: $ref: '#/components/schemas/problem' - "401": - description: Unauthorized + "400": + description: Bad Request content: - application/json: + '*/*': schema: $ref: '#/components/schemas/problem' "403": @@ -183,6 +177,12 @@ paths: application/json: schema: $ref: '#/components/schemas/PagedModel' + "401": + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/problem' post: tags: - eventi @@ -196,12 +196,6 @@ paths: $ref: '#/components/schemas/nuovoEvento' required: true responses: - "422": - description: Unprocessable Entity - content: - application/json: - schema: - $ref: '#/components/schemas/problem' "404": description: Not Found content: @@ -214,14 +208,8 @@ paths: application/json: schema: $ref: '#/components/schemas/problem' - "201": - description: Evento salvato con successo - content: - '*/*': - schema: - type: object - "401": - description: Unauthorized + "400": + description: Bad Request content: application/json: schema: @@ -232,8 +220,20 @@ paths: application/json: schema: $ref: '#/components/schemas/problem' - "400": - description: Bad Request + "201": + description: Evento salvato con successo + content: + '*/*': + schema: + type: object + "422": + description: Unprocessable Entity + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "401": + description: Unauthorized content: application/json: schema: @@ -254,12 +254,6 @@ paths: type: integer format: int64 responses: - "422": - description: Unprocessable Entity - content: - '*/*': - schema: - $ref: '#/components/schemas/problem' "404": description: Not Found content: @@ -272,10 +266,10 @@ paths: application/json: schema: $ref: '#/components/schemas/problem' - "401": - description: Unauthorized + "400": + description: Bad Request content: - application/json: + '*/*': schema: $ref: '#/components/schemas/problem' "403": @@ -290,6 +284,12 @@ paths: application/json: schema: $ref: '#/components/schemas/evento' + "401": + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/problem' components: schemas: problem: @@ -376,6 +376,8 @@ components: - CLIENT - SERVER tipoEvento: + maxLength: 255 + minLength: 0 type: string esito: type: string @@ -390,26 +392,41 @@ components: type: integer format: int64 sottotipoEvento: + maxLength: 255 + minLength: 0 type: string sottotipoEsito: + maxLength: 255 + minLength: 0 type: string dettaglioEsito: type: string idDominio: + pattern: "(^([0-9]){11}$)" type: string iuv: + maxLength: 35 + minLength: 0 type: string ccp: + maxLength: 35 + minLength: 0 type: string idA2A: + pattern: "(^[a-zA-Z0-9\\-_]{1,35}$)" type: string idPendenza: + pattern: "(^[a-zA-Z0-9\\-_]{1,35}$)" type: string idPagamento: + maxLength: 35 + minLength: 0 type: string datiPagoPA: $ref: '#/components/schemas/datiPagoPA' severita: + maximum: 5 + minimum: 0 type: integer format: int32 parametriRichiesta: @@ -425,8 +442,6 @@ components: idRiconciliazione: type: integer format: int64 - _links: - $ref: '#/components/schemas/Links' description: Evento da salvare. Pageable: type: object @@ -507,6 +522,8 @@ components: - CLIENT - SERVER tipoEvento: + maxLength: 255 + minLength: 0 type: string esito: type: string @@ -521,26 +538,41 @@ components: type: integer format: int64 sottotipoEvento: + maxLength: 255 + minLength: 0 type: string sottotipoEsito: + maxLength: 255 + minLength: 0 type: string dettaglioEsito: type: string idDominio: + pattern: "(^([0-9]){11}$)" type: string iuv: + maxLength: 35 + minLength: 0 type: string ccp: + maxLength: 35 + minLength: 0 type: string idA2A: + pattern: "(^[a-zA-Z0-9\\-_]{1,35}$)" type: string idPendenza: + pattern: "(^[a-zA-Z0-9\\-_]{1,35}$)" type: string idPagamento: + maxLength: 35 + minLength: 0 type: string datiPagoPA: $ref: '#/components/schemas/datiPagoPA' severita: + maximum: 5 + minimum: 0 type: integer format: int32 parametriRichiesta: diff --git a/wars/api-gde/pom.xml b/wars/api-gde/pom.xml index 428eedae6a..bffdfa0090 100644 --- a/wars/api-gde/pom.xml +++ b/wars/api-gde/pom.xml @@ -115,6 +115,34 @@ lombok true + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + test + + + org.hamcrest + hamcrest-core + test + + + junit + junit + test + + + org.springframework.boot + spring-boot-starter-validation + test + + diff --git a/wars/api-gde/src/main/java/it/govpay/gde/assemblers/DatiPagoPAModelAssembler.java b/wars/api-gde/src/main/java/it/govpay/gde/assemblers/DatiPagoPAModelAssembler.java deleted file mode 100644 index 9cc394cacd..0000000000 --- a/wars/api-gde/src/main/java/it/govpay/gde/assemblers/DatiPagoPAModelAssembler.java +++ /dev/null @@ -1,41 +0,0 @@ -package it.govpay.gde.assemblers; - -import java.math.BigDecimal; - -import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport; -import org.springframework.stereotype.Component; - -import it.govpay.gde.controller.GdeController; -import it.govpay.gde.entity.DatiPagoPAEntity; -import it.govpay.gde.model.DatiPagoPAModel; - -@Component -public class DatiPagoPAModelAssembler extends RepresentationModelAssemblerSupport { - - public DatiPagoPAModelAssembler() { - super(GdeController.class, DatiPagoPAModel.class); - } - - @Override - public DatiPagoPAModel toModel(DatiPagoPAEntity entity) { - DatiPagoPAModel model = instantiateModel(entity); - - model.setIdCanale(entity.getCodCanale()); - model.setIdPsp(entity.getCodPsp()); - model.setIdIntermediarioPsp(entity.getCodIntermediarioPsp()); - model.setIdIntermediario(entity.getCodIntermediario()); - model.setIdStazione(entity.getCodStazione()); - model.setIdDominio(entity.getCodDominio()); - model.setTipoVersamento(entity.getTipoVersamento()); - model.setModelloPagamento(entity.getModelloPagamento()); - - model.setIdFlusso(entity.getCodFlusso()); - if(entity.getIdTracciato() != null) - model.setIdTracciato(new BigDecimal(entity.getIdTracciato())); - model.setIdRiconciliazione(entity.getTrn()); - model.setSct(entity.getSct()); - - return model; - } - -} \ No newline at end of file diff --git a/wars/api-gde/src/main/java/it/govpay/gde/assemblers/EventoIndexModelAssembler.java b/wars/api-gde/src/main/java/it/govpay/gde/assemblers/EventoIndexModelAssembler.java index 3f56aefe37..36ff978852 100644 --- a/wars/api-gde/src/main/java/it/govpay/gde/assemblers/EventoIndexModelAssembler.java +++ b/wars/api-gde/src/main/java/it/govpay/gde/assemblers/EventoIndexModelAssembler.java @@ -1,7 +1,11 @@ package it.govpay.gde.assemblers; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; + +import java.math.BigDecimal; + import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport; import org.springframework.stereotype.Component; @@ -13,19 +17,14 @@ import it.govpay.gde.entity.converter.DatiPagoPAConverter; import it.govpay.gde.model.CategoriaEvento; import it.govpay.gde.model.ComponenteEvento; +import it.govpay.gde.model.DatiPagoPAModel; import it.govpay.gde.model.EsitoEvento; import it.govpay.gde.model.EventoIndexModel; import it.govpay.gde.model.RuoloEvento; -import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; -import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; - @Component public class EventoIndexModelAssembler extends RepresentationModelAssemblerSupport { - @Autowired - private DatiPagoPAModelAssembler pagoPAModelAssembler; - public EventoIndexModelAssembler() { super(GdeController.class, EventoIndexModel.class); } @@ -113,9 +112,30 @@ public void toModel(EventoBaseEntity entity, EventoIndexModel model) { if(entity.getDatiPagoPA() != null) { DatiPagoPAConverter converter = new DatiPagoPAConverter(); DatiPagoPAEntity datiPagoPAEntity = converter.convertToEntityAttribute(entity.getDatiPagoPA()); - model.setDatiPagoPA(this.pagoPAModelAssembler.toModel(datiPagoPAEntity)); + model.setDatiPagoPA(this.toModel(datiPagoPAEntity)); } model.setSeverita(entity.getSeverita()); } + public DatiPagoPAModel toModel(DatiPagoPAEntity entity) { + DatiPagoPAModel model = new DatiPagoPAModel(); + + model.setIdCanale(entity.getCodCanale()); + model.setIdPsp(entity.getCodPsp()); + model.setIdIntermediarioPsp(entity.getCodIntermediarioPsp()); + model.setIdIntermediario(entity.getCodIntermediario()); + model.setIdStazione(entity.getCodStazione()); + model.setIdDominio(entity.getCodDominio()); + model.setTipoVersamento(entity.getTipoVersamento()); + model.setModelloPagamento(entity.getModelloPagamento()); + + model.setIdFlusso(entity.getCodFlusso()); + if(entity.getIdTracciato() != null) + model.setIdTracciato(new BigDecimal(entity.getIdTracciato())); + model.setIdRiconciliazione(entity.getTrn()); + model.setSct(entity.getSct()); + + return model; + } + } \ No newline at end of file diff --git a/wars/api-gde/src/main/java/it/govpay/gde/controller/GdeController.java b/wars/api-gde/src/main/java/it/govpay/gde/controller/GdeController.java index 89e9ea9fc8..411be60865 100644 --- a/wars/api-gde/src/main/java/it/govpay/gde/controller/GdeController.java +++ b/wars/api-gde/src/main/java/it/govpay/gde/controller/GdeController.java @@ -220,7 +220,7 @@ public ResponseEntity> findEventi( @GetMapping(path = "/eventi/{id}", produces = { MediaType.APPLICATION_JSON_VALUE} , name = "getEvento") public ResponseEntity getEventoById( @Parameter(description="Id dell'evento da leggere.", required=true) - @PathVariable("id") @Positive(message = "Id dell'evento deve essere un valore > 0") Long id + @PathVariable("id") @Positive(message = "Id dell'evento deve essere un valore > 0.") Long id ) { return this.eventoRepository.findById(id) .map(this.eventoAssembler::toModel) @@ -242,16 +242,16 @@ public ResponseEntity addEvento( @Parameter(description="Evento da salvare.", required=true, schema=@Schema(implementation = NuovoEventoModel.class)) @Valid @RequestBody NuovoEventoModel evento){ - this.logger.debug("AAAAAA Salvataggio evento: " + evento.toString()); + this.logger.debug("Salvataggio evento: " + evento.toString()); try { EventoEntity entity = this.nuovoEventoMapper.nuovoEventoModelToEventoEntity(evento); this.eventoRepository.save(entity); - this.logger.debug("AAAAAA Salvataggio evento completato."); + this.logger.debug("Salvataggio evento completato."); return new ResponseEntity<>(HttpStatus.CREATED); }catch (Exception e) { - this.logger.error("AAAAAA Salvataggio evento completato con errore: " +e.getMessage(), e); + this.logger.error("Salvataggio evento completato con errore: " +e.getMessage(), e); throw new InternalException(e); } } diff --git a/wars/api-gde/src/main/java/it/govpay/gde/exception/ResourceNotFoundException.java b/wars/api-gde/src/main/java/it/govpay/gde/exception/ResourceNotFoundException.java index 28919df073..c25ed992f5 100644 --- a/wars/api-gde/src/main/java/it/govpay/gde/exception/ResourceNotFoundException.java +++ b/wars/api-gde/src/main/java/it/govpay/gde/exception/ResourceNotFoundException.java @@ -12,7 +12,7 @@ public class ResourceNotFoundException extends RuntimeException { public ResourceNotFoundException() { super("La risorsa "+((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()) - .getRequest()+" non esiste."); + .getRequest().getPathInfo()+" non esiste."); } } diff --git a/wars/api-gde/src/main/java/it/govpay/gde/model/DatiPagoPAModel.java b/wars/api-gde/src/main/java/it/govpay/gde/model/DatiPagoPAModel.java index 319f6df26e..16c2fe574c 100644 --- a/wars/api-gde/src/main/java/it/govpay/gde/model/DatiPagoPAModel.java +++ b/wars/api-gde/src/main/java/it/govpay/gde/model/DatiPagoPAModel.java @@ -2,8 +2,6 @@ import java.math.BigDecimal; -import org.springframework.hateoas.RepresentationModel; - import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonRootName; @@ -20,7 +18,7 @@ @EqualsAndHashCode(callSuper = false) @JsonRootName(value = "datiPagoPA") @JsonInclude(JsonInclude.Include.NON_NULL) -public class DatiPagoPAModel extends RepresentationModel { +public class DatiPagoPAModel { private String idPsp; diff --git a/wars/api-gde/src/main/java/it/govpay/gde/model/NuovoEventoModel.java b/wars/api-gde/src/main/java/it/govpay/gde/model/NuovoEventoModel.java index 8d32a07d8c..c397fe60c1 100644 --- a/wars/api-gde/src/main/java/it/govpay/gde/model/NuovoEventoModel.java +++ b/wars/api-gde/src/main/java/it/govpay/gde/model/NuovoEventoModel.java @@ -1,6 +1,13 @@ package it.govpay.gde.model; +import java.time.LocalDateTime; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.Pattern; import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; +import javax.validation.constraints.Size; import org.springframework.hateoas.server.core.Relation; @@ -8,10 +15,12 @@ import com.fasterxml.jackson.annotation.JsonRootName; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +@Builder @Data @AllArgsConstructor @NoArgsConstructor @@ -19,15 +28,69 @@ @JsonRootName(value = "nuovoEvento") @Relation(collectionRelation = "eventi") @JsonInclude(JsonInclude.Include.NON_NULL) -public class NuovoEventoModel extends EventoModel { +public class NuovoEventoModel { + + private Long id; + + private ComponenteEvento componente; + + private CategoriaEvento categoriaEvento; + + private RuoloEvento ruolo; + + @Size(max = 255, message = "Il valore presente nel campo tipoEvento non rispetta la lunghezza massima di 255 caratteri.") + private String tipoEvento; + + private EsitoEvento esito; + + @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME) + private LocalDateTime dataEvento; + + @PositiveOrZero(message = "Il campo durataEvento deve contenere un valore >= 0.") + private Long durataEvento; + + @Size(max = 255, message = "Il valore presente nel campo sottotipoEvento non rispetta la lunghezza massima di 255 caratteri.") + private String sottotipoEvento; + + @Size(max = 255, message = "Il valore presente nel campo sottotipoEsito non rispetta la lunghezza massima di 255 caratteri.") + private String sottotipoEsito; + + private String dettaglioEsito; + + @Pattern(regexp = "(^([0-9]){11}$)", message = "Il valore presente nel campo idDominio non rispetta il pattern previsto.") + private String idDominio; + + @Size(max = 35, message = "Il valore presente nel campo iuv non rispetta la lunghezza massima di 35 caratteri.") + private String iuv; + + @Size(max = 35, message = "Il valore presente nel campo ccp non rispetta la lunghezza massima di 35 caratteri.") + private String ccp; + + @Pattern(regexp = "(^[a-zA-Z0-9\\-_]{1,35}$)", message = "Il valore presente nel campo idA2A non rispetta il pattern previsto.") + private String idA2A; + + @Pattern(regexp = "(^[a-zA-Z0-9\\-_]{1,35}$)", message = "Il valore presente nel campo idPendenza non rispetta il pattern previsto.") + private String idPendenza; + + @Size(max = 35, message = "Il valore presente nel campo idPagamento non rispetta la lunghezza massima di 35 caratteri.") + private String idPagamento; + + private DatiPagoPAModel datiPagoPA; + + @Min(value = 0, message = "Il campo severita deve contenere un valore >= 0.") @Max(value = 5, message = "Il campo severita deve contenere un valore <= 5.") + private Integer severita; + + private Object parametriRichiesta; + + private Object parametriRisposta; - @Positive(message = "Il campo idTracciato deve contenere un valore >= 0.") + @Positive(message = "Il campo idTracciato deve contenere un valore > 0.") private Long idTracciato; - @Positive(message = "Il campo idFr deve contenere un valore >= 0.") + @Positive(message = "Il campo idFr deve contenere un valore > 0.") private Long idFr; - @Positive(message = "Il campo idRiconciliazione deve contenere un valore >= 0.") + @Positive(message = "Il campo idRiconciliazione deve contenere un valore > 0.") private Long idRiconciliazione; } diff --git a/wars/api-gde/src/main/resources/application.properties b/wars/api-gde/src/main/resources/application.properties index 78b3bd8d50..557adb6838 100644 --- a/wars/api-gde/src/main/resources/application.properties +++ b/wars/api-gde/src/main/resources/application.properties @@ -1,3 +1,5 @@ +spring.main.banner-mode=off + #logging.level.org.springframework=ERROR logging.level.org.springframework=DEBUG @@ -8,7 +10,7 @@ spring.mvc.datetime-format=yyyy-MM-dd'T'HH:mm:ssZ spring.jpa.generate-ddl=false spring.jpa.hibernate.ddl-auto=none -spring.datasource.url=jdbc:postgresql://localhost:5432/govpay_40 +spring.datasource.url=jdbc:postgresql://localhost:5432/govpay spring.datasource.username=govpay spring.datasource.password=govpay diff --git a/wars/api-gde/src/main/resources/openapi.yaml b/wars/api-gde/src/main/resources/openapi.yaml index 66f114e66f..73ead55625 100644 --- a/wars/api-gde/src/main/resources/openapi.yaml +++ b/wars/api-gde/src/main/resources/openapi.yaml @@ -1,623 +1,602 @@ -openapi: 3.0.0 +openapi: 3.0.1 info: - version: "1.0.0" - title: GovPay - API Giornale degli eventi - contact: - name: GitHub Project Page - url: 'https://github.com/link-it/GovPay/' - license: - name: GPL - url: 'https://github.com/link-it/GovPay/blob/master/LICENSE' + title: OpenAPI definition + version: v0 servers: - - url: /govpay/backend/api/gde/rs/basic/v1/ -tags: - - name: Giornale degli Eventi - description: Consultazione del Giornale degli Eventi -security: - - basicAuth: [] +- url: http://localhost:8080/govpay/backend/api/gde + description: Generated server url paths: - '/eventi': + /eventi: get: - summary: Giornale degli eventi - operationId: findEventi tags: - - Giornale degli Eventi + - eventi + summary: Ricerca eventi + description: Ricerca eventi + operationId: findEventi parameters: - - $ref: '#/components/parameters/pagina' - - $ref: '#/components/parameters/risultatiPerPagina' - - $ref: '#/components/parameters/idDominio' - - $ref: '#/components/parameters/iuv' - - $ref: '#/components/parameters/ccp' - - $ref: '#/components/parameters/idA2A' - - $ref: '#/components/parameters/idPendenza' - - $ref: '#/components/parameters/idPagamentoRpp' - - $ref: '#/components/parameters/esitoEvento' - - $ref: '#/components/parameters/dataDa' - - $ref: '#/components/parameters/dataA' - - $ref: '#/components/parameters/categoriaEvento' - - $ref: '#/components/parameters/tipoEvento' - - $ref: '#/components/parameters/sottotipoEvento' - - $ref: '#/components/parameters/componenteEvento' - - $ref: '#/components/parameters/ruoloEvento' - - $ref: '#/components/parameters/messaggiEvento' - - $ref: '#/components/parameters/metadatiPaginazione' - - $ref: '#/components/parameters/maxRisultati' - - $ref: '#/components/parameters/severitaDa' - - $ref: '#/components/parameters/severitaA' + - name: pageable + in: query + description: informazioni di paginazione e ordinamento + required: true + schema: + $ref: '#/components/schemas/Pageable' + - name: dataDa + in: query + description: Inizio della finestra temporale di osservazione + required: false + schema: + type: string + format: date-time + - name: dataA + in: query + description: Fine della finestra temporale di osservazione + required: false + schema: + type: string + format: date-time + - name: idDominio + in: query + description: Identificativo del dominio beneficiario + required: false + schema: + type: string + - name: iuv + in: query + description: Identificativo univoco di versamento + required: false + schema: + type: string + - name: ccp + in: query + description: Codice contesto pagamento/ID ricevuta + required: false + schema: + type: string + - name: idA2A + in: query + description: Identificativo del gestionale proprietario della pendenza + required: false + schema: + type: string + - name: idPendenza + in: query + description: Identificativo della pendenza nel gestionale proprietario + required: false + schema: + type: string + - name: idPagamento + in: query + description: Identificativo della richiesta di pagamento + required: false + schema: + type: string + - name: categoria + in: query + description: Filtro per categoria evento + required: false + schema: + type: string + enum: + - INTERNO + - INTERFACCIA + - UTENTE + - name: esito + in: query + description: Filtro per esito evento + required: false + schema: + type: string + enum: + - OK + - KO + - FAIL + - name: ruolo + in: query + description: Filtro per ruolo evento + required: false + schema: + type: string + enum: + - CLIENT + - SERVER + - name: sottotipo + in: query + description: Filtro per sottotipo evento + required: false + schema: + type: string + - name: tipo + in: query + description: Filtro per tipo evento + required: false + schema: + type: string + - name: componente + in: query + description: Filtro per componente evento + required: false + schema: + type: string + enum: + - API_BACKOFFICE + - API_ENTE + - API_PAGOPA + - API_PAGAMENTO + - API_PENDENZE + - API_RAGIONERIA + - API_BACKEND_IO + - API_SECIM + - API_MYPIVOT + - API_MAGGIOLI_JPPA + - API_GOVPAY + - API_HYPERSIC_APK + - API_USER + - GOVPAY + - name: severitaDa + in: query + description: Filtro per severita' errore + required: false + schema: + type: integer + format: int32 + - name: severitaA + in: query + description: Filtro per severita' errore + required: false + schema: + type: integer + format: int32 responses: - '200': - description: Elenco degli eventi + "404": + description: Not Found content: application/json: schema: - allOf: - - $ref: '#/components/schemas/ListaPaginata' - - type: object - required: - - risultati - properties: - risultati: - type: array - items: - $ref: '#/components/schemas/Evento' - '401': - $ref: '#/components/responses/401' - '403': - $ref: '#/components/responses/403' - '500': - $ref: '#/components/responses/500' - put: - summary: Giornale degli eventi - operationId: addEvento + $ref: '#/components/schemas/problem' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "400": + description: Bad Request + content: + '*/*': + schema: + $ref: '#/components/schemas/problem' + "403": + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "200": + description: Lista eventi + content: + application/json: + schema: + $ref: '#/components/schemas/PagedModel' + "401": + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + post: tags: - - Giornale degli Eventi + - eventi + summary: Salvataggio di un nuovo evento + description: Salvataggio di un nuovo evento + operationId: addEvento requestBody: content: application/json: schema: - $ref: '#/components/schemas/NuovoEvento' + $ref: '#/components/schemas/nuovoEvento' + required: true responses: - '200': - description: Evento registrato con successo - '400': - $ref: '#/components/responses/400' - '401': - $ref: '#/components/responses/401' - '403': - $ref: '#/components/responses/403' - '422': - $ref: '#/components/responses/422' - '500': - $ref: '#/components/responses/500' - '/eventi/{id}': + "404": + description: Not Found + content: + '*/*': + schema: + $ref: '#/components/schemas/problem' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "403": + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "201": + description: Evento salvato con successo + content: + '*/*': + schema: + type: object + "422": + description: Unprocessable Entity + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "401": + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + /eventi/{id}: get: - summary: Dettaglio di un evento - operationId: getEvento tags: - - Giornale degli Eventi + - eventi + summary: Dettaglio di un evento + description: Dettaglio di un evento + operationId: getEventoById parameters: - - in: path - name: id - description: Identificativo Evento - required: true - schema: - type: string + - name: id + in: path + description: Id dell'evento da leggere. + required: true + schema: + type: integer + format: int64 responses: - '201': - description: Dettaglio di un evento + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "400": + description: Bad Request + content: + '*/*': + schema: + $ref: '#/components/schemas/problem' + "403": + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/problem' + "200": + description: Dettaglio Evento + content: + application/json: + schema: + $ref: '#/components/schemas/evento' + "401": + description: Unauthorized content: application/json: schema: - $ref: '#/components/schemas/Evento' - '401': - $ref: '#/components/responses/401' - '403': - $ref: '#/components/responses/403' - '404': - $ref: '#/components/responses/400' - '500': - $ref: '#/components/responses/500' + $ref: '#/components/schemas/problem' components: - parameters: - campi: - name: campi - in: query - description: >- - csv dei campi da includere nella risposta (default tutti) - required: false - schema: - type: string - categoriaEvento: - name: categoriaEvento - in: query - description: Filtro per categoria evento - required: false - schema: - $ref: '#/components/schemas/CategoriaEvento' - ccp: - name: ccp - in: query - description: Codice contesto pagamento - required: false - schema: - type: string - componenteEvento: - name: componente - in: query - description: Filtro per componente evento - required: false - schema: - $ref: '#/components/schemas/ComponenteEvento' - dataDa: - name: dataDa - in: query - description: Inizio della finestra temporale di osservazione - required: false - schema: - type: string - format: date-time - dataA: - name: dataA - in: query - description: Fine della finestra temporale di osservazione - required: false - schema: - type: string - format: date-time - esitoEvento: - name: esito - in: query - description: Filtro per esito evento - required: false - schema: - $ref: '#/components/schemas/EsitoEvento' - idA2A: - name: idA2A - in: query - description: Identificativo del gestionale proprietario della pendenza - required: false - schema: - type: string - idDominio: - name: idDominio - in: query - description: Identificativo del dominio beneficiario - required: false - schema: - type: string - pattern: '(^([0-9]){11}$)' - idPagamentoRpp: - name: idPagamento - in: query - description: Identificativo della richiesta di pagamento - required: false - schema: - type: string - example: 'c8be909b-2feb-4ffa-8f98-704462abbd1d' - idPendenza: - name: idPendenza - in: query - description: Identificativo della pendenza nel gestionale proprietario - required: false - schema: - type: string - iuv: - name: iuv - in: query - description: Identificativo univoco di versamento - required: false - schema: - type: string - maxRisultati: - name: maxRisultati - in: query - description: >- - Indica se il servizio deve impostare o meno il limite sul calcolo del numero di risultati - required: false - schema: - type: boolean - default: true - example: true - messaggiEvento: - name: messaggi - in: query - description: Include nella risposta le informazioni sui messaggi scambiati - required: false - schema: - type: boolean - metadatiPaginazione: - name: metadatiPaginazione - in: query - description: >- - Indica se il servizio calcola e valorizza i dati di paginazione o meno - required: false - schema: - type: boolean - default: true - example: true - ordinamento: - name: ordinamento - in: query - description: >- - Csv dei campi su cui ordinare i risultati, preceduti da + o - per ascendente o discendente (default ascendente) - * dataRichiestaPagamento - * stato - required: false - schema: - type: string - example: +name - pagina: - name: pagina - in: query - description: Numero di pagina dei risultati - required: false - schema: - $ref: '#/components/schemas/Pagina' - risultatiPerPagina: - name: risultatiPerPagina - in: query - description: Numero di risultati richiesti (max 5000) - required: false - schema: - $ref: '#/components/schemas/RisultatiPerPagina' - ruoloEvento: - name: ruolo - in: query - description: filtro per ruolo evento - required: false - schema: - $ref: '#/components/schemas/RuoloEvento' - severitaDa: - name: severitaDa - in: query - description: filtro per severita errore - required: false - schema: - type: integer - format: int32 - severitaA: - name: severitaA - in: query - description: filtro per severita errore - required: false - schema: - type: integer - format: int32 - sottotipoEvento: - name: sottotipoEvento - in: query - description: filtro per sottotipo evento - required: false - schema: - type: string - tipoEvento: - name: tipoEvento - in: query - description: filtro per tipologia evento - required: false - schema: - type: string - responses: - '400': - description: Richiesta non correttamente formata - content: - application/json: - schema: - $ref: '#/components/schemas/FaultBean' - example: - categoria: RICHIESTA - codice: INTERNO - descrizione: Servizio non disponibile - '401': - description: Richiesta non autenticata - '403': - description: Richiesta non autorizzata - '404': - description: Risorsa inesistente - '415': - description: Formato del messaggio non valido - '422': - description: Richiesta non processabile - content: - application/json: - schema: - $ref: '#/components/schemas/FaultBean' - example: - categoria: RICHIESTA - codice: INTERNO - descrizione: Richiesta non processabile - '500': - description: Servizio non disponibile - content: - application/json: - schema: - $ref: '#/components/schemas/FaultBean' - example: - categoria: INTERNO - codice: INTERNO - descrizione: Servizio non disponibile - securitySchemes: - basicAuth: - type: http - scheme: basic schemas: - CategoriaEvento: - type: string - enum: - - INTERNO - - INTERFACCIA - - UTENTE - example: 'INTERFACCIA' - ComponenteEvento: - type: string - description: Modulo interno che ha emesso l'evento - enum: - - API_BACKOFFICE - - API_ENTE - - API_PAGOPA - - API_PAGAMENTO - - API_PENDENZE - - API_RAGIONERIA - - API_BACKEND_IO - - API_SECIM - - API_MYPIVOT - - API_MAGGIOLI_JPPA - - API_GOVPAY - - API_HYPERSIC_APK - - API_USER - - GOVPAY - example: 'API_PAGOPA' - DatiPagoPA: + problem: + type: object + properties: + type: + type: string + format: uri + title: + type: string + status: + type: integer + format: int32 + detail: + type: string + instance: + type: string + format: uri + Links: + type: object + additionalProperties: + $ref: '#/components/schemas/Link' + datiPagoPA: type: object properties: idPsp: type: string - description: Identificativo del PSP - example: 'ABI12345' idCanale: type: string - example: 'ABI12345_01' idIntermediarioPsp: type: string - example: 'ABI12345_01' tipoVersamento: type: string - description: Tipologia di versamento realizzato - example: 'CP' modelloPagamento: type: string - description: Modello di pagamento utilizzato - example: '0' idDominio: type: string - example: '99999999999' idIntermediario: type: string - example: '99999999999' idStazione: type: string - example: '99999999999_01' idRiconciliazione: type: string - description: Identificativo dell'incasso - example: '12345' sct: type: string - description: Identificativo Sepa Credit Transfer - example: 2017-01-01ABI00000011234 idFlusso: type: string - description: identificativo del flusso di rendicontazione - example: 2017-11-21GovPAYPsp1-10:27:27.903 - dataFlusso: - type: string - format: date-time - description: data flusso di rendicontazione - example: '2017-07-21T17:32:28Z' idTracciato: type: number - description: Identificativo numerico del tracciato - example: - 123456 - EsitoEvento: - type: string - enum: - - OK - - KO - - FAIL - example: 'OK' - Evento: - allOf: - - $ref: '#/components/schemas/EventoIndex' - - type: object - required: - - parametriRichiesta - - parametriRisposta - properties: - parametriRichiesta: - type: object - description: 'Dettaglio del messaggio di richiesta' - parametriRisposta: - type: object - description: 'Dettaglio del messaggio di risposta' - EventoIndex: + _links: + $ref: '#/components/schemas/Links' + nuovoEvento: type: object - required: - - id - - componente - - categoriaEvento - - ruolo - - tipoEvento - - esito - - dataEvento - - durataEvento properties: id: type: integer format: int64 - description: Identificativo evento - example: 1201122131 componente: - $ref: '#/components/schemas/ComponenteEvento' + type: string + enum: + - API_BACKOFFICE + - API_ENTE + - API_PAGOPA + - API_PAGAMENTO + - API_PENDENZE + - API_RAGIONERIA + - API_BACKEND_IO + - API_SECIM + - API_MYPIVOT + - API_MAGGIOLI_JPPA + - API_GOVPAY + - API_HYPERSIC_APK + - API_USER + - GOVPAY categoriaEvento: - $ref: '#/components/schemas/CategoriaEvento' + type: string + enum: + - INTERNO + - INTERFACCIA + - UTENTE ruolo: - $ref: '#/components/schemas/RuoloEvento' - tipoEvento: type: string - example: 'nodoInviaRPT' + enum: + - CLIENT + - SERVER + tipoEvento: maxLength: 255 + minLength: 0 + type: string esito: - $ref: '#/components/schemas/EsitoEvento' + type: string + enum: + - OK + - KO + - FAIL dataEvento: type: string format: date-time - description: Data emissione evento - example: '2017-07-21T17:32:28Z' durataEvento: type: integer format: int64 - description: Durata evento (in millisecondi) - example: 120 sottotipoEvento: - type: string - example: 'richiesta verso il nodo' maxLength: 255 - sottotipoEsito: + minLength: 0 type: string - description: Descrizione dell'esito - example: '200' + sottotipoEsito: maxLength: 255 + minLength: 0 + type: string dettaglioEsito: type: string - example: 'Operazione completata con successo' idDominio: + pattern: "(^([0-9]){11}$)" type: string - description: Identificativo ente creditore - example: 01234567890 - pattern: '(^([0-9]){11}$)' iuv: - type: string - description: Identificativo univoco di versamento - example: RF23567483937849450550875 maxLength: 35 - ccp: + minLength: 0 type: string - description: Codice contesto di pagamento - example: '1234acdc' + ccp: maxLength: 35 + minLength: 0 + type: string idA2A: + pattern: "(^[a-zA-Z0-9\\-_]{1,35}$)" type: string - description: Identificativo del gestionale responsabile della pendenza - example: 'A2A-12345' - pattern: '(^[a-zA-Z0-9\-_]{1,35}$)' idPendenza: + pattern: "(^[a-zA-Z0-9\\-_]{1,35}$)" type: string - description: Identificativo della pendenza nel gestionale responsabile - example: 'abcdef12345' - pattern: '(^[a-zA-Z0-9\-_]{1,35}$)' idPagamento: - type: string - description: Identificativo del pagamento assegnato da GovPay - example: 'f9866575-e255-4d10-9845-57ba88bec136' maxLength: 35 + minLength: 0 + type: string datiPagoPA: - $ref: '#/components/schemas/DatiPagoPA' + $ref: '#/components/schemas/datiPagoPA' severita: + maximum: 5 + minimum: 0 + type: integer + format: int32 + parametriRichiesta: + type: object + parametriRisposta: + type: object + idTracciato: + type: integer + format: int64 + idFr: + type: integer + format: int64 + idRiconciliazione: + type: integer + format: int64 + description: Evento da salvare. + Pageable: + type: object + properties: + page: + minimum: 0 type: integer format: int32 - description: indica il livello di severita nel caso di evento con esito KO/FAIL - example: 0 - FaultBean: + size: + minimum: 1 + type: integer + format: int32 + sort: + type: array + items: + type: string + PageMetadata: type: object - required: - - categoria - - codice - - descrizione properties: - categoria: - type: string - description: >- - Categoria dell'errore riscontrato: - * `AUTORIZZAZIONE` - Operazione non autorizzata - * `RICHIESTA` - Richiesta non valida - * `OPERAZIONE` - Operazione non eseguibile - * `PAGOPA` - Errore da PagoPA - * `EC` - Errore da Ente Creditore - * `INTERNO` - Errore interno + size: + type: integer + format: int64 + totalElements: + type: integer + format: int64 + totalPages: + type: integer + format: int64 + number: + type: integer + format: int64 + PagedModel: + type: object + properties: + _embedded: + type: object + properties: + objects: + type: array + items: + type: object + _links: + $ref: '#/components/schemas/Links' + page: + $ref: '#/components/schemas/PageMetadata' + evento: + type: object + properties: + id: + type: integer + format: int64 + componente: + type: string + enum: + - API_BACKOFFICE + - API_ENTE + - API_PAGOPA + - API_PAGAMENTO + - API_PENDENZE + - API_RAGIONERIA + - API_BACKEND_IO + - API_SECIM + - API_MYPIVOT + - API_MAGGIOLI_JPPA + - API_GOVPAY + - API_HYPERSIC_APK + - API_USER + - GOVPAY + categoriaEvento: + type: string + enum: + - INTERNO + - INTERFACCIA + - UTENTE + ruolo: + type: string enum: - - AUTORIZZAZIONE - - RICHIESTA - - OPERAZIONE - - PAGOPA - - EC - - INTERNO - codice: - type: string - description: Codice di errore - descrizione: - type: string - description: Descrizione dell'errore - dettaglio: - type: string - description: Descrizione aggiuntiva - example: - categoria: INTERNO - codice: INTERNO - descrizione: Servizio non disponibile - ListaPaginata: + - CLIENT + - SERVER + tipoEvento: + maxLength: 255 + minLength: 0 + type: string + esito: + type: string + enum: + - OK + - KO + - FAIL + dataEvento: + type: string + format: date-time + durataEvento: + type: integer + format: int64 + sottotipoEvento: + maxLength: 255 + minLength: 0 + type: string + sottotipoEsito: + maxLength: 255 + minLength: 0 + type: string + dettaglioEsito: + type: string + idDominio: + pattern: "(^([0-9]){11}$)" + type: string + iuv: + maxLength: 35 + minLength: 0 + type: string + ccp: + maxLength: 35 + minLength: 0 + type: string + idA2A: + pattern: "(^[a-zA-Z0-9\\-_]{1,35}$)" + type: string + idPendenza: + pattern: "(^[a-zA-Z0-9\\-_]{1,35}$)" + type: string + idPagamento: + maxLength: 35 + minLength: 0 + type: string + datiPagoPA: + $ref: '#/components/schemas/datiPagoPA' + severita: + maximum: 5 + minimum: 0 + type: integer + format: int32 + parametriRichiesta: + type: object + parametriRisposta: + type: object + _links: + $ref: '#/components/schemas/Links' + Link: type: object properties: - numRisultati: - type: number - format: integer - example: '100' - numPagine: - type: number - format: integer - example: '4' - risultatiPerPagina: - type: number - format: integer - example: '25' - pagina: - type: number - format: integer - example: '1' - prossimiRisultati: + href: type: string - format: integer - example: '/risorsa?pagina=2' - maxRisultati: - type: number - format: integer - example: '100' - NuovoEvento: - allOf: - - $ref: '#/components/schemas/EventoIndex' - - type: object - required: - - parametriRichiesta - - parametriRisposta - properties: - parametriRichiesta: - type: object - description: 'Dettaglio del messaggio di richiesta' - parametriRisposta: - type: object - description: 'Dettaglio del messaggio di risposta' - Pagina: - type: integer - default: 1 - minimum: 1 - RisultatiPerPagina: - type: integer - default: 25 - minimum: 0 - maximum: 200 - RuoloEvento: - type: string - enum: - - CLIENT - - SERVER - example: 'SERVER' + hreflang: + type: string + title: + type: string + type: + type: string + deprecation: + type: string + profile: + type: string + name: + type: string + templated: + type: boolean diff --git a/wars/api-gde/src/main/resources/openapi_gen.yaml b/wars/api-gde/src/main/resources/openapi_gen.yaml deleted file mode 100644 index 5e0c5bebb9..0000000000 --- a/wars/api-gde/src/main/resources/openapi_gen.yaml +++ /dev/null @@ -1,570 +0,0 @@ -openapi: 3.0.1 -info: - title: OpenAPI definition - version: v0 -servers: -- url: http://localhost:8080/govpay/backend/api/gde - description: Generated server url -paths: - /eventi: - get: - tags: - - eventi - summary: Ricerca eventi - description: Ricerca eventi - operationId: findEventi - parameters: - - name: pageable - in: query - description: informazioni di paginazione e ordinamento - required: true - schema: - $ref: '#/components/schemas/Pageable' - - name: dataDa - in: query - description: Inizio della finestra temporale di osservazione - required: false - schema: - type: string - format: date-time - - name: dataA - in: query - description: Fine della finestra temporale di osservazione - required: false - schema: - type: string - format: date-time - - name: idDominio - in: query - description: Identificativo del dominio beneficiario - required: false - schema: - type: string - - name: iuv - in: query - description: Identificativo univoco di versamento - required: false - schema: - type: string - - name: ccp - in: query - description: Codice contesto pagamento/ID ricevuta - required: false - schema: - type: string - - name: idA2A - in: query - description: Identificativo del gestionale proprietario della pendenza - required: false - schema: - type: string - - name: idPendenza - in: query - description: Identificativo della pendenza nel gestionale proprietario - required: false - schema: - type: string - - name: idPagamento - in: query - description: Identificativo della richiesta di pagamento - required: false - schema: - type: string - - name: categoria - in: query - description: Filtro per categoria evento - required: false - schema: - type: string - enum: - - INTERNO - - INTERFACCIA - - UTENTE - - name: esito - in: query - description: Filtro per esito evento - required: false - schema: - type: string - enum: - - OK - - KO - - FAIL - - name: ruolo - in: query - description: Filtro per ruolo evento - required: false - schema: - type: string - enum: - - CLIENT - - SERVER - - name: sottotipo - in: query - description: Filtro per sottotipo evento - required: false - schema: - type: string - - name: tipo - in: query - description: Filtro per tipo evento - required: false - schema: - type: string - - name: componente - in: query - description: Filtro per componente evento - required: false - schema: - type: string - enum: - - API_BACKOFFICE - - API_ENTE - - API_PAGOPA - - API_PAGAMENTO - - API_PENDENZE - - API_RAGIONERIA - - API_BACKEND_IO - - API_SECIM - - API_MYPIVOT - - API_MAGGIOLI_JPPA - - API_GOVPAY - - API_HYPERSIC_APK - - API_USER - - GOVPAY - - name: severitaDa - in: query - description: Filtro per severita' errore - required: false - schema: - type: integer - format: int32 - - name: severitaA - in: query - description: Filtro per severita' errore - required: false - schema: - type: integer - format: int32 - responses: - "422": - description: Unprocessable Entity - content: - '*/*': - schema: - $ref: '#/components/schemas/problem' - "404": - description: Not Found - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "500": - description: Internal Server Error - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "401": - description: Unauthorized - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "403": - description: Forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "200": - description: Lista eventi - content: - application/json: - schema: - $ref: '#/components/schemas/PagedModel' - post: - tags: - - eventi - summary: Salvataggio di un nuovo evento - description: Salvataggio di un nuovo evento - operationId: addEvento - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/nuovoEvento' - required: true - responses: - "422": - description: Unprocessable Entity - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "404": - description: Not Found - content: - '*/*': - schema: - $ref: '#/components/schemas/problem' - "500": - description: Internal Server Error - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "201": - description: Evento salvato con successo - content: - '*/*': - schema: - type: object - "401": - description: Unauthorized - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "403": - description: Forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "400": - description: Bad Request - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - /eventi/{id}: - get: - tags: - - eventi - summary: Dettaglio di un evento - description: Dettaglio di un evento - operationId: getEventoById - parameters: - - name: id - in: path - description: Id dell'evento da leggere. - required: true - schema: - type: integer - format: int64 - responses: - "422": - description: Unprocessable Entity - content: - '*/*': - schema: - $ref: '#/components/schemas/problem' - "404": - description: Not Found - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "500": - description: Internal Server Error - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "401": - description: Unauthorized - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "403": - description: Forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/problem' - "200": - description: Dettaglio Evento - content: - application/json: - schema: - $ref: '#/components/schemas/evento' -components: - schemas: - problem: - type: object - properties: - type: - type: string - format: uri - title: - type: string - status: - type: integer - format: int32 - detail: - type: string - instance: - type: string - format: uri - Links: - type: object - additionalProperties: - $ref: '#/components/schemas/Link' - datiPagoPA: - type: object - properties: - idPsp: - type: string - idCanale: - type: string - idIntermediarioPsp: - type: string - tipoVersamento: - type: string - modelloPagamento: - type: string - idDominio: - type: string - idIntermediario: - type: string - idStazione: - type: string - idRiconciliazione: - type: string - sct: - type: string - idFlusso: - type: string - idTracciato: - type: number - _links: - $ref: '#/components/schemas/Links' - nuovoEvento: - type: object - properties: - id: - type: integer - format: int64 - componente: - type: string - enum: - - API_BACKOFFICE - - API_ENTE - - API_PAGOPA - - API_PAGAMENTO - - API_PENDENZE - - API_RAGIONERIA - - API_BACKEND_IO - - API_SECIM - - API_MYPIVOT - - API_MAGGIOLI_JPPA - - API_GOVPAY - - API_HYPERSIC_APK - - API_USER - - GOVPAY - categoriaEvento: - type: string - enum: - - INTERNO - - INTERFACCIA - - UTENTE - ruolo: - type: string - enum: - - CLIENT - - SERVER - tipoEvento: - type: string - esito: - type: string - enum: - - OK - - KO - - FAIL - dataEvento: - type: string - format: date-time - durataEvento: - type: integer - format: int64 - sottotipoEvento: - type: string - sottotipoEsito: - type: string - dettaglioEsito: - type: string - idDominio: - type: string - iuv: - type: string - ccp: - type: string - idA2A: - type: string - idPendenza: - type: string - idPagamento: - type: string - datiPagoPA: - $ref: '#/components/schemas/datiPagoPA' - severita: - type: integer - format: int32 - parametriRichiesta: - type: object - parametriRisposta: - type: object - idTracciato: - type: integer - format: int64 - idFr: - type: integer - format: int64 - idRiconciliazione: - type: integer - format: int64 - _links: - $ref: '#/components/schemas/Links' - description: Evento da salvare. - Pageable: - type: object - properties: - page: - minimum: 0 - type: integer - format: int32 - size: - minimum: 1 - type: integer - format: int32 - sort: - type: array - items: - type: string - PageMetadata: - type: object - properties: - size: - type: integer - format: int64 - totalElements: - type: integer - format: int64 - totalPages: - type: integer - format: int64 - number: - type: integer - format: int64 - PagedModel: - type: object - properties: - _embedded: - type: object - properties: - objects: - type: array - items: - type: object - _links: - $ref: '#/components/schemas/Links' - page: - $ref: '#/components/schemas/PageMetadata' - evento: - type: object - properties: - id: - type: integer - format: int64 - componente: - type: string - enum: - - API_BACKOFFICE - - API_ENTE - - API_PAGOPA - - API_PAGAMENTO - - API_PENDENZE - - API_RAGIONERIA - - API_BACKEND_IO - - API_SECIM - - API_MYPIVOT - - API_MAGGIOLI_JPPA - - API_GOVPAY - - API_HYPERSIC_APK - - API_USER - - GOVPAY - categoriaEvento: - type: string - enum: - - INTERNO - - INTERFACCIA - - UTENTE - ruolo: - type: string - enum: - - CLIENT - - SERVER - tipoEvento: - type: string - esito: - type: string - enum: - - OK - - KO - - FAIL - dataEvento: - type: string - format: date-time - durataEvento: - type: integer - format: int64 - sottotipoEvento: - type: string - sottotipoEsito: - type: string - dettaglioEsito: - type: string - idDominio: - type: string - iuv: - type: string - ccp: - type: string - idA2A: - type: string - idPendenza: - type: string - idPagamento: - type: string - datiPagoPA: - $ref: '#/components/schemas/datiPagoPA' - severita: - type: integer - format: int32 - parametriRichiesta: - type: object - parametriRisposta: - type: object - _links: - $ref: '#/components/schemas/Links' - Link: - type: object - properties: - href: - type: string - hreflang: - type: string - title: - type: string - type: - type: string - deprecation: - type: string - profile: - type: string - name: - type: string - templated: - type: boolean diff --git a/wars/api-gde/src/test/java/it/govpay/gde/ApiGdeTest.java b/wars/api-gde/src/test/java/it/govpay/gde/ApiGdeTest.java new file mode 100644 index 0000000000..53bcc15414 --- /dev/null +++ b/wars/api-gde/src/test/java/it/govpay/gde/ApiGdeTest.java @@ -0,0 +1,71 @@ +package it.govpay.gde; + +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +import it.govpay.gde.model.NuovoEventoModel; +import it.govpay.gde.model.ProblemModel; + +public class ApiGdeTest extends BaseApiGdeTest { + + @Test + public void test1() throws Exception { + mvc.perform(get("/eventi") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content() + .contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.page.totalElements", is(0))); + } + + @Test + public void test2() throws Exception { + MvcResult mvcResult = mvc.perform(get("/eventi/10000") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andExpect(content() + .contentTypeCompatibleWith(MediaType.APPLICATION_JSON)).andReturn(); + + ProblemModel problem = this.mapFromJson(mvcResult.getResponse().getContentAsString() , ProblemModel.class); + assertEquals(mvcResult.getResponse().getStatus(), problem.getStatus()); + } + + @Test + public void test3() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()); + + mvc.perform(get("/eventi") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content() + .contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$.page.size", is(25))) + .andExpect(jsonPath("$.page.totalPages", is(1))) + .andExpect(jsonPath("$.page.number", is(0))) + .andExpect(jsonPath("$._embedded.eventi", hasSize(1))) + .andExpect(jsonPath("$._embedded.eventi[0].categoriaEvento", is(nuovoEvento.getCategoriaEvento().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].ruolo", is(nuovoEvento.getRuolo().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].componente", is(nuovoEvento.getComponente().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].durataEvento", is(nuovoEvento.getDurataEvento()), long.class)) + .andExpect(jsonPath("$._embedded.eventi[0].tipoEvento", is(nuovoEvento.getTipoEvento()))) + .andExpect(jsonPath("$._embedded.eventi[0].sottotipoEvento", is(nuovoEvento.getSottotipoEvento()))) + .andExpect(jsonPath("$._embedded.eventi[0].esito", is(nuovoEvento.getEsito().getValue()))); + + } +} diff --git a/wars/api-gde/src/test/java/it/govpay/gde/BaseApiGdeTest.java b/wars/api-gde/src/test/java/it/govpay/gde/BaseApiGdeTest.java new file mode 100644 index 0000000000..326ae51a57 --- /dev/null +++ b/wars/api-gde/src/test/java/it/govpay/gde/BaseApiGdeTest.java @@ -0,0 +1,137 @@ +package it.govpay.gde; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; + +import org.apache.commons.lang3.time.DateFormatUtils; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.hateoas.PagedModel; +import org.springframework.hateoas.mediatype.hal.Jackson2HalModule; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import it.govpay.gde.model.CategoriaEvento; +import it.govpay.gde.model.ComponenteEvento; +import it.govpay.gde.model.DatiPagoPAModel; +import it.govpay.gde.model.EsitoEvento; +import it.govpay.gde.model.EventoIndexModel; +import it.govpay.gde.model.NuovoEventoModel; +import it.govpay.gde.model.RuoloEvento; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = Application.class) +@RunWith(SpringRunner.class) +@AutoConfigureMockMvc +public abstract class BaseApiGdeTest { + + public static final String STRING_256 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + public static final String PATTERN_ID_DOMINIO_ERRATO = "123456 8901"; + public static final String PATTERN_ID_A2A_ERRATO = "aaaaaa_a 123456 8901"; + public static final String PATTERN_ID_PENDENZA_ERRATO = "aaaaa_aa 123456 8901"; + + @Autowired + protected MockMvc mvc; + + protected ObjectMapper objectMapper = null; + + public static DateFormat createDefaultDateFormat() { + SimpleDateFormat sdf = new SimpleDateFormat(DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.getPattern()); + sdf.setTimeZone(TimeZone.getTimeZone("Europe/Rome")); + sdf.setLenient(false); + return sdf; + } + + public BaseApiGdeTest() { + objectMapper = new ObjectMapper(); + + objectMapper.setDateFormat(createDefaultDateFormat()); + objectMapper.registerModule(new JavaTimeModule()); + + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.registerModule(new Jackson2HalModule()); + } + + protected String mapToJson(Object obj) throws JsonProcessingException { + return objectMapper.writeValueAsString(obj); + } + protected T mapFromJson(String json, Class clazz) + throws JsonParseException, JsonMappingException, IOException { + + return objectMapper.readValue(json, clazz); + } + + protected PagedModel pagedModelFromJson(String json, Class clazz) + throws JsonParseException, JsonMappingException, IOException { + + return objectMapper.readValue(json, new TypeReference>() {}); + } + + protected Map mapFromJson(String json) + throws JsonParseException, JsonMappingException, IOException { + + return objectMapper.readValue(json, new TypeReference>() {}); + } + + protected NuovoEventoModel buildNuovoEventoOK() { + NuovoEventoModel nuovoEvento = new NuovoEventoModel(); + nuovoEvento.setCategoriaEvento(CategoriaEvento.INTERNO); + nuovoEvento.setRuolo(RuoloEvento.CLIENT); + nuovoEvento.setComponente(ComponenteEvento.GOVPAY); + nuovoEvento.setDataEvento(LocalDateTime.now()); + nuovoEvento.setDurataEvento(0l); + nuovoEvento.setTipoEvento("tipoEvento"); + nuovoEvento.setSottotipoEvento("sottotipoEvento"); + nuovoEvento.setEsito(EsitoEvento.OK); + + return nuovoEvento; + } + + protected DatiPagoPAModel creaDatiPagoPAOk() { + DatiPagoPAModel datiPagoPA = new DatiPagoPAModel(); + datiPagoPA.setIdCanale("codCanale"); + datiPagoPA.setIdDominio("12345678901"); + datiPagoPA.setIdFlusso("idFr_1234567890"); + datiPagoPA.setIdIntermediario("11111111113"); + datiPagoPA.setIdIntermediarioPsp("11111111113"); + datiPagoPA.setIdPsp("codPsp"); + datiPagoPA.setIdRiconciliazione("trn_1234567890"); + datiPagoPA.setIdStazione("11111111113_01"); + datiPagoPA.setIdTracciato(BigDecimal.ONE); + datiPagoPA.setModelloPagamento("0"); + datiPagoPA.setSct("sct_1234567890"); + datiPagoPA.setTipoVersamento("CP"); + return datiPagoPA; + } + + protected Long leggiIdUltimoEvento(MvcResult mvcResult) + throws JsonParseException, JsonMappingException, IOException, UnsupportedEncodingException { + PagedModel mapFromJson = this.pagedModelFromJson(mvcResult.getResponse().getContentAsString(), EventoIndexModel.class); + + List eventi = new ArrayList<>( mapFromJson.getContent()); + + @SuppressWarnings("unchecked") + Map mapEvento = (Map) eventi.get(0); + Long idEvento = Long.valueOf(mapEvento.get("id").toString()); + return idEvento; + } +} diff --git a/wars/api-gde/src/test/java/it/govpay/gde/GetApiGdeTest.java b/wars/api-gde/src/test/java/it/govpay/gde/GetApiGdeTest.java new file mode 100644 index 0000000000..90cea3a481 --- /dev/null +++ b/wars/api-gde/src/test/java/it/govpay/gde/GetApiGdeTest.java @@ -0,0 +1,75 @@ +package it.govpay.gde; + +import static org.hamcrest.Matchers.is; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +import it.govpay.gde.model.NuovoEventoModel; + +public class GetApiGdeTest extends BaseApiGdeTest { + + @Test + public void testGetOK() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()); + + MvcResult mvcResult = mvc.perform(get("/eventi")) + .andExpect(status().isOk()) + .andExpect(content() + .contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$._embedded.eventi[0].categoriaEvento", is(nuovoEvento.getCategoriaEvento().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].ruolo", is(nuovoEvento.getRuolo().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].componente", is(nuovoEvento.getComponente().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].durataEvento", is(nuovoEvento.getDurataEvento()), long.class)) + .andExpect(jsonPath("$._embedded.eventi[0].tipoEvento", is(nuovoEvento.getTipoEvento()))) + .andExpect(jsonPath("$._embedded.eventi[0].sottotipoEvento", is(nuovoEvento.getSottotipoEvento()))) + .andExpect(jsonPath("$._embedded.eventi[0].esito", is(nuovoEvento.getEsito().getValue()))).andReturn(); + + Long idEvento = leggiIdUltimoEvento(mvcResult); + + mvc.perform(get("/eventi/" + idEvento)) + .andExpect(status().isOk()) + .andExpect(content() + .contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.id", is(idEvento), long.class)) + .andExpect(jsonPath("$.categoriaEvento", is(nuovoEvento.getCategoriaEvento().getValue()))) + .andExpect(jsonPath("$.ruolo", is(nuovoEvento.getRuolo().getValue()))) + .andExpect(jsonPath("$.componente", is(nuovoEvento.getComponente().getValue()))) + .andExpect(jsonPath("$.durataEvento", is(nuovoEvento.getDurataEvento()), long.class)) + .andExpect(jsonPath("$.tipoEvento", is(nuovoEvento.getTipoEvento()))) + .andExpect(jsonPath("$.sottotipoEvento", is(nuovoEvento.getSottotipoEvento()))) + .andExpect(jsonPath("$.esito", is(nuovoEvento.getEsito().getValue()))).andReturn(); + } + + @Test + public void testGetNotFound() throws Exception { + + Long idEvento = 100000l; + mvc.perform(get("/eventi/" + idEvento)) + .andExpect(status().isNotFound()) + .andExpect(jsonPath("$.title", is("Not Found"))) + .andExpect(jsonPath("$.status", is(404))) + .andExpect(jsonPath("$.detail", is("La risorsa /eventi/"+idEvento+" non esiste."))); + } + + @Test + public void testGetIdNonValido() throws Exception { + Long idEvento = -1l; + mvc.perform(get("/eventi/" + idEvento)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("getEventoById.id: Id dell'evento deve essere un valore > 0."))); + } +} diff --git a/wars/api-gde/src/test/java/it/govpay/gde/PostApiGdeTest.java b/wars/api-gde/src/test/java/it/govpay/gde/PostApiGdeTest.java new file mode 100644 index 0000000000..19683a5eb3 --- /dev/null +++ b/wars/api-gde/src/test/java/it/govpay/gde/PostApiGdeTest.java @@ -0,0 +1,335 @@ +package it.govpay.gde; + +import static org.hamcrest.Matchers.is; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; + +import it.govpay.gde.model.DatiPagoPAModel; +import it.govpay.gde.model.NuovoEventoModel; + +public class PostApiGdeTest extends BaseApiGdeTest { + + @Test + public void testOK() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()); + + mvc.perform(get("/eventi") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content() + .contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$._embedded.eventi[0].categoriaEvento", is(nuovoEvento.getCategoriaEvento().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].ruolo", is(nuovoEvento.getRuolo().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].componente", is(nuovoEvento.getComponente().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].durataEvento", is(nuovoEvento.getDurataEvento()), long.class)) + .andExpect(jsonPath("$._embedded.eventi[0].tipoEvento", is(nuovoEvento.getTipoEvento()))) + .andExpect(jsonPath("$._embedded.eventi[0].sottotipoEvento", is(nuovoEvento.getSottotipoEvento()))) + .andExpect(jsonPath("$._embedded.eventi[0].esito", is(nuovoEvento.getEsito().getValue()))); + + } + + @Test + public void testDatiPagoPAOK() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + + DatiPagoPAModel datiPagoPA = creaDatiPagoPAOk(); + nuovoEvento.setDatiPagoPA(datiPagoPA ); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()); + + mvc.perform(get("/eventi") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content() + .contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$._embedded.eventi[0].categoriaEvento", is(nuovoEvento.getCategoriaEvento().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].ruolo", is(nuovoEvento.getRuolo().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].componente", is(nuovoEvento.getComponente().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].durataEvento", is(nuovoEvento.getDurataEvento()), long.class)) + .andExpect(jsonPath("$._embedded.eventi[0].tipoEvento", is(nuovoEvento.getTipoEvento()))) + .andExpect(jsonPath("$._embedded.eventi[0].sottotipoEvento", is(nuovoEvento.getSottotipoEvento()))) + .andExpect(jsonPath("$._embedded.eventi[0].esito", is(nuovoEvento.getEsito().getValue()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idCanale", is(nuovoEvento.getDatiPagoPA().getIdCanale()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idDominio", is(nuovoEvento.getDatiPagoPA().getIdDominio()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idFlusso", is(nuovoEvento.getDatiPagoPA().getIdFlusso()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idIntermediario", is(nuovoEvento.getDatiPagoPA().getIdIntermediario()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idIntermediarioPsp", is(nuovoEvento.getDatiPagoPA().getIdIntermediarioPsp()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idPsp", is(nuovoEvento.getDatiPagoPA().getIdPsp()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idRiconciliazione", is(nuovoEvento.getDatiPagoPA().getIdRiconciliazione()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idStazione", is(nuovoEvento.getDatiPagoPA().getIdStazione()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idTracciato", is(nuovoEvento.getDatiPagoPA().getIdTracciato()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idModelloPagamento", is(nuovoEvento.getDatiPagoPA().getModelloPagamento()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idSct", is(nuovoEvento.getDatiPagoPA().getSct()))) + .andExpect(jsonPath("$._embedded.eventi[0].datiPagoPA.idTipoVersamento", is(nuovoEvento.getDatiPagoPA().getTipoVersamento()))) + + ; + + } + + @Test + public void testLunghezzaTipoEvento() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setTipoEvento(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo tipoEvento non rispetta la lunghezza massima di 255 caratteri."))); + + } + + @Test + public void testLunghezzaSottotipoEvento() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setSottotipoEvento(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo sottotipoEvento non rispetta la lunghezza massima di 255 caratteri."))); + } + + @Test + public void testLunghezzaSottotipoEsito() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setSottotipoEsito(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo sottotipoEsito non rispetta la lunghezza massima di 255 caratteri."))); + } + + @Test + public void testLunghezzaIuv() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIuv(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo iuv non rispetta la lunghezza massima di 35 caratteri."))); + } + + @Test + public void testLunghezzaCcp() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setCcp(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo ccp non rispetta la lunghezza massima di 35 caratteri."))); + } + + @Test + public void testLunghezzaIdPagamento() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdPagamento(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo idPagamento non rispetta la lunghezza massima di 35 caratteri."))); + } + + @Test + public void testLunghezzaIdDominio() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdDominio(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo idDominio non rispetta il pattern previsto."))); + } + + @Test + public void testLunghezzaIdA2A() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdA2A(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo idA2A non rispetta il pattern previsto."))); + } + + @Test + public void testLunghezzaIdPendenza() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdPendenza(STRING_256); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo idPendenza non rispetta il pattern previsto."))); + } + + @Test + public void testPatternIdDominio() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdDominio(PATTERN_ID_DOMINIO_ERRATO); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo idDominio non rispetta il pattern previsto."))); + } + + @Test + public void testPatternIdA2A() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdA2A(PATTERN_ID_A2A_ERRATO); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo idA2A non rispetta il pattern previsto."))); + } + + @Test + public void testPatternIdPendenza() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdPendenza(PATTERN_ID_PENDENZA_ERRATO); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il valore presente nel campo idPendenza non rispetta il pattern previsto."))); + } + + @Test + public void testDurataEventoMinZero() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setDurataEvento(-1l); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il campo durataEvento deve contenere un valore >= 0."))); + } + + @Test + public void testSeveritaMinZero() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setSeverita(-1); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il campo severita deve contenere un valore >= 0."))); + } + + @Test + public void testSeveritaMagCinque() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setSeverita(6); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il campo severita deve contenere un valore <= 5."))); + } + + @Test + public void testIdTracciatoZero() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdTracciato(0l); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il campo idTracciato deve contenere un valore > 0."))); + } + + @Test + public void testIdFrZero() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdFr(0l); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il campo idFr deve contenere un valore > 0."))); + } + + @Test + public void testIdRiconciliazioneZero() throws Exception { + NuovoEventoModel nuovoEvento = buildNuovoEventoOK(); + nuovoEvento.setIdRiconciliazione(0l); + + mvc.perform(post("/eventi") + .content(this.mapToJson(nuovoEvento)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.title", is("Bad Request"))) + .andExpect(jsonPath("$.status", is(400))) + .andExpect(jsonPath("$.detail", is("Il campo idRiconciliazione deve contenere un valore > 0."))); + } +} diff --git a/wars/api-gde/src/test/resources/application.properties b/wars/api-gde/src/test/resources/application.properties index a6c87dbbb4..040d263ec3 100644 --- a/wars/api-gde/src/test/resources/application.properties +++ b/wars/api-gde/src/test/resources/application.properties @@ -5,19 +5,21 @@ logging.level.org.springframework=DEBUG spring.mvc.date-format=yyyy-MM-dd spring.mvc.datetime-format=yyyy-MM-dd'T'HH:mm:ssZ -spring.jpa.generate-ddl=false -spring.jpa.hibernate.ddl-auto=none +spring.datasource.url=jdbc:h2:mem:test +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= -spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create -spring.datasource.url=jdbc:postgresql://localhost:5432/govpay_40 -spring.datasource.username=govpay -spring.datasource.password=govpay +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.defer-datasource-initialization=true +spring.jpa.show-sql=false +spring.h2.console.enabled=false spring.jpa.open-in-view=false server.error.whitelabel.enabled=true - # Customizzazione Logback logging.directoryPath=/var/log/govpay