Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions src/main/java/com/minsait/api/controller/ApiController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
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.UsuarioRequest;
import com.minsait.api.controller.dto.UsuarioResponse;
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;
Expand All @@ -15,6 +19,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
Expand All @@ -27,6 +32,9 @@ public class ApiController implements ApiSwagger{
@Autowired
private ClienteRepository clienteRepository;

@Autowired
private UsuarioRepository usuarioRepository;

@PreAuthorize("hasAuthority('LEITURA_CLIENTE')")
@GetMapping("/cliente")
public ResponseEntity<Page<ClienteResponse>> clienteFindAll(@RequestParam(required = false) String nome,
Expand Down Expand Up @@ -104,4 +112,94 @@ public ResponseEntity<ClienteResponse> findById(@PathVariable Long id){

return new ResponseEntity<>(clienteResponse, HttpStatus.OK);
}

@PreAuthorize("hasAuthority('LEITURA_USUARIO')")
@GetMapping("/usuario")
public ResponseEntity<Page<UsuarioResponse>> usuarioFindAll(@RequestParam(required = false) String nome,
@RequestParam(required = false, defaultValue = "0") int page,
@RequestParam(required = false, defaultValue = "10") int pageSize) {
final var usuarioEntity = new UsuarioEntity();
usuarioEntity.setLogin(nome);
Pageable pageable = PageRequest.of(page, pageSize);

final Page<UsuarioEntity> usuarioEntityListPage = usuarioRepository.findAll(usuarioEntity.ususarioEntitySpecification(), pageable);
final Page<UsuarioResponse> usuarioResponseList = ObjectMapperUtil.mapAll(usuarioEntityListPage, UsuarioResponse.class);
return ResponseEntity.ok(usuarioResponseList);
}

@PreAuthorize("hasAuthority('ESCRITA_USUARIO')")
@PostMapping("/usuario")
public ResponseEntity<UsuarioResponse> insertUser(@RequestBody UsuarioRequest request){

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String senha = encoder.encode(request.getSenha());
final var usuarioEntity = ObjectMapperUtil.map(request, UsuarioEntity.class);
usuarioEntity.setSenha(senha);
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<UsuarioResponse> updateUser(@RequestBody UsuarioRequest request){
final var usuarioEntityFound = usuarioRepository.findById(request.getId());
if(usuarioEntityFound.isEmpty()){
return new ResponseEntity<>(new UsuarioResponse(), HttpStatus.NOT_FOUND);
}

final var usuarioEntity = ObjectMapperUtil.map(request, UsuarioEntity.class);

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String senha = null;
if (request.getSenha() == null) {
senha = encoder.encode(usuarioEntityFound.get().getSenha());
} else {
senha = encoder.encode(request.getSenha());
}

usuarioEntity.setSenha(senha);

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<MessageResponse> deleteUser(@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);
}

@PreAuthorize("hasAuthority('LEITURA_USUARIO')")
@GetMapping("/usuario/{id}")
public ResponseEntity<UsuarioResponse> findUsuarioById(@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);
}
}
43 changes: 43 additions & 0 deletions src/main/java/com/minsait/api/controller/ApiSwagger.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
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.UsuarioRequest;
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;
Expand Down Expand Up @@ -63,4 +65,45 @@ public interface ApiSwagger {
}
)
public ResponseEntity<ClienteResponse> findById(Long id);

@Operation(summary = "Busca todos os usuarios",
responses = {
@ApiResponse(responseCode = "200", description = "Dados do usuario 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<Page<UsuarioResponse>> usuarioFindAll(String nome, int page, int pagesize);

@Operation(summary = "Insere um novo usuario",
responses = {
@ApiResponse(responseCode = "200", description = "Usuario inserido com sucesso"),
@ApiResponse(responseCode = "400", description = "Parâmetros inválidos"),
@ApiResponse(responseCode = "500", description = "Erro interno"),
@ApiResponse(responseCode = "403", description = "Acesso negado"),
}
)
public ResponseEntity<UsuarioResponse> insertUser(UsuarioRequest request);

@Operation(summary = "Atualiza um usuario",
responses = {
@ApiResponse(responseCode = "200", description = "Usuario atualizado com sucesso"),
@ApiResponse(responseCode = "400", description = "Parâmetros inválidos"),
@ApiResponse(responseCode = "500", description = "Erro interno"),
@ApiResponse(responseCode = "403", description = "Acesso negado"),
}
)
public ResponseEntity<UsuarioResponse> updateUser(UsuarioRequest request);

@Operation(summary = "Exclui um usuario",
responses = {
@ApiResponse(responseCode = "200", description = "Usuario excluído com sucesso"),
@ApiResponse(responseCode = "400", description = "Parâmetros inválidos"),
@ApiResponse(responseCode = "404", description = "Cliente não encontrado"),
@ApiResponse(responseCode = "500", description = "Erro interno"),
@ApiResponse(responseCode = "403", description = "Acesso negado"),
}
)
public ResponseEntity<MessageResponse> deleteUser(Long id);
}
24 changes: 21 additions & 3 deletions src/main/java/com/minsait/api/controller/AuthController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -32,15 +33,32 @@ public class AuthController {
public ResponseEntity<GetTokenResponse> getToken(@RequestBody GetTokenRequest request){
if(request.getPassword().equals("12345") && request.getUserName().equals("root")){
final ArrayList<String> permissions = new ArrayList<>();
permissions.add("LEITURA_CLIENTE");
permissions.add("ESCRITA_CLIENTE");
permissions.add("LEITURA_USUARIO");
permissions.add("ESCRITA_USUARIO");

UsuarioEntity usuarioEncontrado = usuarioRepository.findByLogin(request.getUserName());

final var token =jwtUtil.generateToken("admin", permissions, 5);
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
encoder.matches(request.getPassword(), usuarioEncontrado.getSenha());
return new ResponseEntity<>(GetTokenResponse.builder()
.accessToken(token)
.build(), HttpStatus.OK);
}else{
return new ResponseEntity<>(GetTokenResponse.builder().build(), HttpStatus.UNAUTHORIZED);
UsuarioEntity usuarioEncontrado = usuarioRepository.findByLogin(request.getUserName());

final var usuarioEntityFound = usuarioRepository.findById(usuarioEncontrado.getId());
if(usuarioEntityFound.isEmpty()){
return new ResponseEntity<>(GetTokenResponse.builder().build(), HttpStatus.NOT_FOUND);
}
final ArrayList<String> permissions = new ArrayList<>(List.of(usuarioEncontrado.getPermissoes().split(",")));

final var token =jwtUtil.generateToken(usuarioEncontrado.getLogin(), permissions, Math.toIntExact(usuarioEncontrado.getId()));
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
encoder.matches(request.getPassword(), usuarioEncontrado.getSenha());
return new ResponseEntity<>(GetTokenResponse.builder()
.accessToken(token)
.build(), HttpStatus.OK);
}
}
}
14 changes: 14 additions & 0 deletions src/main/java/com/minsait/api/repository/UsuarioEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,18 @@ public class UsuarioEntity {

@Column(name = "PERMISSOES")
private String permissoes;
public Specification<UsuarioEntity> ususarioEntitySpecification() {

return (root, query, criteriaBuilder) -> {

List<Predicate> predicates = new ArrayList<>();

if (this.getNome() != null) {

predicates.add(criteriaBuilder.like(criteriaBuilder.lower(root.get("nome")),
"%" + this.getNome().trim().toLowerCase() + "%"));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
}
5 changes: 4 additions & 1 deletion src/main/resources/db/migration/V1_0__create_tables.sql
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,7 @@ 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');
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,'Pedro','root', '12345','peedroo.heenrique.ph@gmail.com','ESCRITA_USUARIO, LEITURA_USUARIO');
INSERT INTO API.USUARIO (ID_USUARIO, NOME, LOGIN, SENHA, EMAIL, PERMISSOES) VALUES (API.SQ_ID_USUARIO.nextval,'Henrique','exclusao', '12345','jose14@outlook.com','ESCRITA_USUARIO, LEITURA_USUARIO');