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