diff --git a/src/main/java/com/retrip/trip/application/in/TripService.java b/src/main/java/com/retrip/trip/application/in/TripService.java index 5ff7aa1..d6ada75 100644 --- a/src/main/java/com/retrip/trip/application/in/TripService.java +++ b/src/main/java/com/retrip/trip/application/in/TripService.java @@ -59,17 +59,18 @@ public TripUpdateResponse updateTrip(UUID memberId, UUID tripId, TripUpdateReque Trip trip = findTrip(tripId); TripTitle tripTitle = request.toTripTitle(); + TripDestinations destinations = request.toTripDestinations(trip); TripDescription tripDescription = request.toTripDescription(); TripPeriod tripPeriod = request.toTripPeriod(); - TripHashTags tripHashTags = request.toHashTags(trip); + TripHashTags hashTags = request.toHashTags(trip); //List itineraries = tripItineraryQueryRepository.findByIdsWithItineraryDetails(trip.getItinerariesIds()); trip.update( memberId, - request.locationId(), + destinations, tripTitle, tripDescription, - tripHashTags, + hashTags, request.maxParticipants(), request.imageUrl(), request.category() diff --git a/src/main/java/com/retrip/trip/application/in/request/TripUpdateRequest.java b/src/main/java/com/retrip/trip/application/in/request/TripUpdateRequest.java index ccbb2f7..2cbb97b 100644 --- a/src/main/java/com/retrip/trip/application/in/request/TripUpdateRequest.java +++ b/src/main/java/com/retrip/trip/application/in/request/TripUpdateRequest.java @@ -1,6 +1,7 @@ package com.retrip.trip.application.in.request; import com.retrip.trip.domain.entity.Trip; +import com.retrip.trip.domain.entity.TripDestinations; import com.retrip.trip.domain.entity.TripHashTags; import com.retrip.trip.domain.vo.*; import io.swagger.v3.oas.annotations.media.Schema; @@ -22,7 +23,7 @@ public record TripUpdateRequest( @Schema(description = "여행 위치 ID", example = "550e8400-e29b-41d4-a716-446655440001") @NotNull - UUID locationId, + List destinationIds, @Schema(description = "여행 시작 날짜", example = "2025-06-15") @FutureOrPresent @@ -35,8 +36,8 @@ public record TripUpdateRequest( @Schema(description = "여행 최대 참가 인원") Integer maxParticipants, - @Schema(description = "HashTag") - List hashTags, + @Schema(description = "HashTags") + List hashTags, @Schema(description = "여행 대표 이미지 URL") String imageUrl, @@ -44,6 +45,23 @@ public record TripUpdateRequest( @Schema(description = "여행 카테고리") TripCategory category ) { + @Schema(description = "해시태그 입력") + public record HashTagInput( + @Schema(description = "해시태그 값", example = "10대") + String tag, + + @Schema(description = "정렬 순서", example = "1") + int order + ) { + } + + public TripDestinations toTripDestinations(Trip trip) { + if (destinationIds == null || destinationIds.isEmpty()) { + return null; + } + return new TripDestinations(trip, destinationIds); + } + public TripTitle toTripTitle() { if (title != null) { return new TripTitle(title); @@ -66,9 +84,10 @@ public TripPeriod toTripPeriod() { } public TripHashTags toHashTags(Trip trip) { - if (hashTags != null) { - return new TripHashTags(trip, hashTags); - } - return null; + if (hashTags == null || hashTags.isEmpty()) return null; + return new TripHashTags(trip, hashTags.stream() + .map(h -> new HashTagInfo(h.tag(), h.order())) + .toList()); } + } diff --git a/src/main/java/com/retrip/trip/application/in/request/context/UserContext.java b/src/main/java/com/retrip/trip/application/in/request/context/UserContext.java index 3d71bf5..e817fbb 100644 --- a/src/main/java/com/retrip/trip/application/in/request/context/UserContext.java +++ b/src/main/java/com/retrip/trip/application/in/request/context/UserContext.java @@ -16,8 +16,14 @@ private enum Gender { } public static UserContext mockOf() { + + String hex = "99999999999999999999999999999991"; + +// 바로 변환 + UUID uuid = UUID.fromString(hex.replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5")); + return new UserContext( - UUID.randomUUID(), + uuid, "Tester", "test@naver.com", "홍길동", diff --git a/src/main/java/com/retrip/trip/application/in/response/TripUpdateResponse.java b/src/main/java/com/retrip/trip/application/in/response/TripUpdateResponse.java index 428b375..bf64912 100644 --- a/src/main/java/com/retrip/trip/application/in/response/TripUpdateResponse.java +++ b/src/main/java/com/retrip/trip/application/in/response/TripUpdateResponse.java @@ -1,21 +1,21 @@ package com.retrip.trip.application.in.response; import com.retrip.trip.domain.entity.Trip; -import com.retrip.trip.domain.entity.TripHashTag; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.UUID; -@Schema(description = "여행 생성 Response") +@Schema(description = "여행 수정 Response") public record TripUpdateResponse( @Schema(description = "여행 ID", example = "550e8400-e29b-41d4-a716-446655440000") UUID id, - @Schema(description = "여행 목적지 ID", example = "550e8400-e29b-41d4-a716-446655440001") - UUID destinationId, + @Schema(description = "여행 목적지 ID 들", example = "550e8400-e29b-41d4-a716-446655440001") + List destinationIds, @Schema(description = "여행 제목", example = "파리 여행") String title, @@ -33,7 +33,7 @@ public record TripUpdateResponse( int maxParticipants, @Schema(description = "여행 카테고리") - List hashTags, + List hashTags, @Schema(description = "여행 카테고리") String category, @@ -44,25 +44,42 @@ public record TripUpdateResponse( @Schema(description = "여행 일정 리스트") List itineraries ) { + public static TripUpdateResponse of(Trip trip) { return new TripUpdateResponse( trip.getId(), - trip.getDestinationId(), + trip.getDestinations().getDestinationIds(), trip.getTitle().getValue(), trip.getDescription().getValue(), trip.getPeriod().getStart(), trip.getPeriod().getEnd(), trip.getTripParticipants().getMaxParticipants(), - trip.getHashTags().getValues().stream().map(TripHashTag::getName).toList(), + trip.getHashTags().getValues().stream() + .map(hashtag -> new HashTagResponse(hashtag.getName(), + hashtag.getTagOrder())) + .sorted(Comparator.comparingInt(HashTagResponse::order)) + .toList(), trip.getCategory().getViewName(), trip.getImageUrl(), trip.getItineraries() == null ? new ArrayList<>() : trip.getItineraries().getValues().stream() - .map(i -> new ItineraryUpdateResponse(i.getId(), i.getName(), i.getDate())) + .map(i -> new ItineraryUpdateResponse(i.getId(), i.getName(), + i.getDate())) .toList() ); } + @Schema(description = "해시태그 Response") + public record HashTagResponse( + @Schema(description = "해시태그") + String tag, + + @Schema(description = "정렬 순서") + int order + ) { + + } + @Schema(description = "여행 일정 Response") private record ItineraryUpdateResponse( @Schema(description = "일정 ID") @@ -74,5 +91,6 @@ private record ItineraryUpdateResponse( @Schema(description = "일정 날짜") LocalDate date ) { + } } diff --git a/src/main/java/com/retrip/trip/domain/entity/Trip.java b/src/main/java/com/retrip/trip/domain/entity/Trip.java index ff49dfb..384525f 100644 --- a/src/main/java/com/retrip/trip/domain/entity/Trip.java +++ b/src/main/java/com/retrip/trip/domain/entity/Trip.java @@ -208,7 +208,7 @@ public boolean isNotTripRecruitingStatus() { public void update( UUID memberId, - UUID destinationId, + TripDestinations destinations, TripTitle tripTitle, TripDescription tripDescription, TripHashTags tripHashTags, @@ -220,8 +220,8 @@ public void update( throw new TripUpdateFailedException(); } - if (destinationId != null) { - this.destinationId = destinationId; + if (destinations != null) { + this.destinations.update(destinations.getValues()); } if (tripTitle != null) { @@ -232,8 +232,7 @@ public void update( } if (tripHashTags != null) { - this.hashTags.getValues().clear(); - this.hashTags.getValues().addAll(tripHashTags.getValues()); + this.hashTags.update(tripHashTags.getValues()); } if (maxParticipants != null) { diff --git a/src/main/java/com/retrip/trip/domain/entity/TripDestinations.java b/src/main/java/com/retrip/trip/domain/entity/TripDestinations.java index a5cd501..ebdf410 100644 --- a/src/main/java/com/retrip/trip/domain/entity/TripDestinations.java +++ b/src/main/java/com/retrip/trip/domain/entity/TripDestinations.java @@ -5,9 +5,11 @@ import jakarta.persistence.CascadeType; import jakarta.persistence.Embeddable; import jakarta.persistence.OneToMany; + import java.util.ArrayList; import java.util.List; import java.util.UUID; + import lombok.Getter; import lombok.NoArgsConstructor; @@ -30,4 +32,9 @@ public List getDestinationIds() { .map(TripDestination::getDestinationId) .toList(); } + + public void update(List tripDestinations) { + this.values.clear(); + this.values.addAll(tripDestinations); + } } diff --git a/src/main/java/com/retrip/trip/domain/entity/TripHashTags.java b/src/main/java/com/retrip/trip/domain/entity/TripHashTags.java index 1dabef4..b81cd3a 100644 --- a/src/main/java/com/retrip/trip/domain/entity/TripHashTags.java +++ b/src/main/java/com/retrip/trip/domain/entity/TripHashTags.java @@ -10,9 +10,9 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.OrderBy; + import java.util.ArrayList; import java.util.Comparator; -import java.util.HashSet; import java.util.List; import java.util.stream.Collectors; @@ -51,4 +51,9 @@ public List getHashTagNames() { .map(TripHashTag::getName) .collect(Collectors.toList()); } + + public void update(List tripHashTags) { + this.values.clear(); + this.values.addAll(tripHashTags); + } }