diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java index 9a543dc..860088a 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java @@ -2,13 +2,19 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; import org.springframework.messaging.handler.annotation.DestinationVariable; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.tenten.tentenstomp.domain.trip.dto.request.*; +import org.tenten.tentenstomp.domain.trip.dto.response.TripItemAddResponse; import org.tenten.tentenstomp.domain.trip.service.TripService; -import org.tenten.tentenstomp.global.messaging.kafka.producer.KafkaProducer; +import org.tenten.tentenstomp.global.common.constant.ResponseConstant; +import org.tenten.tentenstomp.global.response.GlobalDataResponse; @RestController @RequiredArgsConstructor @@ -16,12 +22,13 @@ public class TripController { private final TripService tripService; - private final KafkaProducer kafkaProducer; - /* - TODO : 백엔드에서 예외가 발생하면, 프론트로 예외 발생하기 전 시점 데이터를 보내줘야하는데, 이걸 어떻게 할 수 있을까 - TODO : 실시간 편집인데, 노션 처럼 누가 어떤 것을 변경했는지 알려줄 필요가 있지 않을까? - */ + @PostMapping("/trips/{tripId}") + public ResponseEntity> addTripItemFromMainPage( + @PathVariable Long tripId, + @RequestBody TripItemAddRequest tripItemAddRequest) { + return ResponseEntity.ok(GlobalDataResponse.ok(ResponseConstant.SUCCESS, tripService.addTripItemFromMainPage(tripId, tripItemAddRequest))); + } @MessageMapping("/trips/{tripId}/connectMember") public void connectMember(@DestinationVariable String tripId, @Payload MemberConnectMsg memberConnectMsg) { diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddRequest.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddRequest.java new file mode 100644 index 0000000..a5d1b8e --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddRequest.java @@ -0,0 +1,7 @@ +package org.tenten.tentenstomp.domain.trip.dto.request; + +public record TripItemAddRequest( + Long tourItemId, + String visitDate +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemAddResponse.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemAddResponse.java new file mode 100644 index 0000000..57f6f84 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemAddResponse.java @@ -0,0 +1,9 @@ +package org.tenten.tentenstomp.domain.trip.dto.response; + +public record TripItemAddResponse( + Long tripId, + Long tripItemId, + Long tourItemId, + String visitDate +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java index 3275de3..ef7b29a 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java @@ -217,4 +217,17 @@ public void updateTripTransportation(String tripId, TripTransportationUpdateMsg kafkaProducer.sendAndSaveToRedis(tripBudgetMsg, tripItemMsg, tripPathMsg); } + @Transactional + public TripItemAddResponse addTripItemFromMainPage(Long tripId, TripItemAddRequest tripItemAddRequest) { + Trip trip = tripRepository.findTripForUpdate(tripId).orElseThrow(() -> new GlobalException("해당 아이디로 존재하는 여정이 없습니다 " + tripId, NOT_FOUND)); + List tripItems = tripItemRepository.findTripItemByTripIdAndVisitDate(tripId, LocalDate.parse(tripItemAddRequest.visitDate())); + LocalDate visitDate = LocalDate.parse(tripItemAddRequest.visitDate()); + TripItem entity = TripItemCreateRequest.toEntity(tourItemRepository.getReferenceById(tripItemAddRequest.tourItemId()), trip, (long) tripItems.size() + 1, visitDate); + tripItemRepository.save(entity); + tripItems.add(entity); + + updateBudgetAndItemsAndPath(trip, tripItems, tripItemAddRequest.visitDate()); + + return new TripItemAddResponse(trip.getId(), entity.getId(), tripItemAddRequest.tourItemId(), tripItemAddRequest.visitDate()); + } }