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
@@ -1,6 +1,13 @@
package org.withtime.be.withtimebe.domain.date.controller.query;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.Explode;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.enums.ParameterStyle;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand All @@ -15,6 +22,7 @@
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.DateCourse;
import org.withtime.be.withtimebe.domain.date.entity.enums.*;
import org.withtime.be.withtimebe.domain.date.service.query.DateQueryService;
import org.withtime.be.withtimebe.domain.member.entity.Member;
import org.withtime.be.withtimebe.global.annotation.SwaggerPageable;
Expand All @@ -33,11 +41,29 @@ public class DateQueryController {
@ApiResponse(responseCode = "200", description = "μ„±κ³΅μž…λ‹ˆλ‹€."),
@ApiResponse(responseCode = "404", description = "DATE_COURSE404_1 : ν•΄λ‹Ήν•˜λŠ” 데이트 μ½”μŠ€λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.")
})
@Parameters({
@Parameter(name = "datePriceRange", in = ParameterIn.QUERY,
schema = @Schema(implementation = DatePriceRange.class)),
@Parameter(name = "datePlaces", in = ParameterIn.QUERY,
description = "λ§Œλ‚  μž₯μ†Œ", required = false,
style = ParameterStyle.FORM, explode = Explode.TRUE,
array = @ArraySchema(schema = @Schema(type = "string"))),
@Parameter(name = "dateDurationTime", in = ParameterIn.QUERY,
schema = @Schema(implementation = DateTime.class)),
@Parameter(name = "mealTypes", in = ParameterIn.QUERY, description = "식사 νƒ€μž…",
style = ParameterStyle.FORM, explode = Explode.TRUE,
array = @ArraySchema(schema = @Schema(type = "string",allowableValues = { "BREAKFAST", "LUNCH", "DINNER" }))),
@Parameter(name = "transportation", in = ParameterIn.QUERY,
schema = @Schema(implementation = Transportation.class)),
@Parameter(name = "userPreferredKeywords", in = ParameterIn.QUERY, description = "ν‚€μ›Œλ“œ",
style = ParameterStyle.FORM, explode = Explode.TRUE,
array = @ArraySchema(schema = @Schema(type = "string")))
})
@SwaggerPageable
@GetMapping
public DefaultResponse<DateResponseDTO.DateCourseList> findDateCourses(
@PageableDefault(page = 0, size = 10) Pageable pageable,
@ParameterObject DateRequestDTO.DateCourseSearchCond dateCourseSearchCond,
@ModelAttribute @ParameterObject DateRequestDTO.DateCourseSearchCond dateCourseSearchCond,
@AuthenticatedMember Member member
) {
DateResponseDTO.DateCourseList response = dateQueryService.findDateCourses(dateCourseSearchCond, pageable, member);
Expand All @@ -50,11 +76,29 @@ public DefaultResponse<DateResponseDTO.DateCourseList> findDateCourses(
@ApiResponse(responseCode = "DATE_COURSE_BOOKMARK404_1",
description = "ν•΄λ‹Ή μ½”μŠ€λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€")
})
@Parameters({
@Parameter(name = "datePriceRange", in = ParameterIn.QUERY,
schema = @Schema(implementation = DatePriceRange.class)),
@Parameter(name = "datePlaces", in = ParameterIn.QUERY,
description = "λ§Œλ‚  μž₯μ†Œ", required = false,
style = ParameterStyle.FORM, explode = Explode.TRUE,
array = @ArraySchema(schema = @Schema(type = "string"))),
@Parameter(name = "dateDurationTime", in = ParameterIn.QUERY,
schema = @Schema(implementation = DateTime.class)),
@Parameter(name = "mealTypes", in = ParameterIn.QUERY, description = "식사 νƒ€μž…",
style = ParameterStyle.FORM, explode = Explode.TRUE,
array = @ArraySchema(schema = @Schema(implementation = MealType.class))),
@Parameter(name = "transportation", in = ParameterIn.QUERY,
schema = @Schema(implementation = Transportation.class)),
@Parameter(name = "userPreferredKeywords", in = ParameterIn.QUERY, description = "ν‚€μ›Œλ“œ",
style = ParameterStyle.FORM, explode = Explode.TRUE,
array = @ArraySchema(schema = @Schema(type = "string")))
})
@SwaggerPageable
@PostMapping("/bookmarks/search")
@GetMapping("/bookmarks/search")
public DefaultResponse<DateResponseDTO.DateCourseList> findDateCourseBookmark(
@PageableDefault(page = 0, size = 10) Pageable pageable,
@ModelAttribute DateRequestDTO.DateCourseSearchCond dateCourseSearchCond,
@ModelAttribute @ParameterObject DateRequestDTO.DateCourseSearchCond dateCourseSearchCond,
@AuthenticatedMember Member member
){
Page<DateCourse> bookmarkedDateCourses = dateQueryService.findDateCourseBookmarks(dateCourseSearchCond, pageable, member);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.withtime.be.withtimebe.domain.date.entity.*;
import org.withtime.be.withtimebe.domain.member.entity.Member;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Collections;
Expand Down Expand Up @@ -132,6 +131,7 @@ public static DateResponseDTO.DateCourse createDateCourse(DateCourse dateCourse,
.toList();

return DateResponseDTO.DateCourse.builder()
.dateCourseId(dateCourse.getId())
.name(dateCourse.getName())
.datePlaces(datePlaces)
.isBookmarked(bookmarked)
Expand All @@ -141,7 +141,7 @@ public static DateResponseDTO.DateCourse createDateCourse(DateCourse dateCourse,

public static DateResponseDTO.DateCourseSearchCondInfo createSearchCond(DateRequestDTO.DateCourseSearchCond cond){
return DateResponseDTO.DateCourseSearchCondInfo.builder()
.budget(cond.budget())
.budget(cond.datePriceRange())
.datePlaces(cond.datePlaces())
.mealTypes(cond.mealTypes())
.transportation(cond.transportation())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.withtime.be.withtimebe.domain.date.dto.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
Expand Down Expand Up @@ -65,11 +64,13 @@ public record SaveDateCourse(
){}

public record DateCourseSearchCond(
DatePriceRange budget,
DatePriceRange datePriceRange,
List<String> datePlaces,
DateTime dateDurationTime,
@Schema(requiredMode = Schema.RequiredMode.NOT_REQUIRED, nullable = true)
List<MealType> mealTypes,
Transportation transportation,
@Schema(requiredMode = Schema.RequiredMode.NOT_REQUIRED, nullable = true)
List<String> userPreferredKeywords
){}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public record DatePlace(

@Builder
public record DateCourse(
Long dateCourseId,
String name,
List<DateResponseDTO.DatePlace> datePlaces,
DateCourseSearchCondInfo dateCourseSearchCondInfo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import java.util.Collection;
import java.util.List;

import static org.springframework.util.ObjectUtils.isEmpty;
import static org.withtime.be.withtimebe.domain.date.entity.QDateCourse.dateCourse;


Expand All @@ -37,7 +36,7 @@ public Page<DateCourse> searchDateCourseByApplyPage(DateRequestDTO.DateCourseSea
boolean hasKeywords = dateCourseSearchCond.userPreferredKeywords() != null && !dateCourseSearchCond.userPreferredKeywords().isEmpty();

List<DateCourse> content = queryFactory.selectFrom(dateCourse)
.where(datePriceRangeEq(dateCourseSearchCond.budget()),
.where(datePriceRangeEq(dateCourseSearchCond.datePriceRange()),
datePlacesEq(dateCourseSearchCond.datePlaces()),
dateTimeEq(dateCourseSearchCond.dateDurationTime()),
mealTypesEq(dateCourseSearchCond.mealTypes()),
Expand All @@ -51,7 +50,7 @@ public Page<DateCourse> searchDateCourseByApplyPage(DateRequestDTO.DateCourseSea

Long total = queryFactory.select(dateCourse.id.countDistinct())
.from(dateCourse)
.where(datePriceRangeEq(dateCourseSearchCond.budget()),
.where(datePriceRangeEq(dateCourseSearchCond.datePriceRange()),
datePlacesEq(dateCourseSearchCond.datePlaces()),
dateTimeEq(dateCourseSearchCond.dateDurationTime()),
mealTypesEq(dateCourseSearchCond.mealTypes()),
Expand All @@ -75,7 +74,7 @@ public Page<DateCourse> searchDateCourseBookmarkByMemberAndApplyPage(DateReques
List<DateCourse> content = queryFactory.selectFrom(dateCourse)
.join(dateCourseBookmark).on(dateCourseBookmark.dateCourse.eq(dateCourse))
.where(dateCourseBookmark.member.id.eq(member.getId()),
datePriceRangeEq(dateCourseSearchCond.budget()),
datePriceRangeEq(dateCourseSearchCond.datePriceRange()),
datePlacesEq(dateCourseSearchCond.datePlaces()),
dateTimeEq(dateCourseSearchCond.dateDurationTime()),
mealTypesEq(dateCourseSearchCond.mealTypes()),
Expand All @@ -91,7 +90,7 @@ public Page<DateCourse> searchDateCourseBookmarkByMemberAndApplyPage(DateReques
.from(dateCourse)
.join(dateCourseBookmark).on(dateCourseBookmark.dateCourse.eq(dateCourse))
.where(dateCourseBookmark.member.id.eq(member.getId()),
datePriceRangeEq(dateCourseSearchCond.budget()),
datePriceRangeEq(dateCourseSearchCond.datePriceRange()),
datePlacesEq(dateCourseSearchCond.datePlaces()),
dateTimeEq(dateCourseSearchCond.dateDurationTime()),
mealTypesEq(dateCourseSearchCond.mealTypes()),
Expand Down Expand Up @@ -124,19 +123,19 @@ private BooleanExpression datePriceRangeEq(DatePriceRange datePriceRange){
}

private BooleanExpression datePlacesEq(List<String> datePlaces){
return datePlaces.isEmpty() ? null : dateCourse.datePlaces.any().in(datePlaces);
return datePlaces == null ? null : dateCourse.datePlaces.any().in(datePlaces);
}

private BooleanExpression dateTimeEq(DateTime dateTime){
return isEmpty(dateTime) ? null : dateCourse.dateTime.eq(dateTime);
return dateTime == null ? null : dateCourse.dateTime.eq(dateTime);
}

private BooleanExpression mealTypesEq(List<MealType> mealTypes){
return mealTypes.isEmpty() ? null : dateCourse.mealTypes.any().in(mealTypes);
return mealTypes== null ? null : dateCourse.mealTypes.any().in(mealTypes);
}

private BooleanExpression transportationEq(Transportation transportation){
return isEmpty(transportation) ? null : dateCourse.transportation.eq(transportation);
return transportation == null ? null : dateCourse.transportation.eq(transportation);
}

private BooleanExpression allEq(DatePriceRange datePriceRange, List<String> datePlaces,
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -149,4 +149,4 @@ scheduler:
sync-cron: "0 */5 * * * *" # 5λΆ„λ§ˆλ‹€ Redis -> Mongo 동기화
date-place:
enabled: true
sync-cron: "0 0 0 * * *" # 맀일 μžμ •λ§ˆλ‹€ 동기화
sync-cron: "0 0 0 * * *" # 맀일 μžμ •λ§ˆλ‹€ 동기화