Skip to content

Commit 28b7646

Browse files
committed
[#22] Feat: FastAPI 생성 여행 계획 저장 API 구현
1 parent cec13a4 commit 28b7646

File tree

3 files changed

+92
-1
lines changed

3 files changed

+92
-1
lines changed

src/main/java/com/example/triptalk/domain/tripPlan/controller/TripPlanController.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,31 @@ public ApiResponse<TripPlanResponse.TripPlanStatusDTO> markTripPlanAsTraveled(
5858
TripPlanResponse.TripPlanStatusDTO response = tripPlanService.changeTripPlanStatusToTraveled(tripPlanId, userId);
5959
return ApiResponse.onSuccess(response);
6060
}
61+
62+
@PostMapping("/from-fastapi")
63+
@Operation(
64+
summary = "FastAPI 생성 여행 계획 저장",
65+
description = """
66+
**FastAPI에서 생성된 여행 계획을 DB에 저장합니다.**
67+
68+
### 📝 저장 데이터
69+
- 여행 기본 정보 (제목, 출발지, 목적지, 날짜, 예산 등)
70+
- 하이라이트 목록
71+
- 일별 상세 일정 (DailySchedule + ScheduleItem)
72+
- 교통편 정보 (출발편, 귀환편)
73+
- 숙소 정보
74+
75+
### 🔐 인증
76+
- Authorization 헤더에 Bearer 토큰 필요
77+
- 로그인한 사용자의 여행 계획으로 저장
78+
"""
79+
)
80+
public ApiResponse<TripPlanResponse.TripPlanDTO> createTripPlanFromFastAPI(
81+
@RequestBody com.example.triptalk.domain.tripPlan.dto.TripPlanRequest.CreateFromFastAPIDTO request,
82+
HttpServletRequest httpRequest
83+
) {
84+
Long userId = authUtil.getUserIdFromRequest(httpRequest);
85+
TripPlanResponse.TripPlanDTO response = tripPlanService.createTripPlanFromFastAPI(userId, request);
86+
return ApiResponse.onSuccess(response);
87+
}
6188
}

src/main/java/com/example/triptalk/domain/tripPlan/service/TripPlanService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.triptalk.domain.tripPlan.service;
22

3+
import com.example.triptalk.domain.tripPlan.dto.TripPlanRequest;
34
import com.example.triptalk.domain.tripPlan.dto.TripPlanResponse;
45
import com.example.triptalk.domain.tripPlan.enums.TripStatus;
56

@@ -13,4 +14,7 @@ public interface TripPlanService {
1314

1415
// 여행 상태 변경: PLANNED -> TRAVELED
1516
TripPlanResponse.TripPlanStatusDTO changeTripPlanStatusToTraveled(Long tripPlanId, Long userId);
17+
18+
// FastAPI에서 생성된 여행 계획 저장
19+
TripPlanResponse.TripPlanDTO createTripPlanFromFastAPI(Long userId, TripPlanRequest.CreateFromFastAPIDTO request);
1620
}

src/main/java/com/example/triptalk/domain/tripPlan/service/TripPlanServiceImpl.java

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.example.triptalk.domain.tripPlan.converter.TripPlanConverter;
44
import com.example.triptalk.domain.tripPlan.dto.TripPlanResponse;
5-
import com.example.triptalk.domain.tripPlan.entity.TripPlan;
5+
import com.example.triptalk.domain.tripPlan.entity.*;
66
import com.example.triptalk.domain.tripPlan.enums.TripStatus;
77
import com.example.triptalk.domain.tripPlan.repository.*;
88
import com.example.triptalk.global.apiPayload.code.status.ErrorStatus;
@@ -25,6 +25,7 @@ public class TripPlanServiceImpl implements TripPlanService {
2525
private final TripAccommodationRepository tripAccommodationRepository;
2626
private final DailyScheduleRepository dailyScheduleRepository;
2727
private final TripHighlightRepository tripHighlightRepository;
28+
private final com.example.triptalk.domain.user.repository.UserRepository userRepository;
2829

2930
@Override
3031
public TripPlanResponse.TripPlanDTO getTripPlan(Long tripPlanId, Long userId) {
@@ -93,4 +94,63 @@ public TripPlanResponse.TripPlanStatusDTO changeTripPlanStatusToTraveled(Long tr
9394

9495
return TripPlanConverter.toTripPlanStatusDTO(tripPlan);
9596
}
97+
98+
@Override
99+
@Transactional
100+
public TripPlanResponse.TripPlanDTO createTripPlanFromFastAPI(Long userId, com.example.triptalk.domain.tripPlan.dto.TripPlanRequest.CreateFromFastAPIDTO request) {
101+
// 1. User 조회
102+
com.example.triptalk.domain.user.entity.User user = userRepository.findById(userId)
103+
.orElseThrow(() -> new ErrorHandler(ErrorStatus.USER_NOT_FOUND));
104+
105+
// 2. TripPlan 생성 (Converter 사용)
106+
TripPlan tripPlan = TripPlanConverter.toTripPlanEntity(request, user);
107+
tripPlan = tripPlanRepository.save(tripPlan);
108+
109+
TripPlan finalTripPlan = tripPlan;
110+
111+
// 3. Highlights 저장 (Converter 사용)
112+
java.util.List<TripHighlight> highlights = TripPlanConverter.toTripHighlightEntities(
113+
request.getHighlights(),
114+
finalTripPlan
115+
);
116+
tripHighlightRepository.saveAll(highlights);
117+
118+
// 4. Transportations 저장 (Converter 사용)
119+
TripTransportation outbound = TripPlanConverter.toTripTransportationEntity(
120+
request.getOutboundTransportation(),
121+
finalTripPlan
122+
);
123+
if (outbound != null) {
124+
tripTransportationRepository.save(outbound);
125+
}
126+
127+
TripTransportation returnTransport = TripPlanConverter.toTripTransportationEntity(
128+
request.getReturnTransportation(),
129+
finalTripPlan
130+
);
131+
if (returnTransport != null) {
132+
tripTransportationRepository.save(returnTransport);
133+
}
134+
135+
// 5. Accommodations 저장 (Converter 사용)
136+
java.util.List<TripAccommodation> accommodations = TripPlanConverter.toTripAccommodationEntities(
137+
request.getAccommodations(),
138+
finalTripPlan
139+
);
140+
tripAccommodationRepository.saveAll(accommodations);
141+
142+
// 6. DailySchedules 저장 (Converter 사용)
143+
if (request.getDailySchedules() != null) {
144+
for (com.example.triptalk.domain.tripPlan.dto.TripPlanRequest.DailyScheduleDTO dailyScheduleDTO : request.getDailySchedules()) {
145+
DailySchedule dailySchedule = TripPlanConverter.toDailyScheduleEntity(
146+
dailyScheduleDTO,
147+
finalTripPlan
148+
);
149+
dailyScheduleRepository.save(dailySchedule);
150+
}
151+
}
152+
153+
// 7. 저장된 데이터 조회 및 반환
154+
return getTripPlan(finalTripPlan.getId(), userId);
155+
}
96156
}

0 commit comments

Comments
 (0)