Metoda delete rest api

0

Witam serdecznie

Działam dalej w temacie restowych metod. Obecnie chcę napisać metodę, która kasuje wszystkie auta w danym zakresie mocy albo momentu obrotowego.
Tylko nie wiem jak do tego podejść :D. Chciałbym usunąć samochody, które np. mają od 200 km do 400 km.
Może to dla kogoś banał ale proszę o pomoc/ wskazówki :)


public class CarDto {

    private Long id;
    private String producer;
    private String model;
    private String engineType;
    private Integer displacementCm3;
    private Integer powerHp;
    private Integer torqueNm;

    public Long getId() {
        return id;
    }

    public String getProducer() {
        return producer;
    }

    public String getModel() {
        return model;
    }

    public String getEngineType() {
        return engineType;
    }

    public Integer getDisplacementCm3() {
        return displacementCm3;
    }

    public Integer getPowerHp() {
        return powerHp;
    }

    public Integer getTorqueNm() {
        return torqueNm;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setProducer(String producer) {
        this.producer = producer;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public void setEngineType(String engineType) {
        this.engineType = engineType;
    }

    public void setDisplacementCm3(Integer displacementCm3) {
        this.displacementCm3 = displacementCm3;
    }

    public void setPowerHp(Integer powerHp) {
        this.powerHp = powerHp;
    }

    public void setTorqueNm(Integer torqueNm) {
        this.torqueNm = torqueNm;
    }
}
public interface CarJpaRepository extends JpaRepository<Car, Long> {

    List<Car> findAllByProducerAndModel(String producer, String model);

}

import org.modelmapper.ModelMapper;
import org.springframework.web.bind.annotation.*;
import pl.kurs.springmvcrest2.dto.CarDto;
import pl.kurs.springmvcrest2.model.Car;
import pl.kurs.springmvcrest2.repository.CarJpaRepository;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/cars")
public class CarController {

    private CarJpaRepository carJpaRepository;
    private ModelMapper mapper;

    public CarController(CarJpaRepository carJpaRepository, ModelMapper mapper) {
        this.carJpaRepository = carJpaRepository;
        this.mapper = mapper;
    }

    @GetMapping("/{id}")
    public CarDto getById(@PathVariable(name = "id") long id) {
        Car loadedCar = carJpaRepository.findById(id).orElseGet(() -> new Car());
        return mapper.map(loadedCar, CarDto.class);
    }

    @GetMapping
    public List<CarDto> getAll() {
        return carJpaRepository.findAll()
                .stream()
                .map(x -> mapper.map(x, CarDto.class))
                .collect(Collectors.toList());
    }

    //localhost:8080/cars/customsearch?producer=BMW&model=M3cs
    @GetMapping("/customsearch")
    public List<CarDto> getAll(@RequestParam(value = "producer") String producer,
                            @RequestParam(value = "model") String model) {
        return carJpaRepository.findAllByProducerAndModel(producer, model)
                .stream()
                .map(x -> mapper.map(x, CarDto.class))
                .collect(Collectors.toList());

    }

   @DeleteMapping()
    public String deleteSpecificCars(@RequestBody List<CarDto> carDtoList) {
        List<Long> idList = carDtoList
                .stream()
                .filter(Objects::nonNull)
                .map(x -> x.getId())
                .collect(Collectors.toList());
        carJpaRepository.deleteAllById(idList);
1

No i gdzie jest problem? :D

Ogólnie w tym endpoincie do usuwania i tak używasz samych idków, więc po co przesyłać całe obiekty CarDto skoro można po prostu listę idków?

Jeśli chodzi Ci o możliwość usuwania rekordów pasujących do pewnego zapytania, to w requeście musiałbyś mieć jakieś SearchDto z listą parametrów, następnie, na podstawie danego obiektu SearchDto, ułożyć konkretne zapytanie (SQLowe / HQLowe / CriteriaApi / konkretna metoda ze SpringData) i usunąć te dane.

0

Dokladnie mam metode, która kasuje wszystkie auta po przekazanej liście w formacie JSON oraz XML, podaje sobie id, ktore ma dany samochód i pyk usunięty:). Teraz rozmyślam jak to zrobić by usunąć wszystkie auta w danym zakresie mocy albo momentu.
Czy również usunąć po id?? Problem ze szczegółowym usunięciem np po zakresie mocy.
Czyli najlepiej w interfejsie CarJpaRepository stworzyć kwerendę??

1

Na początku na pewno skorzystaj ze stworzenia metod w Spring Data według tego co podesłał wyżej @Charles_Ray.

Następnie musisz sobie zadać pytanie - na ile dajesz elastyczności użytkownikowi.

Czyli czy chcesz wystawić endpoint o przykładowej nazwie /delete-cars-with-small-power i wtedy sam sobie na sztywno usuniesz samochody z mocą od 150 do 200? Tylko że wtedy zmiana tego zakresu będzie powodowała konieczność zmiany w kodzie.

Czy może jednak chcesz dać większą kontrolę, i wystawić endpoint /delete-by-criteria i wtedy w requeście user sam poda parametry, według których masz znaleźć samochody do usunięcia. Jest to rozwiązanie bardziej generyczne, jednak trudniejsze do zaimplementowania (ale spoko, dasz radę)

0

Tak przeczytałem podany link. Proszę popraw mnie jeśli się mylę w interfejsie CarJpaRepository tworzę metodę, którą później implementuję w CarControlerze

2

Nie. Po prostu tworzysz metodę. Twój controller niczego nie implementuje. Na tym polega Spring Data, że po prostu piszesz metodę o podanej nazwie, a Spring magicznie sam Ci dorobi do tego implementację.

0

Tworzę metodę w CarController i zaczynam od adnotacji @DeleteMapping

0

Gdy tworzę taką metodę to podświetla deleteAllBy i podpowiada by stworzyć ją w CarJpaRepository.
Co robię nie tak??

@DeleteMapping()
    public List<CarDto> deleteCarsWithSmallPower(@RequestParam(value = "powerHp") Integer powerHp) {
       return carJpaRepository.deleteAllBy(powerHp)
              
    }
1

Co robię nie tak??

Właśnie to: używasz metody, która nie istnieje. Jak to ma się skompilować?

1 użytkowników online, w tym zalogowanych: 0, gości: 1