From 186cd2d47bbfe0a5affd4f5585da0a7dedabc5b3 Mon Sep 17 00:00:00 2001 From: asfslaf Date: Fri, 1 Aug 2025 14:31:07 +0900 Subject: [PATCH 1/3] =?UTF-8?q?weeklycontent=20=C3=AC=C2=B6=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CommunityController.java | 2 +- .../controller/EmotionDiaryController.java | 5 + .../hidaddy/controller/WeeklyContent.java | 33 ++++++ .../weeklycontent/WeeklyContentResponse.java | 27 +++++ .../WeeklyContentSimpleResponse.java | 25 +++++ .../Devroup/hidaddy/entity/WeeklyContent.java | 8 +- .../repository/user/BabyRepository.java | 2 + .../WeeklyContentRepository.java | 11 ++ .../hidaddy/service/WeeklyContentService.java | 50 +++++++++ src/main/resources/application.yml.example | 106 ------------------ 10 files changed, 160 insertions(+), 109 deletions(-) create mode 100644 src/main/java/Devroup/hidaddy/controller/WeeklyContent.java create mode 100644 src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentResponse.java create mode 100644 src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentSimpleResponse.java create mode 100644 src/main/java/Devroup/hidaddy/repository/weeklycontent/WeeklyContentRepository.java create mode 100644 src/main/java/Devroup/hidaddy/service/WeeklyContentService.java delete mode 100644 src/main/resources/application.yml.example diff --git a/src/main/java/Devroup/hidaddy/controller/CommunityController.java b/src/main/java/Devroup/hidaddy/controller/CommunityController.java index d3f3d76..6999ffe 100644 --- a/src/main/java/Devroup/hidaddy/controller/CommunityController.java +++ b/src/main/java/Devroup/hidaddy/controller/CommunityController.java @@ -1,4 +1,4 @@ -package Devroup.hidaddy.controller.community; +package Devroup.hidaddy.controller; import Devroup.hidaddy.dto.community.*; import Devroup.hidaddy.entity.User; diff --git a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java index f80f05f..5fc8cfc 100644 --- a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java +++ b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java @@ -3,6 +3,8 @@ import Devroup.hidaddy.dto.emotionDiary.*; import Devroup.hidaddy.entity.User; import Devroup.hidaddy.service.EmotionDiaryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.XSlf4j; import org.springframework.format.annotation.DateTimeFormat; @@ -17,10 +19,12 @@ @RestController @RequestMapping("/api/emotion-diaries") @RequiredArgsConstructor +@Tag(name = "Emotion-Diary", description = "감정일기 API") public class EmotionDiaryController { private final EmotionDiaryService emotionDiaryService; // 감정일기 생성 (create) + @Operation(summary = "감정일기 생성", description = "페이징 처리된 게시글 목록을 내림차순으로 조회합니다.") @PostMapping public ResponseEntity createEmotionDiary( @AuthenticationPrincipal User currentUser, @@ -32,6 +36,7 @@ public ResponseEntity createEmotionDiary( // 감정일기 조회 (read) // 감정일기 목록 조회 + @Operation(summary = "감정일기 목록 조회", description = "캘린더에 사용할 감정일기 목록을 조회합니다.") @GetMapping public ResponseEntity> readEmotionDiary( // 범위 지정하여 범위 내의 감정일기 조회 diff --git a/src/main/java/Devroup/hidaddy/controller/WeeklyContent.java b/src/main/java/Devroup/hidaddy/controller/WeeklyContent.java new file mode 100644 index 0000000..0fe24df --- /dev/null +++ b/src/main/java/Devroup/hidaddy/controller/WeeklyContent.java @@ -0,0 +1,33 @@ +package Devroup.hidaddy.controller; + +import Devroup.hidaddy.dto.weeklycontent.WeeklyContentResponse; +import Devroup.hidaddy.dto.weeklycontent.WeeklyContentSimpleResponse; +import Devroup.hidaddy.entity.User; +import Devroup.hidaddy.service.WeeklyContentService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/weekly") +@RequiredArgsConstructor +public class WeeklyContent { + private final WeeklyContentService service; + private final WeeklyContentService weeklyContentService; + + @GetMapping("/current") + public ResponseEntity getCurrentWeeklyContent( + @RequestParam Long babyId, + @AuthenticationPrincipal User user + ) { + return ResponseEntity.ok(weeklyContentService.getWeeklyContent(babyId)); + } + + @GetMapping("/{week}") + public ResponseEntity getWeeklyContent( + @PathVariable int week + ) { + return ResponseEntity.ok(weeklyContentService.getWeeklyContentSimple(week)); + } +} diff --git a/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentResponse.java b/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentResponse.java new file mode 100644 index 0000000..af36091 --- /dev/null +++ b/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentResponse.java @@ -0,0 +1,27 @@ +package Devroup.hidaddy.dto.weeklycontent; + +import Devroup.hidaddy.entity.User; +import Devroup.hidaddy.entity.WeeklyContent; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class WeeklyContentResponse { + private Long userId; + private int currentWeek; + private String babyContent; + private String momContent; + private String healthContent; + + public static WeeklyContentResponse from(int currentWeek, WeeklyContent weeklyContent) { + return WeeklyContentResponse.builder() + .currentWeek(currentWeek) + .babyContent(weeklyContent.getBabyContent()) + .momContent(weeklyContent.getMomContent()) + .healthContent(weeklyContent.getHealthContent()) + .build(); + } +} diff --git a/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentSimpleResponse.java b/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentSimpleResponse.java new file mode 100644 index 0000000..f9a4a7f --- /dev/null +++ b/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentSimpleResponse.java @@ -0,0 +1,25 @@ +package Devroup.hidaddy.dto.weeklycontent; + +import Devroup.hidaddy.entity.WeeklyContent; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +@AllArgsConstructor +public class WeeklyContentSimpleResponse { + private int week; + private String babyContent; + private String momContent; + private String healthContent; + + public static WeeklyContentSimpleResponse from(WeeklyContent weeklyContent) { + return WeeklyContentSimpleResponse.builder() + .week(weeklyContent.getWeek()) + .babyContent(weeklyContent.getBabyContent()) + .momContent(weeklyContent.getMomContent()) + .healthContent(weeklyContent.getHealthContent()) + .build(); + } +} diff --git a/src/main/java/Devroup/hidaddy/entity/WeeklyContent.java b/src/main/java/Devroup/hidaddy/entity/WeeklyContent.java index 91bf9fe..34133b0 100644 --- a/src/main/java/Devroup/hidaddy/entity/WeeklyContent.java +++ b/src/main/java/Devroup/hidaddy/entity/WeeklyContent.java @@ -19,8 +19,12 @@ public class WeeklyContent { private Integer week; - private String title; + @Lob + private String babyContent; + + @Lob + private String momContent; @Lob - private String content; + private String healthContent; } \ No newline at end of file diff --git a/src/main/java/Devroup/hidaddy/repository/user/BabyRepository.java b/src/main/java/Devroup/hidaddy/repository/user/BabyRepository.java index 7472fd4..ffde494 100644 --- a/src/main/java/Devroup/hidaddy/repository/user/BabyRepository.java +++ b/src/main/java/Devroup/hidaddy/repository/user/BabyRepository.java @@ -15,4 +15,6 @@ public interface BabyRepository extends JpaRepository { void deleteAllByUser(User user); Optional findByIdAndUserId(Long babyId, Long userId); + + Optional findById(Long babyId); } diff --git a/src/main/java/Devroup/hidaddy/repository/weeklycontent/WeeklyContentRepository.java b/src/main/java/Devroup/hidaddy/repository/weeklycontent/WeeklyContentRepository.java new file mode 100644 index 0000000..2f11f6d --- /dev/null +++ b/src/main/java/Devroup/hidaddy/repository/weeklycontent/WeeklyContentRepository.java @@ -0,0 +1,11 @@ +package Devroup.hidaddy.repository.weeklycontent; + +import Devroup.hidaddy.entity.WeeklyContent; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface WeeklyContentRepository extends JpaRepository { + + Optional findByWeek(int week); +} diff --git a/src/main/java/Devroup/hidaddy/service/WeeklyContentService.java b/src/main/java/Devroup/hidaddy/service/WeeklyContentService.java new file mode 100644 index 0000000..37b1056 --- /dev/null +++ b/src/main/java/Devroup/hidaddy/service/WeeklyContentService.java @@ -0,0 +1,50 @@ +package Devroup.hidaddy.service; + +import Devroup.hidaddy.dto.weeklycontent.WeeklyContentResponse; +import Devroup.hidaddy.dto.weeklycontent.WeeklyContentSimpleResponse; +import Devroup.hidaddy.entity.Baby; +import Devroup.hidaddy.entity.WeeklyContent; +import Devroup.hidaddy.repository.user.BabyRepository; +import Devroup.hidaddy.repository.weeklycontent.WeeklyContentRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class WeeklyContentService { + private final BabyRepository babyRepository; + private final WeeklyContentRepository weeklyContentRepository; + + // 출산 예정일로부터 현재 날짜 계산하여 해당 주차 컨텐츠 출력 + public WeeklyContentResponse getWeeklyContent(Long babyId) { + Baby baby = babyRepository.findById(babyId) + .orElseThrow(() -> new IllegalArgumentException("아이를 찾을 수 없습니다.")); + + int currentweek = caculateCurrentWeek(baby.getDueDate().toLocalDate()); + + WeeklyContent weeklyContent = weeklyContentRepository.findByWeek(currentweek) + .orElseThrow(() -> new IllegalArgumentException(currentweek + "주차 데이터가 없습니다.")); + + return WeeklyContentResponse.from(currentweek, weeklyContent); + } + + // 화살표로 특정 주차 넘어갈 경우 특정 주차의 컨텐츠 출력 + public WeeklyContentSimpleResponse getWeeklyContentSimple(int week) { + WeeklyContent weeklyContent = weeklyContentRepository.findByWeek(week) + .orElseThrow(() -> new IllegalArgumentException(week + "주차 데이터가 없습니다.")); + + return WeeklyContentSimpleResponse.from(weeklyContent); + } + + // 현재 날짜를 기준으로 출산 예정일로부터 주차 계산 + private int caculateCurrentWeek(LocalDate dueDate) { + long daysLeft = ChronoUnit.DAYS.between(LocalDate.now(), dueDate); + long weeksLeft = daysLeft / 7; + return (int) (40 - weeksLeft); + } +} diff --git a/src/main/resources/application.yml.example b/src/main/resources/application.yml.example deleted file mode 100644 index 7258833..0000000 --- a/src/main/resources/application.yml.example +++ /dev/null @@ -1,106 +0,0 @@ -spring: - application: - name: hidaddy - - # OAuth 설정 - security: - oauth2: - client: - registration: - google: - client-id: "" - client-secret: "" - scope: - - email - - profile - - kakao: - client-id: "" - redirect-uri: "" - authorization-grant-type: authorization_code - client-authentication-method: client_secret_post - scope: - - account_email - client-name: Kakao - - naver: - client-id: "" - client-secret: "" - client-name: Naver - authorization-grant-type: authorization_code - redirect-uri: "" - scope: - - name - - email - - provider: - google: - authorization-uri: https://accounts.google.com/o/oauth2/v2/auth - token-uri: https://oauth2.googleapis.com/token - user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo - - kakao: - authorization-uri: https://kauth.kakao.com/oauth/authorize - token-uri: https://kauth.kakao.com/oauth/token - user-info-uri: https://kapi.kakao.com/v2/user/me - user-name-attribute: id - - naver: - authorization-uri: https://nid.naver.com/oauth2.0/authorize - token-uri: https://nid.naver.com/oauth2.0/token - user-info-uri: https://openapi.naver.com/v1/nid/me - user-name-attribute: response - - # Database 설정 - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/hidaddy?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true - username: - password: - hikari: - maximum-pool-size: 10 - minimum-idle: 5 - idle-timeout: 300000 - connection-timeout: 20000 - max-lifetime: 1200000 - - # JPA 설정 - jpa: - database-platform: org.hibernate.dialect.MySQL8Dialect - hibernate: - ddl-auto: update # 운영 환경에서는 validate 사용 - properties: - hibernate: - format_sql: true - show_sql: true - use_sql_comments: true - open-in-view: false - -# Swagger 설정 -springdoc: - default-consumes-media-type: application/json - default-produces-media-type: application/json - swagger-ui: - path: /swagger-ui.html - disable-swagger-default-url: true - display-request-duration: true - operations-sorter: alpha - tags-sorter: alpha - doc-expansion: none - syntax-highlight: - theme: monokai - api-docs: - path: /v3/api-docs - enabled: true - show-actuator: false - paths-to-match: - - /api/** - -# 로깅 설정 -logging: - level: - org.hibernate.SQL: debug - org.hibernate.type: trace - com.zaxxer.hikari.HikariConfig: debug - com.zaxxer.hikari: info - org.springdoc: debug # Swagger 관련 로그 추가 \ No newline at end of file From c439e5a8fed219800d9ab00b48d036d298048403 Mon Sep 17 00:00:00 2001 From: asfslaf Date: Fri, 1 Aug 2025 16:19:00 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EC=A3=BC=EC=B0=A8=EB=B3=84=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=C3=AC=C2=9A=C3=AC=C3=AC=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Devroup/hidaddy/controller/WeeklyContent.java | 5 +++++ .../hidaddy/dto/weeklycontent/WeeklyContentResponse.java | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/Devroup/hidaddy/controller/WeeklyContent.java b/src/main/java/Devroup/hidaddy/controller/WeeklyContent.java index 0fe24df..f22700f 100644 --- a/src/main/java/Devroup/hidaddy/controller/WeeklyContent.java +++ b/src/main/java/Devroup/hidaddy/controller/WeeklyContent.java @@ -4,6 +4,8 @@ import Devroup.hidaddy.dto.weeklycontent.WeeklyContentSimpleResponse; import Devroup.hidaddy.entity.User; import Devroup.hidaddy.service.WeeklyContentService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -12,10 +14,12 @@ @RestController @RequestMapping("/api/weekly") @RequiredArgsConstructor +@Tag(name = "WeeklyContent", description = "주차별 정보 조회 API") public class WeeklyContent { private final WeeklyContentService service; private final WeeklyContentService weeklyContentService; + @Operation(summary = "현재 주차의 정보 조회", description = "아이의 출산 예정일로 현재 주차를 계산하고 정보를 조회합니다.") @GetMapping("/current") public ResponseEntity getCurrentWeeklyContent( @RequestParam Long babyId, @@ -24,6 +28,7 @@ public ResponseEntity getCurrentWeeklyContent( return ResponseEntity.ok(weeklyContentService.getWeeklyContent(babyId)); } + @Operation(summary = "특정 주차의 정보 조회", description = "원하는 특정 주차의 정보를 조회합니다.") @GetMapping("/{week}") public ResponseEntity getWeeklyContent( @PathVariable int week diff --git a/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentResponse.java b/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentResponse.java index af36091..75f1c79 100644 --- a/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentResponse.java +++ b/src/main/java/Devroup/hidaddy/dto/weeklycontent/WeeklyContentResponse.java @@ -10,7 +10,6 @@ @Builder @AllArgsConstructor public class WeeklyContentResponse { - private Long userId; private int currentWeek; private String babyContent; private String momContent; From 44257b84afc180acc6062b0f3c0a23f32b419a3f Mon Sep 17 00:00:00 2001 From: asfslaf Date: Sat, 2 Aug 2025 01:04:50 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EA=B0=90=EC=A0=95=EC=9D=BC=EA=B8=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EmotionDiaryController.java | 37 ++++++++++++------- .../EmotionDiaryCreateRequest.java | 4 +- .../EmotionDiaryMonthResponse.java | 19 ++++++++++ .../emotionDiary/EmotionDiaryResponse.java | 2 + .../Devroup/hidaddy/entity/EmotionDiary.java | 7 +++- .../emotionDiary/EmotionDiaryRepository.java | 4 +- .../hidaddy/service/EmotionDiaryService.java | 22 ++++++----- 7 files changed, 67 insertions(+), 28 deletions(-) create mode 100644 src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryMonthResponse.java diff --git a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java index 5fc8cfc..fb985e9 100644 --- a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java +++ b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java @@ -1,12 +1,14 @@ -package Devroup.hidaddy.controller.emotionDiary; +package Devroup.hidaddy.controller; import Devroup.hidaddy.dto.emotionDiary.*; -import Devroup.hidaddy.entity.User; +import Devroup.hidaddy.entity.User; +import Devroup.hidaddy.security.UserDetailsImpl; import Devroup.hidaddy.service.EmotionDiaryService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.XSlf4j; +import org.springframework.cglib.core.Local; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -24,58 +26,65 @@ public class EmotionDiaryController { private final EmotionDiaryService emotionDiaryService; // 감정일기 생성 (create) - @Operation(summary = "감정일기 생성", description = "페이징 처리된 게시글 목록을 내림차순으로 조회합니다.") + @Operation(summary = "감정일기 생성", description = "특정 날짜의 감정일기를 생성합니다.") @PostMapping public ResponseEntity createEmotionDiary( - @AuthenticationPrincipal User currentUser, + @AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody EmotionDiaryCreateRequest dto ) { + User currentUser = userDetails.getUser(); emotionDiaryService.create(dto, currentUser); return ResponseEntity.ok().build(); } // 감정일기 조회 (read) // 감정일기 목록 조회 - @Operation(summary = "감정일기 목록 조회", description = "캘린더에 사용할 감정일기 목록을 조회합니다.") + @Operation(summary = "감정일기 목록 조회", description = "캘린더 표시를 위해 선택한 날짜 범위의 감정일기를 날짜 오름차순으로 조회합니다.") @GetMapping - public ResponseEntity> readEmotionDiary( + public List readEmotionDiary( // 범위 지정하여 범위 내의 감정일기 조회 - @RequestParam("start") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDate start, - @RequestParam("end") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDate end, - @AuthenticationPrincipal User currentUser + @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate, + @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate, + @AuthenticationPrincipal UserDetailsImpl userDetails ) { - List responses = emotionDiaryService.readEmotionDiary(currentUser, start, end); - return ResponseEntity.ok(responses); + User currentUser = userDetails.getUser(); + return emotionDiaryService.readEmotionDiary(currentUser, startDate, endDate); } // 특정 날짜의 감정일기에 접근 + @Operation(summary = "개별 감정일기 조회", description = "특정 날짜의 감정일기를 조회합니다.") @GetMapping("/{date}") public ResponseEntity readEmotionDiaryByDate( // 특정 날짜로 감정일기에 접근 후 조회 @PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date, - @AuthenticationPrincipal User currentUser + @AuthenticationPrincipal UserDetailsImpl userDetails ) { + User currentUser = userDetails.getUser(); EmotionDiaryResponse response = emotionDiaryService.readEmotionDiaryByDate(currentUser, date); return ResponseEntity.ok(response); } // 감정일기 수정 (update) + @Operation(summary = "특정 감정일기 수정", description = "해당하는 날짜의 감정일기를 수정합니다.") @PutMapping("/{date}") public ResponseEntity updateEmotionDiary( - @AuthenticationPrincipal User currentUser, + @AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date, @RequestBody EmotionDiaryUpdateRequest request ) { + User currentUser = userDetails.getUser(); EmotionDiaryResponse response = emotionDiaryService.updateEmotionDiary(currentUser, date, request); return ResponseEntity.ok(response); } // 감정일기 삭제 (delete) + @Operation(summary = "특정 감정일기 삭제", description = "해당하는 날짜의 감정일기를 삭제합니다.") @DeleteMapping("/{date}") public ResponseEntity deleteEmotionDiary( - @AuthenticationPrincipal User currentUser, + @AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date ) { + User currentUser = userDetails.getUser(); emotionDiaryService.deleteEmotionDiary(currentUser, date); return ResponseEntity.ok().build(); } diff --git a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryCreateRequest.java b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryCreateRequest.java index 1be5462..7fd4270 100644 --- a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryCreateRequest.java +++ b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryCreateRequest.java @@ -6,7 +6,7 @@ import lombok.NoArgsConstructor; import org.antlr.v4.runtime.misc.NotNull; -import java.time.LocalDateTime; +import java.time.LocalDate; @Getter @NoArgsConstructor @@ -17,7 +17,7 @@ public class EmotionDiaryCreateRequest { private String content; @NotNull - private LocalDateTime date; + private LocalDate date; private String imageUrl; } diff --git a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryMonthResponse.java b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryMonthResponse.java new file mode 100644 index 0000000..a4c23e9 --- /dev/null +++ b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryMonthResponse.java @@ -0,0 +1,19 @@ +package Devroup.hidaddy.dto.emotionDiary; + +import lombok.Builder; +import lombok.Getter; +import Devroup.hidaddy.entity.EmotionDiary; + +import java.time.LocalDate; + +@Getter +@Builder +public class EmotionDiaryMonthResponse { + private LocalDate date; + + public static EmotionDiaryMonthResponse from(EmotionDiary emotionDiary) { + return EmotionDiaryMonthResponse.builder() + .date(emotionDiary.getDate()) + .build(); + } +} diff --git a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryResponse.java b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryResponse.java index 598c5ab..71ae856 100644 --- a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryResponse.java +++ b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryResponse.java @@ -1,6 +1,7 @@ package Devroup.hidaddy.dto.emotionDiary; import Devroup.hidaddy.entity.EmotionDiary; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -13,6 +14,7 @@ @NoArgsConstructor @AllArgsConstructor @Builder +@JsonInclude(JsonInclude.Include.NON_NULL) public class EmotionDiaryResponse { private Long id; private String content; diff --git a/src/main/java/Devroup/hidaddy/entity/EmotionDiary.java b/src/main/java/Devroup/hidaddy/entity/EmotionDiary.java index 9e40ee7..818871f 100644 --- a/src/main/java/Devroup/hidaddy/entity/EmotionDiary.java +++ b/src/main/java/Devroup/hidaddy/entity/EmotionDiary.java @@ -9,11 +9,16 @@ import java.time.LocalDateTime; @Entity -@Table(name = "emotion_diary") @Getter @NoArgsConstructor @AllArgsConstructor @Builder +@Table( + name = "emotion_diary", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"user_id", "date"}) + } +) public class EmotionDiary { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/Devroup/hidaddy/repository/emotionDiary/EmotionDiaryRepository.java b/src/main/java/Devroup/hidaddy/repository/emotionDiary/EmotionDiaryRepository.java index 9bb9e33..a126edc 100644 --- a/src/main/java/Devroup/hidaddy/repository/emotionDiary/EmotionDiaryRepository.java +++ b/src/main/java/Devroup/hidaddy/repository/emotionDiary/EmotionDiaryRepository.java @@ -12,7 +12,7 @@ @Repository public interface EmotionDiaryRepository extends JpaRepository { - List findAllByUserIdAndDateBetween(Long id, LocalDate start, LocalDate end); + List findAllByUserIdAndDateBetweenOrderByDateAsc(Long id, LocalDate start, LocalDate end); - Optional findByUserIdAndDate(User currentUser, LocalDate date); + Optional findByUserIdAndDate(Long currentUser, LocalDate date); } \ No newline at end of file diff --git a/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java b/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java index 694355f..6dfe968 100644 --- a/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java +++ b/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java @@ -4,6 +4,7 @@ import Devroup.hidaddy.entity.EmotionDiary; import Devroup.hidaddy.entity.User; import Devroup.hidaddy.repository.emotionDiary.*; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,17 +20,19 @@ public class EmotionDiaryService { private final EmotionDiaryRepository diaryRepository; public void create(EmotionDiaryCreateRequest dto, User currentUser) { + LocalDate dataToSave = (dto.getDate() == null) ? LocalDate.now() : dto.getDate(); EmotionDiary diary = EmotionDiary.builder() + .user(currentUser) .content(dto.getContent()) .imageUrl(dto.getImageUrl()) - .date(dto.getDate().toLocalDate()) + .date(dataToSave) .build(); diaryRepository.save(diary); } // 공통 조회 로직 실패 시 오류 발생 - private EmotionDiary findDiaryOrThrow(User currentUser, LocalDate date) { + private EmotionDiary findDiaryOrThrow(Long currentUser, LocalDate date) { return diaryRepository.findByUserIdAndDate(currentUser, date) .orElseThrow(()-> new IllegalArgumentException("해당 날짜에 작성된 감정일기가 없습니다.")); } @@ -37,24 +40,25 @@ private EmotionDiary findDiaryOrThrow(User currentUser, LocalDate date) { // 감정일기 조회(read) // 캘린더 용 목록 조회 @Transactional(readOnly = true) - public List readEmotionDiary(User currentUser, LocalDate start, LocalDate end) + public List readEmotionDiary(User currentUser, LocalDate start, LocalDate end) { - List diaries = diaryRepository.findAllByUserIdAndDateBetween( + List diaries = diaryRepository.findAllByUserIdAndDateBetweenOrderByDateAsc( currentUser.getId(), start, end ); return diaries.stream() - .map(EmotionDiaryResponse::from) + .map(EmotionDiaryMonthResponse::from) .toList(); } // 개별 감정일기에 접근 @Transactional(readOnly = true) public EmotionDiaryResponse readEmotionDiaryByDate(User currentUser, LocalDate date) { - EmotionDiary diary = findDiaryOrThrow(currentUser, date); - return EmotionDiaryResponse.from(diary); + return diaryRepository.findByUserIdAndDate(currentUser.getId(), date) + .map(EmotionDiaryResponse::from) + .orElseGet(EmotionDiaryResponse::new); } // 감정일기 수정 (update) @@ -64,7 +68,7 @@ public EmotionDiaryResponse updateEmotionDiary( LocalDate date, EmotionDiaryUpdateRequest dto ) { - EmotionDiary diary = findDiaryOrThrow(currentUser, date); + EmotionDiary diary = findDiaryOrThrow(currentUser.getId(), date); diary.update(dto.getContent(), dto.getImageUrl()); return EmotionDiaryResponse.from(diary); @@ -72,7 +76,7 @@ public EmotionDiaryResponse updateEmotionDiary( // 감정일기 삭제 (delete) public void deleteEmotionDiary(User currentUser, LocalDate date) { - EmotionDiary diary = findDiaryOrThrow(currentUser, date); + EmotionDiary diary = findDiaryOrThrow(currentUser.getId(), date); diaryRepository.delete(diary); }