diff --git a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java index 61fc2fc..cd97df4 100644 --- a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java +++ b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java @@ -40,6 +40,12 @@ public Anniversary addAnniversary(Long memberId, AnniversaryRequestDTO requestDT throw new IllegalArgumentException("Invalid anniversary type"); } + LocalDate requestDate = requestDTO.getDate(); + LocalDate currentDate = LocalDate.now(ZoneId.of("UTC")); + if (requestDate.isAfter(currentDate)) { + throw new IllegalArgumentException("Date cannot be in the future"); + } + ZonedDateTime zonedDateTime = requestDTO.getDate().atStartOfDay(ZoneId.of("UTC")); Timestamp timestamp = Timestamp.from(zonedDateTime.toInstant()); @@ -63,6 +69,12 @@ public Anniversary updateAnniversary(Long memberId, Long anniversaryId, Annivers validateAnniversaryType(requestDTO.getType()); + LocalDate requestDate = requestDTO.getDate(); + LocalDate currentDate = LocalDate.now(ZoneId.of("UTC")); + if (requestDate.isAfter(currentDate)) { + throw new IllegalArgumentException("Date cannot be in the future"); + } + ZonedDateTime zonedDateTime = requestDTO.getDate().atStartOfDay(ZoneId.of("UTC")); Timestamp timestamp = Timestamp.from(zonedDateTime.toInstant()); @@ -96,50 +108,51 @@ public List> calculateDDay(Anniversary anniversary) { LocalDate today = LocalDate.now(); LocalDateTime anniversaryDateTime = anniversary.getAnniversaryDate().toLocalDateTime(); LocalDate anniversaryDate = anniversaryDateTime.toLocalDate(); - long yearsDifference = ChronoUnit.YEARS.between(anniversaryDate, today); + + Map closestDDay = null; + int minDays = Integer.MAX_VALUE; if (anniversary.getType() == AnniversaryType.연인) { int daysPassed = (int) ChronoUnit.DAYS.between(anniversaryDate, today); int nextDay = ((daysPassed / 100) + 1) * 100; - for (int i = 0; i < 2; i++) { + for (int i = 0; i < 1; i++) { // Only find the next closest 100-day anniversary LocalDate hundredDays = anniversaryDate.plusDays(nextDay + i * 100); if (!hundredDays.isBefore(today)) { - Map dDay = new HashMap<>(); - dDay.put((nextDay + i * 100) + "days", (int) ChronoUnit.DAYS.between(today, hundredDays) - 1); - dDayList.add(dDay); + int daysToHundredDays = (int) ChronoUnit.DAYS.between(today, hundredDays) - 1; + if (daysToHundredDays < minDays) { + minDays = daysToHundredDays; + closestDDay = new HashMap<>(); + closestDDay.put((nextDay + i * 100) + "days", daysToHundredDays); + } + break; } } } - boolean isTodayAnniversary = false; + long yearsDifference = ChronoUnit.YEARS.between(anniversaryDate, today); for (int i = 1; i <= yearsDifference + 1; i++) { LocalDate yearAnniversary = anniversaryDate.plusYears(i); - int daysBetween = (int) ChronoUnit.DAYS.between(today, yearAnniversary); - if (daysBetween == 0) { - Map dDay = new HashMap<>(); - dDay.put("year", daysBetween); - dDayList.add(dDay); - isTodayAnniversary = true; + if (!yearAnniversary.isBefore(today)) { + int daysToYearAnniversary = (int) ChronoUnit.DAYS.between(today, yearAnniversary); + if (daysToYearAnniversary < minDays) { + minDays = daysToYearAnniversary; + closestDDay = new HashMap<>(); + closestDDay.put("year", daysToYearAnniversary); + } break; } } - if (!isTodayAnniversary) { - for (int i = 1; i <= yearsDifference + 1; i++) { - LocalDate yearAnniversary = anniversaryDate.plusYears(i); - if (!yearAnniversary.isBefore(today)) { - Map dDay = new HashMap<>(); - dDay.put("year", (int) ChronoUnit.DAYS.between(today, yearAnniversary)); - dDayList.add(dDay); - break; - } - } + if (closestDDay != null) { + dDayList.add(closestDDay); } + return dDayList; } + public List getDDayZeroAnniversaries(List anniversaries) { List dDayZeroList = new ArrayList<>(); diff --git a/src/main/java/com/example/fiurinee/domain/member/dto/MemberResponseDTO.java b/src/main/java/com/example/fiurinee/domain/member/dto/MemberResponseDTO.java index ca47770..cacd8ce 100644 --- a/src/main/java/com/example/fiurinee/domain/member/dto/MemberResponseDTO.java +++ b/src/main/java/com/example/fiurinee/domain/member/dto/MemberResponseDTO.java @@ -32,13 +32,21 @@ public static MemberResponseDTO of(Member member) { .profileImage(member.getProfileImage()) .alarm(member.isAlarm()) .anniversaries(member.getAnniversaries().stream() - .map(anniversary -> Map.of( - "id", anniversary.getId(), - "name", anniversary.getName(), - "anniversaryDate", anniversary.getAnniversaryDate().toString().substring(0,10), - "type", anniversary.getType().name(), - "dDays", anniversaryService.calculateDDay(anniversary) - )) + .map(anniversary -> { + List> dDays = anniversaryService.calculateDDay(anniversary); + return Map.of( + "id", anniversary.getId(), + "name", anniversary.getName(), + "anniversaryDate", anniversary.getAnniversaryDate().toString().substring(0, 10), + "type", anniversary.getType().name(), + "dDays", dDays + ); + }) + .sorted((a1, a2) -> { + Integer dDay1 = (Integer) ((Map) ((List) a1.get("dDays")).get(0)).values().iterator().next(); + Integer dDay2 = (Integer) ((Map) ((List) a2.get("dDays")).get(0)).values().iterator().next(); + return dDay1.compareTo(dDay2); + }) .collect(Collectors.toList())) .build(); }