Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como criar um endpoint para cadastro de Usuário?

Eu fiz desta forma, está funcional:

package br.com.cep.controller;

import br.com.cep.domain.usuario.DadosCdadstroUsuario;
import br.com.cep.domain.usuario.UsuarioRepository;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import br.com.cep.domain.usuario.DadosAutenticacao;
import br.com.cep.domain.usuario.Usuario;
import br.com.cep.infra.security.DadosTokenJWT;
import br.com.cep.infra.security.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.crypto.password.PasswordEncoder;
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 org.springframework.web.util.UriComponentsBuilder;

@RestController
@RequestMapping("/usuario")
public class AutenticacaoController {

    @Autowired
    private AuthenticationManager manager;

    @Autowired
    private TokenService tokenService;

    @Autowired
    private UsuarioRepository repository;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @PostMapping("/login")
    public ResponseEntity efetuarLogin(@RequestBody @Valid DadosAutenticacao dados){
        var authenticationToken = new UsernamePasswordAuthenticationToken(dados.login(), dados.senha());
        var authentication =  manager.authenticate(authenticationToken);
        var tokenJWT = tokenService.gerarToken((Usuario) authentication.getPrincipal());
        return ResponseEntity.ok(new DadosTokenJWT(tokenJWT));
    }


    @PostMapping("/cadastrar")
    @Transactional
    public ResponseEntity cadastrar(@RequestBody @Valid DadosCdadstroUsuario dados) {

        if(repository.findAllByLogin(dados.login()) == null){
            String login = dados.login();
            String senha = passwordEncoder.encode(dados.senha());
            Usuario usuario = new Usuario(null, login, senha);
            repository.save(usuario);
            return ResponseEntity.ok("cadastrado com sucesso");
        }else{
            return ResponseEntity.badRequest().body("Usuário já existe");
        }

    }
}

Só que apesar de cadastrar, ele deixa passar mesmo senão escrever o login como se fosse e-mail, mesmo colocando validation:

package br.com.cep.domain.usuario;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

public record DadosCdadstroUsuario(
        @NotBlank(message = "Email é obrigatório")
        @Email(message = "Formato do email é inválido")
        @Valid
        String login,
        @NotBlank
        String senha
) {
}

Passei o seguinte body:

{
    "login": "wesleassyy",
    "senha": "123456"
}

E recebi o seguinte retorno:

cadastrado com sucesso

O que posso estar fazendo errado?

4 respostas

Oi!

Sim, desse jeito ficou válido e bem simples o cadastro de usuários.

A única coisa que vi de errado foi no seu record, que o atributo login está anotado com @Valid e talvez isso esteja atrapalhando na validação. Remova essa anotação e deixe apenas o @NotBlank e o @Email mesmo para ver se resolve.

Opa, professor!

Eu removi o @Valid mas continua a mesma coisa...

Eu subi no git meu código: https://github.com/wesleyfelix/cep-explorer/blob/master/src/main/java/br/com/cep/domain/usuario/DadosCadadstroUsuario.java

Eu criei uma aplicação baseada ne curso.

Em teoria tá funcional, só a validação do e-mail que não esta ocorrendo mesmo. O usuário consegue se cadastrar com o login sendo e-mail ou não

solução!

Você adicinou algumas dependências desnecessárias no projeto:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.16.0</version>
</dependency>

<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
    <version>3.0.2</version>
</dependency>

Apague essas três e adicione a dependência de validação do Spring Boot apenas:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Muito obrigado, professor!

Era isso!!