diff --git a/README.md b/README.md index a55b948..ede89de 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,39 @@ Crie um fork do teste para acompanharmos o seu desenvolvimento através dos seus ## Obrigado! Agradecemos sua participação. Boa sorte! 😄 + +## Requisitos do Projeto + +### Tecnologies +- JPA, SpringBoot and H2 for Back-end +- HTML5, CSS, Photoshop, Bootstrap and JavaScript for Front-end + +### How to run +- Open the project in Eclipse IDE +- Run ParkApplication.java +- The projects runs on `http://localhost:8080/estacionamentos` + + +### Services +- List establishments: `http://localhost:8080/estacionamentos` +- Create establishments: `http://localhost:8080/estacionamentos` +- _Header: Contet-Type application/json_ +- Update establishments: `http://localhost:8080/estacionamentos/{establishment id}` +- _Header: Contet-Type application/json_ +- Delete establishments: `http://localhost:8080/estacionamentos/{establishment id}` + +- List vacancies: `http://localhost:8080/estacionamentos/{vacancy id}` + +- List vehicles: `http://localhost:8080/estacionamentos/{establishment id}/vagas/{vehicle id}` +- Create vehicles: `http://localhost:8080/estacionamentos/{establishment id}/vagas/{vehicles id}` +- _Header: Contet-Type application/json_ +- Update vehicles: `http://localhost:8080/estacionamento/{establishment id}/vagas/{vehicle id}` +- _Header: Contet-Type application/json_ +- Delete vehicles: `http://localhost:8080/estacionamentos/{establishment id}/vagas/{vehicle id}` + + +### Team +- Henrico Lazuroz Moura de Almeida +- Thaue Alfredo Ferreira Lima +- Thiago Henrique Santos +- Vitor Coelho da Silva \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3bf5eaf..0cce261 100644 --- a/pom.xml +++ b/pom.xml @@ -20,14 +20,18 @@ + org.springframework.boot - spring-boot-starter-actuator + spring-boot-starter-data-jpa + - org.springframework.boot - spring-boot-starter-data-jpa + org.projectlombok + lombok + 1.18.10 + org.springframework.boot spring-boot-starter-web @@ -38,6 +42,41 @@ h2 runtime + + + org.springframework.boot + spring-boot-devtools + runtime + + + + org.springframework.boot + spring-boot-starter-security + + + + io.jsonwebtoken + jjwt + 0.9.1 + + +<<<<<<< HEAD + spring-boot-starter-thymeleaf + +======= + + io.springfox + springfox-swagger2 + 2.9.2 + + +>>>>>>> 1c4b3e9a796b48bc8009019578bab236cfdaedb5 + + io.springfox + springfox-swagger-ui + 2.9.2 + + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/br/com/hackathonfc/park/ParkApplication.java b/src/main/java/br/com/hackathonfc/park/ParkApplication.java index e46c23e..c464f74 100644 --- a/src/main/java/br/com/hackathonfc/park/ParkApplication.java +++ b/src/main/java/br/com/hackathonfc/park/ParkApplication.java @@ -9,5 +9,4 @@ public class ParkApplication { public static void main(String[] args) { SpringApplication.run(ParkApplication.class, args); } - } diff --git a/src/main/java/br/com/hackathonfc/park/bo/EstacionamentoBO.java b/src/main/java/br/com/hackathonfc/park/bo/EstacionamentoBO.java new file mode 100644 index 0000000..74bd03b --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/bo/EstacionamentoBO.java @@ -0,0 +1,48 @@ +package br.com.hackathonfc.park.bo; + +import br.com.hackathonfc.park.dto.EstacionamentoDTO; +import br.com.hackathonfc.park.dto.VagaDTO; +import br.com.hackathonfc.park.dto.VagaDTOSemEstacionamento; +import br.com.hackathonfc.park.exception.CnpjFound; +import br.com.hackathonfc.park.exception.EstacionamentoNotFound; +import br.com.hackathonfc.park.exception.NomeFound; +import br.com.hackathonfc.park.model.Estacionamento; +import br.com.hackathonfc.park.service.EstacionamentoService; +import br.com.hackathonfc.park.service.VagaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class EstacionamentoBO { + + @Autowired + private EstacionamentoService estacionamentoService; + + @Autowired + private VagaService vagaService; + + public Page listarEstacionamentos(Pageable paginacao){ + return estacionamentoService.listar(paginacao); + } + + public ResponseEntity cadastrar(EstacionamentoDTO estacionamento) throws NomeFound, CnpjFound { + return estacionamentoService.cadastrar(estacionamento); + } + + public ResponseEntity atualizar(Long id, EstacionamentoDTO estacionamentoDTO) throws EstacionamentoNotFound { + return estacionamentoService.atualizar(id, estacionamentoDTO); + } + + public ResponseEntity deletar(Long id) throws EstacionamentoNotFound { + return estacionamentoService.deletar(id); + } + + public EstacionamentoDTO detalharEstacionamento(Long id) throws EstacionamentoNotFound { + return estacionamentoService.detalhar(id); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/bo/VagaBO.java b/src/main/java/br/com/hackathonfc/park/bo/VagaBO.java new file mode 100644 index 0000000..da6e9bf --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/bo/VagaBO.java @@ -0,0 +1,50 @@ +package br.com.hackathonfc.park.bo; + +import br.com.hackathonfc.park.dto.VagaDTO; +import br.com.hackathonfc.park.dto.VagaDTOSemEstacionamento; +import br.com.hackathonfc.park.dto.VeiculoDTO; +import br.com.hackathonfc.park.exception.EstacionamentoNotFound; +import br.com.hackathonfc.park.exception.VagaNotFound; +import br.com.hackathonfc.park.exception.VeiculoNotFound; +import br.com.hackathonfc.park.model.Vaga; +import br.com.hackathonfc.park.model.Veiculo; +import br.com.hackathonfc.park.service.VagaService; +import br.com.hackathonfc.park.service.VeiculoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class VagaBO { + + @Autowired + private VagaService vagaService; + + @Autowired + private VeiculoService veiculoService; + + public List listarVeiculos(Long id) throws EstacionamentoNotFound { + return veiculoService.listarVeiculosDoEstacionamento(id); + } + public List listarVagas(Long id) throws EstacionamentoNotFound { + return vagaService.listar(id); + } + + public ResponseEntity cadastrarVaga(VagaDTO vagaDTO, Long id) { + return vagaService.cadastrar(vagaDTO, id); + } + + public ResponseEntity atualizarVaga(Long id, VagaDTO vagaDTO) throws VagaNotFound, VeiculoNotFound { + return vagaService.atualizar(id, vagaDTO); + } + + public ResponseEntity removerVaga(Long id) throws VagaNotFound { + return vagaService.remover(id); + } + + public VagaDTO detalharVaga(Long id) throws VagaNotFound { + return vagaService.detalhar(id); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/config/cors/CorsConfiguration.java b/src/main/java/br/com/hackathonfc/park/config/cors/CorsConfiguration.java new file mode 100644 index 0000000..e46fbf3 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/config/cors/CorsConfiguration.java @@ -0,0 +1,20 @@ +package br.com.hackathonfc.park.config.cors; + +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@EnableWebMvc +public class CorsConfiguration implements WebMvcConfigurer{ + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedMethods("GET", "POST", "PUT", "DELETE"); + } + }; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/config/profiles/TestConfig.java b/src/main/java/br/com/hackathonfc/park/config/profiles/TestConfig.java new file mode 100644 index 0000000..faa131b --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/config/profiles/TestConfig.java @@ -0,0 +1,22 @@ +package br.com.hackathonfc.park.config.profiles; + +import br.com.hackathonfc.park.service.DbService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("test") +public class TestConfig { + + @Autowired + private DbService dbService; + + @Bean + public boolean instantiateDatebase(){ + dbService.instantiateTestDatabase(); + + return true; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/config/security/SecurityConfiguration.java b/src/main/java/br/com/hackathonfc/park/config/security/SecurityConfiguration.java new file mode 100644 index 0000000..d0a32e8 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/config/security/SecurityConfiguration.java @@ -0,0 +1,84 @@ +package br.com.hackathonfc.park.config.security; + +import br.com.hackathonfc.park.repository.UserRepository; +import br.com.hackathonfc.park.service.AuthenticationService; +import br.com.hackathonfc.park.service.TokenService; +import br.com.hackathonfc.park.util.AuthenticationFilter; +import br.com.hackathonfc.park.util.AuthorizationFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Autowired + private AuthenticationService authenticationService; + + @Autowired + private TokenService tokenService; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserDetailsService userDetailsService; + + @Override + @Bean + protected AuthenticationManager authenticationManager() throws Exception { + return super.authenticationManager(); + } + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(authenticationService).passwordEncoder(new BCryptPasswordEncoder()); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers(HttpMethod.GET, "/estacionamentos/**").permitAll() + .antMatchers("/h2-console/**").permitAll() + .antMatchers("/login").permitAll() + .antMatchers("/signup").permitAll() + .antMatchers("/auth/**").permitAll() + .antMatchers("/user/**").permitAll() + .anyRequest().authenticated(); + + http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + + http.headers().frameOptions().disable(); + + http.addFilter(new AuthenticationFilter(authenticationManager(), tokenService)); + http.addFilter(new AuthorizationFilter(authenticationManager(), tokenService, userDetailsService)); + } + + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring() + .antMatchers("/**.html", "/v2/api-docs", "/webjars/**", "/configuration/**", "/swagger-resources/**"); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/config/swagger/SwaggerConfigurations.java b/src/main/java/br/com/hackathonfc/park/config/swagger/SwaggerConfigurations.java new file mode 100644 index 0000000..f16c8d1 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/config/swagger/SwaggerConfigurations.java @@ -0,0 +1,35 @@ +package br.com.hackathonfc.park.config.swagger; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.Arrays; + +@Configuration +@EnableSwagger2 +public class SwaggerConfigurations { + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("br.com.hackathonfc.park")) + .paths(PathSelectors.ant("/**")) + .build() + .globalOperationParameters(Arrays.asList( + new ParameterBuilder() + .name("Authorization") + .description("Header para token JWT") + .modelRef(new ModelRef("string")) + .parameterType("header") + .required(false) + .build() + )); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/controller/AuthController.java b/src/main/java/br/com/hackathonfc/park/controller/AuthController.java new file mode 100644 index 0000000..6296977 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/controller/AuthController.java @@ -0,0 +1,37 @@ +package br.com.hackathonfc.park.controller; + +import br.com.hackathonfc.park.dto.EmailDTO; +import br.com.hackathonfc.park.model.User; +import br.com.hackathonfc.park.service.AuthService; +import br.com.hackathonfc.park.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; + +@RestController +@RequestMapping("/auth") +public class AuthController { + + @Autowired + private TokenService tokenService; + + @Autowired + private AuthService authService; + + @PostMapping("/refresh_token") + public ResponseEntity refreshToken(HttpServletResponse httpServletResponse){ + return tokenService.refreshToken(httpServletResponse); + } + + @PostMapping("/forgot") + public ResponseEntity forgot(@RequestBody EmailDTO emailDTO){ + return authService.sendNewPassword(emailDTO.getEmail()); + } + + +} diff --git a/src/main/java/br/com/hackathonfc/park/controller/CadastroController.java b/src/main/java/br/com/hackathonfc/park/controller/CadastroController.java new file mode 100644 index 0000000..779a584 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/controller/CadastroController.java @@ -0,0 +1,20 @@ +package br.com.hackathonfc.park.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +@RestController +public class CadastroController +{ + + @RequestMapping("/cadastro") + public ModelAndView cadastro(){ + return new ModelAndView("cadastro"); + } + + @RequestMapping("/gerenciar") + public ModelAndView gerenciar(){ + return new ModelAndView("gerenciar"); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/controller/EstacionamentoController.java b/src/main/java/br/com/hackathonfc/park/controller/EstacionamentoController.java new file mode 100644 index 0000000..1c01b9d --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/controller/EstacionamentoController.java @@ -0,0 +1,83 @@ +package br.com.hackathonfc.park.controller; + +import java.util.List; + +import javax.validation.Valid; + +import br.com.hackathonfc.park.bo.EstacionamentoBO; +import br.com.hackathonfc.park.dto.VagaDTOSemEstacionamento; +import br.com.hackathonfc.park.exception.CnpjFound; +import br.com.hackathonfc.park.exception.EstacionamentoNotFound; +import br.com.hackathonfc.park.exception.NomeFound; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +<<<<<<< HEAD +import org.springframework.web.util.UriComponentsBuilder; +======= +>>>>>>> 1c4b3e9a796b48bc8009019578bab236cfdaedb5 + +import br.com.hackathonfc.park.dto.VagaDTO; +import br.com.hackathonfc.park.dto.EstacionamentoDTO; +import br.com.hackathonfc.park.model.Estacionamento; + +@RestController +@RequestMapping("/estacionamentos") +public class EstacionamentoController { + + @Autowired +<<<<<<< HEAD + private VagaRepository vagaRepository; + + + @CrossOrigin +======= + private EstacionamentoBO estacionamentoBO; + + @GetMapping("/{id}") + public EstacionamentoDTO detalhar(@PathVariable Long id) throws EstacionamentoNotFound { + return estacionamentoBO.detalharEstacionamento(id); + } + +>>>>>>> 1c4b3e9a796b48bc8009019578bab236cfdaedb5 + @GetMapping + public Page listar(@PageableDefault(sort = "id", direction = Direction.ASC, page = 0, size = 10) Pageable paginacao){ + return estacionamentoBO.listarEstacionamentos(paginacao); + } + + @PostMapping + public ResponseEntity cadastrar(@RequestBody @Valid EstacionamentoDTO estacionamentoDTO) throws NomeFound, CnpjFound { + return estacionamentoBO.cadastrar(estacionamentoDTO); + } + + @PutMapping("/{id}") + public ResponseEntity atualizar(@PathVariable Long id, @RequestBody @Valid EstacionamentoDTO estacionamentoDTO) throws EstacionamentoNotFound { + return estacionamentoBO.atualizar(id, estacionamentoDTO); + } + + @PreAuthorize("hasAnyRole('ADMIN')") + @DeleteMapping("/{id}") + public ResponseEntity remover(@PathVariable Long id) throws EstacionamentoNotFound { + return estacionamentoBO.deletar(id); + } +<<<<<<< HEAD + + +======= + +>>>>>>> 1c4b3e9a796b48bc8009019578bab236cfdaedb5 +} diff --git a/src/main/java/br/com/hackathonfc/park/controller/UserController.java b/src/main/java/br/com/hackathonfc/park/controller/UserController.java new file mode 100644 index 0000000..83d6699 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/controller/UserController.java @@ -0,0 +1,42 @@ +package br.com.hackathonfc.park.controller; + +import br.com.hackathonfc.park.dto.UserDTO; +import br.com.hackathonfc.park.exception.PasswordNotValid; +import br.com.hackathonfc.park.exception.UsernameNotValid; +import br.com.hackathonfc.park.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + @PostMapping + public ResponseEntity register(@RequestBody @Valid UserDTO userDTO) throws UsernameNotValid, PasswordNotValid { + return userService.cadastrar(userDTO); + } + + @GetMapping("/{id}") + public UserDTO detalhar(@PathVariable Long id){ + return userService.detalhar(id); + } + + @PutMapping("/{id}") + public ResponseEntity atualizar(@PathVariable Long id, @RequestBody UserDTO userDTO){ + return userService.atualizar(id, userDTO); + } + + @PreAuthorize("hasAnyRole('ADMIN')") + @DeleteMapping("/{id}") + public ResponseEntity deletar(@PathVariable Long id){ + return userService.remover(id); + } + +} diff --git a/src/main/java/br/com/hackathonfc/park/controller/VagaController.java b/src/main/java/br/com/hackathonfc/park/controller/VagaController.java new file mode 100644 index 0000000..b9a4f0e --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/controller/VagaController.java @@ -0,0 +1,68 @@ +package br.com.hackathonfc.park.controller; + +import java.util.List; +import java.util.Optional; + +import javax.validation.Valid; + +import br.com.hackathonfc.park.bo.VagaBO; +import br.com.hackathonfc.park.dto.VagaDTO; +import br.com.hackathonfc.park.dto.VagaDTOSemEstacionamento; +import br.com.hackathonfc.park.exception.EstacionamentoNotFound; +import br.com.hackathonfc.park.exception.PlacaFound; +import br.com.hackathonfc.park.exception.VagaNotFound; +import br.com.hackathonfc.park.exception.VeiculoNotFound; +import br.com.hackathonfc.park.mapper.VeiculoMAP; +import br.com.hackathonfc.park.model.Vaga; +import br.com.hackathonfc.park.service.VeiculoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.util.UriComponentsBuilder; + +import br.com.hackathonfc.park.dto.VeiculoDTO; +import br.com.hackathonfc.park.model.Veiculo; +import br.com.hackathonfc.park.repository.VagaRepository; +import br.com.hackathonfc.park.repository.VeiculoRepository; + +@RestController +@RequestMapping("/estacionamentos") +public class VagaController { + + @Autowired + private VagaBO vagaBO; + + @GetMapping("/{id}/vagas/{id2}") + public VagaDTO detalharVaga(@PathVariable Long id2) throws VagaNotFound{ + return vagaBO.detalharVaga(id2); + } + + @GetMapping("/{id}/vagas") + public List listarVagas(@PathVariable Long id) throws EstacionamentoNotFound { + return vagaBO.listarVagas(id); + } + + @PostMapping("/{id}/vagas") + public ResponseEntity cadastrarVaga(@RequestBody @Valid VagaDTO vagaDTO, @PathVariable Long id){ + return vagaBO.cadastrarVaga(vagaDTO, id); + } + + @PutMapping("/{id}/vagas/{id2}") + public ResponseEntity atualizarVaga(@PathVariable Long id2, @RequestBody @Valid VagaDTO vagaDTO) throws VagaNotFound, VeiculoNotFound { + return vagaBO.atualizarVaga(id2, vagaDTO); + } + + @DeleteMapping("/{id}/vagas/{id2}") + public ResponseEntity removerVaga(@PathVariable Long id2) throws VeiculoNotFound, VagaNotFound { + return vagaBO.removerVaga(id2); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/controller/VeiculoController.java b/src/main/java/br/com/hackathonfc/park/controller/VeiculoController.java new file mode 100644 index 0000000..e316e31 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/controller/VeiculoController.java @@ -0,0 +1,53 @@ +package br.com.hackathonfc.park.controller; + +import br.com.hackathonfc.park.dto.VeiculoDTO; +import br.com.hackathonfc.park.exception.*; +import br.com.hackathonfc.park.model.Veiculo; +import br.com.hackathonfc.park.service.VeiculoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/estacionamentos") +public class VeiculoController { + + @Autowired + private VeiculoService veiculoService; + + @GetMapping("/{id}/veiculos") + public List listarVeiculos(@PathVariable Long id) throws EstacionamentoNotFound { + return veiculoService.listarVeiculosDoEstacionamento(id); + } + + @GetMapping("/{id}/veiculos/todos") + public List listarTodosOsVeiculos() throws EstacionamentoNotFound { + return veiculoService.listarTodosOsVeiculos(); + } + + @GetMapping("/{id}/veiculos/{id2}") + public List listarVeiculosDeUmaVaga(@PathVariable Long id2) { + return veiculoService.listarVeiculosDeUmaVaga(id2); + } + + @PostMapping("/{id}/veiculos") + public ResponseEntity cadastrarVeiculo(@RequestBody @Valid VeiculoDTO veiculoDTO) throws PlacaFound, UnmatchedType, VagaNotFound { + return veiculoService.cadastrarVeiculo(veiculoDTO); + } + + @PutMapping("/{id}/veiculos/{id2}") + @Transactional + public ResponseEntity atualizarVeiculo(@PathVariable Long id2, @RequestBody @Valid VeiculoDTO veiculoDTO) throws VeiculoNotFound, VagaNotFound { + return veiculoService.atualizarVeiculo(id2, veiculoDTO); + } + + @DeleteMapping("/{id}/veiculos/{id2}") + @Transactional + public ResponseEntity removerVeiculo(@PathVariable Long id2) throws VeiculoNotFound, VagaNotFound { + return veiculoService.removerVeiculo(id2); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/dto/EmailDTO.java b/src/main/java/br/com/hackathonfc/park/dto/EmailDTO.java new file mode 100644 index 0000000..fd3f0fb --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/dto/EmailDTO.java @@ -0,0 +1,12 @@ +package br.com.hackathonfc.park.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class EmailDTO { + + private String email; + +} diff --git a/src/main/java/br/com/hackathonfc/park/dto/EstacionamentoDTO.java b/src/main/java/br/com/hackathonfc/park/dto/EstacionamentoDTO.java new file mode 100644 index 0000000..1a7451a --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/dto/EstacionamentoDTO.java @@ -0,0 +1,55 @@ +package br.com.hackathonfc.park.dto; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import br.com.hackathonfc.park.model.Estacionamento; +import br.com.hackathonfc.park.model.User; +import br.com.hackathonfc.park.repository.EstacionamentoRepository; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EstacionamentoDTO { + + private Long id; + + @NotEmpty + private String nome; + + @NotNull + private String cnpj; + + @NotEmpty + private String endereco; + + @NotNull + private int telefone; + + @NotNull + private int vagasCarros; + + @NotNull + private int vagasMotos; + + @NotNull + private Double precoHora; + + @NotNull + private Long userId; + + public EstacionamentoDTO(Estacionamento estacionamento, User user) { + this.id = estacionamento.getId(); + this.nome = estacionamento.getNome(); + this.cnpj = estacionamento.getCnpj(); + this.endereco = estacionamento.getEndereco(); + this.telefone = estacionamento.getTelefone(); + this.vagasCarros = estacionamento.getVagasCarros(); + this.vagasMotos = estacionamento.getVagasMotos(); + this.precoHora = estacionamento.getPrecoHora(); + this.userId = user.getId(); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/dto/TokenDTO.java b/src/main/java/br/com/hackathonfc/park/dto/TokenDTO.java new file mode 100644 index 0000000..e55337c --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/dto/TokenDTO.java @@ -0,0 +1,13 @@ +package br.com.hackathonfc.park.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class TokenDTO { + + private String token; + + private String type; +} diff --git a/src/main/java/br/com/hackathonfc/park/dto/UserDTO.java b/src/main/java/br/com/hackathonfc/park/dto/UserDTO.java new file mode 100644 index 0000000..4245997 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/dto/UserDTO.java @@ -0,0 +1,28 @@ +package br.com.hackathonfc.park.dto; + +import br.com.hackathonfc.park.model.User; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserDTO { + + private Long id; + + @NotEmpty + private String email; + + @NotEmpty + private String password; + + public UserDTO(User user) { + this.id = user.getId(); + this.email = user.getEmail(); + this.password = user.getPassword(); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/dto/VagaDTO.java b/src/main/java/br/com/hackathonfc/park/dto/VagaDTO.java new file mode 100644 index 0000000..a890c8d --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/dto/VagaDTO.java @@ -0,0 +1,34 @@ +package br.com.hackathonfc.park.dto; + +import br.com.hackathonfc.park.enums.TipoVaga; +import br.com.hackathonfc.park.model.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Id; +import javax.validation.constraints.NotNull; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class VagaDTO { + + @Id + private Long id; + + @NotNull + private boolean livre; + + private Long veiculo_id; + + @NotNull + private TipoVaga tipoVaga; + + public VagaDTO(Vaga vaga) { + this.id = vaga.getId(); + this.livre = vaga.isLivre(); + this.veiculo_id = vaga.getVeiculo().getId(); + this.tipoVaga = vaga.getTipoVaga(); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/dto/VagaDTOSemEstacionamento.java b/src/main/java/br/com/hackathonfc/park/dto/VagaDTOSemEstacionamento.java new file mode 100644 index 0000000..01f5e87 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/dto/VagaDTOSemEstacionamento.java @@ -0,0 +1,23 @@ +package br.com.hackathonfc.park.dto; + +import br.com.hackathonfc.park.enums.TipoVaga; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Id; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class VagaDTOSemEstacionamento { + + @Id + private Long id; + + private boolean livre; + + private Long veiculo_id; + + private TipoVaga tipoVaga; +} diff --git a/src/main/java/br/com/hackathonfc/park/dto/VeiculoDTO.java b/src/main/java/br/com/hackathonfc/park/dto/VeiculoDTO.java new file mode 100644 index 0000000..10aa94d --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/dto/VeiculoDTO.java @@ -0,0 +1,48 @@ +package br.com.hackathonfc.park.dto; + +import br.com.hackathonfc.park.enums.TipoVeiculo; +import br.com.hackathonfc.park.model.Veiculo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Id; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class VeiculoDTO { + + @Id + private Long id; + + @NotEmpty + private String marca; + + @NotEmpty + private String modelo; + + @NotEmpty + private String cor; + + @NotEmpty + private String placa; + + @NotNull + private TipoVeiculo tipoVeiculo; + + @NotNull + private Long vagaId; + + public VeiculoDTO(Veiculo veiculo) { + this.id = veiculo.getId(); + this.marca = veiculo.getMarca(); + this.modelo = veiculo.getModelo(); + this.cor = veiculo.getCor(); + this.placa = veiculo.getPlaca(); + this.tipoVeiculo = veiculo.getTipoVeiculo(); + this.vagaId = veiculo.getVaga().getId(); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/enums/TipoVaga.java b/src/main/java/br/com/hackathonfc/park/enums/TipoVaga.java new file mode 100644 index 0000000..879553c --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/enums/TipoVaga.java @@ -0,0 +1,8 @@ +package br.com.hackathonfc.park.enums; + +public enum TipoVaga { + + MOTO, + CARRO; + +} diff --git a/src/main/java/br/com/hackathonfc/park/enums/TipoVeiculo.java b/src/main/java/br/com/hackathonfc/park/enums/TipoVeiculo.java new file mode 100644 index 0000000..af58cdc --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/enums/TipoVeiculo.java @@ -0,0 +1,8 @@ +package br.com.hackathonfc.park.enums; + +public enum TipoVeiculo { + + MOTO, + CARRO; + +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/CnpjFound.java b/src/main/java/br/com/hackathonfc/park/exception/CnpjFound.java new file mode 100644 index 0000000..9c38104 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/CnpjFound.java @@ -0,0 +1,8 @@ +package br.com.hackathonfc.park.exception; + +public class CnpjFound extends Exception { + @Override + public String getMessage() { + return "Cnpj já cadastrado no sistema!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/EstacionamentoNotFound.java b/src/main/java/br/com/hackathonfc/park/exception/EstacionamentoNotFound.java new file mode 100644 index 0000000..2d4e439 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/EstacionamentoNotFound.java @@ -0,0 +1,11 @@ +package br.com.hackathonfc.park.exception; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class EstacionamentoNotFound extends Exception { + @Override + public String getMessage() { + return "Estacionamento não encontrado no sistema!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/GlobalExceptionHandler.java b/src/main/java/br/com/hackathonfc/park/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..e23c411 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/GlobalExceptionHandler.java @@ -0,0 +1,153 @@ +package br.com.hackathonfc.park.exception; + +import br.com.hackathonfc.park.util.ApiError; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.lang.Nullable; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.util.WebUtils; + +@ControllerAdvice +public class GlobalExceptionHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + @ExceptionHandler({ + CnpjFound.class, + EstacionamentoNotFound.class, + NomeFound.class, + PlacaFound.class, + VeiculoNotFound.class, + VagaNotFound.class, + UnmatchedType.class, + PasswordNotValid.class, + UsernameNotValid.class + }) + + @Nullable + public final ResponseEntity handleException(Exception ex, WebRequest request) { + HttpHeaders headers = new HttpHeaders(); + + LOGGER.error("Lidando com " + ex.getClass().getSimpleName() + " por causa de " + ex.getMessage()); + + if (ex instanceof CnpjFound) { + HttpStatus status = HttpStatus.CONFLICT; + CnpjFound pnve = (CnpjFound) ex; + return handleCnpjFound(pnve, headers, status, request); + + } else if (ex instanceof EstacionamentoNotFound) { + HttpStatus status = HttpStatus.CONFLICT; + EstacionamentoNotFound anve = (EstacionamentoNotFound) ex; + return handleEstacionamentoNotFound(anve, headers, status, request); + + } else if (ex instanceof NomeFound) { + HttpStatus status = HttpStatus.CONFLICT; + NomeFound efe = (NomeFound) ex; + return handleNomeFound(efe, headers, status, request); + + } else if (ex instanceof PlacaFound) { + HttpStatus status = HttpStatus.CONFLICT; + PlacaFound cpffe = (PlacaFound) ex; + return handlePlacaFound(cpffe, headers, status, request); + + }else if (ex instanceof VeiculoNotFound) { + HttpStatus status = HttpStatus.CONFLICT; + VeiculoNotFound cnpjfe = (VeiculoNotFound) ex; + return handleVeiculoNotFound(cnpjfe, headers, status, request); + + } else if (ex instanceof VagaNotFound){ + HttpStatus status = HttpStatus.CONFLICT; + VagaNotFound cnpjfe = (VagaNotFound) ex; + return handleVagaNotFound(cnpjfe, headers, status, request); + } + else if (ex instanceof UnmatchedType){ + HttpStatus status = HttpStatus.CONFLICT; + UnmatchedType cnpjfe = (UnmatchedType) ex; + return handleUnmatchedType(cnpjfe, headers, status, request); + } + else if (ex instanceof PasswordNotValid){ + HttpStatus status = HttpStatus.CONFLICT; + PasswordNotValid cnpjfe = (PasswordNotValid) ex; + return handlePasswordNotValid(cnpjfe, headers, status, request); + } + else if (ex instanceof UsernameNotValid){ + HttpStatus status = HttpStatus.CONFLICT; + UsernameNotValid cnpjfe = (UsernameNotValid) ex; + return handleUsernameNotValid(cnpjfe, headers, status, request); + } + else { + if (LOGGER.isWarnEnabled()) { + LOGGER.warn("Exceção desconhecida: " + ex.getClass().getName()); + } + HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR; + return handleExceptionInternal(ex, null, headers, status, request); + } + } + + private ResponseEntity handlePasswordNotValid(PasswordNotValid ex, HttpHeaders headers, HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + private ResponseEntity handleUsernameNotValid(UsernameNotValid ex, HttpHeaders headers, HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + protected final ResponseEntity handleCnpjFound(CnpjFound ex, HttpHeaders headers, + HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + protected final ResponseEntity handleUnmatchedType(UnmatchedType ex, HttpHeaders headers, + HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + protected final ResponseEntity handleEstacionamentoNotFound(EstacionamentoNotFound ex, HttpHeaders headers, + HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + protected final ResponseEntity handleNomeFound(NomeFound ex, HttpHeaders headers, + HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + protected final ResponseEntity handlePlacaFound(PlacaFound ex, HttpHeaders headers, + HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + protected final ResponseEntity handleVeiculoNotFound(VeiculoNotFound ex, HttpHeaders headers, + HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + protected final ResponseEntity handleVagaNotFound(VagaNotFound ex, HttpHeaders headers, + HttpStatus status, WebRequest request) { + String error = ex.getMessage(); + return handleExceptionInternal(ex, new ApiError(error), headers, status, request); + } + + protected ResponseEntity handleExceptionInternal(Exception ex, @Nullable ApiError body, + HttpHeaders headers, HttpStatus status, + WebRequest request) { + if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) { + request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST); + } + + return new ResponseEntity<>(body, headers, status); + } + +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/NomeFound.java b/src/main/java/br/com/hackathonfc/park/exception/NomeFound.java new file mode 100644 index 0000000..c39dd31 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/NomeFound.java @@ -0,0 +1,11 @@ +package br.com.hackathonfc.park.exception; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NomeFound extends Exception{ + @Override + public String getMessage() { + return "Nome já cadastrado no sistema!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/PasswordNotValid.java b/src/main/java/br/com/hackathonfc/park/exception/PasswordNotValid.java new file mode 100644 index 0000000..fd19a0f --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/PasswordNotValid.java @@ -0,0 +1,12 @@ +package br.com.hackathonfc.park.exception; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class PasswordNotValid extends Exception{ + + @Override + public String getMessage() { + return "Senha de usuário inválida!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/PlacaFound.java b/src/main/java/br/com/hackathonfc/park/exception/PlacaFound.java new file mode 100644 index 0000000..bae9ac8 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/PlacaFound.java @@ -0,0 +1,11 @@ +package br.com.hackathonfc.park.exception; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class PlacaFound extends Exception{ + @Override + public String getMessage() { + return "Placa já cadastrada no sistema!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/UnmatchedType.java b/src/main/java/br/com/hackathonfc/park/exception/UnmatchedType.java new file mode 100644 index 0000000..48fc8ed --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/UnmatchedType.java @@ -0,0 +1,11 @@ +package br.com.hackathonfc.park.exception; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class UnmatchedType extends Exception{ + @Override + public String getMessage() { + return "Este veículo não pode estacionar nesta vaga!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/UsernameNotValid.java b/src/main/java/br/com/hackathonfc/park/exception/UsernameNotValid.java new file mode 100644 index 0000000..d49a9a3 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/UsernameNotValid.java @@ -0,0 +1,9 @@ +package br.com.hackathonfc.park.exception; + +public class UsernameNotValid extends Exception { + + @Override + public String getMessage() { + return "Nome de usuário inválido!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/VagaNotFound.java b/src/main/java/br/com/hackathonfc/park/exception/VagaNotFound.java new file mode 100644 index 0000000..52aaaa3 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/VagaNotFound.java @@ -0,0 +1,8 @@ +package br.com.hackathonfc.park.exception; + +public class VagaNotFound extends Exception { + @Override + public String getMessage() { + return "Vaga não encontrada no sistema!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/exception/VeiculoNotFound.java b/src/main/java/br/com/hackathonfc/park/exception/VeiculoNotFound.java new file mode 100644 index 0000000..7da1a2e --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/exception/VeiculoNotFound.java @@ -0,0 +1,11 @@ +package br.com.hackathonfc.park.exception; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class VeiculoNotFound extends Exception{ + @Override + public String getMessage() { + return "Veículo não encontrado no sistema!"; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/mapper/EstacionamentoMAP.java b/src/main/java/br/com/hackathonfc/park/mapper/EstacionamentoMAP.java new file mode 100644 index 0000000..7c032dd --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/mapper/EstacionamentoMAP.java @@ -0,0 +1,39 @@ +package br.com.hackathonfc.park.mapper; + +import br.com.hackathonfc.park.dto.EstacionamentoDTO; +import br.com.hackathonfc.park.model.Estacionamento; +import br.com.hackathonfc.park.model.User; +import br.com.hackathonfc.park.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class EstacionamentoMAP { + + @Autowired + private static UserRepository userRepository; + + public static List fromDTO(List estacionamentos){ + return estacionamentos.stream().map(e -> { + return new Estacionamento(e, userRepository.findById(e.getUserId()).get()); + }).collect(Collectors.toList()); + } + + public static Estacionamento fromDTO(EstacionamentoDTO estacionamentoDTO){ + return new Estacionamento(estacionamentoDTO, userRepository.findById(estacionamentoDTO.getUserId()).get()); + } + + public static List toDTO(Page estacionamentos){ + return estacionamentos.stream().map(e -> { + return new EstacionamentoDTO(e, e.getUser()); + }).collect(Collectors.toList()); + } + + public static EstacionamentoDTO toDTO(Estacionamento estacionamento) { + return new EstacionamentoDTO(estacionamento, estacionamento.getUser()); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/mapper/UserMAP.java b/src/main/java/br/com/hackathonfc/park/mapper/UserMAP.java new file mode 100644 index 0000000..7dc6239 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/mapper/UserMAP.java @@ -0,0 +1,17 @@ +package br.com.hackathonfc.park.mapper; + +import br.com.hackathonfc.park.dto.UserDTO; +import br.com.hackathonfc.park.model.User; +import org.springframework.stereotype.Component; + +@Component +public class UserMAP { + + public User fromDTO(UserDTO userDTO){ + return new User(userDTO); + } + + public UserDTO toDTO(User user) { + return new UserDTO(user); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/mapper/VagaMAP.java b/src/main/java/br/com/hackathonfc/park/mapper/VagaMAP.java new file mode 100644 index 0000000..fb250a7 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/mapper/VagaMAP.java @@ -0,0 +1,53 @@ +package br.com.hackathonfc.park.mapper; + +import br.com.hackathonfc.park.dto.VagaDTO; +import br.com.hackathonfc.park.dto.VagaDTOSemEstacionamento; +import br.com.hackathonfc.park.model.Estacionamento; +import br.com.hackathonfc.park.model.Vaga; +import br.com.hackathonfc.park.model.Veiculo; +import br.com.hackathonfc.park.repository.EstacionamentoRepository; +import br.com.hackathonfc.park.repository.VeiculoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class VagaMAP { + + @Autowired + private static VeiculoRepository veiculoRepository; + + public static Vaga fromDTO(VagaDTO vagaDTO, Estacionamento estacionamento, Veiculo veiculo){ + return new Vaga(vagaDTO, veiculo, estacionamento); + } + + public static List toDTO(List vagas){ + return vagas.stream().map(v -> { + return new VagaDTO(v); + }).collect(Collectors.toList()); + } + + public static VagaDTO toDTO(Vaga vaga){ + try { + return new VagaDTO(vaga); + } + catch(Exception e){ + return new VagaDTO(vaga.getId(), vaga.isLivre(), null, vaga.getTipoVaga()); + } + } + + public static List toDTOSemEstacionamento(List vagas){ + return vagas.stream().map(v -> { + Long id; + if (v.getVeiculo() == null){ + id = null; + } else { + id = v.getVeiculo().getId(); + } + + return new VagaDTOSemEstacionamento(v.getId(), v.isLivre(), id, v.getTipoVaga()); + }).collect(Collectors.toList()); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/mapper/VeiculoMAP.java b/src/main/java/br/com/hackathonfc/park/mapper/VeiculoMAP.java new file mode 100644 index 0000000..4be0767 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/mapper/VeiculoMAP.java @@ -0,0 +1,34 @@ +package br.com.hackathonfc.park.mapper; + +import br.com.hackathonfc.park.dto.VeiculoDTO; +import br.com.hackathonfc.park.model.Vaga; +import br.com.hackathonfc.park.model.Veiculo; +import br.com.hackathonfc.park.repository.VagaRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class VeiculoMAP { + + @Autowired + private static VagaRepository vagaRepository; + + public static List toDTO(List veiculos) { + return veiculos.stream().map(VeiculoDTO::new).collect(Collectors.toList()); + } + + public static VeiculoDTO toDTO(Veiculo veiculo){ + return new VeiculoDTO(veiculo); + } + + public static List fromDTO(List veiculos){ + return veiculos.stream().map(v -> {return new Veiculo(v, vagaRepository.findById(v.getVagaId()).get());} ).collect(Collectors.toList()); + } + + public static Veiculo fromDTO(VeiculoDTO veiculoDTO, Vaga vaga){ + return new Veiculo(veiculoDTO, vaga); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/model/Estacionamento.java b/src/main/java/br/com/hackathonfc/park/model/Estacionamento.java new file mode 100644 index 0000000..0bcb14b --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/model/Estacionamento.java @@ -0,0 +1,64 @@ +package br.com.hackathonfc.park.model; + +import br.com.hackathonfc.park.dto.EstacionamentoDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.*; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Estacionamento { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nome; + + private String cnpj; + + private String endereco; + + private int telefone; + + private int vagasMotos; + + private int vagasCarros; + + private Double precoHora; + + @ManyToOne + private User user; + + @OneToMany(mappedBy = "estacionamento", cascade = CascadeType.REMOVE, orphanRemoval = true) + private List vagas = new ArrayList<>(); + + public Estacionamento(EstacionamentoDTO estacionamentoDTO, User user) { + this.nome = estacionamentoDTO.getNome(); + this.cnpj = estacionamentoDTO.getCnpj(); + this.endereco = estacionamentoDTO.getEndereco(); + this.telefone = estacionamentoDTO.getTelefone(); + this.vagasCarros = estacionamentoDTO.getVagasCarros(); + this.vagasMotos = estacionamentoDTO.getVagasMotos(); + this.precoHora = estacionamentoDTO.getPrecoHora(); + this.user = user; + } + + public Estacionamento(String s, String s1, String s2, int i, int i1, int i2, double v, User user) { + this.nome = s; + this.cnpj = s1; + this.endereco = s2; + this.telefone = i; + this.vagasMotos = i1; + this.vagasCarros = i2; + this.precoHora = v; + this.user = user; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/model/Perfil.java b/src/main/java/br/com/hackathonfc/park/model/Perfil.java new file mode 100644 index 0000000..aa89cd3 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/model/Perfil.java @@ -0,0 +1,30 @@ +package br.com.hackathonfc.park.model; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +@NoArgsConstructor +@Data +public class Perfil implements GrantedAuthority { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @Override + public String getAuthority() { + return name; + } + + public Perfil(String name){ + this.name = name; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/model/User.java b/src/main/java/br/com/hackathonfc/park/model/User.java new file mode 100644 index 0000000..cc80ebf --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/model/User.java @@ -0,0 +1,91 @@ +package br.com.hackathonfc.park.model; + +import br.com.hackathonfc.park.dto.UserDTO; +import lombok.*; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import javax.persistence.*; +import java.util.*; + +@Data +@Entity +@NoArgsConstructor +public class User implements UserDetails { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String email; + + private String password; + + @ManyToMany + private List perfis = new ArrayList<>(); + + @OneToMany(mappedBy = "user") + private List estacionamentos = Arrays.asList(); + + public User(UserDTO userDTO) { + this.id = userDTO.getId(); + this.email = userDTO.getEmail(); + this.password = userDTO.getPassword(); + } + + public User(String email, String password, List perfis) { + this.email = email; + this.password = password; + this.perfis = perfis; + } + + public User(String email, String password) { + this.email = email; + this.password = password; + } + + public User(String email, String password, Perfil perfil){ + this.email = email; + this.password = password; + this.perfis.add(perfil); + } + + @Override + public Collection getAuthorities() { + return this.perfis; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getUsername() { + return email; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + public boolean hasRole(Perfil perfil){ + return getAuthorities().contains(perfil); + } + +} diff --git a/src/main/java/br/com/hackathonfc/park/model/Vaga.java b/src/main/java/br/com/hackathonfc/park/model/Vaga.java new file mode 100644 index 0000000..5f9463f --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/model/Vaga.java @@ -0,0 +1,51 @@ +package br.com.hackathonfc.park.model; + +import br.com.hackathonfc.park.dto.VagaDTO; +import br.com.hackathonfc.park.enums.TipoVaga; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Vaga { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private boolean livre = true; + + @Enumerated(EnumType.STRING) + private TipoVaga tipoVaga = TipoVaga.CARRO; + + @ManyToOne + private Estacionamento estacionamento; + + @OneToOne(mappedBy = "vaga", cascade = {CascadeType.REMOVE, CascadeType.REFRESH}, orphanRemoval = true) + private Veiculo veiculo; + + public Vaga(VagaDTO vagaDTO, Veiculo veiculo, Estacionamento estacionamento) { + this.veiculo = veiculo; + this.livre = vagaDTO.isLivre(); + this.estacionamento = estacionamento; + this.tipoVaga = vagaDTO.getTipoVaga(); + } + + public Vaga(Estacionamento estacionamento, TipoVaga tipoVaga){ + this.veiculo = null; + this.livre = true; + this.estacionamento = estacionamento; + this.tipoVaga = tipoVaga; + } + + public Vaga(Estacionamento estacionamento, Boolean livre, TipoVaga tipoVaga, Veiculo veiculo){ + this.estacionamento = estacionamento; + this.livre = livre; + this.tipoVaga = tipoVaga; + this.veiculo = veiculo; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/model/Veiculo.java b/src/main/java/br/com/hackathonfc/park/model/Veiculo.java new file mode 100644 index 0000000..68035fd --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/model/Veiculo.java @@ -0,0 +1,53 @@ +package br.com.hackathonfc.park.model; + +import br.com.hackathonfc.park.dto.VeiculoDTO; +import br.com.hackathonfc.park.enums.TipoVeiculo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Veiculo { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String marca; + + private String modelo; + + private String cor; + + private String placa; + + @Enumerated(EnumType.STRING) + private TipoVeiculo tipoVeiculo = TipoVeiculo.MOTO; + + @OneToOne + private Vaga vaga; + + public Veiculo(VeiculoDTO veiculoDTO, Vaga vaga){ + this.id = veiculoDTO.getId(); + this.marca = veiculoDTO.getMarca(); + this.modelo = veiculoDTO.getModelo(); + this.cor = veiculoDTO.getCor(); + this.placa = veiculoDTO.getPlaca(); + this.tipoVeiculo = veiculoDTO.getTipoVeiculo(); + this.vaga = vaga; + } + + public Veiculo(String marca, String modelo, String cor, String placa, TipoVeiculo tipoVeiculo, Vaga vaga){ + this.marca = marca; + this.modelo = modelo; + this.cor = cor; + this.placa = placa; + this.tipoVeiculo = tipoVeiculo; + this.vaga = vaga; + } +} diff --git a/src/main/java/br/com/hackathonfc/park/repository/EstacionamentoRepository.java b/src/main/java/br/com/hackathonfc/park/repository/EstacionamentoRepository.java new file mode 100644 index 0000000..5fe2cde --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/repository/EstacionamentoRepository.java @@ -0,0 +1,18 @@ +package br.com.hackathonfc.park.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + + + +import br.com.hackathonfc.park.model.Estacionamento; + +import java.util.Optional; + +public interface EstacionamentoRepository extends JpaRepository{ + + Estacionamento findById(long id); + + Optional findByCnpj(String cnpj); + + Optional findByNome(String nome); +} diff --git a/src/main/java/br/com/hackathonfc/park/repository/PerfilRepository.java b/src/main/java/br/com/hackathonfc/park/repository/PerfilRepository.java new file mode 100644 index 0000000..e5e7aa7 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/repository/PerfilRepository.java @@ -0,0 +1,7 @@ +package br.com.hackathonfc.park.repository; + +import br.com.hackathonfc.park.model.Perfil; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PerfilRepository extends JpaRepository { +} diff --git a/src/main/java/br/com/hackathonfc/park/repository/UserRepository.java b/src/main/java/br/com/hackathonfc/park/repository/UserRepository.java new file mode 100644 index 0000000..eaa8c38 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/repository/UserRepository.java @@ -0,0 +1,10 @@ +package br.com.hackathonfc.park.repository; + +import br.com.hackathonfc.park.model.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByEmail(String email); +} diff --git a/src/main/java/br/com/hackathonfc/park/repository/VagaRepository.java b/src/main/java/br/com/hackathonfc/park/repository/VagaRepository.java new file mode 100644 index 0000000..73cc9ca --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/repository/VagaRepository.java @@ -0,0 +1,15 @@ +package br.com.hackathonfc.park.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import br.com.hackathonfc.park.model.Vaga; +import br.com.hackathonfc.park.model.Veiculo; + +public interface VagaRepository extends JpaRepository { + @Query("SELECT v FROM Vaga v WHERE v.estacionamento.id = :id") + List findAllFromEstacionamento(@Param("id") Long id); +} diff --git a/src/main/java/br/com/hackathonfc/park/repository/VeiculoRepository.java b/src/main/java/br/com/hackathonfc/park/repository/VeiculoRepository.java new file mode 100644 index 0000000..a2d25a4 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/repository/VeiculoRepository.java @@ -0,0 +1,18 @@ +package br.com.hackathonfc.park.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import br.com.hackathonfc.park.model.Veiculo; + +public interface VeiculoRepository extends JpaRepository { + + @Query("SELECT v FROM Veiculo v WHERE v.vaga.id = :id") + List findByVagaId(@Param("id") Long id); + + Optional findByPlaca(String placa); +} diff --git a/src/main/java/br/com/hackathonfc/park/service/AuthService.java b/src/main/java/br/com/hackathonfc/park/service/AuthService.java new file mode 100644 index 0000000..c29d401 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/AuthService.java @@ -0,0 +1,60 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.model.User; +import br.com.hackathonfc.park.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.Random; + +@Service +public class AuthService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private BCryptPasswordEncoder bCryptPasswordEncoder; + + private Random random = new Random(); + + public ResponseEntitysendNewPassword(String email) throws UsernameNotFoundException { + Optional checkUser = userRepository.findByEmail(email); + + if (checkUser.isPresent()){ + User user = checkUser.get(); + String newPassword = newPassword(); + System.out.println(newPassword); + user.setPassword(bCryptPasswordEncoder.encode(newPassword)); + userRepository.save(user); + return ResponseEntity.ok(user); + } else { + throw new UsernameNotFoundException("No user found with email " + email); + } + } + + private String newPassword() { + char[] vet = new char[8]; + for (int i = 0; i< 8; i++){ + vet[i] = randomChar(); + } + return new String(vet); + } + + private char randomChar() { + int opt = random.nextInt(3); + + if (opt == 0){ + return (char) (random.nextInt(10) + 48); + } else if (opt == 1){ + return (char) (random.nextInt(26) + 65); + } else { + return (char) (random.nextInt(26) + 97); + } + } + +} diff --git a/src/main/java/br/com/hackathonfc/park/service/AuthenticationService.java b/src/main/java/br/com/hackathonfc/park/service/AuthenticationService.java new file mode 100644 index 0000000..25b4fd9 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/AuthenticationService.java @@ -0,0 +1,37 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.model.Perfil; +import br.com.hackathonfc.park.model.User; +import br.com.hackathonfc.park.repository.PerfilRepository; +import br.com.hackathonfc.park.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +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 java.util.List; +import java.util.Optional; + +@Service +public class AuthenticationService implements UserDetailsService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private PerfilRepository perfilRepository; + + @Override + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + Optional checkUser= userRepository.findByEmail(email); + List perfis = perfilRepository.findAll(); + + if (checkUser.isPresent()) { + User user = checkUser.get(); + return new User(user.getEmail(), user.getPassword(), perfis); + } + + throw new UsernameNotFoundException("Dados inválidos!"); + } +} \ No newline at end of file diff --git a/src/main/java/br/com/hackathonfc/park/service/DbService.java b/src/main/java/br/com/hackathonfc/park/service/DbService.java new file mode 100644 index 0000000..dcc0af3 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/DbService.java @@ -0,0 +1,93 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.enums.TipoVaga; +import br.com.hackathonfc.park.enums.TipoVeiculo; +import br.com.hackathonfc.park.model.*; +import br.com.hackathonfc.park.repository.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DbService { + + @Autowired + private EstacionamentoRepository estacionamentoRepository; + + @Autowired + private VagaRepository vagaRepository; + + @Autowired + private VeiculoRepository veiculoRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private PerfilRepository perfilRepository; + + public void instantiateTestDatabase(){ + Perfil perfil1 = new Perfil("ROLE_ADMIN"); + Perfil perfil2 = new Perfil("ROLE_USER"); + + perfilRepository.save(perfil1); + perfilRepository.save(perfil2); + + Perfil perfilAdmin = perfilRepository.findById(perfil1.getId()).get(); + Perfil perfilUser = perfilRepository.findById(perfil2.getId()).get(); + + User user = new User("admin@gmail.com", encode("admin"), perfilAdmin); + User user1 = new User("user@gmail.com", encode("user"), perfilUser); + User user2 = new User("henrico@gmail.com", encode("user"), perfilUser); + + userRepository.save(user); + userRepository.save(user1); + userRepository.save(user2); + + Estacionamento estacionamento = new Estacionamento("Estacionamento 1", "1234556", "Rua Doutora Ana Costa, 505 - Aparecida, Santos/SP", 123456, 4, 4, 8.50, user); + Estacionamento estacionamento1 = new Estacionamento("Estacionamento 2", "1234556", "Rua Marechal Mallet, 403 - Embaré, Santos/SP", 123456, 8, 8, 7.80, user1); + Estacionamento estacionamento2 = new Estacionamento("Estacionamento 3", "1234556", "Rua Itapura, 306 - Mocca, São Paulo/SP", 123456, 5, 5, 9.50, user2); + + estacionamentoRepository.save(estacionamento); + estacionamentoRepository.save(estacionamento1); + estacionamentoRepository.save(estacionamento2); + + Vaga vaga = new Vaga(estacionamento, true, TipoVaga.CARRO, null); + Vaga vaga2 = new Vaga(estacionamento, true, TipoVaga.MOTO, null); + + Vaga vaga3 = new Vaga(estacionamento1, true, TipoVaga.CARRO, null); + Vaga vaga4 = new Vaga(estacionamento1, true, TipoVaga.MOTO, null); + + Vaga vaga5 = new Vaga(estacionamento2, true, TipoVaga.CARRO, null); + Vaga vaga6 = new Vaga(estacionamento2, true, TipoVaga.MOTO, null); + + vagaRepository.save(vaga); + vagaRepository.save(vaga2); + vagaRepository.save(vaga3); + vagaRepository.save(vaga4); + vagaRepository.save(vaga5); + vagaRepository.save(vaga6); + + Veiculo veiculo = new Veiculo("Ford", "Focus", "Preto", "XXXX-4444", TipoVeiculo.CARRO, vaga); + Veiculo veiculo2 = new Veiculo("BMW", "Tiger", "Preto", "XXXX-5555", TipoVeiculo.MOTO, vaga2); + + Veiculo veiculo3 = new Veiculo("Ford", "Mustang", "Preto", "FORD-4444", TipoVeiculo.CARRO, vaga3); + Veiculo veiculo4 = new Veiculo("BMW", "S1000RR", "Vermelho", "MALB-6666", TipoVeiculo.MOTO, vaga4); + + Veiculo veiculo5 = new Veiculo("Chevrolet", "Cruze", "Prata", "VVVV-6969", TipoVeiculo.CARRO, vaga5); + Veiculo veiculo6 = new Veiculo("Harley Davidson", "Fat Boy 2014", "Vermelho", "HARL-1882", TipoVeiculo.CARRO, vaga6); + + veiculoRepository.save(veiculo); + veiculoRepository.save(veiculo2); + veiculoRepository.save(veiculo3); + veiculoRepository.save(veiculo4); + veiculoRepository.save(veiculo5); + veiculoRepository.save(veiculo6); + } + + public String encode(String password){ + return new BCryptPasswordEncoder().encode(password); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/service/EstacionamentoService.java b/src/main/java/br/com/hackathonfc/park/service/EstacionamentoService.java new file mode 100644 index 0000000..bb12f18 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/EstacionamentoService.java @@ -0,0 +1,149 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.dto.EstacionamentoDTO; +import br.com.hackathonfc.park.exception.CnpjFound; +import br.com.hackathonfc.park.exception.EstacionamentoNotFound; +import br.com.hackathonfc.park.exception.NomeFound; +import br.com.hackathonfc.park.mapper.EstacionamentoMAP; +import br.com.hackathonfc.park.model.Estacionamento; +import br.com.hackathonfc.park.enums.TipoVaga; +import br.com.hackathonfc.park.model.Vaga; +import br.com.hackathonfc.park.repository.EstacionamentoRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +import static br.com.hackathonfc.park.enums.TipoVaga.*; +import static br.com.hackathonfc.park.enums.TipoVaga.MOTO; + +@Service +@Slf4j +public class EstacionamentoService { + + @Autowired + private EstacionamentoRepository estacionamentoRepository; + + @Autowired + private VagaService vagaService; + + private EstacionamentoMAP estacionamentoMAP = new EstacionamentoMAP(); + + public Page listar(Pageable paginacao){ + + List estacionamentos = estacionamentoMAP.toDTO(estacionamentoRepository.findAll(paginacao)); + + return new PageImpl(estacionamentos); + + } + + public ResponseEntity cadastrar(EstacionamentoDTO estacionamentoDTO) + throws CnpjFound, NomeFound { + + boolean isCnpjPresent = validateCnpj(estacionamentoDTO.getCnpj()); + boolean isNomePresent = validateNome(estacionamentoDTO.getNome()); + + if (isCnpjPresent){ + throw new CnpjFound(); + } else if(isNomePresent){ + throw new NomeFound(); + } + + try { + Estacionamento estacionamento = estacionamentoRepository.save(estacionamentoMAP.fromDTO(estacionamentoDTO)); + cadastrarVagas(estacionamentoDTO.getVagasMotos(), estacionamentoDTO.getVagasCarros(), estacionamento); + return ResponseEntity.ok(estacionamentoMAP.toDTO(estacionamento)); + } + catch (Exception e){ + log.error(e.toString()); + return ResponseEntity.badRequest().build(); + } + } + + public ResponseEntity atualizar(Long id, EstacionamentoDTO estacionamentoDTO) + throws EstacionamentoNotFound { + + Optional checkEstacionamento = estacionamentoRepository.findById(id); + + if (checkEstacionamento.isPresent()){ + Estacionamento estacionamento = estacionamentoRepository.getOne(id); + + estacionamento.setNome(estacionamentoDTO.getNome()); + estacionamento.setCnpj(estacionamentoDTO.getCnpj()); + estacionamento.setEndereco(estacionamentoDTO.getEndereco()); + estacionamento.setPrecoHora(estacionamentoDTO.getPrecoHora()); + estacionamento.setTelefone(estacionamentoDTO.getTelefone()); + estacionamento.setVagasCarros(estacionamentoDTO.getVagasCarros()); + estacionamento.setVagasMotos(estacionamentoDTO.getVagasMotos()); + + return ResponseEntity.ok(estacionamentoMAP.toDTO(estacionamentoRepository.save(estacionamento))); + } else{ + throw new EstacionamentoNotFound(); + } + + } + + public ResponseEntity deletar(Long id) + throws EstacionamentoNotFound { + + Optional checkEstacionamento = estacionamentoRepository.findById(id); + + if (checkEstacionamento.isPresent()) { + try{ + estacionamentoRepository.deleteById(id); + return ResponseEntity.ok().build(); + } + catch(Exception e){ + System.out.println(e); + } + } else { + throw new EstacionamentoNotFound(); + } + + return ResponseEntity.notFound().build(); + } + + public EstacionamentoDTO detalhar(Long id) throws EstacionamentoNotFound{ + Optional estacionamento = estacionamentoRepository.findById(id); + if(estacionamento.isPresent()) + return estacionamentoMAP.toDTO(estacionamento.get()); + else + throw new EstacionamentoNotFound(); + } + + public Optional retornarEstacionamento(Long id) throws EstacionamentoNotFound { + Optional estacionamento = estacionamentoRepository.findById(id); + + if (estacionamento.isPresent()) + return estacionamento; + else + throw new EstacionamentoNotFound(); + } + + public boolean validateCnpj(String cnpj){ + return estacionamentoRepository.findByCnpj(cnpj).isPresent(); + } + + private boolean validateNome(String nome) { + return estacionamentoRepository.findByNome(nome).isPresent(); + } + + private void cadastrarVagas(int vagasMoto, int vagasCarro, Estacionamento estacionamento){ + TipoVaga tipoMoto = MOTO; + TipoVaga tipoCarro = CARRO; + + for (int i = 0; i < vagasMoto; i++) { + vagaService.cadastrarVaga(new Vaga(estacionamento, tipoMoto), estacionamento.getId()); + } + + for (int i = 0; i < vagasCarro; i++) { + vagaService.cadastrarVaga(new Vaga(estacionamento, tipoCarro), estacionamento.getId()); + } + } +} diff --git a/src/main/java/br/com/hackathonfc/park/service/PerfilService.java b/src/main/java/br/com/hackathonfc/park/service/PerfilService.java new file mode 100644 index 0000000..5b4b850 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/PerfilService.java @@ -0,0 +1,17 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.model.Perfil; +import br.com.hackathonfc.park.repository.PerfilRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class PerfilService { + + @Autowired + private PerfilRepository perfilRepository; + + public Perfil detalhar(Long id){ + return perfilRepository.findById(id).get(); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/service/TokenService.java b/src/main/java/br/com/hackathonfc/park/service/TokenService.java new file mode 100644 index 0000000..5740146 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/TokenService.java @@ -0,0 +1,72 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.model.User; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; + +@Service +public class TokenService { + + @Value("${jwt.expiration}") + private String expiration; + + @Value("${jwt.secret}") + private String secret; + + public static final String AUTHORIZATION = "Authorization"; + public static final String BEARER_ = "Bearer "; + + public String generateToken(String username){ + Date today = new Date(System.currentTimeMillis()); + + Date expirationDate = new Date(today.getTime() + Long.parseLong(expiration)); + + return Jwts.builder() + .setSubject(username) + .signWith(SignatureAlgorithm.HS256, secret.getBytes()) + .setExpiration(expirationDate) + .compact(); + } + + public ResponseEntity refreshToken (HttpServletResponse httpServletResponse){ + User user = UserService.authenticated(); + String token = generateToken(user.getUsername()); + httpServletResponse.addHeader("Authorization", "Bearer " + token); + return ResponseEntity.noContent().build(); + } + + public boolean isTokenValid(String token) { + try { + Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token); + return true; + } catch (Exception e) { + System.out.println(e); + return false; + } + } + + public String recuperarToken(HttpServletRequest request) { + String token = request.getHeader(AUTHORIZATION); + + if (token == null || token.isEmpty() || !token.startsWith(BEARER_)) { + return null; + } + + return token.substring(7, token.length()); + } + + public String getUsername(String token) { + Claims body = Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token).getBody(); + return body.getSubject(); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/service/UserService.java b/src/main/java/br/com/hackathonfc/park/service/UserService.java new file mode 100644 index 0000000..bc5b26d --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/UserService.java @@ -0,0 +1,120 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.dto.UserDTO; +import br.com.hackathonfc.park.exception.PasswordNotValid; +import br.com.hackathonfc.park.exception.UsernameNotValid; +import br.com.hackathonfc.park.mapper.UserMAP; +import br.com.hackathonfc.park.model.Perfil; +import br.com.hackathonfc.park.model.User; +import br.com.hackathonfc.park.repository.UserRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AuthorizationServiceException; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@Slf4j +public class UserService { + + @Autowired + private UserRepository userRepository; + + private UserMAP userMAP; + + @Autowired + private DbService dbService; + + @Autowired + private PerfilService perfilService; + + public ResponseEntity cadastrar(UserDTO userDTO) throws UsernameNotValid, PasswordNotValid { + if(validatePassword(userDTO.getPassword()) != true) { + throw new PasswordNotValid(); + } else if(validateEmail(userDTO.getEmail()) != true){ + throw new UsernameNotValid(); + } else{ + User user = userRepository.save(new User(userDTO.getEmail(), dbService.encode(userDTO.getPassword()))); + return ResponseEntity.ok(new UserDTO(user)); + } + } + + public UserDTO detalhar(Long id) throws UsernameNotFoundException{ + Optional checkUser = userRepository.findById(id); + User user = UserService.authenticated(); + Perfil perfilAdmin = perfilService.detalhar(1L); + Boolean checkBool = user.hasRole(perfilAdmin); + + if(checkUser.isPresent()){ + if(user == null || !user.hasRole(perfilAdmin)) { + throw new AuthorizationServiceException("Acesso não permitido!"); + } else { + return new UserDTO(checkUser.get()); + } + } else { + throw new UsernameNotFoundException("Usuário não encontrado no sistema!"); + } + } + + public ResponseEntity atualizar(Long id, UserDTO userDTO) throws UsernameNotFoundException{ + Optional checkUser = userRepository.findById(id); + + if(checkUser.isPresent()){ + User user = checkUser.get(); + user.setEmail(userDTO.getEmail()); + user.setPassword(userDTO.getPassword()); + userRepository.save(user); + return ResponseEntity.ok(userMAP.toDTO(user)); + } else { + throw new UsernameNotFoundException("Usuário não encontrado no sistema!"); + } + } + + public ResponseEntity remover(Long id) throws UsernameNotFoundException{ + Optional checkUser = userRepository.findById(id); + + User user = UserService.authenticated(); + + Perfil perfil = perfilService.detalhar(1L); + + if (checkUser.isPresent()){ + if(user!=null && user.hasRole(perfil)) { + userRepository.deleteById(id); + return ResponseEntity.ok().build(); + } else + throw new AuthorizationServiceException("Acess danied!"); + } else{ + throw new UsernameNotFoundException("Usuário não encontrado no sistema!"); + } + } + + public static User authenticated(){ + try { + return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } catch (Exception e){ + return null; + } + } + + private boolean validateEmail(String email){ + Optional checkUser = userRepository.findByEmail(email); + + if (checkUser.isPresent()){ + return false; + } else { + return true; + } + } + + private boolean validatePassword(String password){ + if (password == null || password.isEmpty() || password.length() < 8){ + return false; + } else { + return true; + } + } +} diff --git a/src/main/java/br/com/hackathonfc/park/service/VagaService.java b/src/main/java/br/com/hackathonfc/park/service/VagaService.java new file mode 100644 index 0000000..8a032cd --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/VagaService.java @@ -0,0 +1,160 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.dto.VagaDTO; +import br.com.hackathonfc.park.dto.VagaDTOSemEstacionamento; +import br.com.hackathonfc.park.exception.EstacionamentoNotFound; +import br.com.hackathonfc.park.exception.VagaNotFound; +import br.com.hackathonfc.park.exception.VeiculoNotFound; +import br.com.hackathonfc.park.mapper.VagaMAP; +import br.com.hackathonfc.park.model.Estacionamento; +import br.com.hackathonfc.park.model.Vaga; +import br.com.hackathonfc.park.model.Veiculo; +import br.com.hackathonfc.park.repository.VagaRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@Slf4j +public class VagaService { + + @Autowired + private VagaRepository vagaRepository; + + @Autowired + private VeiculoService veiculoService; + + @Autowired + private EstacionamentoService estacionamentoService; + + private VagaMAP vagaMAP; + + public List listar(Long id) throws EstacionamentoNotFound { + Optional checkEstacionamento = estacionamentoService.retornarEstacionamento(id); + List vagas; + + if(checkEstacionamento.isPresent()){ + vagas = vagaRepository.findAllFromEstacionamento(id); + } else{ + throw new EstacionamentoNotFound(); + } + + return vagaMAP.toDTOSemEstacionamento(vagas); + } + + public ResponseEntity cadastrar(VagaDTO vagaDTO, Long id) { + try { + Estacionamento estacionamento = estacionamentoService.retornarEstacionamento(id).get(); + Optional checkVeiculo = veiculoService.retornarVeiculo(vagaDTO.getVeiculo_id()); + Veiculo veiculo; + + if (!checkVeiculo.isPresent()) { + veiculo = null; + } else{ + veiculo = checkVeiculo.get(); + } + + Vaga vaga = vagaRepository.save(vagaMAP.fromDTO(vagaDTO, estacionamento, veiculo)); + return ResponseEntity.ok(vagaMAP.toDTO(vaga)); + } + catch (Exception e) { + return ResponseEntity.badRequest().build(); + } + } + + public ResponseEntity atualizar(Long id, VagaDTO vagaDTO) throws VagaNotFound, VeiculoNotFound { + Optional checkVaga = vagaRepository.findById(id); + Veiculo veiculo = new Veiculo(); + + if(checkVaga.isPresent()){ + Vaga vaga = vagaRepository.getOne(id); + + if (vagaDTO.getVeiculo_id() != null) { + + Optional checkVeiculo = veiculoService.retornarVeiculo(vagaDTO.getVeiculo_id()); + + if (checkVeiculo.isPresent()){ + veiculo = checkVeiculo.get(); + } + } + + vaga.setLivre(vagaDTO.isLivre()); + vaga.setVeiculo(veiculo); + + vagaRepository.save(vaga); + + return ResponseEntity.ok(vagaMAP.toDTO(vaga)); + } + else { + throw new VagaNotFound(); + } + } + + public ResponseEntity remover(Long id) throws VagaNotFound{ + Optional checkVaga = vagaRepository.findById(id); + + if(checkVaga.isPresent()){ + vagaRepository.deleteById(id); + + return ResponseEntity.ok().build(); + } + else { + throw new VagaNotFound(); + } + } + + public VagaDTO detalhar(Long id) throws VagaNotFound{ + Optional checkVaga = vagaRepository.findById(id); + Vaga vaga; + + if (checkVaga.isPresent()){ + vaga = checkVaga.get(); + } else { + throw new VagaNotFound(); + } + + return vagaMAP.toDTO(vaga); + } + + public List listarDeUmEstacionamento(Long id) throws EstacionamentoNotFound{ + Optional estacionamento = estacionamentoService.retornarEstacionamento(id); + + if (estacionamento.isPresent()){ + return vagaRepository.findAllFromEstacionamento(id); + } + else { + throw new EstacionamentoNotFound(); + } + } + + public Optional retornarVaga(Long id) throws VagaNotFound{ + Optional vaga = vagaRepository.findById(id); + + if (vaga.isPresent()){ + return vagaRepository.findById(id); + } + else { + throw new VagaNotFound(); + } + } + + public Vaga cadastrarVaga(Vaga vaga, Long id){ + try { + Optional estacionamento = estacionamentoService.retornarEstacionamento(id); + + if (estacionamento.isPresent()) { + return vagaRepository.save(vaga); + } else { + throw new EstacionamentoNotFound(); + } + } + catch (Exception e) { + log.error(e.toString()); + return null; + } + } +} diff --git a/src/main/java/br/com/hackathonfc/park/service/VeiculoService.java b/src/main/java/br/com/hackathonfc/park/service/VeiculoService.java new file mode 100644 index 0000000..278c5fb --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/service/VeiculoService.java @@ -0,0 +1,138 @@ +package br.com.hackathonfc.park.service; + +import br.com.hackathonfc.park.dto.VeiculoDTO; +import br.com.hackathonfc.park.exception.*; +import br.com.hackathonfc.park.mapper.VeiculoMAP; +import br.com.hackathonfc.park.enums.TipoVaga; +import br.com.hackathonfc.park.enums.TipoVeiculo; +import br.com.hackathonfc.park.model.Vaga; +import br.com.hackathonfc.park.model.Veiculo; +import br.com.hackathonfc.park.repository.VeiculoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +@Service +public class VeiculoService { + + @Autowired + private VeiculoRepository veiculoRepository; + + @Autowired + private VagaService vagaService; + + private VeiculoMAP veiculoMAP = new VeiculoMAP(); + + public List listarTodosOsVeiculos() throws EstacionamentoNotFound { + List veiculos = veiculoRepository.findAll(); + + return veiculoMAP.toDTO(veiculos); + } + + public List listarVeiculosDoEstacionamento(Long id) throws EstacionamentoNotFound { + List vagas = vagaService.listarDeUmEstacionamento(id); + + List veiculos = new ArrayList(); + + for (Vaga vaga : vagas) { + Veiculo veiculo = vaga.getVeiculo(); + veiculos.add(new VeiculoDTO(veiculo)); + } + + return veiculos; + } + + public List listarVeiculosDeUmaVaga(Long id) { + return veiculoMAP.toDTO(veiculoRepository.findByVagaId(id)); + } + + public ResponseEntity cadastrarVeiculo(VeiculoDTO veiculoDTO) + throws PlacaFound, UnmatchedType, VagaNotFound { + + Vaga vaga = new Vaga(); + + Optional checkVaga = vagaService.retornarVaga(veiculoDTO.getVagaId()); + + boolean isPlacaFound = ValidatePlaca(veiculoDTO.getPlaca()); + + if (checkVaga.isPresent()) { + boolean isTypeValid = ValidadeType(veiculoDTO.getTipoVeiculo(), checkVaga.get().getTipoVaga()); + + if (isTypeValid) { + vaga = checkVaga.get(); + } + else { + throw new UnmatchedType(); + } + } + + if (isPlacaFound == true) throw new PlacaFound(); + + try{ + vaga.setLivre(false); + Veiculo veiculo = veiculoRepository.save(veiculoMAP.fromDTO(veiculoDTO, vaga)); + return ResponseEntity.ok(veiculoMAP.toDTO(veiculo)); + } + catch (Exception e){ + return ResponseEntity.badRequest().build(); + } + } + + public ResponseEntity atualizarVeiculo(Long id, VeiculoDTO veiculoDTO) + throws VeiculoNotFound, VagaNotFound { + + Optional optional = veiculoRepository.findById(id); + + if(optional.isPresent()) { + Veiculo veiculo = veiculoRepository.getOne(id); + + veiculo.setCor(veiculoDTO.getCor()); + veiculo.setMarca(veiculoDTO.getMarca()); + veiculo.setModelo(veiculoDTO.getModelo()); + veiculo.setPlaca(veiculoDTO.getPlaca()); + veiculo.setTipoVeiculo(veiculoDTO.getTipoVeiculo()); + veiculo.setVaga(vagaService.retornarVaga(veiculoDTO.getVagaId()).get()); + + return ResponseEntity.ok(veiculoMAP.toDTO(veiculo)); + } else { + throw new VeiculoNotFound(); + } + } + + public ResponseEntity removerVeiculo(@PathVariable Long id) + throws VeiculoNotFound, VagaNotFound { + Optional optional = veiculoRepository.findById(id); + + if(optional.isPresent()) { + Vaga vaga = vagaService.retornarVaga(optional.get().getVaga().getId()).get(); + vaga.setLivre(true); + veiculoRepository.deleteById(id); + return ResponseEntity.ok().build(); + } else { + throw new VeiculoNotFound(); + } + } + + public Optional retornarVeiculo(Long id) throws VeiculoNotFound{ + Optional veiculo = veiculoRepository.findById(id); + + if(veiculo.isPresent()) + return veiculo; + else + throw new VeiculoNotFound(); + } + + private boolean ValidatePlaca(String placa){ + return veiculoRepository.findByPlaca(placa).isPresent(); + } + + private boolean ValidadeType(TipoVeiculo tipoVeiculo, TipoVaga tipoVaga) { + return tipoVeiculo.toString().equals(tipoVaga.toString()); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/util/ApiError.java b/src/main/java/br/com/hackathonfc/park/util/ApiError.java new file mode 100644 index 0000000..7b89d45 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/util/ApiError.java @@ -0,0 +1,12 @@ +package br.com.hackathonfc.park.util; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class ApiError { + private String error; +} diff --git a/src/main/java/br/com/hackathonfc/park/util/AuthenticationFilter.java b/src/main/java/br/com/hackathonfc/park/util/AuthenticationFilter.java new file mode 100644 index 0000000..bda1f2d --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/util/AuthenticationFilter.java @@ -0,0 +1,55 @@ +package br.com.hackathonfc.park.util; + +import br.com.hackathonfc.park.dto.UserDTO; +import br.com.hackathonfc.park.model.User; +import br.com.hackathonfc.park.service.TokenService; +import com.fasterxml.jackson.databind.ObjectMapper; +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.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; + +public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter { + + private TokenService tokenService; + + private AuthenticationManager authenticationManager; + + public AuthenticationFilter(AuthenticationManager authenticationManager, TokenService tokenService){ + this.authenticationManager = authenticationManager; + this.tokenService = tokenService; + } + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { + try{ + UserDTO userDTO = new ObjectMapper().readValue(request.getInputStream(), UserDTO.class); + + UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDTO.getEmail(), userDTO.getPassword(), new ArrayList<>()); + + Authentication auth = authenticationManager.authenticate(authToken); + + return auth; + + } catch (IOException e){ + throw new RuntimeException(); + } + } + + @Override + protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { + String username = ((User) authResult.getPrincipal()).getUsername(); + + String token = tokenService.generateToken(username); + + response.addHeader("Authorization", "Bearer " + token); + } +} diff --git a/src/main/java/br/com/hackathonfc/park/util/AuthorizationFilter.java b/src/main/java/br/com/hackathonfc/park/util/AuthorizationFilter.java new file mode 100644 index 0000000..09e71c1 --- /dev/null +++ b/src/main/java/br/com/hackathonfc/park/util/AuthorizationFilter.java @@ -0,0 +1,49 @@ +package br.com.hackathonfc.park.util; + +import br.com.hackathonfc.park.service.TokenService; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +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; + +public class AuthorizationFilter extends BasicAuthenticationFilter { + + private TokenService tokenService; + + private UserDetailsService userDetailsService; + + public AuthorizationFilter(AuthenticationManager authenticationManager, TokenService tokenService, UserDetailsService userDetailsService) { + super(authenticationManager); + this.tokenService = tokenService; + this.userDetailsService = userDetailsService; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + String token = tokenService.recuperarToken(request); + + boolean valid = tokenService.isTokenValid(token); + + if (valid) { + UsernamePasswordAuthenticationToken auth = getAuthentication(request, token); + if (auth != null) + SecurityContextHolder.getContext().setAuthentication(auth); + } + + chain.doFilter(request, response); + } + + private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request, String token){ + String username = tokenService.getUsername(token); + UserDetails user = userDetailsService.loadUserByUsername(username); + return new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); + } +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties new file mode 100644 index 0000000..b56eaa0 --- /dev/null +++ b/src/main/resources/application-dev.properties @@ -0,0 +1,14 @@ +# data source +spring.datasource.url=jdbc:mysql://localhost:3306/curso_spring +spring.datasource.username=root +spring.datasource.password= + +#jpa +spring.jpa.hibernate.ddl-auto=create +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect + +# jwt +jwt.secret=rm'!@N=Ke!~p8VTA2ZRK~nMDQX5Uvm!m'D&]{@Vr?G;2?XhbC:Qa#9#eMLN\}x3?JR3.2zr~v)gYF^8\:8>:XfB:Ww75N/emt9Yj[bQMNCWwW\J?N,nvH.<2\.r~w]*e~vgak)X"v8H`MH/7"2E`,^k@nL/zBq`}C6tT*cCSVC^c]-L}&/ +jwt.expiration=3600000 \ No newline at end of file diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties new file mode 100644 index 0000000..dc9b168 --- /dev/null +++ b/src/main/resources/application-test.properties @@ -0,0 +1,19 @@ +# data source +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:parkDb +spring.datasource.username=sa +spring.datasource.password= + +# jpa +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=update + +# h2 +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console + +# jwt +jwt.secret=rm'!@N=Ke!~p8VTA2ZRK~nMDQX5Uvm!m'D&]{@Vr?G;2?XhbC:Qa#9#eMLN\}x3?JR3.2zr~v)gYF^8\:8>:XfB:Ww75N/emt9Yj[bQMNCWwW\J?N,nvH.<2\.r~w]*e~vgak)X"v8H`MH/7"2E`,^k@nL/zBq`}C6tT*cCSVC^c]-L}&/ +jwt.expiration=3600000 \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..ff95ca4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,3 @@ +spring.profiles.active=test + diff --git a/src/main/resources/templates/cadastro.html b/src/main/resources/templates/cadastro.html new file mode 100644 index 0000000..981b4fb --- /dev/null +++ b/src/main/resources/templates/cadastro.html @@ -0,0 +1,169 @@ + + + + + + + + + + + + + +
+
+
+
+
+ +
+
+ +
+
+ Nome +
+ +
+
+
+
+
+
+
+
+ CNPJ +
+ +
+
+
+ +
+
+ +
+
+ + +
+ +
+
+
+ +
+
+ +
+
+ + +
+ +
+
+
+ +
+
+ +
+
+ + +
+ +
+
+
+ +
+
+ +
+
+ + +
+ +
+
+
+ + +
+
+
+ +
+
+ +
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..be21cab --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,102 @@ + + + + + Gerenciador de Estacionamento + + + + +
+
+ Banner +
+
+
+ +
+
+
+

Estacionamento

+
+
+
    +
  • Vagas Carro: 20
  • +
  • Vagas Moto: 10
  • +
+
+
Endereço: Rua Doutor Fulano de Tal, 505 - Aparecida, Santos/SP
+
+
+ Gerenciar +
+ +
+
+

Estacionamento Fulano

+
+
+
    +
  • Vagas Carro: 20
  • +
  • Vagas Moto: 10
  • +
+
+
Endereço: Rua Doutor Fulano de Tal, 505 - Aparecida, Santos/SP
+
+
+ Gerenciar +
+ +
+
+

Estacionamento Fulano

+
+
+
    +
  • Vagas Carro: 20
  • +
  • Vagas Moto: 10
  • +
+
+
Endereço: Rua Doutor Fulano de Tal, 505 - Aparecida, Santos/SP
+
+
+ Gerenciar +
+ +
+
+

+
+
+
    +
  • Vagas Carro: 20
  • +
  • Vagas Moto: 10
  • +
+
+
Endereço: Rua Doutor Fulano de Tal, 505 - Aparecida, Santos/SP
+
+
+ Gerenciar +
+
+
+
+
+ Logotipo + © Gerenciador de Estacionamento 2019 +
+
+ + + \ No newline at end of file