Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions src/main/java/com/kau/capstone/entity/food/Food.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,8 @@

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Food {

@Id
@Comment("강아지 사료 식별자")
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand All @@ -30,5 +27,11 @@ public class Food {
private String imageUrl;

@Comment("사료 가격")
private Long price;
private long price;

private Food(String name, String imageUrl, Long price) {
this.name = name;
this.imageUrl = imageUrl;
this.price = price;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package com.kau.capstone.entity.food.repository;

import com.kau.capstone.entity.food.Food;
import com.kau.capstone.v2.food.exception.FoodNotFoundExceptionV2;
import lombok.NonNull;
import org.springframework.data.jpa.repository.JpaRepository;

public interface FoodRepository extends JpaRepository<Food, Long> {
default @NonNull Food getById(@NonNull Long id){
return findById(id).orElseThrow(FoodNotFoundExceptionV2::new);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.kau.capstone.entity.member.Member;
import com.kau.capstone.v1.member.exception.MemberNotFoundException;
import lombok.NonNull;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -13,7 +14,7 @@ public interface MemberRepository extends JpaRepository<Member, Long> {

Optional<Member> findByPlatformId(String platformId);

default Member getById(long id){
default @NonNull Member getById(@NonNull Long id){
return findById(id).orElseThrow(MemberNotFoundException::new);
}

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/kau/capstone/entity/point/History.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ private History(Point point, Long totalPoint, Long changePoint, String name) {
this.name = name;
}

public static History of(Point point, Long changePoint, String name) {
return new History(point, point.getAmount(), changePoint, name);
}
public static History of(Point point, PayPointReqV2 req, PointType type) {
return new History(point, point.getAmount(), -req.point(), type.description);
}
Expand Down
48 changes: 24 additions & 24 deletions src/main/java/com/kau/capstone/initial/FoodInitializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,28 @@ public class FoodInitializer {

private final FoodRepository foodRepository;

@PostConstruct
public void init() {
// 사료 이미지 추가
var food1 = create("시저 성견용 연어맛이 곁들여진 쇠고기 건식 사료", 8500L, "https://thumbnail10.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/2256824262381067-6cbaab6b-0381-4ac1-bb4d-e3cde73a8020.jpg");
var food2 = create("지니펫 유기농&활기찬일상 강아지사료 항산화 건식사료, 닭", 22000L, "https://thumbnail10.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/1066056294989691-10dab58a-4aea-4dcb-9a3f-c082d31b0d7f.jpg");
var food3 = create("무마진 강아지 전연령용 소프트사료, 연어", 14900L, "https://thumbnail10.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/2791828730297325-4999e7fd-60dd-4c19-89c5-6e39a985641d.png");
var food4 = create("버틀러 3개월령 이상 더텐 소프트 밀웜 소프트사료, 오리", 21000L, "https://thumbnail10.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/2268100251879690-7d94cf09-07d9-4cf7-b8c8-4951bdecc6e4.png");
var food5 = create("소프트플러스 전연령 참 좋은 황태 강아지 소프트사료, 연어", 11700L, "https://thumbnail7.coupangcdn.com/thumbnails/remote/230x230ex/image/vendor_inventory/b119/c157e5ee1c9140c28de31446550a9eb84c84ac3125a011f5631a17f500b0.jpg");
var food6 = create("마이펫닥터 전연령 시그니처 티어스컨트롤 유기농 강아지사료, 눈물 개선/눈건강", 30000L, "https://thumbnail7.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/1072637633682648-fadc9cb3-f91f-41c9-99e7-ae611099246c.jpg");

save(food1, food2, food3, food4, food5, food6);
}

private Food create(String name, Long price, String imageUrl) {
return Food.builder()
.name(name)
.price(price)
.imageUrl(imageUrl)
.build();
}

private void save(Food... foods) {
foodRepository.saveAll(Arrays.stream(foods).toList());
}
// @PostConstruct
// public void init() {
// // 사료 이미지 추가
// var food1 = create("시저 성견용 연어맛이 곁들여진 쇠고기 건식 사료", 8500L, "https://thumbnail10.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/2256824262381067-6cbaab6b-0381-4ac1-bb4d-e3cde73a8020.jpg");
// var food2 = create("지니펫 유기농&활기찬일상 강아지사료 항산화 건식사료, 닭", 22000L, "https://thumbnail10.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/1066056294989691-10dab58a-4aea-4dcb-9a3f-c082d31b0d7f.jpg");
// var food3 = create("무마진 강아지 전연령용 소프트사료, 연어", 14900L, "https://thumbnail10.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/2791828730297325-4999e7fd-60dd-4c19-89c5-6e39a985641d.png");
// var food4 = create("버틀러 3개월령 이상 더텐 소프트 밀웜 소프트사료, 오리", 21000L, "https://thumbnail10.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/2268100251879690-7d94cf09-07d9-4cf7-b8c8-4951bdecc6e4.png");
// var food5 = create("소프트플러스 전연령 참 좋은 황태 강아지 소프트사료, 연어", 11700L, "https://thumbnail7.coupangcdn.com/thumbnails/remote/230x230ex/image/vendor_inventory/b119/c157e5ee1c9140c28de31446550a9eb84c84ac3125a011f5631a17f500b0.jpg");
// var food6 = create("마이펫닥터 전연령 시그니처 티어스컨트롤 유기농 강아지사료, 눈물 개선/눈건강", 30000L, "https://thumbnail7.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/1072637633682648-fadc9cb3-f91f-41c9-99e7-ae611099246c.jpg");
//
// save(food1, food2, food3, food4, food5, food6);
// }
//
// private Food create(String name, Long price, String imageUrl) {
// return Food.builder()
// .name(name)
// .price(price)
// .imageUrl(imageUrl)
// .build();
// }
//
// private void save(Food... foods) {
// foodRepository.saveAll(Arrays.stream(foods).toList());
// }
}
10 changes: 5 additions & 5 deletions src/main/java/com/kau/capstone/v1/food/dto/FoodResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ public record FoodResponse(
) {

public static FoodResponse toResponse(Food food) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

of로 통일하기로 했어요.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 코드는 안고치는거 아니었나요?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

쏘리

return FoodResponse.builder()
.id(food.getId())
.imageUrl(food.getImageUrl())
.price(food.getPrice())
.build();
return new FoodResponse(
food.getId(),
food.getImageUrl(),
food.getPrice()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ public static FoodsResponse toResponse(List<Food> foods) {
.map(FoodResponse::toResponse)
.toList();

return FoodsResponse.builder()
.foods(foodResponses)
.build();
return new FoodsResponse(foodResponses);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

팩토리 메서드(of)로 사용하는 데, new를 사용하는 것은 잘못된 방식인 것 같아요.(record 타입 기본 생성자 private으로 변환 필요해 보임. 모든 인원이 해당 되며, @NoArgsConstructor 활용하면 될 듯 합니다.)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이것도 v1인데 고쳐야 하나요..?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

쏘리

}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.kau.capstone.v1.food.exception;

import com.kau.capstone._core.exception.ApiException;
import com.kau.capstone.global.exception.ApplicationException;
import com.kau.capstone.global.exception.ErrorCode;
import org.springframework.http.HttpStatus;

public class FoodNotFoundException extends ApplicationException {
public class FoodNotFoundException extends ApiException {
private static final String message = "해당 사료를 찾을 수 없습니다.";

public FoodNotFoundException(ErrorCode errorCode) {
super(errorCode);
public FoodNotFoundException() {
super(HttpStatus.NOT_FOUND, message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,7 @@ public void processPointPaymentForFood(long memberId, Long foodId, Long delivery
Member member = memberRepository.getById(memberId);
Point point = member.getPoint();

Food food = foodRepository.findById(foodId)
.orElseThrow(() -> new FoodNotFoundException(FOOD_NOT_FOUND));
Food food = foodRepository.getById(foodId);
Long totalPrice = food.getPrice() + deliveryFee;

if (point.getAmount() < totalPrice) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.kau.capstone.v2.food.controller;

import com.kau.capstone._core.dto.ApiResponse;
import com.kau.capstone.v1.auth.dto.LoginInfo;
import com.kau.capstone.v1.auth.util.LoginUser;
import com.kau.capstone.v1.point.dto.DeliveryFeeRequest;
import com.kau.capstone.v1.point.service.PointService;
import com.kau.capstone.v2.food.dto.response.FoodsResponseV2;
import com.kau.capstone.v2.food.service.FoodServiceV2;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
public class FoodControllerV2 {
private final FoodServiceV2 foodServiceV2;
private final PointService pointService;

@GetMapping("/api/v2/foods")
public ResponseEntity<ApiResponse<FoodsResponseV2>> getFoodsInfo() {
FoodsResponseV2 response = foodServiceV2.getFoodsInfo();

return ApiResponse.ok(response);
}

@PostMapping("/api/v2/foods/{foodId}/points/payment")
public ResponseEntity<ApiResponse<Void>> payFoodWithPoints(@LoginUser LoginInfo loginInfo,
@PathVariable Long foodId,
@RequestBody DeliveryFeeRequest request) {
foodServiceV2.processPointPaymentForFood(loginInfo.memberId(), foodId, request.deliveryFee());

Comment on lines +28 to +32
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

controller랑 service랑 로직이 1대1로서 같은 의미인데, 메서드 명이 다른 것이 확인하기 힘든 것 같은데,,, 다들 어떻게 생각해요?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이건 저도 하나로 통일하는게 좋을 것 같아요

return ApiResponse.ok();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.kau.capstone.v2.food.dto.response;

import com.kau.capstone.entity.food.Food;

public record FoodResponseV2(
Long id,
String imageUrl,
Long price
) {

public static FoodResponseV2 of(Food food) {
return new FoodResponseV2(
food.getId(),
food.getImageUrl(),
food.getPrice()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.kau.capstone.v2.food.dto.response;

import com.kau.capstone.entity.food.Food;

import java.util.List;

public record FoodsResponseV2(
List<FoodResponseV2> foods
) {

public static FoodsResponseV2 of(List<Food> foods) {
List<FoodResponseV2> foodResponses = foods.stream()
.map(FoodResponseV2::of)
.toList();

return new FoodsResponseV2(foodResponses);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.kau.capstone.v2.food.exception;

import com.kau.capstone._core.exception.ApiException;
import org.springframework.http.HttpStatus;

public class FoodNotFoundExceptionV2 extends ApiException {
private static final String message = "해당 사료를 찾을 수 없습니다.";

public FoodNotFoundExceptionV2() {
super(HttpStatus.NOT_FOUND, message);
}
}
71 changes: 71 additions & 0 deletions src/main/java/com/kau/capstone/v2/food/service/FoodServiceV2.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.kau.capstone.v2.food.service;

import com.kau.capstone.entity.alarm.Alarm;
import com.kau.capstone.entity.alarm.AlarmDetail;
import com.kau.capstone.entity.alarm.repository.AlarmRepository;
import com.kau.capstone.entity.food.Food;
import com.kau.capstone.entity.food.repository.FoodRepository;
import com.kau.capstone.entity.member.Member;
import com.kau.capstone.entity.member.repository.MemberRepository;
import com.kau.capstone.entity.point.History;
import com.kau.capstone.entity.point.Point;
import com.kau.capstone.entity.point.repository.HistoryRepository;
import com.kau.capstone.entity.reward.Reward;
import com.kau.capstone.entity.reward.RewardDetail;
import com.kau.capstone.entity.reward.repository.RewardRepository;
import com.kau.capstone.v2.food.dto.response.FoodsResponseV2;
import com.kau.capstone.v2.point.exception.PointNotEnoughExceptionV2;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;

@Service
@Transactional
@RequiredArgsConstructor
public class FoodServiceV2 {

private final FoodRepository foodRepository;
private final MemberRepository memberRepository;
private final RewardRepository rewardRepository;
private final AlarmRepository alarmRepository;
private final HistoryRepository historyRepository;

public FoodsResponseV2 getFoodsInfo() {
List<Food> foods = foodRepository.findAll();

return FoodsResponseV2.of(foods);
}

public void processPointPaymentForFood(Long memberId, Long foodId, Long deliveryFee) {
Member member = memberRepository.getById(memberId);
Point point = member.getPoint();

Food food = foodRepository.getById(foodId);
long totalPrice = food.getPrice() + deliveryFee;

checkAmount(point.getAmount(), totalPrice);

point.payment(totalPrice);
History history = History.of(point, -totalPrice, food.getName());
historyRepository.save(history);

Reward reward = rewardRepository.findRewardByMemberAndType(member, RewardDetail.THREE.type());
if (!Objects.isNull(reward) && !reward.getIsAchieved()) {
reward.achievedSuccess();
}

Alarm alarm = alarmRepository.findAlarmByMemberAndType(member, AlarmDetail.ONE.type());
if (!Objects.isNull(alarm) && alarm.getIsVisible()) {
alarm.doNotVisible();
}
}

private void checkAmount(long amount, long point){
if (amount < point) {
throw new PointNotEnoughExceptionV2();
}
}
Comment on lines +66 to +70
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳이 이 로직만 따로 함수화한 이유가 있나요?

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//package com.kau.capstone.domain.food.controller;
//
//import com.kau.capstone.v1.food.dto.FoodsResponse;
//import com.kau.capstone.v1.food.dto.FoodsResponseV2;
//import com.kau.capstone.entity.food.Food;
//import com.kau.capstone.entity.member.Member;
//import com.kau.capstone.v1.point.dto.DeliveryFeeRequest;
Expand Down Expand Up @@ -51,7 +51,7 @@
// .get("/api/v1/foods")
// .then()
// .extract();
// FoodsResponse response = res.jsonPath().getObject("", FoodsResponse.class);
// FoodsResponseV2 response = res.jsonPath().getObject("", FoodsResponseV2.class);
//
// // then
// assertSoftly(soft -> {
Expand Down
Loading