diff --git a/mvn-repository-exported.zip b/mvn-repository-exported.zip
deleted file mode 100644
index 0f0519c..0000000
Binary files a/mvn-repository-exported.zip and /dev/null differ
diff --git a/pom.xml b/pom.xml
index 028f84b..149f48b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,6 +34,10 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.springframework.boot
+ spring-boot-starter-security
+
@@ -46,12 +50,23 @@
lombok
true
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.0
+
+
org.springframework.boot
spring-boot-starter-test
test
+
+ org.springframework.security
+ spring-security-test
+ test
+
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..8df58b4
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/config/CryptConfig.java
@@ -0,0 +1,19 @@
+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;
+
+/**
+ * Created by david at 2019-03-20
+ */
+@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..6a1cdbf
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/config/WebSecurity.java
@@ -0,0 +1,51 @@
+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.http.HttpStatus;
+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;
+import org.springframework.security.web.authentication.HttpStatusEntryPoint;
+
+
+/**
+ * Created by david at 2019-03-20
+ */
+@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, "/utente/sign-up", "/unitalogistiche/utente/*").permitAll()
+ .anyRequest().authenticated()
+ .and()
+ .addFilter(new JWTAuthenticationFilter(authenticationManager()))
+ .addFilter(new JWTAuthorizationFilter(authenticationManager()))
+ .exceptionHandling()
+ .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
+ 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/EventiController.java b/src/main/java/it/myti/academy/backend/controller/EventiController.java
new file mode 100644
index 0000000..2a93c77
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/controller/EventiController.java
@@ -0,0 +1,29 @@
+package it.myti.academy.backend.controller;
+
+import it.myti.academy.backend.model.Evento;
+import it.myti.academy.backend.service.EventoService;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * Created by david at 2019-03-11
+ */
+@RestController
+public class EventiController {
+
+ @Autowired
+ public EventoService eventoService;
+
+ @GetMapping("/eventi/utente/{id}")
+ public List getEventiByUtente(@PathVariable("id") Long idUtente, @RequestParam(value = "idSpedizione", required = false) Long idSpedizione, @RequestParam(value = "idUnitaLogistica", required = false) Long idUnitaLogistica) {
+
+ final List eventiSpedizioniAttiveByUtente = eventoService.getEventiByUtenteAndSpedizioneAndUnitaLogistica(idUtente, idSpedizione, idUnitaLogistica);
+
+ return eventiSpedizioniAttiveByUtente;
+ }
+}
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 3787555..c2eb27d 100644
--- a/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java
+++ b/src/main/java/it/myti/academy/backend/controller/UnitaLogisticheController.java
@@ -3,17 +3,19 @@
import it.myti.academy.backend.model.Collo;
import it.myti.academy.backend.model.EventoParticle;
import it.myti.academy.backend.model.UnitaLogistica;
+import it.myti.academy.backend.model.Utente;
import it.myti.academy.backend.model.resp.UnitaLogisticheDettaglio;
import it.myti.academy.backend.repository.EventiParticleRepository;
+import it.myti.academy.backend.repository.UtenteRepository;
import it.myti.academy.backend.service.ColloService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
-import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -24,15 +26,18 @@ public class UnitaLogisticheController {
@Autowired
public ColloService colloService;
-
@Autowired
public EventiParticleRepository eventiParticleRepository;
- private Function colloToDetail;
+ @Autowired
+ private UtenteRepository utenteRepository;
- @GetMapping("/unitalogistiche/utente/{id}")
- public List getDettagliByUtente(@PathVariable("id") long id) {
+ @GetMapping("/unitalogistiche")
+ public List getDettagliByUtente() {
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ String currentPrincipalName = authentication.getName();
+ Utente user = utenteRepository.findByUsername(currentPrincipalName);
- final List spedizioniAttiveByUtente = colloService.getSpedizioniAttiveByUtente(id);
+ final List spedizioniAttiveByUtente = colloService.getSpedizioniAttiveByUtente(user.getId());
final List collect = spedizioniAttiveByUtente.stream()
.map(c -> colloToDetails(c))
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..99cdf4e
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/controller/UtenteController.java
@@ -0,0 +1,38 @@
+package it.myti.academy.backend.controller;
+
+import it.myti.academy.backend.model.Utente;
+import it.myti.academy.backend.model.req.NewUtente;
+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;
+
+/**
+ * Created by david at 2019-03-20
+ */
+
+@RestController
+public class UtenteController {
+
+ private UtenteRepository applicationUserRepository;
+ private BCryptPasswordEncoder bCryptPasswordEncoder;
+
+ @Autowired
+ public UtenteController(UtenteRepository applicationUserRepository,
+ BCryptPasswordEncoder bCryptPasswordEncoder) {
+ this.applicationUserRepository = applicationUserRepository;
+ this.bCryptPasswordEncoder = bCryptPasswordEncoder;
+ }
+
+ @PostMapping("/utente/sign-up")
+ public String signUp(@RequestBody NewUtente newUtente) {
+ Utente utente = new Utente();
+ utente.setNome(newUtente.getNome());
+ utente.setUsername(newUtente.getUsername());
+ utente.setPassword(bCryptPasswordEncoder.encode(newUtente.getPassword()));
+ applicationUserRepository.save(utente);
+ return "OK!";
+ }
+}
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..56772fc
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/filter/JWTAuthenticationFilter.java
@@ -0,0 +1,61 @@
+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;
+
+/**
+ * Created by david at 2019-03-20
+ */
+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) throws IOException, ServletException {
+ 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..b5ee208
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/filter/JWTAuthorizationFilter.java
@@ -0,0 +1,54 @@
+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;
+
+/**
+ * Created by david at 2019-03-20
+ */
+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..91b1bc3
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/filter/SecurityConstants.java
@@ -0,0 +1,12 @@
+package it.myti.academy.backend.filter;
+
+/**
+ * Created by david at 2019-03-20
+ */
+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/sign-up";
+}
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 c51bc01..313b3a4 100644
--- a/src/main/java/it/myti/academy/backend/model/Collo.java
+++ b/src/main/java/it/myti/academy/backend/model/Collo.java
@@ -3,15 +3,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
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.OneToMany;
-import javax.persistence.Table;
+import javax.persistence.*;
import java.util.List;
/**
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 4b6d6d7..8ed5987 100644
--- a/src/main/java/it/myti/academy/backend/model/Contenuto.java
+++ b/src/main/java/it/myti/academy/backend/model/Contenuto.java
@@ -3,14 +3,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
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
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 4d65c6f..25724f5 100644
--- a/src/main/java/it/myti/academy/backend/model/Evento.java
+++ b/src/main/java/it/myti/academy/backend/model/Evento.java
@@ -3,20 +3,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import javax.persistence.*;
import java.util.Date;
/**
diff --git a/src/main/java/it/myti/academy/backend/model/EventoHannibal.java b/src/main/java/it/myti/academy/backend/model/EventoHannibal.java
index 6e85416..706483e 100644
--- a/src/main/java/it/myti/academy/backend/model/EventoHannibal.java
+++ b/src/main/java/it/myti/academy/backend/model/EventoHannibal.java
@@ -1,6 +1,7 @@
package it.myti.academy.backend.model;
import lombok.Data;
+import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
@@ -12,6 +13,7 @@
*/
@Data
+@EqualsAndHashCode(callSuper = false)
@Entity
@DiscriminatorValue("2")
@Table(name = "eventi_hannibal")
diff --git a/src/main/java/it/myti/academy/backend/model/EventoParticle.java b/src/main/java/it/myti/academy/backend/model/EventoParticle.java
index 1350593..fc03536 100644
--- a/src/main/java/it/myti/academy/backend/model/EventoParticle.java
+++ b/src/main/java/it/myti/academy/backend/model/EventoParticle.java
@@ -1,6 +1,7 @@
package it.myti.academy.backend.model;
import lombok.Data;
+import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
@@ -11,6 +12,7 @@
* Created by david at 2019-02-13
*/
@Data
+@EqualsAndHashCode(callSuper = false)
@Entity
@DiscriminatorValue("1")
@Table(name = "eventi_particle")
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 74fad58..dca6543 100644
--- a/src/main/java/it/myti/academy/backend/model/EventoTipo.java
+++ b/src/main/java/it/myti/academy/backend/model/EventoTipo.java
@@ -3,13 +3,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
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.OneToMany;
-import javax.persistence.Table;
+import javax.persistence.*;
import java.util.List;
/**
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 8e8f256..af468e2 100644
--- a/src/main/java/it/myti/academy/backend/model/Spedizione.java
+++ b/src/main/java/it/myti/academy/backend/model/Spedizione.java
@@ -3,15 +3,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
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.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
+import javax.persistence.*;
import java.util.Date;
import java.util.List;
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 427493d..032af0d 100644
--- a/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java
+++ b/src/main/java/it/myti/academy/backend/model/StatoUnitaLogistica.java
@@ -3,13 +3,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
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.OneToMany;
-import javax.persistence.Table;
+import javax.persistence.*;
import java.util.List;
/**
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..fd53b50 100644
--- a/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java
+++ b/src/main/java/it/myti/academy/backend/model/UnitaLogistica.java
@@ -2,14 +2,7 @@
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.OneToMany;
+import javax.persistence.*;
import java.util.List;
/**
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..5a718f1 100644
--- a/src/main/java/it/myti/academy/backend/model/Utente.java
+++ b/src/main/java/it/myti/academy/backend/model/Utente.java
@@ -2,13 +2,7 @@
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.OneToMany;
-import javax.persistence.Table;
+import javax.persistence.*;
import java.util.List;
/**
@@ -21,7 +15,7 @@ public class Utente {
@Id
@Column(updatable = false)
- @GeneratedValue(strategy = GenerationType.AUTO)
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(unique = true, length = 64)
diff --git a/src/main/java/it/myti/academy/backend/model/req/NewUtente.java b/src/main/java/it/myti/academy/backend/model/req/NewUtente.java
new file mode 100644
index 0000000..41a1ced
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/model/req/NewUtente.java
@@ -0,0 +1,13 @@
+package it.myti.academy.backend.model.req;
+
+import lombok.Data;
+
+/**
+ * Created by david at 2019-03-20
+ */
+@Data
+public class NewUtente {
+ private String nome;
+ private String username;
+ private String password;
+}
diff --git a/src/main/java/it/myti/academy/backend/model/resp/UnitaLogisticheDettaglio.java b/src/main/java/it/myti/academy/backend/model/resp/UnitaLogisticheDettaglio.java
index bcad126..d443acd 100644
--- a/src/main/java/it/myti/academy/backend/model/resp/UnitaLogisticheDettaglio.java
+++ b/src/main/java/it/myti/academy/backend/model/resp/UnitaLogisticheDettaglio.java
@@ -6,9 +6,7 @@
import it.myti.academy.backend.model.StatoUnitaLogistica;
import lombok.Data;
-import java.util.ArrayList;
import java.util.List;
-import java.util.stream.Collectors;
/**
* Created by david at 2019-03-11
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..5dd27a8 100644
--- a/src/main/java/it/myti/academy/backend/repository/ColloRepository.java
+++ b/src/main/java/it/myti/academy/backend/repository/ColloRepository.java
@@ -1,14 +1,20 @@
package it.myti.academy.backend.repository;
-import it.myti.academy.backend.model.Utente;
import it.myti.academy.backend.model.Collo;
+import it.myti.academy.backend.model.Utente;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Created by david at 2019-02-20
*/
+@Repository
public interface ColloRepository extends JpaRepository {
List findAllByUtente(Utente utente);
+
+ @Query(value = "SELECT * FROM colli WHERE (utente_id = :utente) and (:spedizione is null or spedizione_id = :spedizione) and (:unitaLogistica is null or unita_logistica_id = :unitaLogistica)", nativeQuery = true)
+ List findAllByUtenteAndSpedizioneAndUnitaLogistica(Long utente, Long spedizione, Long 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
index 26b13d8..4407f40 100644
--- a/src/main/java/it/myti/academy/backend/repository/EventiParticleRepository.java
+++ b/src/main/java/it/myti/academy/backend/repository/EventiParticleRepository.java
@@ -2,10 +2,12 @@
import it.myti.academy.backend.model.EventoParticle;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
/**
* Created by david at 2019-03-11
*/
+@Repository
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 274a836..381052a 100644
--- a/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java
+++ b/src/main/java/it/myti/academy/backend/repository/UtenteRepository.java
@@ -7,5 +7,7 @@
/**
* Created by david at 2019-02-20
*/
+@Repository
public interface UtenteRepository extends JpaRepository {
+ Utente findByUsername(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 46ff431..34f2b2e 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,6 @@
package it.myti.academy.backend.service;
import it.myti.academy.backend.model.Collo;
-import it.myti.academy.backend.model.Utente;
import java.util.List;
@@ -10,5 +9,4 @@
*/
public interface ColloService {
List getSpedizioniAttiveByUtente(Long utenteId);
- List getSpedizioniAttiveByUtente(Utente utente);
}
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..c609c77
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/service/EventoService.java
@@ -0,0 +1,9 @@
+package it.myti.academy.backend.service;
+
+import it.myti.academy.backend.model.Evento;
+
+import java.util.List;
+
+public interface EventoService {
+ List getEventiByUtenteAndSpedizioneAndUnitaLogistica(Long idUtente, Long idSpedizione, Long idUnitaLogistica);
+}
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 6a4901f..cd04a29 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,10 +1,10 @@
package it.myti.academy.backend.service.impl;
+import it.myti.academy.backend.model.Collo;
import it.myti.academy.backend.model.Utente;
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;
@@ -27,16 +27,12 @@ public class ColloServiceImpl implements ColloService {
@Override
public List getSpedizioniAttiveByUtente(Long utenteId) {
final Utente utente = utenteRepository.findById(utenteId).get();
- if (utente != null)
- return getSpedizioniAttiveByUtente(utente);
+ if (utente != null) {
+ final List allByUtente = colloRepository.findAllByUtente(utente);
+ return allByUtente.stream()
+ .filter(collo -> collo.getSpedizione().getArrivoIl().after(new Date()))
+ .collect(Collectors.toList());
+ }
return new ArrayList<>();
}
-
- @Override
- public List getSpedizioniAttiveByUtente(Utente utente) {
- final List allByUtente = colloRepository.findAllByUtente(utente);
- return allByUtente.stream()
- .filter(collo -> collo.getSpedizione().getArrivoIl().after(new Date()))
- .collect(Collectors.toList());
- }
}
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..3e99140
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/service/impl/EventoServiceImpl.java
@@ -0,0 +1,28 @@
+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.repository.ColloRepository;
+import it.myti.academy.backend.service.EventoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class EventoServiceImpl implements EventoService {
+
+ @Autowired
+ private ColloRepository colloRepository;
+
+ @Override
+ public List getEventiByUtenteAndSpedizioneAndUnitaLogistica(Long idUtente, Long idSpedizione, Long idUnitaLogistica) {
+ final List colliByUtente = colloRepository.findAllByUtenteAndSpedizioneAndUnitaLogistica(idUtente, idSpedizione, idUnitaLogistica);
+ return colliByUtente.stream()
+ .filter(collo -> collo.getSpedizione().getArrivoIl().after(new Date()))
+ .flatMap(collo -> collo.getEventi().stream())
+ .collect(Collectors.toList());
+ }
+}
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..3820863
--- /dev/null
+++ b/src/main/java/it/myti/academy/backend/service/impl/UserDetailsServiceImpl.java
@@ -0,0 +1,32 @@
+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;
+
+/**
+ * Created by david at 2019-03-20
+ */
+@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/resources/application.properties b/src/main/resources/application.properties
index 94dfb32..1449a8f 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,13 +1,9 @@
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
-
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.datasource.url=jdbc:h2:mem:accademy
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
-
server.port=9090
-
-jwt.secret=MY-SECRET-KEY
diff --git a/src/test/java/it/myti/academy/backend/BackendApplicationTests.java b/src/test/java/it/myti/academy/backend/BackendApplicationTests.java
index e10beeb..e9beb41 100644
--- a/src/test/java/it/myti/academy/backend/BackendApplicationTests.java
+++ b/src/test/java/it/myti/academy/backend/BackendApplicationTests.java
@@ -1,12 +1,5 @@
package it.myti.academy.backend;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.junit4.SpringRunner;
-
//@RunWith(SpringRunner.class)
//@SpringBootTest()
//public class BackendApplicationTests {
diff --git a/src/test/java/it/myti/academy/backend/controller/UnitaLogisticheControllerTest.java b/src/test/java/it/myti/academy/backend/controller/UnitaLogisticheControllerTest.java
new file mode 100644
index 0000000..4c7116e
--- /dev/null
+++ b/src/test/java/it/myti/academy/backend/controller/UnitaLogisticheControllerTest.java
@@ -0,0 +1,63 @@
+package it.myti.academy.backend.controller;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+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.MvcResult;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
+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.status;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class UnitaLogisticheControllerTest {
+
+ @Autowired
+ private WebApplicationContext context;
+
+ private MockMvc mockMvc;
+
+ @Before
+ public void setup() {
+ mockMvc = MockMvcBuilders
+ .webAppContextSetup(context)
+ .apply(springSecurity())
+ .build();
+ }
+
+ @Test
+ public void getDettagliByUtente() throws Exception {
+ final MockHttpServletRequestBuilder signup = post("/utente/sign-up").contentType(MediaType.APPLICATION_JSON)
+ .content("{\"username\": \"admin\", \"password\": \"admin\", \"nome\": \"admin\"}");
+ mockMvc.perform(signup)
+ .andExpect(status().isOk());
+
+ final MockHttpServletRequestBuilder login = post("/login").contentType(MediaType.APPLICATION_JSON)
+ .content("{\"username\": \"admin\", \"password\": \"admin\"}");
+ final MvcResult response = mockMvc.perform(login)
+ .andExpect(status().isOk())
+ .andReturn();
+ final String token = "Bearer " + response.getResponse().getHeader("Authorization");
+
+ final MockHttpServletRequestBuilder requestBuilder = get("/unitalogistiche/").header("Authorization", token);
+ mockMvc.perform(requestBuilder)
+ .andExpect(status().isOk());
+ }
+
+ @Test
+ public void postDettagliByUtente() throws Exception {
+ final MockHttpServletRequestBuilder requestBuilder = post("/unitalogistiche");
+ mockMvc.perform(requestBuilder)
+ .andExpect(status().isUnauthorized());
+ }
+}
diff --git a/src/test/java/it/myti/academy/backend/model/UtenteTest.java b/src/test/java/it/myti/academy/backend/model/UtenteTest.java
index 8963149..ebd943e 100644
--- a/src/test/java/it/myti/academy/backend/model/UtenteTest.java
+++ b/src/test/java/it/myti/academy/backend/model/UtenteTest.java
@@ -6,7 +6,8 @@
import java.util.ArrayList;
import java.util.List;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
/**
* Created by david at 2019-02-21
diff --git a/src/test/java/it/myti/academy/backend/service/impl/ColloServiceImplTest.java b/src/test/java/it/myti/academy/backend/service/impl/ColloServiceImplTest.java
index b410839..c030e6e 100644
--- a/src/test/java/it/myti/academy/backend/service/impl/ColloServiceImplTest.java
+++ b/src/test/java/it/myti/academy/backend/service/impl/ColloServiceImplTest.java
@@ -12,7 +12,8 @@
import java.util.List;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
/**
* Created by david at 2019-02-20
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
index 48ea7b4..97f88d9 100644
--- a/src/test/resources/application.properties
+++ b/src/test/resources/application.properties
@@ -1,11 +1,9 @@
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
-
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.datasource.url=jdbc:h2:mem:accademy-test;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
-
jwt.secret=MY-SECRET-KEY
\ No newline at end of file