From 186cd2d47bbfe0a5affd4f5585da0a7dedabc5b3 Mon Sep 17 00:00:00 2001 From: asfslaf Date: Fri, 1 Aug 2025 14:31:07 +0900 Subject: [PATCH 1/2] =?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/2] =?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;