From 388187f34986d540cb40601acd4a4e4446d6076e Mon Sep 17 00:00:00 2001 From: gabrielecanesi Date: Mon, 11 Mar 2019 22:42:47 +0100 Subject: [PATCH 1/3] Aggiunta api GET /unitalogistiche/utente/id creazione della classe astratta Contenuto e della classe dei dettagli da ritornare dall'api --- .../controller/UnitaLogisticheController.java | 60 +++++++++++++++++++ .../it/myti/academy/backend/model/Collo.java | 9 ++- .../myti/academy/backend/model/Contenuto.java | 16 +---- .../academy/backend/model/ContenutoBase.java | 7 +++ .../backend/model/ContenutoCompleto.java | 22 +++++++ .../it/myti/academy/backend/model/Evento.java | 3 + .../academy/backend/model/EventoTipo.java | 2 + .../academy/backend/model/Spedizione.java | 2 + .../backend/model/StatoUnitaLogistica.java | 2 + .../academy/backend/model/UnitaLogistica.java | 4 ++ .../it/myti/academy/backend/model/Utente.java | 2 + .../DettagliUnitaLogisticaUtente.java | 22 +++++++ .../backend/repository/ColloRepository.java | 2 + .../repository/UnitaLogisticaRepository.java | 11 ++++ .../backend/repository/UtenteRepository.java | 3 +- 15 files changed, 152 insertions(+), 15 deletions(-) create mode 100644 src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java create mode 100644 src/main/java/it/myti/academy/backend/model/ContenutoBase.java create mode 100644 src/main/java/it/myti/academy/backend/model/ContenutoCompleto.java create mode 100644 src/main/java/it/myti/academy/backend/model/dettagli/DettagliUnitaLogisticaUtente.java create mode 100644 src/main/java/it/myti/academy/backend/repository/UnitaLogisticaRepository.java diff --git a/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java b/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java new file mode 100644 index 0000000..6ae9e7e --- /dev/null +++ b/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java @@ -0,0 +1,60 @@ +package it.myti.academy.backend.controller; + + import it.myti.academy.backend.model.*; + import it.myti.academy.backend.model.dettagli.DettagliUnitaLogisticaUtente; + import it.myti.academy.backend.repository.ColloRepository; + import it.myti.academy.backend.repository.UnitaLogisticaRepository; + import it.myti.academy.backend.repository.UtenteRepository; + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.web.bind.annotation.GetMapping; + import org.springframework.web.bind.annotation.PathVariable; + import org.springframework.web.bind.annotation.RestController; + import java.util.List; + import java.util.stream.Collectors; + +@RestController +public class UnitaLogisticheController { + + @Autowired + UnitaLogisticaRepository unitaLogisticaRepository; + + @Autowired + ColloRepository colloRepository; + + @Autowired + UtenteRepository utenteRepository; + + + @GetMapping("unitalogistiche/utente/{id}") + public List getAllByUtente(@PathVariable("id") Long id){ + Utente utente = utenteRepository.getById(id); + List colliUtente = colloRepository.findAllByUtente(utente); + return colliUtente.stream().map(collo -> { + List contenutiBase = collo.getContenuti().stream().map(contenuto -> { + ContenutoBase contenutoBase = new ContenutoBase(); + contenutoBase.setDescrizione(contenuto.getDescrizione()); + contenutoBase.setId(contenuto.getId()); + contenutoBase.setNome(contenuto.getNome()); + contenutoBase.setQuantita(contenuto.getQuantita()); + contenutoBase.setTempMaxRichiesta(contenuto.getTempMaxRichiesta()); + contenutoBase.setTempMinRichiesta(contenuto.getTempMinRichiesta()); + contenutoBase.setUnitaDiMisura(contenuto.getUnitaDiMisura()); + return contenutoBase; + }).collect(Collectors.toList()); + EventoParticle evento = (EventoParticle) collo.getEventi().get(collo.getEventi().size() - 1); + DettagliUnitaLogisticaUtente dettagliUnitaLogisticaUtente = new DettagliUnitaLogisticaUtente(); + dettagliUnitaLogisticaUtente.setId(collo.getUnitaLogistica().getId()); + dettagliUnitaLogisticaUtente.setNome(collo.getUnitaLogistica().getCodice()); + dettagliUnitaLogisticaUtente.setLatitudine(evento.getLatitudine().toString()); + dettagliUnitaLogisticaUtente.setLongitudine(evento.getLongitudine().toString()); + dettagliUnitaLogisticaUtente.setUmidita(evento.getUmidita()); + dettagliUnitaLogisticaUtente.setSpedizione(collo.getSpedizione()); + dettagliUnitaLogisticaUtente.setStatus(collo.getUnitaLogistica().getStato()); + dettagliUnitaLogisticaUtente.setTemperatura(evento.getTemperatura()); + dettagliUnitaLogisticaUtente.setContenuti(contenutiBase); + return dettagliUnitaLogisticaUtente; + }).collect(Collectors.toList()); + } + + +} diff --git a/src/main/java/it/myti/academy/backend/model/Collo.java b/src/main/java/it/myti/academy/backend/model/Collo.java index 85ec2b6..de79ac3 100644 --- a/src/main/java/it/myti/academy/backend/model/Collo.java +++ b/src/main/java/it/myti/academy/backend/model/Collo.java @@ -1,5 +1,7 @@ package it.myti.academy.backend.model; +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonManagedReference; import lombok.Data; import javax.persistence.Column; @@ -26,22 +28,27 @@ public class Collo { @GeneratedValue(strategy = GenerationType.AUTO) protected Long id; + @JsonManagedReference @ManyToOne @JoinColumn(name = "unita_logistica_id") protected UnitaLogistica unitaLogistica; + @JsonManagedReference @ManyToOne @JoinColumn(name = "spedizione_id") protected Spedizione spedizione; + @JsonManagedReference @ManyToOne @JoinColumn(name = "utente_id") protected Utente utente; + @JsonBackReference @Column @OneToMany(mappedBy = "collo") - protected List contenuti; + protected List contenuti; + @JsonBackReference @Column @OneToMany(mappedBy = "collo") protected List eventi; diff --git a/src/main/java/it/myti/academy/backend/model/Contenuto.java b/src/main/java/it/myti/academy/backend/model/Contenuto.java index f4a2c73..ec58136 100644 --- a/src/main/java/it/myti/academy/backend/model/Contenuto.java +++ b/src/main/java/it/myti/academy/backend/model/Contenuto.java @@ -2,22 +2,16 @@ import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import javax.persistence.*; /** * Created by david at 2019-02-13 */ @Data @Entity +@Inheritance @Table(name = "contenuti") -public class Contenuto { +abstract public class Contenuto { @Id @Column(updatable = false) @@ -41,8 +35,4 @@ public class Contenuto { @Column(length = 2) protected String unitaDiMisura; - - @ManyToOne - @JoinColumn(name = "collo_id") - protected Collo collo; } diff --git a/src/main/java/it/myti/academy/backend/model/ContenutoBase.java b/src/main/java/it/myti/academy/backend/model/ContenutoBase.java new file mode 100644 index 0000000..0ad1f81 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/ContenutoBase.java @@ -0,0 +1,7 @@ +package it.myti.academy.backend.model; +import lombok.Data; + +@Data +public class ContenutoBase extends Contenuto{ + +} diff --git a/src/main/java/it/myti/academy/backend/model/ContenutoCompleto.java b/src/main/java/it/myti/academy/backend/model/ContenutoCompleto.java new file mode 100644 index 0000000..21a2163 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/ContenutoCompleto.java @@ -0,0 +1,22 @@ +package it.myti.academy.backend.model; + +import com.fasterxml.jackson.annotation.JsonManagedReference; +import lombok.Data; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +/** + * Created by david at 2019-02-13 + */ +@Data +@Entity +@Table(name = "contenuti") +public class ContenutoCompleto extends Contenuto{ + + @JsonManagedReference + @ManyToOne + @JoinColumn(name = "collo_id") + protected Collo collo; +} diff --git a/src/main/java/it/myti/academy/backend/model/Evento.java b/src/main/java/it/myti/academy/backend/model/Evento.java index 428f47a..1387c09 100644 --- a/src/main/java/it/myti/academy/backend/model/Evento.java +++ b/src/main/java/it/myti/academy/backend/model/Evento.java @@ -1,5 +1,6 @@ package it.myti.academy.backend.model; +import com.fasterxml.jackson.annotation.JsonManagedReference; import lombok.Data; import javax.persistence.Column; @@ -40,10 +41,12 @@ public abstract class Evento { @Temporal(TemporalType.TIMESTAMP) protected Date ricevutoIl = new Date(); + @JsonManagedReference @ManyToOne @JoinColumn(name = "evento_tipo_id") protected EventoTipo tipo; + @JsonManagedReference @ManyToOne @JoinColumn(name = "collo_id") protected Collo collo; diff --git a/src/main/java/it/myti/academy/backend/model/EventoTipo.java b/src/main/java/it/myti/academy/backend/model/EventoTipo.java index 4a0138d..5543964 100644 --- a/src/main/java/it/myti/academy/backend/model/EventoTipo.java +++ b/src/main/java/it/myti/academy/backend/model/EventoTipo.java @@ -1,5 +1,6 @@ package it.myti.academy.backend.model; +import com.fasterxml.jackson.annotation.JsonBackReference; import lombok.Data; import javax.persistence.Column; @@ -30,6 +31,7 @@ public class EventoTipo { @Column(length = 2048) protected String descrizione; + @JsonBackReference @OneToMany(mappedBy = "tipo") protected List eventi; } diff --git a/src/main/java/it/myti/academy/backend/model/Spedizione.java b/src/main/java/it/myti/academy/backend/model/Spedizione.java index 11abe00..108fa05 100644 --- a/src/main/java/it/myti/academy/backend/model/Spedizione.java +++ b/src/main/java/it/myti/academy/backend/model/Spedizione.java @@ -1,5 +1,6 @@ package it.myti.academy.backend.model; +import com.fasterxml.jackson.annotation.JsonBackReference; import lombok.Data; import javax.persistence.Column; @@ -44,6 +45,7 @@ public class Spedizione { @Column(name = "arrivo_a", nullable = false) protected String arrivoA; + @JsonBackReference @Column @OneToMany(mappedBy = "spedizione") protected List colliInviati; diff --git a/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java b/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java index cb5b755..683f127 100644 --- a/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java +++ b/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java @@ -1,5 +1,6 @@ package it.myti.academy.backend.model; +import com.fasterxml.jackson.annotation.JsonBackReference; import lombok.Data; import javax.persistence.Column; @@ -31,6 +32,7 @@ public class StatoUnitaLogistica { @Column(length = 2048) protected String descrizione; + @JsonBackReference @OneToMany(mappedBy = "stato") protected List unitaLogistiche; diff --git a/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java b/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java index 861bd7a..f4036d2 100644 --- a/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java +++ b/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java @@ -1,5 +1,7 @@ package it.myti.academy.backend.model; +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonManagedReference; import lombok.Data; import javax.persistence.Column; @@ -36,10 +38,12 @@ public class UnitaLogistica { @Column(name = "temp_minima") protected Short temperaturaMinima; + @JsonManagedReference @ManyToOne @JoinColumn(name = "stato_id") protected StatoUnitaLogistica stato; + @JsonBackReference @Column @OneToMany(mappedBy = "unitaLogistica") protected List spedizioniFatte; diff --git a/src/main/java/it/myti/academy/backend/model/Utente.java b/src/main/java/it/myti/academy/backend/model/Utente.java index 32b4591..388e11c 100644 --- a/src/main/java/it/myti/academy/backend/model/Utente.java +++ b/src/main/java/it/myti/academy/backend/model/Utente.java @@ -1,5 +1,6 @@ package it.myti.academy.backend.model; +import com.fasterxml.jackson.annotation.JsonBackReference; import lombok.Data; import javax.persistence.Column; @@ -33,6 +34,7 @@ public class Utente { @Column(length = 64, nullable = false) protected String nome; + @JsonBackReference @Column @OneToMany(mappedBy = "utente") protected List spedizioniFatte; diff --git a/src/main/java/it/myti/academy/backend/model/dettagli/DettagliUnitaLogisticaUtente.java b/src/main/java/it/myti/academy/backend/model/dettagli/DettagliUnitaLogisticaUtente.java new file mode 100644 index 0000000..98fce13 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/dettagli/DettagliUnitaLogisticaUtente.java @@ -0,0 +1,22 @@ +package it.myti.academy.backend.model.dettagli; + +import it.myti.academy.backend.model.Contenuto; +import it.myti.academy.backend.model.Spedizione; +import it.myti.academy.backend.model.StatoUnitaLogistica; +import lombok.Data; + +import java.util.List; + +@Data +public class DettagliUnitaLogisticaUtente { + + protected Long id; + protected String nome; + protected StatoUnitaLogistica status; + protected String latitudine; + protected String longitudine; + protected Double temperatura; + protected Double umidita; + protected Spedizione spedizione; + protected List contenuti; +} diff --git a/src/main/java/it/myti/academy/backend/repository/ColloRepository.java b/src/main/java/it/myti/academy/backend/repository/ColloRepository.java index 85d4171..42054dc 100644 --- a/src/main/java/it/myti/academy/backend/repository/ColloRepository.java +++ b/src/main/java/it/myti/academy/backend/repository/ColloRepository.java @@ -1,5 +1,6 @@ package it.myti.academy.backend.repository; +import it.myti.academy.backend.model.UnitaLogistica; import it.myti.academy.backend.model.Utente; import it.myti.academy.backend.model.Collo; import org.springframework.data.jpa.repository.JpaRepository; @@ -11,4 +12,5 @@ */ public interface ColloRepository extends JpaRepository { List findAllByUtente(Utente utente); + List findAllByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica); } diff --git a/src/main/java/it/myti/academy/backend/repository/UnitaLogisticaRepository.java b/src/main/java/it/myti/academy/backend/repository/UnitaLogisticaRepository.java new file mode 100644 index 0000000..c3170dc --- /dev/null +++ b/src/main/java/it/myti/academy/backend/repository/UnitaLogisticaRepository.java @@ -0,0 +1,11 @@ +package it.myti.academy.backend.repository; + +import it.myti.academy.backend.model.UnitaLogistica; +import org.springframework.data.jpa.repository.JpaRepository; + + + +public interface UnitaLogisticaRepository extends JpaRepository { + UnitaLogistica getById(Long id); + +} diff --git a/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java b/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java index 274a836..3e45784 100644 --- a/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java +++ b/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java @@ -2,10 +2,11 @@ import it.myti.academy.backend.model.Utente; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; /** * Created by david at 2019-02-20 */ public interface UtenteRepository extends JpaRepository { + Utente getById(Long id); + } From ddc111dcd427ef04db83d57263e8c08fd4a54606 Mon Sep 17 00:00:00 2001 From: gabrielecanesi Date: Tue, 12 Mar 2019 20:45:47 +0100 Subject: [PATCH 2/3] =?UTF-8?q?aggiunta=20api=20unit=C3=A0=20logistiche=20?= =?UTF-8?q?aggiunta=20api=20spedizioni=20aggiunti=20service=20implementazi?= =?UTF-8?q?one=20e=20gestione=20delle=20eccezioni?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/controller/ColliController.java | 13 ++-- .../controller/EccezioniController.java | 33 ++++++++ .../backend/controller/EventiController.java | 27 +++++++ .../controller/HelloWorldController.java | 33 -------- .../controller/UnitaLogisticheController.java | 60 +++++---------- .../DettagliUnitaLogisticaUtente.java | 2 +- .../errori/ColloNonTrovatoException.java | 4 + .../backend/model/errori/DettagliErrore.java | 18 +++++ .../SpedizioniAttiveNonTrovateException.java | 4 + .../UnitaLogisticaNonTrovataException.java | 12 +++ .../errori/UtenteNonTrovatoException.java | 4 + .../backend/repository/ColloRepository.java | 3 + .../repository/UnitaLogisticaRepository.java | 6 +- .../academy/backend/service/ColloService.java | 7 +- .../backend/service/ContenutoService.java | 10 +++ .../backend/service/EventoService.java | 12 +++ .../backend/service/HelloWorldService.java | 9 --- .../service/UnitaLogisticaService.java | 15 ++++ .../backend/service/UtenteService.java | 12 +++ .../service/impl/ColloServiceImpl.java | 21 +++++- .../service/impl/ContenutoServiceImpl.java | 29 +++++++ .../service/impl/EventoServiceImpl.java | 32 ++++++++ .../service/impl/HelloWorldServiceImpl.java | 20 ----- .../impl/UnitaLogisticaServiceImpl.java | 75 +++++++++++++++++++ .../service/impl/UtenteServiceImpl.java | 22 ++++++ src/main/resources/data.sql | 11 ++- .../controller/HelloWorldControllerTest.java | 63 ---------------- 27 files changed, 375 insertions(+), 182 deletions(-) create mode 100644 src/main/java/it/myti/academy/backend/controller/EccezioniController.java create mode 100644 src/main/java/it/myti/academy/backend/controller/EventiController.java delete mode 100644 src/main/java/it/myti/academy/backend/controller/HelloWorldController.java rename src/main/java/it/myti/academy/backend/model/{dettagli => entitaRisposte}/DettagliUnitaLogisticaUtente.java (91%) create mode 100644 src/main/java/it/myti/academy/backend/model/errori/ColloNonTrovatoException.java create mode 100644 src/main/java/it/myti/academy/backend/model/errori/DettagliErrore.java create mode 100644 src/main/java/it/myti/academy/backend/model/errori/SpedizioniAttiveNonTrovateException.java create mode 100644 src/main/java/it/myti/academy/backend/model/errori/UnitaLogisticaNonTrovataException.java create mode 100644 src/main/java/it/myti/academy/backend/model/errori/UtenteNonTrovatoException.java create mode 100644 src/main/java/it/myti/academy/backend/service/ContenutoService.java create mode 100644 src/main/java/it/myti/academy/backend/service/EventoService.java delete mode 100644 src/main/java/it/myti/academy/backend/service/HelloWorldService.java create mode 100644 src/main/java/it/myti/academy/backend/service/UnitaLogisticaService.java create mode 100644 src/main/java/it/myti/academy/backend/service/UtenteService.java create mode 100644 src/main/java/it/myti/academy/backend/service/impl/ContenutoServiceImpl.java create mode 100644 src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java delete mode 100644 src/main/java/it/myti/academy/backend/service/impl/HelloWorldServiceImpl.java create mode 100644 src/main/java/it/myti/academy/backend/service/impl/UnitaLogisticaServiceImpl.java create mode 100644 src/main/java/it/myti/academy/backend/service/impl/UtenteServiceImpl.java delete mode 100644 src/test/java/it/myti/academy/backend/controller/HelloWorldControllerTest.java diff --git a/src/main/java/it/myti/academy/backend/controller/ColliController.java b/src/main/java/it/myti/academy/backend/controller/ColliController.java index dfc1ea1..76f152c 100644 --- a/src/main/java/it/myti/academy/backend/controller/ColliController.java +++ b/src/main/java/it/myti/academy/backend/controller/ColliController.java @@ -2,8 +2,11 @@ import it.myti.academy.backend.model.Collo; import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; +import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; import it.myti.academy.backend.repository.UtenteRepository; import it.myti.academy.backend.service.ColloService; +import it.myti.academy.backend.service.UtenteService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -14,20 +17,20 @@ /** * Created by david at 2019-03-07 */ -@RestController("/collo") +@RestController public class ColliController { @Autowired ColloService colloService; @Autowired - UtenteRepository utenteRepository; + UtenteService utenteService; - @GetMapping("/utente/{id}") - public List getByUtente(@PathVariable("id") long id) { + @GetMapping("/collo/utente/{id}") + public List getByUtente(@PathVariable("id") long id) throws UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { List returnValue = null; - final Utente utente = utenteRepository.findById(id).get(); + final Utente utente = utenteService.getById(id); if(utente!=null) { returnValue = colloService.getSpedizioniAttiveByUtente(utente); } diff --git a/src/main/java/it/myti/academy/backend/controller/EccezioniController.java b/src/main/java/it/myti/academy/backend/controller/EccezioniController.java new file mode 100644 index 0000000..446d5bb --- /dev/null +++ b/src/main/java/it/myti/academy/backend/controller/EccezioniController.java @@ -0,0 +1,33 @@ +package it.myti.academy.backend.controller; + +import it.myti.academy.backend.model.errori.*; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@ControllerAdvice +@RestController +public class EccezioniController extends ResponseEntityExceptionHandler { + + @ExceptionHandler(UnitaLogisticaNonTrovataException.class) + public final DettagliErrore gestisciUnitaNonTrovata(UnitaLogisticaNonTrovataException e) { + return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Nessuna unità logistica trovata."); + } + + @ExceptionHandler(UtenteNonTrovatoException.class) + public final DettagliErrore gestisciUtenteNonTrovato(UtenteNonTrovatoException e) { + return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Utente non trovato."); + } + + @ExceptionHandler(ColloNonTrovatoException.class) + public final DettagliErrore gestisciUtenteNonTrovato(ColloNonTrovatoException e) { + return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Collo non trovato."); + } + + @ExceptionHandler(SpedizioniAttiveNonTrovateException.class) + public final DettagliErrore gestisciSpedizioniAttiveNonTrovate(SpedizioniAttiveNonTrovateException e) { + return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Non esistono spedizioni attive per l'utente."); + } +} \ No newline at end of file diff --git a/src/main/java/it/myti/academy/backend/controller/EventiController.java b/src/main/java/it/myti/academy/backend/controller/EventiController.java new file mode 100644 index 0000000..c2a1a30 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/controller/EventiController.java @@ -0,0 +1,27 @@ +package it.myti.academy.backend.controller; + +import it.myti.academy.backend.model.Evento; +import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; +import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; +import it.myti.academy.backend.service.EventoService; +import it.myti.academy.backend.service.UtenteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class EventiController { + @Autowired + EventoService eventoService; + + @Autowired + UtenteService utenteService; + + @GetMapping("/eventi/utente/{idUtente}") + public List getRventiByCollo(@PathVariable("idUtente") Long idUtente) throws UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { + return eventoService.findEventiAttiviByUtente(utenteService.getById(idUtente)); + } +} diff --git a/src/main/java/it/myti/academy/backend/controller/HelloWorldController.java b/src/main/java/it/myti/academy/backend/controller/HelloWorldController.java deleted file mode 100644 index a20eb27..0000000 --- a/src/main/java/it/myti/academy/backend/controller/HelloWorldController.java +++ /dev/null @@ -1,33 +0,0 @@ -package it.myti.academy.backend.controller; - -import it.myti.academy.backend.service.HelloWorldService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * Created by david at 2019-02-19 - */ -@RestController -public class HelloWorldController { - - private HelloWorldService helloWorldService; - - @Autowired - public HelloWorldController(HelloWorldService helloWorldService) { - this.helloWorldService = helloWorldService; - } - - @GetMapping("hello") - public String hello() { - return helloWorldService.sayHello(); - } - - @PostMapping("hello") - public String helloAt(@RequestBody() String nome) { - return helloWorldService.sayHello(nome); - } - -} diff --git a/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java b/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java index 6ae9e7e..c6bbba7 100644 --- a/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java +++ b/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java @@ -1,59 +1,37 @@ package it.myti.academy.backend.controller; - import it.myti.academy.backend.model.*; - import it.myti.academy.backend.model.dettagli.DettagliUnitaLogisticaUtente; - import it.myti.academy.backend.repository.ColloRepository; - import it.myti.academy.backend.repository.UnitaLogisticaRepository; - import it.myti.academy.backend.repository.UtenteRepository; + import it.myti.academy.backend.model.UnitaLogistica; + import it.myti.academy.backend.model.Utente; + import it.myti.academy.backend.model.entitaRisposte.DettagliUnitaLogisticaUtente; + import it.myti.academy.backend.model.errori.ColloNonTrovatoException; + import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; + import it.myti.academy.backend.model.errori.UnitaLogisticaNonTrovataException; + import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; + import it.myti.academy.backend.service.UnitaLogisticaService; + import it.myti.academy.backend.service.UtenteService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.List; - import java.util.stream.Collectors; @RestController public class UnitaLogisticheController { @Autowired - UnitaLogisticaRepository unitaLogisticaRepository; + UnitaLogisticaService unitaLogisticaService; @Autowired - ColloRepository colloRepository; + UtenteService utenteService; - @Autowired - UtenteRepository utenteRepository; - - - @GetMapping("unitalogistiche/utente/{id}") - public List getAllByUtente(@PathVariable("id") Long id){ - Utente utente = utenteRepository.getById(id); - List colliUtente = colloRepository.findAllByUtente(utente); - return colliUtente.stream().map(collo -> { - List contenutiBase = collo.getContenuti().stream().map(contenuto -> { - ContenutoBase contenutoBase = new ContenutoBase(); - contenutoBase.setDescrizione(contenuto.getDescrizione()); - contenutoBase.setId(contenuto.getId()); - contenutoBase.setNome(contenuto.getNome()); - contenutoBase.setQuantita(contenuto.getQuantita()); - contenutoBase.setTempMaxRichiesta(contenuto.getTempMaxRichiesta()); - contenutoBase.setTempMinRichiesta(contenuto.getTempMinRichiesta()); - contenutoBase.setUnitaDiMisura(contenuto.getUnitaDiMisura()); - return contenutoBase; - }).collect(Collectors.toList()); - EventoParticle evento = (EventoParticle) collo.getEventi().get(collo.getEventi().size() - 1); - DettagliUnitaLogisticaUtente dettagliUnitaLogisticaUtente = new DettagliUnitaLogisticaUtente(); - dettagliUnitaLogisticaUtente.setId(collo.getUnitaLogistica().getId()); - dettagliUnitaLogisticaUtente.setNome(collo.getUnitaLogistica().getCodice()); - dettagliUnitaLogisticaUtente.setLatitudine(evento.getLatitudine().toString()); - dettagliUnitaLogisticaUtente.setLongitudine(evento.getLongitudine().toString()); - dettagliUnitaLogisticaUtente.setUmidita(evento.getUmidita()); - dettagliUnitaLogisticaUtente.setSpedizione(collo.getSpedizione()); - dettagliUnitaLogisticaUtente.setStatus(collo.getUnitaLogistica().getStato()); - dettagliUnitaLogisticaUtente.setTemperatura(evento.getTemperatura()); - dettagliUnitaLogisticaUtente.setContenuti(contenutiBase); - return dettagliUnitaLogisticaUtente; - }).collect(Collectors.toList()); + @GetMapping("unitalogistiche/utente/{idUtente}") + public List getUnitaLogisticheByUtente(@PathVariable("idUtente") Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { + return unitaLogisticaService.getByUtente(idUtente); + } + + @GetMapping("unitalogistiche/{idUnitaLogistica}/utente/{idUtente}") + public DettagliUnitaLogisticaUtente geUnitaLogisticaByIdAndUtente(@PathVariable("idUnitaLogistica") Long idUnitaLogistica, @PathVariable("idUtente") Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, ColloNonTrovatoException, SpedizioniAttiveNonTrovateException { + return unitaLogisticaService.getByIdAndUtente(idUnitaLogistica, idUtente); } diff --git a/src/main/java/it/myti/academy/backend/model/dettagli/DettagliUnitaLogisticaUtente.java b/src/main/java/it/myti/academy/backend/model/entitaRisposte/DettagliUnitaLogisticaUtente.java similarity index 91% rename from src/main/java/it/myti/academy/backend/model/dettagli/DettagliUnitaLogisticaUtente.java rename to src/main/java/it/myti/academy/backend/model/entitaRisposte/DettagliUnitaLogisticaUtente.java index 98fce13..79990d3 100644 --- a/src/main/java/it/myti/academy/backend/model/dettagli/DettagliUnitaLogisticaUtente.java +++ b/src/main/java/it/myti/academy/backend/model/entitaRisposte/DettagliUnitaLogisticaUtente.java @@ -1,4 +1,4 @@ -package it.myti.academy.backend.model.dettagli; +package it.myti.academy.backend.model.entitaRisposte; import it.myti.academy.backend.model.Contenuto; import it.myti.academy.backend.model.Spedizione; diff --git a/src/main/java/it/myti/academy/backend/model/errori/ColloNonTrovatoException.java b/src/main/java/it/myti/academy/backend/model/errori/ColloNonTrovatoException.java new file mode 100644 index 0000000..bad6a51 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/errori/ColloNonTrovatoException.java @@ -0,0 +1,4 @@ +package it.myti.academy.backend.model.errori; + +public class ColloNonTrovatoException extends Exception { +} diff --git a/src/main/java/it/myti/academy/backend/model/errori/DettagliErrore.java b/src/main/java/it/myti/academy/backend/model/errori/DettagliErrore.java new file mode 100644 index 0000000..b30238b --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/errori/DettagliErrore.java @@ -0,0 +1,18 @@ +package it.myti.academy.backend.model.errori; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DettagliErrore { + private Date data; + private int codice; + private String messaggio; + + public DettagliErrore(int codice, String messaggio){ + data = new Date(); + this.codice = codice; + this.messaggio = messaggio; + } +} diff --git a/src/main/java/it/myti/academy/backend/model/errori/SpedizioniAttiveNonTrovateException.java b/src/main/java/it/myti/academy/backend/model/errori/SpedizioniAttiveNonTrovateException.java new file mode 100644 index 0000000..3ba872f --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/errori/SpedizioniAttiveNonTrovateException.java @@ -0,0 +1,4 @@ +package it.myti.academy.backend.model.errori; + +public class SpedizioniAttiveNonTrovateException extends Exception { +} diff --git a/src/main/java/it/myti/academy/backend/model/errori/UnitaLogisticaNonTrovataException.java b/src/main/java/it/myti/academy/backend/model/errori/UnitaLogisticaNonTrovataException.java new file mode 100644 index 0000000..91f1255 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/errori/UnitaLogisticaNonTrovataException.java @@ -0,0 +1,12 @@ +package it.myti.academy.backend.model.errori; + + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + + +public class UnitaLogisticaNonTrovataException extends Exception { + +} + + diff --git a/src/main/java/it/myti/academy/backend/model/errori/UtenteNonTrovatoException.java b/src/main/java/it/myti/academy/backend/model/errori/UtenteNonTrovatoException.java new file mode 100644 index 0000000..1c0e392 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/errori/UtenteNonTrovatoException.java @@ -0,0 +1,4 @@ +package it.myti.academy.backend.model.errori; + +public class UtenteNonTrovatoException extends Exception { +} diff --git a/src/main/java/it/myti/academy/backend/repository/ColloRepository.java b/src/main/java/it/myti/academy/backend/repository/ColloRepository.java index 42054dc..469b4c5 100644 --- a/src/main/java/it/myti/academy/backend/repository/ColloRepository.java +++ b/src/main/java/it/myti/academy/backend/repository/ColloRepository.java @@ -1,5 +1,6 @@ package it.myti.academy.backend.repository; +import it.myti.academy.backend.model.Contenuto; import it.myti.academy.backend.model.UnitaLogistica; import it.myti.academy.backend.model.Utente; import it.myti.academy.backend.model.Collo; @@ -12,5 +13,7 @@ */ public interface ColloRepository extends JpaRepository { List findAllByUtente(Utente utente); + Collo findFirstByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica); List findAllByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica); + } diff --git a/src/main/java/it/myti/academy/backend/repository/UnitaLogisticaRepository.java b/src/main/java/it/myti/academy/backend/repository/UnitaLogisticaRepository.java index c3170dc..9851d7a 100644 --- a/src/main/java/it/myti/academy/backend/repository/UnitaLogisticaRepository.java +++ b/src/main/java/it/myti/academy/backend/repository/UnitaLogisticaRepository.java @@ -1,11 +1,9 @@ package it.myti.academy.backend.repository; -import it.myti.academy.backend.model.UnitaLogistica; -import org.springframework.data.jpa.repository.JpaRepository; - + import it.myti.academy.backend.model.UnitaLogistica; + import org.springframework.data.jpa.repository.JpaRepository; public interface UnitaLogisticaRepository extends JpaRepository { UnitaLogistica getById(Long id); - } diff --git a/src/main/java/it/myti/academy/backend/service/ColloService.java b/src/main/java/it/myti/academy/backend/service/ColloService.java index a9aabd2..6a88c88 100644 --- a/src/main/java/it/myti/academy/backend/service/ColloService.java +++ b/src/main/java/it/myti/academy/backend/service/ColloService.java @@ -1,7 +1,11 @@ package it.myti.academy.backend.service; import it.myti.academy.backend.model.Collo; +import it.myti.academy.backend.model.UnitaLogistica; import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.errori.ColloNonTrovatoException; +import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; +import it.myti.academy.backend.model.errori.UnitaLogisticaNonTrovataException; import java.util.List; @@ -9,5 +13,6 @@ * Created by david at 2019-02-20 */ public interface ColloService { - List getSpedizioniAttiveByUtente(Utente utente); + List getSpedizioniAttiveByUtente(Utente utente) throws SpedizioniAttiveNonTrovateException; + Collo getSpedizioneAttivaByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica) throws SpedizioniAttiveNonTrovateException; } diff --git a/src/main/java/it/myti/academy/backend/service/ContenutoService.java b/src/main/java/it/myti/academy/backend/service/ContenutoService.java new file mode 100644 index 0000000..f81dd3f --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/ContenutoService.java @@ -0,0 +1,10 @@ +package it.myti.academy.backend.service; + +import it.myti.academy.backend.model.Collo; +import it.myti.academy.backend.model.Contenuto; + +import java.util.List; + +public interface ContenutoService { + List generaContenutoBaseByCollo(Collo collo); +} diff --git a/src/main/java/it/myti/academy/backend/service/EventoService.java b/src/main/java/it/myti/academy/backend/service/EventoService.java new file mode 100644 index 0000000..0bb5eac --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/EventoService.java @@ -0,0 +1,12 @@ +package it.myti.academy.backend.service; + +import it.myti.academy.backend.model.Collo; +import it.myti.academy.backend.model.Evento; +import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; + +import java.util.List; + +public interface EventoService { + List findEventiAttiviByUtente(Utente utente) throws SpedizioniAttiveNonTrovateException; +} diff --git a/src/main/java/it/myti/academy/backend/service/HelloWorldService.java b/src/main/java/it/myti/academy/backend/service/HelloWorldService.java deleted file mode 100644 index 2e65ead..0000000 --- a/src/main/java/it/myti/academy/backend/service/HelloWorldService.java +++ /dev/null @@ -1,9 +0,0 @@ -package it.myti.academy.backend.service; - -/** - * Created by david at 2019-02-19 - */ -public interface HelloWorldService { - String sayHello(); - String sayHello(String who); -} diff --git a/src/main/java/it/myti/academy/backend/service/UnitaLogisticaService.java b/src/main/java/it/myti/academy/backend/service/UnitaLogisticaService.java new file mode 100644 index 0000000..37a037c --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/UnitaLogisticaService.java @@ -0,0 +1,15 @@ +package it.myti.academy.backend.service; + + +import it.myti.academy.backend.model.entitaRisposte.DettagliUnitaLogisticaUtente; +import it.myti.academy.backend.model.errori.ColloNonTrovatoException; +import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; +import it.myti.academy.backend.model.errori.UnitaLogisticaNonTrovataException; +import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; + +import java.util.List; + +public interface UnitaLogisticaService { + List getByUtente(Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException; + DettagliUnitaLogisticaUtente getByIdAndUtente(Long idUnitaLogistica, Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, ColloNonTrovatoException, SpedizioniAttiveNonTrovateException; +} diff --git a/src/main/java/it/myti/academy/backend/service/UtenteService.java b/src/main/java/it/myti/academy/backend/service/UtenteService.java new file mode 100644 index 0000000..17cb5f1 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/UtenteService.java @@ -0,0 +1,12 @@ +package it.myti.academy.backend.service; + +import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; +import it.myti.academy.backend.repository.UtenteRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +public interface UtenteService { + Utente getById(Long id) throws UtenteNonTrovatoException; +} diff --git a/src/main/java/it/myti/academy/backend/service/impl/ColloServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/ColloServiceImpl.java index ac6d87d..f4b785e 100644 --- a/src/main/java/it/myti/academy/backend/service/impl/ColloServiceImpl.java +++ b/src/main/java/it/myti/academy/backend/service/impl/ColloServiceImpl.java @@ -1,6 +1,9 @@ package it.myti.academy.backend.service.impl; +import it.myti.academy.backend.model.UnitaLogistica; import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.errori.ColloNonTrovatoException; +import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; import it.myti.academy.backend.repository.ColloRepository; import it.myti.academy.backend.service.ColloService; import it.myti.academy.backend.model.Collo; @@ -20,10 +23,24 @@ public class ColloServiceImpl implements ColloService { private ColloRepository colloRepository; @Override - public List getSpedizioniAttiveByUtente(Utente utente) { + public List getSpedizioniAttiveByUtente(Utente utente) throws SpedizioniAttiveNonTrovateException { final List allByUtente = colloRepository.findAllByUtente(utente); - return allByUtente.stream() + List risultato = allByUtente.stream() .filter(collo -> collo.getSpedizione().getArrivoIl().after(new Date())) .collect(Collectors.toList()); + if(risultato.size() == 0) + throw new SpedizioniAttiveNonTrovateException(); + return risultato; + } + + public Collo getSpedizioneAttivaByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica) throws SpedizioniAttiveNonTrovateException { + final List colliUtenteUnitaLogistica = colloRepository.findAllByUtenteAndUnitaLogistica(utente, unitaLogistica); + List SpedizioniAttive = colliUtenteUnitaLogistica.stream() + .filter(collo -> collo.getSpedizione().getArrivoIl().after(new Date())) + .collect(Collectors.toList()); + if(SpedizioniAttive.size() == 0) + throw new SpedizioniAttiveNonTrovateException(); + return SpedizioniAttive.get(0); + } } diff --git a/src/main/java/it/myti/academy/backend/service/impl/ContenutoServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/ContenutoServiceImpl.java new file mode 100644 index 0000000..991b5e5 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/impl/ContenutoServiceImpl.java @@ -0,0 +1,29 @@ +package it.myti.academy.backend.service.impl; + +import it.myti.academy.backend.model.Collo; +import it.myti.academy.backend.model.Contenuto; +import it.myti.academy.backend.model.ContenutoBase; +import it.myti.academy.backend.service.ContenutoService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class ContenutoServiceImpl implements ContenutoService { + @Override + public List generaContenutoBaseByCollo(Collo collo) { + + return collo.getContenuti().stream().map(contenuto -> { + ContenutoBase contenutoBase = new ContenutoBase(); + contenutoBase.setDescrizione(contenuto.getDescrizione()); + contenutoBase.setId(contenuto.getId()); + contenutoBase.setNome(contenuto.getNome()); + contenutoBase.setQuantita(contenuto.getQuantita()); + contenutoBase.setTempMaxRichiesta(contenuto.getTempMaxRichiesta()); + contenutoBase.setTempMinRichiesta(contenuto.getTempMinRichiesta()); + contenutoBase.setUnitaDiMisura(contenuto.getUnitaDiMisura()); + return contenutoBase; + }).collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java new file mode 100644 index 0000000..f7992a6 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java @@ -0,0 +1,32 @@ +package it.myti.academy.backend.service.impl; + +import it.myti.academy.backend.model.Collo; +import it.myti.academy.backend.model.Evento; +import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; +import it.myti.academy.backend.service.ColloService; +import it.myti.academy.backend.service.EventoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class EventoServiceImpl implements EventoService { + + @Autowired + ColloService colloService; + + @Override + public List findEventiAttiviByUtente(Utente utente) throws SpedizioniAttiveNonTrovateException { + List colliUtente = colloService.getSpedizioniAttiveByUtente(utente); + List eventi = new ArrayList<>(); + colliUtente.forEach(collo -> { + collo.getEventi().forEach(evento -> { + eventi.add(evento); + }); + }); + return eventi; + } +} diff --git a/src/main/java/it/myti/academy/backend/service/impl/HelloWorldServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/HelloWorldServiceImpl.java deleted file mode 100644 index 17f4dea..0000000 --- a/src/main/java/it/myti/academy/backend/service/impl/HelloWorldServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package it.myti.academy.backend.service.impl; - -import it.myti.academy.backend.service.HelloWorldService; -import org.springframework.stereotype.Service; - -/** - * Created by david at 2019-02-19 - */ -@Service -public class HelloWorldServiceImpl implements HelloWorldService { - @Override - public String sayHello() { - return "Hello"; - } - - @Override - public String sayHello(String who) { - return String.format("Hello %s!", who); - } -} diff --git a/src/main/java/it/myti/academy/backend/service/impl/UnitaLogisticaServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/UnitaLogisticaServiceImpl.java new file mode 100644 index 0000000..f2b5f1c --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/impl/UnitaLogisticaServiceImpl.java @@ -0,0 +1,75 @@ +package it.myti.academy.backend.service.impl; + +import it.myti.academy.backend.model.*; +import it.myti.academy.backend.model.entitaRisposte.DettagliUnitaLogisticaUtente; +import it.myti.academy.backend.model.errori.ColloNonTrovatoException; +import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; +import it.myti.academy.backend.model.errori.UnitaLogisticaNonTrovataException; +import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; +import it.myti.academy.backend.repository.UnitaLogisticaRepository; +import it.myti.academy.backend.service.ColloService; +import it.myti.academy.backend.service.ContenutoService; +import it.myti.academy.backend.service.UnitaLogisticaService; +import it.myti.academy.backend.service.UtenteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class UnitaLogisticaServiceImpl implements UnitaLogisticaService { + @Autowired + UtenteService utenteService; + + @Autowired + UnitaLogisticaRepository unitaLogisticaRepository; + + @Autowired + ColloService colloService; + + @Autowired + ContenutoService contenutoService; + + + public List getByUtente(Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { + Utente utente = utenteService.getById(idUtente); + if(utente == null) + throw new UtenteNonTrovatoException(); + List colliUtente = colloService.getSpedizioniAttiveByUtente(utente); + if (colliUtente.isEmpty()) + throw new UnitaLogisticaNonTrovataException(); + return colliUtente.stream().map(collo -> { + return generaDettagliRichiestaUnitaByCollo(collo); + }).collect(Collectors.toList()); + } + + public DettagliUnitaLogisticaUtente getByIdAndUtente(Long idUnitaLogistica, Long idUtente) throws UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { + Utente utente = utenteService.getById(idUtente); + UnitaLogistica unitaLogistica = unitaLogisticaRepository.getById(idUnitaLogistica); + Collo colloUtente = colloService.getSpedizioneAttivaByUtenteAndUnitaLogistica(utente, unitaLogistica); + return generaDettagliRichiestaUnitaByCollo(colloUtente); + } + + + + + + private DettagliUnitaLogisticaUtente generaDettagliRichiestaUnitaByCollo(Collo collo){ + List contenutiBase = contenutoService.generaContenutoBaseByCollo(collo); + EventoParticle evento = (EventoParticle) collo.getEventi().get(collo.getEventi().size() - 1); + DettagliUnitaLogisticaUtente dettagliUnitaLogisticaUtente = new DettagliUnitaLogisticaUtente(); + dettagliUnitaLogisticaUtente.setNome(collo.getUnitaLogistica().getCodice()); + dettagliUnitaLogisticaUtente.setId(collo.getUnitaLogistica().getId()); + dettagliUnitaLogisticaUtente.setLatitudine(evento.getLatitudine().toString()); + dettagliUnitaLogisticaUtente.setLongitudine(evento.getLongitudine().toString()); + dettagliUnitaLogisticaUtente.setUmidita(evento.getUmidita()); + dettagliUnitaLogisticaUtente.setSpedizione(collo.getSpedizione()); + dettagliUnitaLogisticaUtente.setStatus(collo.getUnitaLogistica().getStato()); + dettagliUnitaLogisticaUtente.setTemperatura(evento.getTemperatura()); + dettagliUnitaLogisticaUtente.setContenuti(contenutiBase); + return dettagliUnitaLogisticaUtente; + } + + +} diff --git a/src/main/java/it/myti/academy/backend/service/impl/UtenteServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/UtenteServiceImpl.java new file mode 100644 index 0000000..369fc03 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/impl/UtenteServiceImpl.java @@ -0,0 +1,22 @@ +package it.myti.academy.backend.service.impl; + +import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; +import it.myti.academy.backend.repository.UtenteRepository; +import it.myti.academy.backend.service.UtenteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class UtenteServiceImpl implements UtenteService { + @Autowired + UtenteRepository utenteRepository; + + @Override + public Utente getById(Long id) throws UtenteNonTrovatoException { + Utente utente = utenteRepository.getById(id); + if(utente == null) + throw new UtenteNonTrovatoException(); + return utente; + } +} diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 1bd2c87..0f39ce7 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,6 +1,7 @@ INSERT INTO utenti (`id`, `username`, `password`, `nome`) VALUES - (1, 'logistic@galbanino.it', 'ciaociao123', 'Logistica Galbanino'); + (1, 'logistic@galbanino.it', 'ciaociao123', 'Logistica Galbanino'), + (2, 'pippo@baudo.it', 'cfffiaociao123', 'Cocaina'); INSERT INTO tipologie_eventi (`id`, `nome`, `descrizione`) VALUES @@ -19,7 +20,7 @@ VALUES ( 1, 'AAAA', 'UL2', 12, -12, 1); INSERT INTO spedizioni (`id`, `codice_treno`, `partenza_il`, `partenza_da`, `arrivo_il`, `arrivo_a`) VALUES -(1, 'TRAIN_AAAA', '2019-02-01', 'BRESCIA', '2019-02-03', 'MILANO'); +(1, 'TRAIN_AAAA', '2019-02-01', 'BRESCIA', '2019-09-03', 'MILANO'); INSERT INTO colli (`id`, `unita_logistica_id`, `spedizione_id`, `utente_id`) VALUES ( 1, 1, 1, 1); @@ -42,4 +43,8 @@ VALUES (3, 2.7, 81.0, 0, 45.556556, 10.216596, 100), (4, 2.56, 80.8, 0, 45.556556, 10.216596, 100), (5, 2.82, 80.3, 0, 45.556556, 10.216596, 100), - (6, 2.93, 79.9, 0, 45.556556, 10.216596, 100); \ No newline at end of file + (6, 2.93, 79.9, 0, 45.556556, 10.216596, 100); +INSERT INTO contenuti (`dtype`, `id`, `descrizione`, `nome`, `quantita`, `temperatura_massima_ricchiesta`, `temperatura_minima_ricchiesta`, `unita_di_misura`, `collo_id`) +VALUES + ('ContenutoDettagliato', 1, 'descrizione', 'mele', 20, 18, 10, 'kg', 1), + ('ContenutoDettagliato', 2, 'descrizione', 'pere', 30, 18, 10, 'kg', 1); \ No newline at end of file diff --git a/src/test/java/it/myti/academy/backend/controller/HelloWorldControllerTest.java b/src/test/java/it/myti/academy/backend/controller/HelloWorldControllerTest.java deleted file mode 100644 index 3e688fb..0000000 --- a/src/test/java/it/myti/academy/backend/controller/HelloWorldControllerTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package it.myti.academy.backend.controller; - -import it.myti.academy.backend.service.HelloWorldService; -import it.myti.academy.backend.service.impl.HelloWorldServiceImpl; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; - -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.status; - -/** - * Created by david at 2019-02-19 - */ -@RunWith(SpringRunner.class) -@WebMvcTest(HelloWorldController.class) -public class HelloWorldControllerTest { - - @TestConfiguration - static class EmployeeServiceImplTestContextConfiguration { - - @Bean - public HelloWorldService employeeService() { - return new HelloWorldServiceImpl(); - } - } - - - @Autowired //2 - private MockMvc mockMvc; - - @Test - public void hello() throws Exception { - final String returnString = "Hello"; - - final MockHttpServletRequestBuilder requestBuilder = get("/hello").contentType(MediaType.TEXT_PLAIN); - mockMvc.perform(requestBuilder) - .andExpect(status().isOk()) - .andExpect(content().string(returnString)); - } - - @Test - public void helloPOST() throws Exception { - final String paramStr = "MESSGE"; - final String expected = "Hello " + paramStr + "!"; - - final MockHttpServletRequestBuilder requestBuilder = post("/hello") - .contentType(MediaType.APPLICATION_JSON) - .content(paramStr); - mockMvc.perform(requestBuilder) - .andExpect(status().isOk()) - .andExpect(content().string(expected)); - } -} \ No newline at end of file From c1765fe287c1fc7959cdd5cc3a7da0cf7f18c202 Mon Sep 17 00:00:00 2001 From: gabrielecanesi Date: Sun, 31 Mar 2019 21:47:37 +0200 Subject: [PATCH 3/3] aggiunta security --- pom.xml | 18 +++++-- .../academy/backend/config/CryptConfig.java | 16 +++++++ .../academy/backend/config/WebSecurity.java | 43 +++++++++++++++++ .../backend/controller/ColliController.java | 8 ++-- .../controller/EccezioniController.java | 21 ++++---- .../backend/controller/EventiController.java | 15 ++++-- .../controller/UnitaLogisticheController.java | 45 +++++++++-------- .../backend/controller/UtenteController.java | 41 ++++++++++++++++ .../filter/JWTAuthenticationFilter.java | 47 ++++++++++++++++++ .../filter/JWTAuthorizationFilter.java | 48 +++++++++++++++++++ .../backend/filter/SecurityConstants.java | 9 ++++ .../it/myti/academy/backend/model/Collo.java | 11 ++--- .../myti/academy/backend/model/Contenuto.java | 20 ++++++-- .../it/myti/academy/backend/model/Evento.java | 5 +- .../academy/backend/model/EventoTipo.java | 4 +- .../academy/backend/model/Spedizione.java | 4 +- .../backend/model/StatoUnitaLogistica.java | 4 +- .../academy/backend/model/UnitaLogistica.java | 4 -- .../it/myti/academy/backend/model/Utente.java | 6 +-- .../backend/model/UtenteRichiesta.java | 10 ++++ .../errori/ColloNonTrovatoException.java | 4 -- .../SpedizioniAttiveNonTrovateException.java | 4 -- .../eccezioni/RegistrazioneException.java | 4 ++ .../UnitaLogisticaNonTrovataException.java | 2 +- .../UtenteNonAutorizzatoException.java | 4 ++ .../UtenteNonTrovatoException.java | 2 +- .../backend/repository/ColloRepository.java | 2 - .../repository/EventiParticleRepository.java | 15 ++++++ .../backend/repository/UtenteRepository.java | 4 +- .../academy/backend/service/ColloService.java | 8 ++-- .../backend/service/EventoService.java | 4 +- .../service/UnitaLogisticaService.java | 10 ++-- .../backend/service/UtenteService.java | 6 +-- .../service/impl/ColloServiceImpl.java | 29 +++++++---- .../service/impl/EventoServiceImpl.java | 3 +- .../impl/UnitaLogisticaServiceImpl.java | 11 ++--- .../service/impl/UserDetailsServiceImpl.java | 27 +++++++++++ .../service/impl/UtenteServiceImpl.java | 8 +++- src/main/resources/application.properties | 2 - src/main/resources/data.sql | 15 +++--- 40 files changed, 414 insertions(+), 129 deletions(-) create mode 100644 src/main/java/it/myti/academy/backend/config/CryptConfig.java create mode 100644 src/main/java/it/myti/academy/backend/config/WebSecurity.java create mode 100644 src/main/java/it/myti/academy/backend/controller/UtenteController.java create mode 100644 src/main/java/it/myti/academy/backend/filter/JWTAuthenticationFilter.java create mode 100644 src/main/java/it/myti/academy/backend/filter/JWTAuthorizationFilter.java create mode 100644 src/main/java/it/myti/academy/backend/filter/SecurityConstants.java create mode 100644 src/main/java/it/myti/academy/backend/model/UtenteRichiesta.java delete mode 100644 src/main/java/it/myti/academy/backend/model/errori/ColloNonTrovatoException.java delete mode 100644 src/main/java/it/myti/academy/backend/model/errori/SpedizioniAttiveNonTrovateException.java create mode 100644 src/main/java/it/myti/academy/backend/model/errori/eccezioni/RegistrazioneException.java rename src/main/java/it/myti/academy/backend/model/errori/{ => eccezioni}/UnitaLogisticaNonTrovataException.java (76%) create mode 100644 src/main/java/it/myti/academy/backend/model/errori/eccezioni/UtenteNonAutorizzatoException.java rename src/main/java/it/myti/academy/backend/model/errori/{ => eccezioni}/UtenteNonTrovatoException.java (52%) create mode 100644 src/main/java/it/myti/academy/backend/repository/EventiParticleRepository.java create mode 100644 src/main/java/it/myti/academy/backend/service/impl/UserDetailsServiceImpl.java diff --git a/pom.xml b/pom.xml index b608f09..ca8c7a3 100644 --- a/pom.xml +++ b/pom.xml @@ -34,12 +34,12 @@ org.springframework.boot spring-boot-starter-data-jpa - - org.springframework.boot - spring-boot-devtools - runtime + org.springframework.security + spring-security-web + + com.h2database h2 @@ -50,12 +50,22 @@ lombok true + + io.jsonwebtoken + jjwt + 0.9.0 + + org.springframework.boot spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-security + diff --git a/src/main/java/it/myti/academy/backend/config/CryptConfig.java b/src/main/java/it/myti/academy/backend/config/CryptConfig.java new file mode 100644 index 0000000..adc6163 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/config/CryptConfig.java @@ -0,0 +1,16 @@ +package it.myti.academy.backend.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +@Configuration +public class CryptConfig { + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + +} diff --git a/src/main/java/it/myti/academy/backend/config/WebSecurity.java b/src/main/java/it/myti/academy/backend/config/WebSecurity.java new file mode 100644 index 0000000..0e8cd1a --- /dev/null +++ b/src/main/java/it/myti/academy/backend/config/WebSecurity.java @@ -0,0 +1,43 @@ +package it.myti.academy.backend.config; + +import it.myti.academy.backend.filter.JWTAuthenticationFilter; +import it.myti.academy.backend.filter.JWTAuthorizationFilter; +import it.myti.academy.backend.filter.SecurityConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + + +@EnableWebSecurity +public class WebSecurity extends WebSecurityConfigurerAdapter implements SecurityConstants { + private UserDetailsService userDetailsService; + private BCryptPasswordEncoder bCryptPasswordEncoder; + + @Autowired + public WebSecurity(@Qualifier("userDetailsServiceImpl") UserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) { + this.userDetailsService = userDetailsService; + this.bCryptPasswordEncoder = bCryptPasswordEncoder; + } + @Override + protected void configure(HttpSecurity http) throws Exception { + + http.csrf().disable().authorizeRequests() + .antMatchers("/h2-console/**").permitAll() + .antMatchers(HttpMethod.POST, "/registrazione").permitAll() + .anyRequest().authenticated() + .and() + .addFilter(new JWTAuthenticationFilter(authenticationManager())) + .addFilter(new JWTAuthorizationFilter(authenticationManager())); + http.headers().frameOptions().disable(); + } + @Override + public void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder); + } +} diff --git a/src/main/java/it/myti/academy/backend/controller/ColliController.java b/src/main/java/it/myti/academy/backend/controller/ColliController.java index 76f152c..4c3c912 100644 --- a/src/main/java/it/myti/academy/backend/controller/ColliController.java +++ b/src/main/java/it/myti/academy/backend/controller/ColliController.java @@ -2,9 +2,7 @@ import it.myti.academy.backend.model.Collo; import it.myti.academy.backend.model.Utente; -import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; -import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; -import it.myti.academy.backend.repository.UtenteRepository; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonTrovatoException; import it.myti.academy.backend.service.ColloService; import it.myti.academy.backend.service.UtenteService; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +25,9 @@ public class ColliController { UtenteService utenteService; @GetMapping("/collo/utente/{id}") - public List getByUtente(@PathVariable("id") long id) throws UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { + public List getByUtente(@PathVariable("id") long id) throws UtenteNonTrovatoException { + + List returnValue = null; final Utente utente = utenteService.getById(id); diff --git a/src/main/java/it/myti/academy/backend/controller/EccezioniController.java b/src/main/java/it/myti/academy/backend/controller/EccezioniController.java index 446d5bb..4ac2d98 100644 --- a/src/main/java/it/myti/academy/backend/controller/EccezioniController.java +++ b/src/main/java/it/myti/academy/backend/controller/EccezioniController.java @@ -1,6 +1,8 @@ package it.myti.academy.backend.controller; +import it.myti.academy.backend.model.entitaRisposte.DettagliUnitaLogisticaUtente; import it.myti.academy.backend.model.errori.*; +import it.myti.academy.backend.model.errori.eccezioni.*; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -12,22 +14,23 @@ public class EccezioniController extends ResponseEntityExceptionHandler { @ExceptionHandler(UnitaLogisticaNonTrovataException.class) - public final DettagliErrore gestisciUnitaNonTrovata(UnitaLogisticaNonTrovataException e) { - return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Nessuna unità logistica trovata."); + public final DettagliErrore gestisciErrore(UnitaLogisticaNonTrovataException e) { + return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Unità logistica non trovata"); } @ExceptionHandler(UtenteNonTrovatoException.class) - public final DettagliErrore gestisciUtenteNonTrovato(UtenteNonTrovatoException e) { + public final DettagliErrore gestisciErrore(UtenteNonTrovatoException e) { return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Utente non trovato."); } - @ExceptionHandler(ColloNonTrovatoException.class) - public final DettagliErrore gestisciUtenteNonTrovato(ColloNonTrovatoException e) { - return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Collo non trovato."); + + @ExceptionHandler(UtenteNonAutorizzatoException.class) + public final DettagliErrore gestisciErrore(UtenteNonAutorizzatoException e){ + return new DettagliErrore(HttpStatus.UNAUTHORIZED.value(), "Utente non autorizzato"); } - @ExceptionHandler(SpedizioniAttiveNonTrovateException.class) - public final DettagliErrore gestisciSpedizioniAttiveNonTrovate(SpedizioniAttiveNonTrovateException e) { - return new DettagliErrore(HttpStatus.NOT_FOUND.value(), "Non esistono spedizioni attive per l'utente."); + @ExceptionHandler(RegistrazioneException.class) + public final DettagliErrore gestisciErrore(RegistrazioneException e){ + return new DettagliErrore(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Errore durante la registrazione"); } } \ No newline at end of file diff --git a/src/main/java/it/myti/academy/backend/controller/EventiController.java b/src/main/java/it/myti/academy/backend/controller/EventiController.java index c2a1a30..bc5e349 100644 --- a/src/main/java/it/myti/academy/backend/controller/EventiController.java +++ b/src/main/java/it/myti/academy/backend/controller/EventiController.java @@ -1,11 +1,13 @@ package it.myti.academy.backend.controller; import it.myti.academy.backend.model.Evento; -import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; -import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; +import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonAutorizzatoException; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonTrovatoException; import it.myti.academy.backend.service.EventoService; import it.myti.academy.backend.service.UtenteService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @@ -21,7 +23,12 @@ public class EventiController { UtenteService utenteService; @GetMapping("/eventi/utente/{idUtente}") - public List getRventiByCollo(@PathVariable("idUtente") Long idUtente) throws UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { - return eventoService.findEventiAttiviByUtente(utenteService.getById(idUtente)); + public List getEventiByCollo(@PathVariable("idUtente") Long idUtente) throws UtenteNonTrovatoException, UtenteNonAutorizzatoException { + String username = SecurityContextHolder.getContext().getAuthentication().getName(); + Utente utente = utenteService.getByUsername(username); + if(utente.getId().equals(idUtente) || username == null) + return eventoService.findEventiAttiviByUtente(utenteService.getById(idUtente)); + throw new UtenteNonAutorizzatoException(); + } } diff --git a/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java b/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java index c6bbba7..6d8f791 100644 --- a/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java +++ b/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java @@ -1,19 +1,18 @@ package it.myti.academy.backend.controller; - import it.myti.academy.backend.model.UnitaLogistica; - import it.myti.academy.backend.model.Utente; - import it.myti.academy.backend.model.entitaRisposte.DettagliUnitaLogisticaUtente; - import it.myti.academy.backend.model.errori.ColloNonTrovatoException; - import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; - import it.myti.academy.backend.model.errori.UnitaLogisticaNonTrovataException; - import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; - import it.myti.academy.backend.service.UnitaLogisticaService; - import it.myti.academy.backend.service.UtenteService; - import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.web.bind.annotation.GetMapping; - import org.springframework.web.bind.annotation.PathVariable; - import org.springframework.web.bind.annotation.RestController; - import java.util.List; +import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.entitaRisposte.DettagliUnitaLogisticaUtente; +import it.myti.academy.backend.model.errori.eccezioni.UnitaLogisticaNonTrovataException; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonAutorizzatoException; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonTrovatoException; +import it.myti.academy.backend.service.UnitaLogisticaService; +import it.myti.academy.backend.service.UtenteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; @RestController public class UnitaLogisticheController { @@ -25,14 +24,22 @@ public class UnitaLogisticheController { UtenteService utenteService; @GetMapping("unitalogistiche/utente/{idUtente}") - public List getUnitaLogisticheByUtente(@PathVariable("idUtente") Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { - return unitaLogisticaService.getByUtente(idUtente); + public List getUnitaLogisticheByUtente(@PathVariable("idUtente") Long idUtente) throws UtenteNonAutorizzatoException, UnitaLogisticaNonTrovataException, UtenteNonTrovatoException { + String username = SecurityContextHolder.getContext().getAuthentication().getName(); + Utente utente = utenteService.getByUsername(username); + if(utente.getId().equals(idUtente) || username == null) + return unitaLogisticaService.getByUtente(idUtente); + throw new UtenteNonAutorizzatoException(); } @GetMapping("unitalogistiche/{idUnitaLogistica}/utente/{idUtente}") - public DettagliUnitaLogisticaUtente geUnitaLogisticaByIdAndUtente(@PathVariable("idUnitaLogistica") Long idUnitaLogistica, @PathVariable("idUtente") Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, ColloNonTrovatoException, SpedizioniAttiveNonTrovateException { - return unitaLogisticaService.getByIdAndUtente(idUnitaLogistica, idUtente); + public DettagliUnitaLogisticaUtente geUnitaLogisticaByIdAndUtente(@PathVariable("idUnitaLogistica") Long idUnitaLogistica, @PathVariable("idUtente") Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, UtenteNonAutorizzatoException { + String username = SecurityContextHolder.getContext().getAuthentication().getName(); + Utente utente = utenteService.getByUsername(username); + if(utente.getId().equals(idUtente) || username == null) + return unitaLogisticaService.getByIdAndUtente(idUnitaLogistica, idUtente); + throw new UtenteNonAutorizzatoException(); } -} +} \ No newline at end of file diff --git a/src/main/java/it/myti/academy/backend/controller/UtenteController.java b/src/main/java/it/myti/academy/backend/controller/UtenteController.java new file mode 100644 index 0000000..7d0a30b --- /dev/null +++ b/src/main/java/it/myti/academy/backend/controller/UtenteController.java @@ -0,0 +1,41 @@ +package it.myti.academy.backend.controller; + +import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.model.UtenteRichiesta; +import it.myti.academy.backend.model.errori.eccezioni.RegistrazioneException; +import it.myti.academy.backend.repository.UtenteRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +public class UtenteController { + + private UtenteRepository applicationUserRepository; + private BCryptPasswordEncoder bCryptPasswordEncoder; + + @Autowired + public UtenteController(UtenteRepository applicationUserRepository, + BCryptPasswordEncoder bCryptPasswordEncoder) { + this.applicationUserRepository = applicationUserRepository; + this.bCryptPasswordEncoder = bCryptPasswordEncoder; + } + + @PostMapping("/registrazione") + public Utente registrazione(@RequestBody UtenteRichiesta utenteRichiesta) throws RegistrazioneException { + Utente utente = new Utente(); + utente.setNome(utenteRichiesta.getNome()); + utente.setUsername(utenteRichiesta.getUsername()); + utente.setPassword(bCryptPasswordEncoder.encode(utenteRichiesta.getPassword())); + try { + applicationUserRepository.save(utente); + }catch(Exception e){ + throw new RegistrazioneException(); + } + + return utente; + } +} diff --git a/src/main/java/it/myti/academy/backend/filter/JWTAuthenticationFilter.java b/src/main/java/it/myti/academy/backend/filter/JWTAuthenticationFilter.java new file mode 100644 index 0000000..d3d3fcf --- /dev/null +++ b/src/main/java/it/myti/academy/backend/filter/JWTAuthenticationFilter.java @@ -0,0 +1,47 @@ +package it.myti.academy.backend.filter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import it.myti.academy.backend.model.Utente; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; + +public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter implements SecurityConstants { + + + private AuthenticationManager authenticationManager; + public JWTAuthenticationFilter(AuthenticationManager authenticationManager) { + this.authenticationManager = authenticationManager; + } + @Override + public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) throws AuthenticationException { + try { + Utente creds = new ObjectMapper().readValue(req.getInputStream(), Utente.class); + return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(creds.getUsername(), creds.getPassword(), new ArrayList<>()) ); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + @Override + protected void successfulAuthentication(HttpServletRequest req, HttpServletResponse res, FilterChain chain, Authentication auth){ + String token = Jwts.builder() + .setSubject(((User) auth.getPrincipal()).getUsername()) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) + .signWith(SignatureAlgorithm.HS512, SECRET) + .compact(); + res.addHeader(HEADER_STRING, TOKEN_PREFIX + token); + } +} diff --git a/src/main/java/it/myti/academy/backend/filter/JWTAuthorizationFilter.java b/src/main/java/it/myti/academy/backend/filter/JWTAuthorizationFilter.java new file mode 100644 index 0000000..e0b7031 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/filter/JWTAuthorizationFilter.java @@ -0,0 +1,48 @@ +package it.myti.academy.backend.filter; + +import io.jsonwebtoken.Jwts; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; + +public class JWTAuthorizationFilter extends BasicAuthenticationFilter implements SecurityConstants{ + public JWTAuthorizationFilter(AuthenticationManager authManager) { + super(authManager); + } + @Override + protected void doFilterInternal(HttpServletRequest req, + HttpServletResponse res, + FilterChain chain) throws IOException, ServletException { + String header = req.getHeader(HEADER_STRING); + if (header == null || !header.startsWith(TOKEN_PREFIX)) { + chain.doFilter(req, res); + return; + } + UsernamePasswordAuthenticationToken authentication = getAuthentication(req); + SecurityContextHolder.getContext().setAuthentication(authentication); + chain.doFilter(req, res); + } + private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) { + String token = request.getHeader(HEADER_STRING); + if (token != null) { + // parse the token. + String user = Jwts.parser() + .setSigningKey(SECRET) + .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) + .getBody() + .getSubject(); + if (user != null) { + return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>()); + } + return null; + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/it/myti/academy/backend/filter/SecurityConstants.java b/src/main/java/it/myti/academy/backend/filter/SecurityConstants.java new file mode 100644 index 0000000..93e09e1 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/filter/SecurityConstants.java @@ -0,0 +1,9 @@ +package it.myti.academy.backend.filter; + +public interface SecurityConstants { + final static Long EXPIRATION_TIME = 3600000L; + final static String TOKEN_PREFIX = "Bearer "; + final static String HEADER_STRING = "Authorization"; + final static String SECRET = "this-is-a-secret"; + final static String SIGN_UP_URL = "/utente"; +} diff --git a/src/main/java/it/myti/academy/backend/model/Collo.java b/src/main/java/it/myti/academy/backend/model/Collo.java index de79ac3..c51bc01 100644 --- a/src/main/java/it/myti/academy/backend/model/Collo.java +++ b/src/main/java/it/myti/academy/backend/model/Collo.java @@ -1,7 +1,6 @@ package it.myti.academy.backend.model; -import com.fasterxml.jackson.annotation.JsonBackReference; -import com.fasterxml.jackson.annotation.JsonManagedReference; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import javax.persistence.Column; @@ -28,28 +27,24 @@ public class Collo { @GeneratedValue(strategy = GenerationType.AUTO) protected Long id; - @JsonManagedReference @ManyToOne @JoinColumn(name = "unita_logistica_id") protected UnitaLogistica unitaLogistica; - @JsonManagedReference @ManyToOne @JoinColumn(name = "spedizione_id") protected Spedizione spedizione; - @JsonManagedReference @ManyToOne @JoinColumn(name = "utente_id") protected Utente utente; - @JsonBackReference @Column @OneToMany(mappedBy = "collo") - protected List contenuti; + protected List contenuti; - @JsonBackReference @Column + @JsonIgnore @OneToMany(mappedBy = "collo") protected List eventi; diff --git a/src/main/java/it/myti/academy/backend/model/Contenuto.java b/src/main/java/it/myti/academy/backend/model/Contenuto.java index ec58136..4b6d6d7 100644 --- a/src/main/java/it/myti/academy/backend/model/Contenuto.java +++ b/src/main/java/it/myti/academy/backend/model/Contenuto.java @@ -1,17 +1,24 @@ package it.myti.academy.backend.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; /** * Created by david at 2019-02-13 */ @Data @Entity -@Inheritance @Table(name = "contenuti") -abstract public class Contenuto { +public class Contenuto { @Id @Column(updatable = false) @@ -33,6 +40,11 @@ abstract public class Contenuto { @Column(scale = 2) protected Double quantita; - @Column(length = 2) + @Column(length = 2, name = "unita_di_misura") protected String unitaDiMisura; + + @ManyToOne + @JsonIgnore + @JoinColumn(name = "collo_id") + protected Collo collo; } diff --git a/src/main/java/it/myti/academy/backend/model/Evento.java b/src/main/java/it/myti/academy/backend/model/Evento.java index 1387c09..4d65c6f 100644 --- a/src/main/java/it/myti/academy/backend/model/Evento.java +++ b/src/main/java/it/myti/academy/backend/model/Evento.java @@ -1,6 +1,6 @@ package it.myti.academy.backend.model; -import com.fasterxml.jackson.annotation.JsonManagedReference; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import javax.persistence.Column; @@ -41,13 +41,12 @@ public abstract class Evento { @Temporal(TemporalType.TIMESTAMP) protected Date ricevutoIl = new Date(); - @JsonManagedReference @ManyToOne @JoinColumn(name = "evento_tipo_id") protected EventoTipo tipo; - @JsonManagedReference @ManyToOne + @JsonIgnore @JoinColumn(name = "collo_id") protected Collo collo; diff --git a/src/main/java/it/myti/academy/backend/model/EventoTipo.java b/src/main/java/it/myti/academy/backend/model/EventoTipo.java index 5543964..74fad58 100644 --- a/src/main/java/it/myti/academy/backend/model/EventoTipo.java +++ b/src/main/java/it/myti/academy/backend/model/EventoTipo.java @@ -1,6 +1,6 @@ package it.myti.academy.backend.model; -import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import javax.persistence.Column; @@ -31,7 +31,7 @@ public class EventoTipo { @Column(length = 2048) protected String descrizione; - @JsonBackReference + @JsonIgnore @OneToMany(mappedBy = "tipo") protected List eventi; } diff --git a/src/main/java/it/myti/academy/backend/model/Spedizione.java b/src/main/java/it/myti/academy/backend/model/Spedizione.java index 108fa05..8e8f256 100644 --- a/src/main/java/it/myti/academy/backend/model/Spedizione.java +++ b/src/main/java/it/myti/academy/backend/model/Spedizione.java @@ -1,6 +1,6 @@ package it.myti.academy.backend.model; -import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import javax.persistence.Column; @@ -45,8 +45,8 @@ public class Spedizione { @Column(name = "arrivo_a", nullable = false) protected String arrivoA; - @JsonBackReference @Column + @JsonIgnore @OneToMany(mappedBy = "spedizione") protected List colliInviati; diff --git a/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java b/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java index 683f127..427493d 100644 --- a/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java +++ b/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java @@ -1,6 +1,6 @@ package it.myti.academy.backend.model; -import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import javax.persistence.Column; @@ -32,7 +32,7 @@ public class StatoUnitaLogistica { @Column(length = 2048) protected String descrizione; - @JsonBackReference + @JsonIgnore @OneToMany(mappedBy = "stato") protected List unitaLogistiche; diff --git a/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java b/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java index f4036d2..861bd7a 100644 --- a/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java +++ b/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java @@ -1,7 +1,5 @@ package it.myti.academy.backend.model; -import com.fasterxml.jackson.annotation.JsonBackReference; -import com.fasterxml.jackson.annotation.JsonManagedReference; import lombok.Data; import javax.persistence.Column; @@ -38,12 +36,10 @@ public class UnitaLogistica { @Column(name = "temp_minima") protected Short temperaturaMinima; - @JsonManagedReference @ManyToOne @JoinColumn(name = "stato_id") protected StatoUnitaLogistica stato; - @JsonBackReference @Column @OneToMany(mappedBy = "unitaLogistica") protected List spedizioniFatte; diff --git a/src/main/java/it/myti/academy/backend/model/Utente.java b/src/main/java/it/myti/academy/backend/model/Utente.java index 388e11c..f66ff20 100644 --- a/src/main/java/it/myti/academy/backend/model/Utente.java +++ b/src/main/java/it/myti/academy/backend/model/Utente.java @@ -1,6 +1,5 @@ package it.myti.academy.backend.model; -import com.fasterxml.jackson.annotation.JsonBackReference; import lombok.Data; import javax.persistence.Column; @@ -22,19 +21,18 @@ public class Utente { @Id @Column(updatable = false) - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) protected Long id; @Column(unique = true, length = 64) protected String username; - @Column(unique = true, length = 64) + @Column(length = 64) protected String password; @Column(length = 64, nullable = false) protected String nome; - @JsonBackReference @Column @OneToMany(mappedBy = "utente") protected List spedizioniFatte; diff --git a/src/main/java/it/myti/academy/backend/model/UtenteRichiesta.java b/src/main/java/it/myti/academy/backend/model/UtenteRichiesta.java new file mode 100644 index 0000000..883fdeb --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/UtenteRichiesta.java @@ -0,0 +1,10 @@ +package it.myti.academy.backend.model; + +import lombok.Data; + +@Data +public class UtenteRichiesta { + private String nome; + private String username; + private String password; +} diff --git a/src/main/java/it/myti/academy/backend/model/errori/ColloNonTrovatoException.java b/src/main/java/it/myti/academy/backend/model/errori/ColloNonTrovatoException.java deleted file mode 100644 index bad6a51..0000000 --- a/src/main/java/it/myti/academy/backend/model/errori/ColloNonTrovatoException.java +++ /dev/null @@ -1,4 +0,0 @@ -package it.myti.academy.backend.model.errori; - -public class ColloNonTrovatoException extends Exception { -} diff --git a/src/main/java/it/myti/academy/backend/model/errori/SpedizioniAttiveNonTrovateException.java b/src/main/java/it/myti/academy/backend/model/errori/SpedizioniAttiveNonTrovateException.java deleted file mode 100644 index 3ba872f..0000000 --- a/src/main/java/it/myti/academy/backend/model/errori/SpedizioniAttiveNonTrovateException.java +++ /dev/null @@ -1,4 +0,0 @@ -package it.myti.academy.backend.model.errori; - -public class SpedizioniAttiveNonTrovateException extends Exception { -} diff --git a/src/main/java/it/myti/academy/backend/model/errori/eccezioni/RegistrazioneException.java b/src/main/java/it/myti/academy/backend/model/errori/eccezioni/RegistrazioneException.java new file mode 100644 index 0000000..0539110 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/errori/eccezioni/RegistrazioneException.java @@ -0,0 +1,4 @@ +package it.myti.academy.backend.model.errori.eccezioni; + +public class RegistrazioneException extends Exception { +} diff --git a/src/main/java/it/myti/academy/backend/model/errori/UnitaLogisticaNonTrovataException.java b/src/main/java/it/myti/academy/backend/model/errori/eccezioni/UnitaLogisticaNonTrovataException.java similarity index 76% rename from src/main/java/it/myti/academy/backend/model/errori/UnitaLogisticaNonTrovataException.java rename to src/main/java/it/myti/academy/backend/model/errori/eccezioni/UnitaLogisticaNonTrovataException.java index 91f1255..1b718dd 100644 --- a/src/main/java/it/myti/academy/backend/model/errori/UnitaLogisticaNonTrovataException.java +++ b/src/main/java/it/myti/academy/backend/model/errori/eccezioni/UnitaLogisticaNonTrovataException.java @@ -1,4 +1,4 @@ -package it.myti.academy.backend.model.errori; +package it.myti.academy.backend.model.errori.eccezioni; import org.springframework.http.HttpStatus; diff --git a/src/main/java/it/myti/academy/backend/model/errori/eccezioni/UtenteNonAutorizzatoException.java b/src/main/java/it/myti/academy/backend/model/errori/eccezioni/UtenteNonAutorizzatoException.java new file mode 100644 index 0000000..44d55e9 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/model/errori/eccezioni/UtenteNonAutorizzatoException.java @@ -0,0 +1,4 @@ +package it.myti.academy.backend.model.errori.eccezioni; + +public class UtenteNonAutorizzatoException extends Exception { +} diff --git a/src/main/java/it/myti/academy/backend/model/errori/UtenteNonTrovatoException.java b/src/main/java/it/myti/academy/backend/model/errori/eccezioni/UtenteNonTrovatoException.java similarity index 52% rename from src/main/java/it/myti/academy/backend/model/errori/UtenteNonTrovatoException.java rename to src/main/java/it/myti/academy/backend/model/errori/eccezioni/UtenteNonTrovatoException.java index 1c0e392..c7fbaec 100644 --- a/src/main/java/it/myti/academy/backend/model/errori/UtenteNonTrovatoException.java +++ b/src/main/java/it/myti/academy/backend/model/errori/eccezioni/UtenteNonTrovatoException.java @@ -1,4 +1,4 @@ -package it.myti.academy.backend.model.errori; +package it.myti.academy.backend.model.errori.eccezioni; public class UtenteNonTrovatoException extends Exception { } diff --git a/src/main/java/it/myti/academy/backend/repository/ColloRepository.java b/src/main/java/it/myti/academy/backend/repository/ColloRepository.java index 469b4c5..cd96c40 100644 --- a/src/main/java/it/myti/academy/backend/repository/ColloRepository.java +++ b/src/main/java/it/myti/academy/backend/repository/ColloRepository.java @@ -1,6 +1,5 @@ package it.myti.academy.backend.repository; -import it.myti.academy.backend.model.Contenuto; import it.myti.academy.backend.model.UnitaLogistica; import it.myti.academy.backend.model.Utente; import it.myti.academy.backend.model.Collo; @@ -15,5 +14,4 @@ public interface ColloRepository extends JpaRepository { List findAllByUtente(Utente utente); Collo findFirstByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica); List findAllByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica); - } diff --git a/src/main/java/it/myti/academy/backend/repository/EventiParticleRepository.java b/src/main/java/it/myti/academy/backend/repository/EventiParticleRepository.java new file mode 100644 index 0000000..523bcb3 --- /dev/null +++ b/src/main/java/it/myti/academy/backend/repository/EventiParticleRepository.java @@ -0,0 +1,15 @@ +package it.myti.academy.backend.repository; + +import it.myti.academy.backend.model.EventoParticle; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +/** + * Created by david at 2019-03-11 + */ +public interface EventiParticleRepository extends JpaRepository { + + EventoParticle findFirstByOrderByRicevutoIlDesc(); + +} diff --git a/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java b/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java index 3e45784..9932757 100644 --- a/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java +++ b/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java @@ -2,11 +2,13 @@ import it.myti.academy.backend.model.Utente; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; /** * Created by david at 2019-02-20 */ public interface UtenteRepository extends JpaRepository { + Utente findByUsername(String username); Utente getById(Long id); - + Utente getByUsername(String username); } diff --git a/src/main/java/it/myti/academy/backend/service/ColloService.java b/src/main/java/it/myti/academy/backend/service/ColloService.java index 6a88c88..b8fd134 100644 --- a/src/main/java/it/myti/academy/backend/service/ColloService.java +++ b/src/main/java/it/myti/academy/backend/service/ColloService.java @@ -3,9 +3,6 @@ import it.myti.academy.backend.model.Collo; import it.myti.academy.backend.model.UnitaLogistica; import it.myti.academy.backend.model.Utente; -import it.myti.academy.backend.model.errori.ColloNonTrovatoException; -import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; -import it.myti.academy.backend.model.errori.UnitaLogisticaNonTrovataException; import java.util.List; @@ -13,6 +10,7 @@ * Created by david at 2019-02-20 */ public interface ColloService { - List getSpedizioniAttiveByUtente(Utente utente) throws SpedizioniAttiveNonTrovateException; - Collo getSpedizioneAttivaByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica) throws SpedizioniAttiveNonTrovateException; + List getSpedizioniAttiveByUtente(Long utenteId); + List getSpedizioniAttiveByUtente(Utente utente); + Collo getSpedizioneAttivaByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica); } diff --git a/src/main/java/it/myti/academy/backend/service/EventoService.java b/src/main/java/it/myti/academy/backend/service/EventoService.java index 0bb5eac..aada216 100644 --- a/src/main/java/it/myti/academy/backend/service/EventoService.java +++ b/src/main/java/it/myti/academy/backend/service/EventoService.java @@ -1,12 +1,10 @@ package it.myti.academy.backend.service; -import it.myti.academy.backend.model.Collo; import it.myti.academy.backend.model.Evento; import it.myti.academy.backend.model.Utente; -import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; import java.util.List; public interface EventoService { - List findEventiAttiviByUtente(Utente utente) throws SpedizioniAttiveNonTrovateException; + List findEventiAttiviByUtente(Utente utente); } diff --git a/src/main/java/it/myti/academy/backend/service/UnitaLogisticaService.java b/src/main/java/it/myti/academy/backend/service/UnitaLogisticaService.java index 37a037c..3384277 100644 --- a/src/main/java/it/myti/academy/backend/service/UnitaLogisticaService.java +++ b/src/main/java/it/myti/academy/backend/service/UnitaLogisticaService.java @@ -2,14 +2,12 @@ import it.myti.academy.backend.model.entitaRisposte.DettagliUnitaLogisticaUtente; -import it.myti.academy.backend.model.errori.ColloNonTrovatoException; -import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; -import it.myti.academy.backend.model.errori.UnitaLogisticaNonTrovataException; -import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; +import it.myti.academy.backend.model.errori.eccezioni.UnitaLogisticaNonTrovataException; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonTrovatoException; import java.util.List; public interface UnitaLogisticaService { - List getByUtente(Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException; - DettagliUnitaLogisticaUtente getByIdAndUtente(Long idUnitaLogistica, Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, ColloNonTrovatoException, SpedizioniAttiveNonTrovateException; + List getByUtente(Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException; + DettagliUnitaLogisticaUtente getByIdAndUtente(Long idUnitaLogistica, Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException; } diff --git a/src/main/java/it/myti/academy/backend/service/UtenteService.java b/src/main/java/it/myti/academy/backend/service/UtenteService.java index 17cb5f1..39ade09 100644 --- a/src/main/java/it/myti/academy/backend/service/UtenteService.java +++ b/src/main/java/it/myti/academy/backend/service/UtenteService.java @@ -1,12 +1,10 @@ package it.myti.academy.backend.service; import it.myti.academy.backend.model.Utente; -import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; -import it.myti.academy.backend.repository.UtenteRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonTrovatoException; public interface UtenteService { Utente getById(Long id) throws UtenteNonTrovatoException; + Utente getByUsername(String username); } diff --git a/src/main/java/it/myti/academy/backend/service/impl/ColloServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/ColloServiceImpl.java index f4b785e..c63e9c7 100644 --- a/src/main/java/it/myti/academy/backend/service/impl/ColloServiceImpl.java +++ b/src/main/java/it/myti/academy/backend/service/impl/ColloServiceImpl.java @@ -2,14 +2,14 @@ import it.myti.academy.backend.model.UnitaLogistica; import it.myti.academy.backend.model.Utente; -import it.myti.academy.backend.model.errori.ColloNonTrovatoException; -import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; import it.myti.academy.backend.repository.ColloRepository; +import it.myti.academy.backend.repository.UtenteRepository; import it.myti.academy.backend.service.ColloService; import it.myti.academy.backend.model.Collo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -22,25 +22,34 @@ public class ColloServiceImpl implements ColloService { @Autowired private ColloRepository colloRepository; + @Autowired + private UtenteRepository utenteRepository; + + @Override + public List getSpedizioniAttiveByUtente(Long utenteId) { + final Utente utente = utenteRepository.findById(utenteId).get(); + if (utente != null) + return getSpedizioniAttiveByUtente(utente); + return new ArrayList<>(); + } + @Override - public List getSpedizioniAttiveByUtente(Utente utente) throws SpedizioniAttiveNonTrovateException { + public List getSpedizioniAttiveByUtente(Utente utente) { final List allByUtente = colloRepository.findAllByUtente(utente); - List risultato = allByUtente.stream() + return allByUtente.stream() .filter(collo -> collo.getSpedizione().getArrivoIl().after(new Date())) .collect(Collectors.toList()); - if(risultato.size() == 0) - throw new SpedizioniAttiveNonTrovateException(); - return risultato; } - public Collo getSpedizioneAttivaByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica) throws SpedizioniAttiveNonTrovateException { + + public Collo getSpedizioneAttivaByUtenteAndUnitaLogistica(Utente utente, UnitaLogistica unitaLogistica) { final List colliUtenteUnitaLogistica = colloRepository.findAllByUtenteAndUnitaLogistica(utente, unitaLogistica); List SpedizioniAttive = colliUtenteUnitaLogistica.stream() .filter(collo -> collo.getSpedizione().getArrivoIl().after(new Date())) .collect(Collectors.toList()); - if(SpedizioniAttive.size() == 0) - throw new SpedizioniAttiveNonTrovateException(); return SpedizioniAttive.get(0); } + + } diff --git a/src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java index f7992a6..987dda5 100644 --- a/src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java +++ b/src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java @@ -3,7 +3,6 @@ import it.myti.academy.backend.model.Collo; import it.myti.academy.backend.model.Evento; import it.myti.academy.backend.model.Utente; -import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; import it.myti.academy.backend.service.ColloService; import it.myti.academy.backend.service.EventoService; import org.springframework.beans.factory.annotation.Autowired; @@ -19,7 +18,7 @@ public class EventoServiceImpl implements EventoService { ColloService colloService; @Override - public List findEventiAttiviByUtente(Utente utente) throws SpedizioniAttiveNonTrovateException { + public List findEventiAttiviByUtente(Utente utente) { List colliUtente = colloService.getSpedizioniAttiveByUtente(utente); List eventi = new ArrayList<>(); colliUtente.forEach(collo -> { diff --git a/src/main/java/it/myti/academy/backend/service/impl/UnitaLogisticaServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/UnitaLogisticaServiceImpl.java index f2b5f1c..8f02f4d 100644 --- a/src/main/java/it/myti/academy/backend/service/impl/UnitaLogisticaServiceImpl.java +++ b/src/main/java/it/myti/academy/backend/service/impl/UnitaLogisticaServiceImpl.java @@ -2,10 +2,7 @@ import it.myti.academy.backend.model.*; import it.myti.academy.backend.model.entitaRisposte.DettagliUnitaLogisticaUtente; -import it.myti.academy.backend.model.errori.ColloNonTrovatoException; -import it.myti.academy.backend.model.errori.SpedizioniAttiveNonTrovateException; -import it.myti.academy.backend.model.errori.UnitaLogisticaNonTrovataException; -import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonTrovatoException; import it.myti.academy.backend.repository.UnitaLogisticaRepository; import it.myti.academy.backend.service.ColloService; import it.myti.academy.backend.service.ContenutoService; @@ -32,19 +29,17 @@ public class UnitaLogisticaServiceImpl implements UnitaLogisticaService { ContenutoService contenutoService; - public List getByUtente(Long idUtente) throws UnitaLogisticaNonTrovataException, UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { + public List getByUtente(Long idUtente) throws UtenteNonTrovatoException { Utente utente = utenteService.getById(idUtente); if(utente == null) throw new UtenteNonTrovatoException(); List colliUtente = colloService.getSpedizioniAttiveByUtente(utente); - if (colliUtente.isEmpty()) - throw new UnitaLogisticaNonTrovataException(); return colliUtente.stream().map(collo -> { return generaDettagliRichiestaUnitaByCollo(collo); }).collect(Collectors.toList()); } - public DettagliUnitaLogisticaUtente getByIdAndUtente(Long idUnitaLogistica, Long idUtente) throws UtenteNonTrovatoException, SpedizioniAttiveNonTrovateException { + public DettagliUnitaLogisticaUtente getByIdAndUtente(Long idUnitaLogistica, Long idUtente) throws UtenteNonTrovatoException { Utente utente = utenteService.getById(idUtente); UnitaLogistica unitaLogistica = unitaLogisticaRepository.getById(idUnitaLogistica); Collo colloUtente = colloService.getSpedizioneAttivaByUtenteAndUnitaLogistica(utente, unitaLogistica); diff --git a/src/main/java/it/myti/academy/backend/service/impl/UserDetailsServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/UserDetailsServiceImpl.java new file mode 100644 index 0000000..11597de --- /dev/null +++ b/src/main/java/it/myti/academy/backend/service/impl/UserDetailsServiceImpl.java @@ -0,0 +1,27 @@ +package it.myti.academy.backend.service.impl; + +import it.myti.academy.backend.model.Utente; +import it.myti.academy.backend.repository.UtenteRepository; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import static java.util.Collections.emptyList; + +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + private UtenteRepository applicationUserRepository; + public UserDetailsServiceImpl(UtenteRepository applicationUserRepository) { + this.applicationUserRepository = applicationUserRepository; + } + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Utente applicationUser = applicationUserRepository.findByUsername(username); + if (applicationUser == null) { + throw new UsernameNotFoundException(username); + } + return new User(applicationUser.getUsername(), applicationUser.getPassword(), emptyList()); + } +} diff --git a/src/main/java/it/myti/academy/backend/service/impl/UtenteServiceImpl.java b/src/main/java/it/myti/academy/backend/service/impl/UtenteServiceImpl.java index 369fc03..170b6a1 100644 --- a/src/main/java/it/myti/academy/backend/service/impl/UtenteServiceImpl.java +++ b/src/main/java/it/myti/academy/backend/service/impl/UtenteServiceImpl.java @@ -1,7 +1,7 @@ package it.myti.academy.backend.service.impl; import it.myti.academy.backend.model.Utente; -import it.myti.academy.backend.model.errori.UtenteNonTrovatoException; +import it.myti.academy.backend.model.errori.eccezioni.UtenteNonTrovatoException; import it.myti.academy.backend.repository.UtenteRepository; import it.myti.academy.backend.service.UtenteService; import org.springframework.beans.factory.annotation.Autowired; @@ -9,6 +9,7 @@ @Service public class UtenteServiceImpl implements UtenteService { + @Autowired UtenteRepository utenteRepository; @@ -19,4 +20,9 @@ public Utente getById(Long id) throws UtenteNonTrovatoException { throw new UtenteNonTrovatoException(); return utente; } + + @Override + public Utente getByUsername(String username) { + return utenteRepository.getByUsername(username); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 94dfb32..9fc0373 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,5 +9,3 @@ spring.datasource.username=sa spring.datasource.password= server.port=9090 - -jwt.secret=MY-SECRET-KEY diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 0f39ce7..44c0194 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,7 +1,9 @@ + + INSERT INTO utenti (`id`, `username`, `password`, `nome`) VALUES - (1, 'logistic@galbanino.it', 'ciaociao123', 'Logistica Galbanino'), - (2, 'pippo@baudo.it', 'cfffiaociao123', 'Cocaina'); + (1, 'logistic@galbanino.it', '$2a$10$E4xLUTPcVrQ6zGewW40twucl1sVesuZjAbH8dKTf4eb8KMsnmzxAu', 'Logistica Galbanino'), + (2, 'prova', '$2a$10$E4xLUTPcVrQ6zGewW40twucl1sVesuZjAbH8dKTf4eb8KMsnmzxAu', 'nome'); INSERT INTO tipologie_eventi (`id`, `nome`, `descrizione`) VALUES @@ -20,7 +22,7 @@ VALUES ( 1, 'AAAA', 'UL2', 12, -12, 1); INSERT INTO spedizioni (`id`, `codice_treno`, `partenza_il`, `partenza_da`, `arrivo_il`, `arrivo_a`) VALUES -(1, 'TRAIN_AAAA', '2019-02-01', 'BRESCIA', '2019-09-03', 'MILANO'); +(1, 'TRAIN_AAAA', '2019-02-01', 'BRESCIA', '2019-05-03', 'MILANO'); INSERT INTO colli (`id`, `unita_logistica_id`, `spedizione_id`, `utente_id`) VALUES ( 1, 1, 1, 1); @@ -44,7 +46,8 @@ VALUES (4, 2.56, 80.8, 0, 45.556556, 10.216596, 100), (5, 2.82, 80.3, 0, 45.556556, 10.216596, 100), (6, 2.93, 79.9, 0, 45.556556, 10.216596, 100); -INSERT INTO contenuti (`dtype`, `id`, `descrizione`, `nome`, `quantita`, `temperatura_massima_ricchiesta`, `temperatura_minima_ricchiesta`, `unita_di_misura`, `collo_id`) + +INSERT INTO contenuti (`DTYPE`, `id`, `nome`, `descrizione`, `temperatura_minima_ricchiesta`, `temperatura_massima_ricchiesta`, `quantita`, `unita_di_misura`, `collo_id`) VALUES - ('ContenutoDettagliato', 1, 'descrizione', 'mele', 20, 18, 10, 'kg', 1), - ('ContenutoDettagliato', 2, 'descrizione', 'pere', 30, 18, 10, 'kg', 1); \ No newline at end of file + ('ContenutoCompleto', 1, 'CAVOLO CAPPUCCIO', 'Detto anche verza', 2, 5, 10, 'kg', 1), + ('ContenutoCompleto', 2, 'STRACCHINO', 'Detto anche robbiola', 2, 3, 20, 'kg', 1); \ No newline at end of file