Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import org.withtime.be.withtimebe.global.annotation.SwaggerPageable;
import org.withtime.be.withtimebe.global.security.annotation.AuthenticatedMember;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/date-courses")
Expand Down Expand Up @@ -63,9 +65,15 @@ public class DateQueryController {
@GetMapping
public DefaultResponse<DateResponseDTO.DateCourseList> findDateCourses(
@PageableDefault(page = 0, size = 10) Pageable pageable,
@ModelAttribute @ParameterObject DateRequestDTO.DateCourseSearchCond dateCourseSearchCond,
@RequestParam(required = false) DatePriceRange datePriceRange,
@RequestParam(required = false) List<String> datePlaces,
@RequestParam(required = false) DateTime dateDurationTime,
@RequestParam(required = false) List<MealType> mealTypes,
@RequestParam(required = false) Transportation transportation,
@RequestParam(required = false) List<String> userPreferredKeywords,
@AuthenticatedMember Member member
) {
DateRequestDTO.DateCourseSearchCond dateCourseSearchCond = DateConverter.createSearchCondFromParam(datePriceRange, datePlaces, dateDurationTime, mealTypes, transportation, userPreferredKeywords);
DateResponseDTO.DateCourseList response = dateQueryService.findDateCourses(dateCourseSearchCond, pageable, member);
return DefaultResponse.ok(response);
}
Expand Down Expand Up @@ -98,11 +106,17 @@ public DefaultResponse<DateResponseDTO.DateCourseList> findDateCourses(
@GetMapping("/bookmarks/search")
public DefaultResponse<DateResponseDTO.DateCourseList> findDateCourseBookmark(
@PageableDefault(page = 0, size = 10) Pageable pageable,
@ModelAttribute @ParameterObject DateRequestDTO.DateCourseSearchCond dateCourseSearchCond,
@RequestParam(required = false) DatePriceRange datePriceRange,
@RequestParam(required = false) List<String> datePlaces,
@RequestParam(required = false) DateTime dateDurationTime,
@RequestParam(required = false) List<MealType> mealTypes,
@RequestParam(required = false) Transportation transportation,
@RequestParam(required = false) List<String> userPreferredKeywords,
@AuthenticatedMember Member member
){
DateRequestDTO.DateCourseSearchCond dateCourseSearchCond = DateConverter.createSearchCondFromParam(datePriceRange, datePlaces, dateDurationTime, mealTypes, transportation, userPreferredKeywords);
Page<DateCourse> bookmarkedDateCourses = dateQueryService.findDateCourseBookmarks(dateCourseSearchCond, pageable, member);
DateResponseDTO.DateCourseList response = DateConverter.createDateCourseList(bookmarkedDateCourses, null, dateCourseSearchCond);
DateResponseDTO.DateCourseList response = DateConverter.createDateCourseList(bookmarkedDateCourses, null);
return DefaultResponse.ok(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
import org.withtime.be.withtimebe.domain.date.dto.request.DateRequestDTO;
import org.withtime.be.withtimebe.domain.date.dto.response.DateResponseDTO;
import org.withtime.be.withtimebe.domain.date.entity.*;
import org.withtime.be.withtimebe.domain.date.entity.enums.DatePriceRange;
import org.withtime.be.withtimebe.domain.date.entity.enums.DateTime;
import org.withtime.be.withtimebe.domain.date.entity.enums.MealType;
import org.withtime.be.withtimebe.domain.date.entity.enums.Transportation;
import org.withtime.be.withtimebe.domain.member.entity.Member;

import java.time.LocalDateTime;
Expand Down Expand Up @@ -34,6 +38,11 @@ public static DateResponseDTO.DateCourseBookmark createDateCourseBookmarkRespons
public static DateCourse createDateCourse(DateRequestDTO.SaveDateCourse dateCourse){
return DateCourse.builder()
.name(dateCourse.name())
.datePriceRange(dateCourse.dateCourseSearchCond().datePriceRange())
.datePlaces(dateCourse.dateCourseSearchCond().datePlaces())
.dateTime(dateCourse.dateCourseSearchCond().dateDurationTime())
.mealTypes(dateCourse.dateCourseSearchCond().mealTypes())
.transportation(dateCourse.dateCourseSearchCond().transportation())
.build();
}

Expand Down Expand Up @@ -68,7 +77,7 @@ public static DateResponseDTO.DateCourseSearchCondInfo toDateCourseSearchCondInf
.dateDurationTime(request.dateDurationTime()) // 데이트 소요 시간
.mealTypes(request.mealPlan()) // 식사 계획
.transportation(request.transportation()) // 교통 수단
.userPreferredKeywords(request.userPreferredKeywords()) // 키워드
.dateCoursePlaceCategories(request.userPreferredKeywords()) // 키워드
.build();
}

Expand Down Expand Up @@ -132,10 +141,12 @@ public static DateResponseDTO.DatePlace createDatePlace(DatePlace datePlace,

// DateResponseDTO.DateCourse -> DateResponseDTO.DateCourse
public static DateResponseDTO.DateCourse createDateCourse(DateCourse dateCourse,
Set<Long> bookmarkedIds,
DateRequestDTO.DateCourseSearchCond cond){
Boolean bookmarked = null;
if (bookmarkedIds != null && !bookmarkedIds.isEmpty()) bookmarked = bookmarkedIds.contains(dateCourse.getId());
Set<Long> bookmarkedIds){
Boolean bookmarked = (bookmarkedIds == null)? null
: (dateCourse.getId() != null && bookmarkedIds.contains(dateCourse.getId()));
if (dateCourse.getId() != null) System.out.println("test1");
if (bookmarkedIds.contains(dateCourse.getId())) System.out.println("test2");

List<DateResponseDTO.DatePlace> datePlaces = dateCourse.getDatePlaceDateCourses().stream()
.map(dc -> DateConverter.createDatePlace(dc.getDatePlace(), dc.getStartTime(), dc.getEndTime()))
.toList();
Expand All @@ -145,28 +156,31 @@ public static DateResponseDTO.DateCourse createDateCourse(DateCourse dateCourse,
.name(dateCourse.getName())
.datePlaces(datePlaces)
.isBookmarked(bookmarked)
.dateCourseSearchCondInfo(createSearchCond(cond))
.dateCourseSearchCondInfo(createSearchCond(dateCourse))
.build();
}

public static DateResponseDTO.DateCourseSearchCondInfo createSearchCond(DateRequestDTO.DateCourseSearchCond cond){
public static DateResponseDTO.DateCourseSearchCondInfo createSearchCond(DateCourse dateCourse){
List<String> dateCoursePlaceCategories = dateCourse.getDateCoursePlaceCategories().stream()
.map(dcpc -> dcpc.getPlaceCategory().getLabel())
.toList();

return DateResponseDTO.DateCourseSearchCondInfo.builder()
.budget(cond.datePriceRange())
.datePlaces(cond.datePlaces())
.mealTypes(cond.mealTypes())
.transportation(cond.transportation())
.dateDurationTime(cond.dateDurationTime())
.userPreferredKeywords(cond.userPreferredKeywords())
.budget(dateCourse.getDatePriceRange())
.datePlaces(dateCourse.getDatePlaces())
.mealTypes(dateCourse.getMealTypes())
.transportation(dateCourse.getTransportation())
.dateDurationTime(dateCourse.getDateTime())
.dateCoursePlaceCategories(dateCoursePlaceCategories)
.build();
}

// Page<DateCourse> -> DateRequestDTO.DateCourseList
public static DateResponseDTO.DateCourseList createDateCourseList(Page<DateCourse> dateCourses, Set<Long> bookmarkedIds,
DateRequestDTO.DateCourseSearchCond cond){
public static DateResponseDTO.DateCourseList createDateCourseList(Page<DateCourse> dateCourses, Set<Long> bookmarkedIds){
List<DateResponseDTO.DateCourse> dateCourseList = dateCourses.stream()
.map(dc ->{
if (bookmarkedIds != null) return createDateCourse(dc, bookmarkedIds, cond);
return createDateCourse(dc, Collections.emptySet(), cond);
if (bookmarkedIds != null) return createDateCourse(dc, bookmarkedIds);
return createDateCourse(dc, Collections.emptySet());
})
.toList();

Expand All @@ -192,4 +206,22 @@ public static DateResponseDTO.SignatureDish toSignatureDish(Item item) {
.build();
}

public static DateRequestDTO.DateCourseSearchCond createSearchCondFromParam(
DatePriceRange datePriceRange,
List<String> datePlaces,
DateTime dateDurationTime,
List<MealType> mealTypes,
Transportation transportation,
List<String> userPreferredKeywords
){
return DateRequestDTO.DateCourseSearchCond.builder()
.datePriceRange(datePriceRange)
.datePlaces(datePlaces)
.dateDurationTime(dateDurationTime)
.mealTypes(mealTypes)
.transportation(transportation)
.userPreferredKeywords(userPreferredKeywords)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Builder;
import org.withtime.be.withtimebe.domain.date.entity.enums.DatePriceRange;
import org.withtime.be.withtimebe.domain.date.entity.enums.DateTime;
import org.withtime.be.withtimebe.domain.date.entity.enums.MealType;
Expand Down Expand Up @@ -60,9 +61,11 @@ public record CreateDateCourse(

public record SaveDateCourse(
List<Long> datePlaceIds,
String name
String name,
DateCourseSearchCond dateCourseSearchCond
){}

@Builder
public record DateCourseSearchCond(
DatePriceRange datePriceRange,
List<String> datePlaces,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import lombok.Builder;
import org.withtime.be.withtimebe.domain.date.entity.enums.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;

Expand Down Expand Up @@ -69,7 +67,7 @@ public record DateCourseSearchCondInfo(
DateTime dateDurationTime,
List<MealType> mealTypes,
Transportation transportation,
List<String> userPreferredKeywords
List<String> dateCoursePlaceCategories
){}

@Builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public class DateCourse extends BaseEntity {

@Builder.Default
@OneToMany(mappedBy = "dateCourse", cascade = CascadeType.ALL, orphanRemoval = true)
private List<DateCoursePlaceCategory> DateCoursePlaceCategory = new ArrayList<>();
private List<DateCoursePlaceCategory> dateCoursePlaceCategories = new ArrayList<>();

@Builder.Default
@OneToMany(mappedBy = "dateCourse", cascade = CascadeType.ALL, orphanRemoval = true)
Expand All @@ -73,4 +73,14 @@ public void addDatePlaceDateCourses(List<DatePlaceDateCourse> datePlaceDateCours
}
datePlaceDateCourses.addAll(datePlaceDateCourseList);
}

public void addDateCoursePlaceCategory(List<DateCoursePlaceCategory> dateCoursePlaceCategoryList) {
if (dateCoursePlaceCategoryList == null || dateCoursePlaceCategoryList.isEmpty()) return;
for (DateCoursePlaceCategory dateCoursePlaceCategory : dateCoursePlaceCategoryList) {
dateCoursePlaceCategory.setDateCourse(this);
}
dateCoursePlaceCategories.addAll(dateCoursePlaceCategoryList);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class DateCoursePlaceCategory {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "date_course_id", nullable = false)
@Setter
private DateCourse dateCourse;

@ManyToOne(fetch = FetchType.LAZY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,9 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.withtime.be.withtimebe.domain.date.entity.PlaceCategory;

import java.util.Collection;
import java.util.List;

public interface PlaceCategoryRepository extends JpaRepository<PlaceCategory, Long> {
List<PlaceCategory> findAllByLabelIn(List<String> labels);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.withtime.be.withtimebe.domain.date.converter.DateConverter;
import org.withtime.be.withtimebe.domain.date.dto.request.DateRequestDTO;
import org.withtime.be.withtimebe.domain.date.entity.DateCourse;
import org.withtime.be.withtimebe.domain.date.entity.DateCourseBookmark;
import org.withtime.be.withtimebe.domain.date.entity.DatePlace;
import org.withtime.be.withtimebe.domain.date.entity.DatePlaceDateCourse;
import org.withtime.be.withtimebe.domain.date.entity.*;
import org.withtime.be.withtimebe.domain.date.entity.enums.BudgetLevel;
import org.withtime.be.withtimebe.domain.date.entity.enums.KeywordForBudget;
import org.withtime.be.withtimebe.domain.date.entity.enums.MealType;
Expand All @@ -18,6 +15,7 @@
import org.withtime.be.withtimebe.domain.date.repository.DateCourseBookmarkRepository;
import org.withtime.be.withtimebe.domain.date.repository.DateCourseRepository;
import org.withtime.be.withtimebe.domain.date.repository.DatePlaceRepository;
import org.withtime.be.withtimebe.domain.date.repository.PlaceCategoryRepository;
import org.withtime.be.withtimebe.domain.date.service.command.dto.RecommendedCourseResult;
import org.withtime.be.withtimebe.domain.member.annotation.GetPoint;
import org.withtime.be.withtimebe.domain.member.annotation.enums.PointAction;
Expand All @@ -38,6 +36,7 @@ public class DateCommandServiceImpl implements DateCommandService{
private final DateCourseBookmarkRepository dateCourseBookmarkRepository;
private final DateCourseRepository dateCourseRepository;
private final DatePlaceRepository datePlaceRepository;
private final PlaceCategoryRepository placeCategoryRepository;

/** 단일 코스 생성 (저장/북마크/attemptCount 없음, excludedCourseSignatures로 중복 제외) */
@Transactional(readOnly = true)
Expand Down Expand Up @@ -296,10 +295,19 @@ public DateCourseBookmark createDateCourseBookmarkWithGeneratedCourse(
){
DateCourse dateCourse = DateConverter.createDateCourse(request);
List<DatePlace> datePlaces = datePlaceRepository.findAllById(request.datePlaceIds());
List<PlaceCategory> placeCategories = placeCategoryRepository.findAllByLabelIn(request.dateCourseSearchCond().userPreferredKeywords());

List<DatePlaceDateCourse> datePlaceDateCourses = datePlaces.stream()
.map(datePlace -> DatePlaceDateCourse.builder().datePlace(datePlace).build())
.toList();
dateCourse.addDatePlaceDateCourses(datePlaceDateCourses);

List<DateCoursePlaceCategory> dateCoursePlaceCategories = placeCategories.stream()
.map(dcpc -> DateCoursePlaceCategory.builder()
.placeCategory(dcpc)
.build())
.toList();
dateCourse.addDateCoursePlaceCategory(dateCoursePlaceCategories);
dateCourseRepository.save(dateCourse);

DateCourseBookmark dateCourseBookmark = DateConverter.createDateCourseBookmark(dateCourse, member);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public DateResponseDTO.DateCourseList findDateCourses(DateRequestDTO.DateCourseS
? new HashSet<>(dateCourseBookmarkRepository.findBookmarkedCourseIds(member.getId(), ids))
: java.util.Collections.emptySet();

return DateConverter.createDateCourseList(dateCourses, bookmarkedIds, dateCourseSearchCond);
return DateConverter.createDateCourseList(dateCourses, bookmarkedIds);
}

@LogPlaceCategory
Expand Down