From 8fb9e5a043380140096c1d8741982a700cfbbe1c Mon Sep 17 00:00:00 2001 From: Hoffmann Date: Mon, 3 Jul 2023 23:24:15 -0300 Subject: [PATCH] Add a parte referente a user no projeto --- .../minsait/api/controller/ApiController.java | 95 ++++++++++++++++++- .../minsait/api/controller/ApiSwagger.java | 9 ++ .../api/controller/AuthController.java | 20 ++-- .../minsait/api/repository/UsuarioEntity.java | 35 +++++++ .../db/migration/V1_0__create_tables.sql | 6 +- 5 files changed, 151 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/minsait/api/controller/ApiController.java b/src/main/java/com/minsait/api/controller/ApiController.java index 88a78c0..5447cd5 100644 --- a/src/main/java/com/minsait/api/controller/ApiController.java +++ b/src/main/java/com/minsait/api/controller/ApiController.java @@ -1,10 +1,10 @@ package com.minsait.api.controller; -import com.minsait.api.controller.dto.ClienteRequest; -import com.minsait.api.controller.dto.ClienteResponse; -import com.minsait.api.controller.dto.MessageResponse; +import com.minsait.api.controller.dto.*; import com.minsait.api.repository.ClienteEntity; import com.minsait.api.repository.ClienteRepository; +import com.minsait.api.repository.UsuarioEntity; +import com.minsait.api.repository.UsuarioRepository; import com.minsait.api.util.ObjectMapperUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -18,6 +18,8 @@ import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; @Slf4j @RestController @@ -104,4 +106,91 @@ public ResponseEntity findById(@PathVariable Long id){ return new ResponseEntity<>(clienteResponse, HttpStatus.OK); } + + + @Autowired + private UsuarioRepository usuarioRepository; + + @PreAuthorize("hasAuthority('LEITURA_USUARIO')") + @GetMapping("/usuario") + public ResponseEntity> findAllUsuario(@RequestParam(required = false) String nome, + @RequestParam(required = false) String login, + @RequestParam(required = false) String email, + @RequestParam(required = false, defaultValue = "0") int page, + @RequestParam(required = false, defaultValue = "10") int pageSize) { + final var usuarioEntity = new UsuarioEntity(); + usuarioEntity.setLogin(login); + usuarioEntity.setEmail(email); + Pageable pageable = PageRequest.of(page, pageSize); + + final Page usuarioEntityListPage = usuarioRepository.findAll(usuarioEntity.usuarioEntitySpecification(), pageable); + final Page usuarioResponseList = ObjectMapperUtil.mapAll(usuarioEntityListPage, UsuarioResponse.class); + return ResponseEntity.ok(usuarioResponseList); + } + + @PreAuthorize("hasAuthority('LEITURA_USUARIO')") + @GetMapping("/usuario/{id}") + public ResponseEntity findByIdUsuario(@PathVariable Long id){ + final var usuarioEntity = usuarioRepository.findById(id); + UsuarioResponse usuarioResponse = new UsuarioResponse(); + + if (usuarioEntity.isPresent()){ + usuarioResponse = ObjectMapperUtil.map(usuarioEntity.get(), UsuarioResponse.class); + }else{ + return new ResponseEntity<>(usuarioResponse, HttpStatus.NOT_FOUND); + } + + return new ResponseEntity<>(usuarioResponse, HttpStatus.OK); + } + + @PreAuthorize("hasAuthority('ESCRITA_USUARIO')") + @PostMapping("/usuario") + public ResponseEntity insertUsuario(@RequestBody UsuarioRequest request){ + + final var usuarioEntity = ObjectMapperUtil.map(request, UsuarioEntity.class); + usuarioEntity.setSenhaAndEncode(request.getSenha()); + + final var usuarioInserted = usuarioRepository.save(usuarioEntity); + final var usuarioResponse = ObjectMapperUtil.map(usuarioInserted, UsuarioResponse.class); + + return new ResponseEntity<>(usuarioResponse, HttpStatus.CREATED); + } + + + @PreAuthorize("hasAuthority('ESCRITA_USUARIO')") + @PutMapping("/usuario") + public ResponseEntity updateUsuario(@RequestBody UsuarioRequest request){ + final var usuarioEntity = ObjectMapperUtil.map(request, UsuarioEntity.class); + final var usuarioEntityFound = usuarioRepository.findById(usuarioEntity.getId()); + + if (usuarioEntityFound.isEmpty()) { + return new ResponseEntity<>(new UsuarioResponse(), HttpStatus.NOT_FOUND); + } + final var usuarioUpdated = usuarioRepository.save(usuarioEntity); + + final var usuarioResponse = ObjectMapperUtil.map(usuarioUpdated, UsuarioResponse.class); + + return new ResponseEntity<>(usuarioResponse, HttpStatus.OK); + } + + @PreAuthorize("hasAuthority('ESCRITA_USUARIO')") + @DeleteMapping("/usuario/{id}") + public ResponseEntity deleteUsuario(@PathVariable Long id){ + final var usuarioEntityFound = usuarioRepository.findById(id); + if(usuarioEntityFound.isPresent()){ + usuarioRepository.delete(usuarioEntityFound.get()); + }else{ + return new ResponseEntity<>(MessageResponse.builder() + .message("Usuario não encontrado!") + .date(LocalDateTime.now()) + .error(false) + .build(), HttpStatus.NOT_FOUND); + } + + return new ResponseEntity<>(MessageResponse.builder() + .message("OK") + .date(LocalDateTime.now()) + .error(false) + .build(), HttpStatus.OK); + } } \ No newline at end of file diff --git a/src/main/java/com/minsait/api/controller/ApiSwagger.java b/src/main/java/com/minsait/api/controller/ApiSwagger.java index 4eccc58..a46608a 100644 --- a/src/main/java/com/minsait/api/controller/ApiSwagger.java +++ b/src/main/java/com/minsait/api/controller/ApiSwagger.java @@ -3,6 +3,7 @@ import com.minsait.api.controller.dto.ClienteRequest; import com.minsait.api.controller.dto.ClienteResponse; import com.minsait.api.controller.dto.MessageResponse; +import com.minsait.api.controller.dto.UsuarioResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; @@ -63,4 +64,12 @@ public interface ApiSwagger { } ) public ResponseEntity findById(Long id); + + @Operation(summary = "Busca todos os registros", responses = { + @ApiResponse(responseCode = "200", description = "Dados do registro retornados com sucesso"), + @ApiResponse(responseCode = "400", description = "Parâmetros inválidos"), + @ApiResponse(responseCode = "500", description = "Erro interno"), + @ApiResponse(responseCode = "403", description = "Acesso negado"), }) + public ResponseEntity> findAllUsuario(String nome, String login, String email, int page, + int pageSize); } diff --git a/src/main/java/com/minsait/api/controller/AuthController.java b/src/main/java/com/minsait/api/controller/AuthController.java index e2bff0f..f7bfc3d 100644 --- a/src/main/java/com/minsait/api/controller/AuthController.java +++ b/src/main/java/com/minsait/api/controller/AuthController.java @@ -2,6 +2,7 @@ import com.minsait.api.controller.dto.GetTokenRequest; import com.minsait.api.controller.dto.GetTokenResponse; +import com.minsait.api.repository.UsuarioEntity; import com.minsait.api.repository.UsuarioRepository; import com.minsait.api.sicurity.util.JWTUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -29,17 +30,16 @@ public class AuthController { JWTUtil jwtUtil; @PostMapping("/get-token") - public ResponseEntity getToken(@RequestBody GetTokenRequest request){ - if(request.getPassword().equals("12345") && request.getUserName().equals("root")){ + public ResponseEntity getToken(@RequestBody GetTokenRequest request) { + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + UsuarioEntity usuario = usuarioRepository.findByLogin(request.getUserName()); + + if (usuario != null && encoder.matches(request.getPassword(), usuario.getSenha())) { final ArrayList permissions = new ArrayList<>(); - permissions.add("LEITURA_CLIENTE"); - permissions.add("ESCRITA_CLIENTE"); - - final var token =jwtUtil.generateToken("admin", permissions, 5); - return new ResponseEntity<>(GetTokenResponse.builder() - .accessToken(token) - .build(), HttpStatus.OK); - }else{ + + final var token = jwtUtil.generateToken(usuario.getLogin(), permissions, 5); + return new ResponseEntity<>(GetTokenResponse.builder().accessToken(token).build(), HttpStatus.OK); + } else { return new ResponseEntity<>(GetTokenResponse.builder().build(), HttpStatus.UNAUTHORIZED); } } diff --git a/src/main/java/com/minsait/api/repository/UsuarioEntity.java b/src/main/java/com/minsait/api/repository/UsuarioEntity.java index c6e2ada..f13a82b 100644 --- a/src/main/java/com/minsait/api/repository/UsuarioEntity.java +++ b/src/main/java/com/minsait/api/repository/UsuarioEntity.java @@ -4,6 +4,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.jpa.domain.Specification; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import javax.persistence.*; import javax.persistence.criteria.Predicate; @@ -37,4 +38,38 @@ public class UsuarioEntity { @Column(name = "PERMISSOES") private String permissoes; + + + public void setSenhaAndEncode(String senha) { + if (senha != null) { + BCryptPasswordEncoder senhaAndEncoder = new BCryptPasswordEncoder(); + senha = senhaAndEncoder.encode(senha); + } + + this.senha = senha; + } + + public Specification usuarioEntitySpecification() { + return (root, query, criteriaBuilder) -> { + + List predicates = new ArrayList<>(); + + if (this.getNome() != null) { + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(root.get("nome")), + "%" + this.getNome().trim().toLowerCase() + "%")); + } + + if (this.getLogin() != null) { + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(root.get("login")), + "%" + this.getLogin().trim().toLowerCase() + "%")); + } + + if (this.getEmail() != null) { + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(root.get("email")), + "%" + this.getEmail().trim().toLowerCase() + "%")); + } + + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } } diff --git a/src/main/resources/db/migration/V1_0__create_tables.sql b/src/main/resources/db/migration/V1_0__create_tables.sql index a13b393..87204f4 100644 --- a/src/main/resources/db/migration/V1_0__create_tables.sql +++ b/src/main/resources/db/migration/V1_0__create_tables.sql @@ -33,4 +33,8 @@ INSERT INTO API.CLIENTE (ID_CLIENTE, NOME, ENDERECO, EMAIL, TELEFONE) VALUES (AP INSERT INTO API.CLIENTE (ID_CLIENTE, NOME, ENDERECO, EMAIL, TELEFONE) VALUES (API.SQ_ID_CLIENTE.nextval,'Jão','Rua H, 343','jose14@outlook.com','53 988098432'); INSERT INTO API.CLIENTE (ID_CLIENTE, NOME, ENDERECO, EMAIL, TELEFONE) VALUES (API.SQ_ID_CLIENTE.nextval,'Manolo','Rua M, 342','jose14@outlook.com','53 98098234'); INSERT INTO API.CLIENTE (ID_CLIENTE, NOME, ENDERECO, EMAIL, TELEFONE) VALUES (API.SQ_ID_CLIENTE.nextval,'Wlisses','Rua N, 341','jose14@outlook.com','53 98098234'); -INSERT INTO API.CLIENTE (ID_CLIENTE, NOME, ENDERECO, EMAIL, TELEFONE) VALUES (API.SQ_ID_CLIENTE.nextval,'Leonardo','Rua O, 320','jose14@outlook.com','53 980928347'); \ No newline at end of file +INSERT INTO API.CLIENTE (ID_CLIENTE, NOME, ENDERECO, EMAIL, TELEFONE) VALUES (API.SQ_ID_CLIENTE.nextval,'Leonardo','Rua O, 320','jose14@outlook.com','53 980928347'); + + +INSERT INTO API.USUARIO (ID_USUARIO, NOME, LOGIN, SENHA, EMAIL, PERMISSOES) VALUES (API.SQ_ID_USUARIO.nextval,'root','root', '789456123','root@gmail.com','LEITURA_USUARIO,ESCRITA_USUARIO,LEITURA_CLIENTE,ESCRITA_CLIENTE'); +INSERT INTO API.USUARIO (ID_USUARIO, NOME, LOGIN, SENHA, EMAIL, PERMISSOES) VALUES (API.SQ_ID_USUARIO.nextval,'hoffmann','hoffmann', '7894561230','hoffmann@gmail.com','LEITURA_USUARIO,LEITURA_CLIENTE'); \ No newline at end of file