From f7ac244a3e85be3c5a8fe6734c295678a3af84fb Mon Sep 17 00:00:00 2001 From: Kwak Seong Joon Date: Thu, 11 Jul 2024 02:27:22 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[feat]=20DateController=EC=97=90=20?= =?UTF-8?q?=EA=B0=80=EA=B9=8C=EC=9A=B4=EC=9D=BC=EC=A0=95=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84=20-=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dateroad/date/api/DateController.java | 8 ++++++++ .../org/dateroad/date/dto/response/DateGetNearestRes.java | 2 ++ .../src/main/java/org/dateroad/code/FailureCode.java | 1 + .../src/main/java/org/dateroad/date/domain/Date.java | 2 ++ 4 files changed, 13 insertions(+) create mode 100644 dateroad-api/src/main/java/org/dateroad/date/dto/response/DateGetNearestRes.java diff --git a/dateroad-api/src/main/java/org/dateroad/date/api/DateController.java b/dateroad-api/src/main/java/org/dateroad/date/api/DateController.java index b19a3d36..8f279ecc 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/api/DateController.java +++ b/dateroad-api/src/main/java/org/dateroad/date/api/DateController.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.dateroad.auth.argumentresolve.UserId; import org.dateroad.date.dto.request.DateCreateReq; +import org.dateroad.date.dto.response.DateGetNearestRes; import org.dateroad.date.service.DateService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -27,4 +28,11 @@ public ResponseEntity deleteDate(@UserId final Long userId, dateService.deleteDate(userId, dateId); return ResponseEntity.ok().build(); } + + @GetMapping("/nearest") + public ResponseEntity getNearestDate(@UserId final Long userId) { + DateGetNearestRes dateGetNearestRes = dateService.getNearestDate(userId); + return ResponseEntity + .ok(dateGetNearestRes); + } } diff --git a/dateroad-api/src/main/java/org/dateroad/date/dto/response/DateGetNearestRes.java b/dateroad-api/src/main/java/org/dateroad/date/dto/response/DateGetNearestRes.java new file mode 100644 index 00000000..a1ad0a17 --- /dev/null +++ b/dateroad-api/src/main/java/org/dateroad/date/dto/response/DateGetNearestRes.java @@ -0,0 +1,2 @@ +package org.dateroad.date.dto.response;public record DateGetNearestRes() { +} diff --git a/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java b/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java index 77fa8f1d..aceab748 100644 --- a/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java +++ b/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java @@ -53,6 +53,7 @@ public enum FailureCode { USER_NOT_FOUND(HttpStatus.NOT_FOUND, "e4042", "유저를 찾을 수 없습니다."), COURSE_THUMBNAIL_NOT_FOUND(HttpStatus.NOT_FOUND, "e4043", "코스 썸네일을 찾을수 없습니다."), DATE_NOT_FOUND(HttpStatus.NOT_FOUND, "e4044", "데이트를 찾을 수 없습니다."), + NEAREST_DATE_NOT_FOUND(HttpStatus.NOT_FOUND, "e4045", "다가오는 데이트를 찾을 수 없습니다."), /** * 405 Method Not Allowed diff --git a/dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java b/dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java index d750aee5..d6324723 100644 --- a/dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java +++ b/dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java @@ -10,6 +10,7 @@ import java.time.LocalTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import org.dateroad.user.domain.User; @@ -18,6 +19,7 @@ @SuperBuilder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) +@Getter @Table(name = "dates") public class Date extends DateBase { @Id From 88f74a72d52ac7ffe9552ec4dcce134229b9d2d5 Mon Sep 17 00:00:00 2001 From: Kwak Seong Joon Date: Thu, 11 Jul 2024 02:27:34 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[feat]=20DTO=20=EC=B6=94=EA=B0=80=20-=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date/dto/request/DateCreateReq.java | 2 +- .../date/dto/response/DateGetNearestRes.java | 37 ++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/dateroad-api/src/main/java/org/dateroad/date/dto/request/DateCreateReq.java b/dateroad-api/src/main/java/org/dateroad/date/dto/request/DateCreateReq.java index 57832b3f..f93de9d9 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/dto/request/DateCreateReq.java +++ b/dateroad-api/src/main/java/org/dateroad/date/dto/request/DateCreateReq.java @@ -10,7 +10,7 @@ public record DateCreateReq( String title, @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd", timezone = "Asia/Seoul") LocalDate date, - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "hh:mm a", timezone = "Asia/Seoul") LocalTime startAt, List tags, String country, diff --git a/dateroad-api/src/main/java/org/dateroad/date/dto/response/DateGetNearestRes.java b/dateroad-api/src/main/java/org/dateroad/date/dto/response/DateGetNearestRes.java index a1ad0a17..07138a62 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/dto/response/DateGetNearestRes.java +++ b/dateroad-api/src/main/java/org/dateroad/date/dto/response/DateGetNearestRes.java @@ -1,2 +1,37 @@ -package org.dateroad.date.dto.response;public record DateGetNearestRes() { +package org.dateroad.date.dto.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AccessLevel; +import lombok.Builder; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +@Builder(access = AccessLevel.PRIVATE) +public record DateGetNearestRes( + Long dateId, + int dDay, + String dateName, + int month, + int day, + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "hh:mm a", timezone = "Asia/Seoul") + LocalTime startAt +) { + public static DateGetNearestRes of(Long dateId, + int dDay, + String dateName, + int month, + int day, + LocalTime startAt) { + return DateGetNearestRes.builder() + .dateId(dateId) + .dDay(dDay) + .dateName(dateName) + .month(month) + .day(day) + .startAt(startAt) + .build(); + } + } From 5725396624f23b20798e122bc7edfbb785140643 Mon Sep 17 00:00:00 2001 From: Kwak Seong Joon Date: Thu, 11 Jul 2024 02:27:52 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[feat]=20=EA=B0=80=EA=B9=8C=EC=9A=B4=20?= =?UTF-8?q?=EC=9D=BC=EC=A0=95=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20-=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dateroad/date/service/DateRepository.java | 8 +++++ .../dateroad/date/service/DateService.java | 31 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/dateroad-api/src/main/java/org/dateroad/date/service/DateRepository.java b/dateroad-api/src/main/java/org/dateroad/date/service/DateRepository.java index e723c8b3..3758eb34 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/service/DateRepository.java +++ b/dateroad-api/src/main/java/org/dateroad/date/service/DateRepository.java @@ -2,6 +2,14 @@ import org.dateroad.date.domain.Date; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDate; +import java.util.Optional; public interface DateRepository extends JpaRepository { + + Optional findTopByUserIdAndDateAfterOrderByDateAscStartAtAsc( + @Param("userId") Long userId, + @Param("currentDate") LocalDate currentDate); } diff --git a/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java b/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java index 005a5943..a110d34f 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java +++ b/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java @@ -1,11 +1,13 @@ package org.dateroad.date.service; import lombok.RequiredArgsConstructor; +import lombok.experimental.SuperBuilder; import org.dateroad.code.FailureCode; import org.dateroad.date.domain.Date; import org.dateroad.date.dto.request.DateCreateReq; import org.dateroad.date.dto.request.PlaceCreateReq; import org.dateroad.date.dto.request.TagCreateReq; +import org.dateroad.date.dto.response.DateGetNearestRes; import org.dateroad.date.repository.DatePlaceRepository; import org.dateroad.date.repository.DateTagRepository; import org.dateroad.exception.EntityNotFoundException; @@ -17,6 +19,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.List; @RequiredArgsConstructor @@ -46,6 +50,22 @@ public void deleteDate(Long userId, Long dateId) { dateRepository.deleteById(dateId); } + public DateGetNearestRes getNearestDate(final Long userId) { + LocalDate currentDate = LocalDate.now(); + User findUser = getUser(userId); + Date nearest = findNearestDate(findUser.getId(), currentDate) ; + int dDay = calculateDDay(nearest.getDate(), currentDate); + return DateGetNearestRes + .of( + nearest.getId(), + dDay, + nearest.getTitle(), + nearest.getDate().getMonthValue(), + nearest.getDate().getDayOfMonth(), + nearest.getStartAt()); + + } + private User getUser(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new EntityNotFoundException(FailureCode.USER_NOT_FOUND)); @@ -79,4 +99,15 @@ private void validateDate(User findUser, Date findDate) { throw new ForbiddenException(FailureCode.DATE_DELETE_ACCESS_DENIED); } } + + //dDay 계산 + private int calculateDDay(final LocalDate eventDate, final LocalDate now) { + return (int) ChronoUnit.DAYS.between(now, eventDate); + } + + //가장 가까운 데이트 가져오기 + private Date findNearestDate(final Long userId, final LocalDate now) { + return dateRepository.findTopByUserIdAndDateAfterOrderByDateAscStartAtAsc(userId, now) + .orElseThrow(() -> new EntityNotFoundException(FailureCode.NEAREST_DATE_NOT_FOUND)); + } } From b28376caff1462db81016acb511afb000719bb89 Mon Sep 17 00:00:00 2001 From: Kwak Seong Joon Date: Thu, 11 Jul 2024 04:31:04 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[feat]=20=EA=B0=80=EC=9E=A5=20=EA=B0=80?= =?UTF-8?q?=EA=B9=8C=EC=9A=B4=20=EC=9D=BC=EC=A0=95=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EA=B8=B0=20=EA=B5=AC=ED=98=84=20-=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date/dto/request/DateCreateReq.java | 2 +- .../dateroad/date/service/DateRepository.java | 10 +++---- .../dateroad/date/service/DateService.java | 30 +++++++++++-------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/dateroad-api/src/main/java/org/dateroad/date/dto/request/DateCreateReq.java b/dateroad-api/src/main/java/org/dateroad/date/dto/request/DateCreateReq.java index f93de9d9..57832b3f 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/dto/request/DateCreateReq.java +++ b/dateroad-api/src/main/java/org/dateroad/date/dto/request/DateCreateReq.java @@ -10,7 +10,7 @@ public record DateCreateReq( String title, @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd", timezone = "Asia/Seoul") LocalDate date, - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "hh:mm a", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm", timezone = "Asia/Seoul") LocalTime startAt, List tags, String country, diff --git a/dateroad-api/src/main/java/org/dateroad/date/service/DateRepository.java b/dateroad-api/src/main/java/org/dateroad/date/service/DateRepository.java index 3758eb34..6f3ce0c7 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/service/DateRepository.java +++ b/dateroad-api/src/main/java/org/dateroad/date/service/DateRepository.java @@ -2,14 +2,14 @@ import org.dateroad.date.domain.Date; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.repository.query.Param; import java.time.LocalDate; +import java.time.LocalTime; import java.util.Optional; public interface DateRepository extends JpaRepository { - - Optional findTopByUserIdAndDateAfterOrderByDateAscStartAtAsc( - @Param("userId") Long userId, - @Param("currentDate") LocalDate currentDate); + Optional findFirstByUserIdAndDateAfterOrDateAndStartAtAfterOrderByDateAscStartAtAsc( + Long userId, LocalDate currentDate, LocalDate sameDay, LocalTime currentTime); } + + diff --git a/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java b/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java index a110d34f..88e8335b 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java +++ b/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java @@ -1,7 +1,6 @@ package org.dateroad.date.service; import lombok.RequiredArgsConstructor; -import lombok.experimental.SuperBuilder; import org.dateroad.code.FailureCode; import org.dateroad.date.domain.Date; import org.dateroad.date.dto.request.DateCreateReq; @@ -20,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.time.LocalTime; import java.time.temporal.ChronoUnit; import java.util.List; @@ -52,18 +52,19 @@ public void deleteDate(Long userId, Long dateId) { public DateGetNearestRes getNearestDate(final Long userId) { LocalDate currentDate = LocalDate.now(); + LocalTime currentTime = LocalTime.now(); User findUser = getUser(userId); - Date nearest = findNearestDate(findUser.getId(), currentDate) ; - int dDay = calculateDDay(nearest.getDate(), currentDate); + Date nearest = findNearestDate(findUser.getId(), currentDate, currentTime); ; + int dDay = calculateDDay(nearest.getDateDay(), currentDate); return DateGetNearestRes .of( nearest.getId(), dDay, nearest.getTitle(), - nearest.getDate().getMonthValue(), - nearest.getDate().getDayOfMonth(), - nearest.getStartAt()); - + nearest.getDateDay().getMonthValue(), + nearest.getDateDay().getDayOfMonth(), + nearest.getStartAt() + ); } private User getUser(Long userId) { @@ -101,13 +102,18 @@ private void validateDate(User findUser, Date findDate) { } //dDay 계산 - private int calculateDDay(final LocalDate eventDate, final LocalDate now) { - return (int) ChronoUnit.DAYS.between(now, eventDate); + private int calculateDDay(LocalDate eventDate, LocalDate currentDate) { + if (eventDate.isEqual(currentDate)) { + return 0; + } else { + return (int) ChronoUnit.DAYS.between(currentDate, eventDate); + } } //가장 가까운 데이트 가져오기 - private Date findNearestDate(final Long userId, final LocalDate now) { - return dateRepository.findTopByUserIdAndDateAfterOrderByDateAscStartAtAsc(userId, now) - .orElseThrow(() -> new EntityNotFoundException(FailureCode.NEAREST_DATE_NOT_FOUND)); + private Date findNearestDate(Long userId, LocalDate currentDate, LocalTime currentTime) { + return dateRepository.findFirstByUserIdAndDateAfterOrDateAndStartAtAfterOrderByDateAscStartAtAsc(userId, currentDate, currentDate, currentTime) + .orElseThrow(() -> new EntityNotFoundException(FailureCode.DATE_NOT_FOUND)); } + } From 197c573622de96215ff771d08f113ef65cdbb200 Mon Sep 17 00:00:00 2001 From: Kwak Seong Joon Date: Thu, 11 Jul 2024 04:42:05 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[fix]=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20-=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dateroad/date/service/DateService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java b/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java index 88e8335b..a5f41813 100644 --- a/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java +++ b/dateroad-api/src/main/java/org/dateroad/date/service/DateService.java @@ -55,14 +55,14 @@ public DateGetNearestRes getNearestDate(final Long userId) { LocalTime currentTime = LocalTime.now(); User findUser = getUser(userId); Date nearest = findNearestDate(findUser.getId(), currentDate, currentTime); ; - int dDay = calculateDDay(nearest.getDateDay(), currentDate); + int dDay = calculateDDay(nearest.getDate(), currentDate); return DateGetNearestRes .of( nearest.getId(), dDay, nearest.getTitle(), - nearest.getDateDay().getMonthValue(), - nearest.getDateDay().getDayOfMonth(), + nearest.getDate().getMonthValue(), + nearest.getDate().getDayOfMonth(), nearest.getStartAt() ); } From 6bcd96225dfebecfd04345ae7821f107a22eb36f Mon Sep 17 00:00:00 2001 From: Kwak Seong Joon Date: Fri, 12 Jul 2024 04:45:30 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[fix]=20=EA=B0=99=EC=9D=80=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=82=AD=EC=A0=9C=20-?= =?UTF-8?q?=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java b/dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java index 5fd26215..42360067 100644 --- a/dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java +++ b/dateroad-domain/src/main/java/org/dateroad/date/domain/Date.java @@ -20,7 +20,6 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) -@Getter @Table(name = "dates") public class Date extends DateBase { @Id