Coder Social home page Coder Social logo

lillow / projeto-blog-pessoal-back Goto Github PK

View Code? Open in Web Editor NEW
1.0 2.0 0.0 344 KB

API-REST desenvolvida para o consumo no projeto Blog Pessoal desenvolvido durante o bootcamp da Generation Brasil

License: MIT License

Java 100.00%
blog blogpessoal java api-rest spring-boot

projeto-blog-pessoal-back's Introduction

Language | Idioma

🇧🇷 Portuguese | Português
🇺🇸 English | Inglês

Danillo Silva | Web Developer

var lillo = new Developer
{
    Name = "Danillo Silva",
    Pronouns = "He | His",
    Function = "Full-stack",
    CurrentEducation = "Estácio",
    Hobbies = [ "Learn",
                  "Gym",
                  "Games",
                  "Code",
                  "Series and Anime",
                  "Meet friends",
                ],
    Ambitions = [ "Develop leadership, management and technical skills",
                    "Achieving balance in personal and professional life",
                    "Achieve fluency in English"
                ]
};

var myLife = new Life(lillo);

myLife.Start();
while (!myLife.Successful)
{
    Life.TryAgain(myLife);
    if (!myLife.IsAlive) break;
}

Languages and Tools

projeto-blog-pessoal-back's People

Contributors

lillow avatar

Watchers

 avatar  avatar

projeto-blog-pessoal-back's Issues

Problema em Models

No documento Usuario.java:

  • Relacionar Usuario com Postagem (1:N)
  • Incluir Getters e Setters de minhasPostagens
  • Incluir atributo foto do tipo String, e seu get and set

exemplo:

@OneToMany(mappedBy = "criador", cascade = CascadeType.REMOVE)
@JsonIgnoreProperties({"criador"})
private List<Postagem> minhasPostagens = new ArrayList<>();

public List<Postagem> getMinhasPostagens() {
	return minhasPostagens;
}

public void setMinhasPostagens(List<Postagem> minhasPostagens) {
       this.minhasPostagens = minhasPostagens;
}

No documento Tema.java:

  • Alterar cascadetype para REMOVE

exemplo:

@OneToMany(mappedBy = "tema", cascade = CascadeType.REMOVE)
@JsonIgnoreProperties("tema")
private List<Postagem> postagem = new ArrayList<>();

No documento Postagem.java:

  • Relacionar Postagem com Usuario (N:1)
  • Incluir Getters e Setters de criador

exemplo:

@ManyToOne
@JoinColumn(name = "usuario_id")
@JsonIgnoreProperties({"minhasPostagens"})
private Usuario criador;

public Usuario getCriador() {
        return criador;
}

public void setCriador(Usuario criador) {
        this.criador = criador;
}

Recomendação em Controladores

No documento UsuarioController.java:

  • Adcionar método getAll
  • Adcionar método getById
  • Adcionar método putUsuario
  • Colocar notação @Valid nos métodos ja criados autentication e post

exemplo:

@GetMapping("/all")
public ResponseEntity <List<Usuario>> getAll() {
        return ResponseEntity.ok(repository.findAll());
}

@GetMapping("/{id}")
public ResponseEntity<Usuario> getById(@PathVariable long id) {
        return repository.findById(id)
	        .map(resp -> ResponseEntity.ok(resp))
	        .orElse(ResponseEntity.notFound().build());
}

@PutMapping("/atualizar")
public ResponseEntity<Usuario> putUsuario(@Valid @RequestBody Usuario usuario){		
        return service.atualizarUsuario(usuario)
                .map(resp -> ResponseEntity.status(HttpStatus.OK).body(resp))
                .orElse(ResponseEntity.status(HttpStatus.BAD_REQUEST).build());
}

@PostMapping("/logar")
public ResponseEntity<UserLogin> autentication(@Valid @RequestBody Optional <UserLogin> user){
        return usuarioService.Logar(user).map(resp -> ResponseEntity.ok(resp))
		        .orElse(ResponseEntity.status(HttpStatus.UNAUTHORIZED).build());
}

@PostMapping("/cadastrar")
public ResponseEntity<Usuario> post(@Valid @RequestBody Usuario usuario){
        return ResponseEntity.status(HttpStatus.CREATED)
		        .body(usuarioService.CadastrarUsuario(usuario));
}

No documento TemaController.java:

  • Colocar notação @Valid nos métodos ja criados post e put
  • Adcionar retorno Bad Request no metodo put
  • Recomento efetuar tratativa diferente no Delete

exemplo:

@PostMapping
public ResponseEntity<Tema> post(@Valid @RequestBody Tema tema){
        return ResponseEntity.status(HttpStatus.CREATED)
		        .body(repository.save(tema));
}

@PutMapping
public ResponseEntity<Tema> put(@Valid @RequestBody Tema tema){
        return repository.findById(tema.getId())
		        .map(resp -> ResponseEntity.status(HttpStatus.CREATED).body(repository.save(tema)))
		        .orElse(ResponseEntity.status(HttpStatus.BAD_REQUEST).build());
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping("/{id}")
public void delete(@PathVariable long id) {
        Optional<Tema> tema = repository.findById(id);
        if(tema.isEmpty())
	        throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
        repository.deleteById(id);				
}

No documento PostagemController.java:

  • Colocar notação @Valid nos métodos ja criados post e put
  • Adcionar retorno Bad Request no metodo put
  • Recomento efetuar tratativa diferente no Delete
  • Arrumar notação CrossOrigin encima da classe

exemplo:

@PostMapping
public ResponseEntity<Postagem> post(@Valid @RequestBody Postagem postagem){
        return ResponseEntity.status(HttpStatus.CREATED)
		        .body(repository.save(postagem));
}

@PutMapping
public ResponseEntity<Postagem> put(@Valid @RequestBody Postagem postagem){
        return repository.findById(postagem.getId())
		        .map(resp -> ResponseEntity.status(HttpStatus.OK).body(repository.save(postagem)))
		        .orElse(ResponseEntity.status(HttpStatus.BAD_REQUEST).build());
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping("/{id}")
public void delete(@PathVariable long id) {
        Optional<Postagem> post = repository.findById(id);
        if(post.isEmpty())
	        throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
        repository.deleteById(id);				
}

@CrossOrigin(value = "*", allowedHeaders = "*")

Recomendação em Service

No documento UsuarioService.java:

  • Modificar o Service por completo

exemplo:

@Service
public class UsuarioService {

	@Autowired
	private UsuarioRepository usuarioRepository;

	public Optional<Usuario> cadastrarUsuario(Usuario usuario) {
		if (usuarioRepository.findByUsuario(usuario.getUsuario()).isPresent())
			throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Usuário já existe!", null);

		usuario.setSenha(criptografarSenha(usuario.getSenha()));
		return Optional.of(usuarioRepository.save(usuario));
	}

	public Optional<Usuario> atualizarUsuario(Usuario usuario) {
		if (usuarioRepository.findById(usuario.getId()).isPresent()) {
			Optional<Usuario> buscaUsuario = usuarioRepository.findByUsuario(usuario.getUsuario());

			if (buscaUsuario.isPresent()) {				
				if (buscaUsuario.get().getId() != usuario.getId())
					throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Usuário já existe!", null);
			}
			
			usuario.setSenha(criptografarSenha(usuario.getSenha()));
			return Optional.of(usuarioRepository.save(usuario));
		} 
		throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Usuário não encontrado!", null);		
	}	
	
	public Optional<UsuarioLogin> logarUsuario(Optional<UsuarioLogin> usuarioLogin) {
		Optional<Usuario> usuario = usuarioRepository.findByUsuario(usuarioLogin.get().getUsuario());

		if (usuario.isPresent()) {
			if (compararSenhas(usuarioLogin.get().getSenha(), usuario.get().getSenha())) {
				usuarioLogin.get().setId(usuario.get().getId());				
				usuarioLogin.get().setNome(usuario.get().getNome());
				usuarioLogin.get().setFoto(usuario.get().getFoto());
				usuarioLogin.get().setSenha(usuario.get().getSenha());
				usuarioLogin.get().setToken(generatorBasicToken(usuarioLogin.get().getUsuario(), usuarioLogin.get().getSenha()));

				return usuarioLogin;
			}
		}		
		throw new ResponseStatusException(
				HttpStatus.UNAUTHORIZED, "Usuário ou senha inválidos!", null);
	}
	
	private String criptografarSenha(String senha) {
		BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
		String senhaEncoder = encoder.encode(senha);
		return senhaEncoder;
	}
	
	private boolean compararSenhas(String senhaDigitada, String senhaBanco) {
		BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
		return encoder.matches(senhaDigitada, senhaBanco);		
	}
	
	private String generatorBasicToken(String email, String password) {
		String structure = email + ":" + password;
		byte[] structureBase64 = Base64.encodeBase64(structure.getBytes(Charset.forName("US-ASCII")));
		return "Basic " + new String(structureBase64);
	}
}

Recomendação em UsuarioLogin

No documento UsuarioLogin.java:

  • Colocar atributos de acordo com o exemplo abaixo
  • Incluir Getter e setter de todos eles

exemplo:

private long id;
private String nome;
private String usuario;
private String foto;
private String senha;
private String token;

Recomendação em Repositorios

No documento UsuarioRepository.java:

  • Adcionar notação repository em UsuarioRepository
  • Adcionar método findAllByNomeContainingIgnoreCase

exemplo:

@Repository
public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
	public Optional<Usuario> findByUsuario(String usuario);
        public List<Usuario> findAllByNomeContainingIgnoreCase(String nome);
}

No documento Tema.java:

  • Adcionar notação repository em TemaRepository

exemplo:

@Repository
public interface TemaRepository extends JpaRepository<Tema, Long> {
	public List<Tema> findAllByDescricaoContainingIgnoreCase(String descricao);
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.