[인프런 워밍업 클럽 0기] BE 7일차 과제

[인프런 워밍업 클럽 0기] BE 7일차 과제

 

  • controller

@RequestMapping("/api/v1")
@RestController
public class FruitController {

    private final FruitService fruitService;

    public FruitController(FruitService fruitService) {
        this.fruitService = fruitService;
    }

    @PostMapping("/fruit")
    public void saveFruit(@RequestBody FruitDTO request) {
        fruitService.save(request);
    }

    @PutMapping("/fruit")
    public void sellFruit(@RequestBody FruitDTO request) {
        fruitService.sell(request);
    }

    @GetMapping("/fruit/stat")
    public FruitResponse getStat(@RequestParam String name) {
        return fruitService.getStat(name);
    }

    @GetMapping("/fruit/count")
    public FruitCountResponse count(@RequestParam String name) {
        return fruitService.count(name);
    }

    @GetMapping("/fruit/list")
    public FruitListResponse getList(FruitListRequest fruitListRequest) {
        return fruitService.getList(fruitListRequest);
    }
}

 

 

  • service

@Service
public class FruitService {

    private final FruitRepository fruitRepository;

    public FruitService(FruitRepository fruitRepository) {
        this.fruitRepository = fruitRepository;
    }

    public void save(FruitDTO request) {
        fruitRepository.save(new Fruit(request.getName(),
                request.getWarehousingDate(),
                request.getPrice()));
    }

    public void sell(FruitDTO request) {
        Fruit fruit = fruitRepository.findById(request.getId()).orElseThrow(IllegalArgumentException::new);
        fruit.changeIs_sold();
        fruitRepository.save(fruit);
    }

    public FruitResponse getStat(String name) {
        List<Fruit> salesList = fruitRepository.findByNameAndIsSoldIsFalse(name);
        List<Fruit> notSalesList = fruitRepository.findByNameAndIsSoldIsTrue(name);

        long salesAmount = salesList.stream().mapToLong(Fruit::getPrice).sum();
        long notSalesAmount = notSalesList.stream().mapToLong(Fruit::getPrice).sum();

        return new FruitResponse(salesAmount, notSalesAmount);
    }

    public FruitCountResponse count(String name) {
        return new FruitCountResponse(fruitRepository.countByNameAndIsSoldIsTrue(name));
    }

    public FruitListResponse getList(FruitListRequest fruitListRequest) {
        if ("GTE".equals(fruitListRequest.getOption())) {
            return new FruitListResponse(fruitRepository.findAllByPriceGreaterThanEqualAndIsSoldIsFalse(fruitListRequest.getPrice()));
        }

        if ("LTE".equals(fruitListRequest.getOption())) {
            return new FruitListResponse(fruitRepository.findAllByPriceLessThanEqualAndIsSoldIsFalse(fruitListRequest.getPrice()));
        }

        throw new IllegalArgumentException("과일 리스트를 불러올 수 없습니다.");
    }
}

 

  • repository

@Repository
public interface FruitRepository extends JpaRepository<Fruit, Long> {
    List<Fruit> findByNameAndIsSoldIsFalse(String name);
    List<Fruit> findByNameAndIsSoldIsTrue(String name);

    long countByNameAndIsSoldIsTrue(String name);

    List<Fruit> findAllByPriceGreaterThanEqualAndIsSoldIsFalse(Long price);
    List<Fruit> findAllByPriceLessThanEqualAndIsSoldIsFalse(Long price);
}

 

  • domain

@Entity
@Getter
public class Fruit {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private LocalDate warehousingDate;

    @Column(nullable = false)
    private long price;

    @Column(nullable = false, columnDefinition = "boolean default false")
    private boolean isSold;

    public Fruit(String name, LocalDate warehousingDate, long price) {
        this.name = name;
        this.warehousingDate = warehousingDate;
        this.price = price;
    }

    public Fruit() {
    }

    public void changeIs_sold() {
        this.isSold = true;
    }
}

 

  • dto

@Data
@AllArgsConstructor
@RequiredArgsConstructor
public class FruitDTO {
    private Long id;
    private String name;
    private LocalDate warehousingDate;
    private long price;
    private boolean is_sold;

    @Data
    @AllArgsConstructor
    @RequiredArgsConstructor
    public static class FruitResponse {
        private long salesAmount;
        private long notSalesAmount;
    }

    @Data
    @AllArgsConstructor
    @RequiredArgsConstructor
    public static class FruitCountResponse {
        private long count;
    }

    @Data
    @AllArgsConstructor
    @RequiredArgsConstructor
    public static class FruitListRequest {
        private String option;
        private long price;
    }

    @Data
    @AllArgsConstructor
    @RequiredArgsConstructor
    public static class FruitListResponse {
        private List<Fruit> list;
    }
}

 

댓글을 작성해보세요.

채널톡 아이콘