Colocar o retorno no Controller ou no Service

Pessoal,

Seria boa prática colocar o retorno no Controller ou no Service? Eu coloquei no Controller mas pensei que como é uma espécie de regra de negócio, talvez fosse melhor colocar no Service.

@GetMapping("/filmes")
public ResponseEntity<List<Filme>> filmes() {
    log.info("filmes");
    List<Filme> listFilmes = filmesService.findAll();

    if(listFilmes.size()>0){
        return new ResponseEntity<List<Filme>>(listFilmes,HttpStatus.OK);
    }else{
        return new ResponseEntity<List<Filme>>(HttpStatus.NOT_FOUND);
    }
}

Seguindo as práticas REST, você estaria devolvendo um 404 NOT FOUND caso não tenha filmes para apresentar, porém é um retorno incorreto, afinal o recurso em si existe, mesmo que não tenha dados para apresentar, o retorno deveria ser um 200 OK confirmando a existência do recurso, caso não tenha dados o retorno seria uma lista vazia.

Ok, mas esse IF para determinar o retorno eu devo colocar no Controller ou no Service?

Em lugar nenhum, esse if não deveria nem existir aí!

Exemplo:

@GetMapping("/filmes")
public ResponseEntity<List<Filme>> filmes() {
    log.info("filmes");
    return new ResponseEntity<List<Filme>>(filmesService.findAll(), HttpStatus.OK);
}
1 curtida

Entendi. Obrigado

Meus 2 centavos (referente ao uso dos códigos HTTP, pois sua dúvida original já foi solucionada): Retorne 204 (No Content) quando um recurso não for encontrado ou, nesse seu caso, quando a lista vier vazia.

Usar 404 (Not found) pode confundir pois é usada quando a URL do serviço não existe (ou foi digitada errada, whatever).

1 curtida

Seguindo essa lógica dos códigos HTTP que o @Lucas_Camara comentou tu pode fazer da seguinte forma:

Exemplo:

@GetMapping("/filmes")
public ResponseEntity<List<Filme>> filmes() {
    log.info("filmes");

    List<Filme> filmes = filmesService.findAll();
    HttpStatus status = filmes.size() > 0 ? HttpStatus.OK : HttpStatus.NO_CONTENT;

    return new ResponseEntity<List<Filme>>(filmes, status);
}
1 curtida