0
respostas

Spring REST - Dúvida

Estou aprendendo Spring REST e por curiosidade surgiu uma dúvida, tenho um controller e tenho GET, POST e PUT. Minha curiosidade é, pode ter mais de um POST no controller, na minha cabeça não conseguir criar algum cenário para adicionar mais um post, segue o código!


@RestController
@RequestMapping(value = "/restaurantes")
public class RestauranteController {

    @Autowired
    private RestauranteRepository restauranteRepository;

    @Autowired
    private CadastroRestauranteService cadastroRestauranteService;

    @Autowired
    private SmartValidator smartValidator;


    @GetMapping
    public List<RestauranteDTO> listar() {
        List<Restaurante> restaurantes = restauranteRepository.findAll();
        return toCollectionDTO(restaurantes);
    }

    @GetMapping(value = "/{RestauranteId}")
    public RestauranteDTO buscar(@PathVariable Long RestauranteId) {
        Restaurante restaurante = cadastroRestauranteService.buscarOuFalhar(RestauranteId);

            return toDTO(restaurante);
    }



    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public RestauranteDTO adicionar(@RequestBody @Valid RestauranteInput restauranteInput) {

        try {
                Restaurante restaurante = toDomainObject(restauranteInput);
                RestauranteDTO restauranteDTO = toDTO(cadastroRestauranteService.salvar(restaurante));

            return restauranteDTO;  
        } catch (CozinhaNaoEncontradaException e) {
            throw new NegocioException(e.getMessage());
        }
    }


    @PutMapping(value = "/{restauranteId}")
    public RestauranteDTO atualizar(@PathVariable Long restauranteId, @RequestBody @Valid RestauranteInput restauranteInput) {
        try {
            Restaurante restaurante = toDomainObject(restauranteInput);

            Restaurante restauranteRecuperado = cadastroRestauranteService.buscarOuFalhar(restauranteId);
            BeanUtils.copyProperties(restaurante, restauranteRecuperado, "id", "formasPagamento", "endereco", "dataCadastro", "produtos"); //

            RestauranteDTO restauranteDTO = toDTO(cadastroRestauranteService.salvar(restauranteRecuperado));
            return restauranteDTO;
        } catch (CozinhaNaoEncontradaException e) {
            throw new NegocioException(e.getMessage());
        }
    }


    private RestauranteDTO toDTO(Restaurante restaurante) {
        CozinhaDTO cozinhaDTO = new CozinhaDTO();
        cozinhaDTO.setId(restaurante.getCozinha().getId());
        cozinhaDTO.setNome(restaurante.getCozinha().getNome());


        RestauranteDTO restauranteDTO = new RestauranteDTO();
        restauranteDTO.setId(restaurante.getId());
        restauranteDTO.setNome(restaurante.getNome());
        restauranteDTO.setTaxaFrete(restaurante.getTaxaFrete());
        restauranteDTO.setCozinhaId(cozinhaDTO);
        return restauranteDTO;
    }

    private List<RestauranteDTO> toCollectionDTO(List<Restaurante> restaurantes){

            return    restaurantes.stream()
                        .map(restaurante -> toDTO(restaurante))
                        .collect(Collectors.toList());        
    }



    /*Dado um RestauranteInput, eu retorno um restauranre*/
    private Restaurante toDomainObject(RestauranteInput restauranteInput) {

        Restaurante restaurante = new Restaurante();

        Cozinha cozinha = new Cozinha();
        cozinha.setId(restauranteInput.getCozinhaInput().getId());        

        restaurante.setNome(restauranteInput.getNome());
        restaurante.setTaxaFrete(restauranteInput.getTaxaFrete());

        restaurante.setCozinha(cozinha);

        return restaurante;

    }
}