diff --git a/src/main/java/com/example/prdoit/controller/CommentController.java b/src/main/java/com/example/prdoit/controller/CommentController.java index 89bed6d..66547e3 100644 --- a/src/main/java/com/example/prdoit/controller/CommentController.java +++ b/src/main/java/com/example/prdoit/controller/CommentController.java @@ -16,13 +16,13 @@ public class CommentController { private final CommentService commentService; // 1. 댓글 조회 - @GetMapping("/{contentId}") + @GetMapping("/content/{contentId}") public ResponseEntity> getComments(@PathVariable String contentId) { return ResponseEntity.ok(commentService.getCommentList(contentId)); } // 2. 댓글 작성 - @PostMapping + @PostMapping() public ResponseEntity createComment(@RequestBody CommentRequestDto commentRequestDto) { commentService.postComment(commentRequestDto); return ResponseEntity.ok("댓글이 성공적으로 작성되었습니다!"); diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index 12b343f..d244ec5 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -134,19 +134,4 @@ public ResponseEntity deleteProject(@PathVariable String projectId) { return ResponseEntity.badRequest().body("프로젝트 삭제에 실패했습니다."); } } - -/* - @PutMapping("/product") - public ResponseEntity putBacklog(@RequestBody BacklogPutDto backlogPutDto) { - log.info("[putBacklog] 백로그 이동 요청"); - try{ - projectService.putBacklog(backlogPutDto); - return ResponseEntity.ok("백로그 이동에 성공했습니다."); - } catch (RuntimeException e){ - log.error("[putBacklog] {}", e.getMessage()); - return ResponseEntity.badRequest().body("백로그 이동에 실패했습니다."); - } - } - - */ } diff --git a/src/main/java/com/example/prdoit/controller/UserController.java b/src/main/java/com/example/prdoit/controller/UserController.java index 6f56d19..ecbf8f2 100644 --- a/src/main/java/com/example/prdoit/controller/UserController.java +++ b/src/main/java/com/example/prdoit/controller/UserController.java @@ -4,6 +4,7 @@ import com.example.prdoit.dto.user.LoginDto; import com.example.prdoit.dto.user.UserDto; import com.example.prdoit.exception.CustomException; +import com.example.prdoit.service.notification.NotificationService; import com.example.prdoit.service.user.UserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -20,6 +21,7 @@ public class UserController { private final UserService userService; + private final NotificationService notificationService; @PostMapping("/signup") public ResponseEntity signUp(@RequestBody UserDto userDto) { @@ -141,4 +143,16 @@ public ResponseEntity checkPassword(@RequestBody LoginDto loginDto) { } } + @GetMapping("/notification/{userId}") + public ResponseEntity getNotificationList(@PathVariable String userId) { + log.info("[getNotificationList] 알림 목록 조회 시작 - User ID: {}", userId); + + try { + return ResponseEntity.ok(notificationService.getNotificationList(userId)); + } catch (CustomException e) { + log.error("[getNotificationList] 알림 목록 조회 실패 - 이유: {}", e.getMessage()); + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + } diff --git a/src/main/java/com/example/prdoit/dto/notification/NotificationResponseDto.java b/src/main/java/com/example/prdoit/dto/notification/NotificationResponseDto.java new file mode 100644 index 0000000..f4ac2db --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/notification/NotificationResponseDto.java @@ -0,0 +1,17 @@ +package com.example.prdoit.dto.notification; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class NotificationResponseDto { + private int notificationId; + private String notificationContent; + private String contentId; + private String userId; + private int isRead; + private int isContent; +} diff --git a/src/main/java/com/example/prdoit/model/IdTable.java b/src/main/java/com/example/prdoit/model/IdTable.java index eaec3ef..e23c634 100644 --- a/src/main/java/com/example/prdoit/model/IdTable.java +++ b/src/main/java/com/example/prdoit/model/IdTable.java @@ -35,10 +35,6 @@ public class IdTable { @JsonIgnore private List surveyTable; - @OneToMany(mappedBy = "id", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) - @JsonIgnore - private List readTable; - @OneToMany(mappedBy = "id", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) @JsonIgnore private List communityTable; @@ -47,4 +43,8 @@ public class IdTable { @JsonIgnore private List contentTable; + @OneToMany(mappedBy = "userId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) + @JsonIgnore + private List notificationTable; + } diff --git a/src/main/java/com/example/prdoit/model/ReadTable.java b/src/main/java/com/example/prdoit/model/NotificationTable.java similarity index 56% rename from src/main/java/com/example/prdoit/model/ReadTable.java rename to src/main/java/com/example/prdoit/model/NotificationTable.java index a979779..f2e9eb3 100644 --- a/src/main/java/com/example/prdoit/model/ReadTable.java +++ b/src/main/java/com/example/prdoit/model/NotificationTable.java @@ -11,15 +11,22 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class ReadTable { +public class NotificationTable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private int readId; + private int notificationId; - private int readContentId; + private String notificationContent; + + private String contentId; + + private int isRead; + + private int isContent; @ManyToOne - @JoinColumn(name = "id") - private IdTable id; + @JoinColumn(name = "userId") + private IdTable userId; + } diff --git a/src/main/java/com/example/prdoit/repository/NotificationTableRepository.java b/src/main/java/com/example/prdoit/repository/NotificationTableRepository.java new file mode 100644 index 0000000..513720e --- /dev/null +++ b/src/main/java/com/example/prdoit/repository/NotificationTableRepository.java @@ -0,0 +1,9 @@ +package com.example.prdoit.repository; + +import com.example.prdoit.model.NotificationTable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface NotificationTableRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/prdoit/service/comment/CommentServiceImpl.java b/src/main/java/com/example/prdoit/service/comment/CommentServiceImpl.java index 5b20c61..87f5b5e 100644 --- a/src/main/java/com/example/prdoit/service/comment/CommentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/comment/CommentServiceImpl.java @@ -5,9 +5,8 @@ import com.example.prdoit.model.CommentCommentTable; import com.example.prdoit.model.CommentTable; import com.example.prdoit.model.ContentTable; -import com.example.prdoit.repository.CommentCommentTableRepository; -import com.example.prdoit.repository.CommentTableRepository; -import com.example.prdoit.repository.ContentTableRepository; +import com.example.prdoit.model.NotificationTable; +import com.example.prdoit.repository.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -25,6 +24,8 @@ public class CommentServiceImpl implements CommentService { private final CommentTableRepository commentTableRepository; private final CommentCommentTableRepository commentCommentTableRepository; private final ContentTableRepository contentTableRepository; + private final NotificationTableRepository notificationTableRepository; + private final IdTableRepository idTableRepository; // 1. 댓글 목록 조회 (GET) @Override @@ -67,6 +68,14 @@ public void postComment(CommentRequestDto commentRequestDto) { .contentId(contentTable) .build()); + notificationTableRepository.save(NotificationTable.builder() + .notificationContent("댓글이 작성되었습니다.") + .contentId(contentTable.getContentId()) + .userId(contentTable.getUserId()) + .isRead(0) + .isContent(1) + .build()); + log.info("[postComment] 댓글 등록을 완료했습니다."); } @@ -85,6 +94,14 @@ public void postCommentReply(CommentReplyRequestDto commentReplyRequestDto) { .commentId(parentComment) .build()); + notificationTableRepository.save(NotificationTable.builder() + .notificationContent("대댓글이 작성되었습니다.") + .contentId(parentComment.getContentId().getContentId()) + .userId(idTableRepository.findByNickname(parentComment.getCommentNickname())) + .isRead(0) + .isContent(1) + .build()); + log.info("[postCommentReply] 대댓글 등록을 완료했습니다."); } diff --git a/src/main/java/com/example/prdoit/service/notification/NotificationService.java b/src/main/java/com/example/prdoit/service/notification/NotificationService.java new file mode 100644 index 0000000..bba09fe --- /dev/null +++ b/src/main/java/com/example/prdoit/service/notification/NotificationService.java @@ -0,0 +1,9 @@ +package com.example.prdoit.service.notification; + +import com.example.prdoit.dto.notification.NotificationResponseDto; + +import java.util.List; + +public interface NotificationService { + List getNotificationList(String userId); +} diff --git a/src/main/java/com/example/prdoit/service/notification/NotificationServiceImpl.java b/src/main/java/com/example/prdoit/service/notification/NotificationServiceImpl.java new file mode 100644 index 0000000..f7131dd --- /dev/null +++ b/src/main/java/com/example/prdoit/service/notification/NotificationServiceImpl.java @@ -0,0 +1,45 @@ +package com.example.prdoit.service.notification; + +import com.example.prdoit.dto.notification.NotificationResponseDto; +import com.example.prdoit.model.IdTable; +import com.example.prdoit.model.NotificationTable; +import com.example.prdoit.repository.IdTableRepository; +import com.example.prdoit.repository.NotificationTableRepository; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@AllArgsConstructor +@Slf4j +public class NotificationServiceImpl implements NotificationService { + + private final IdTableRepository idTableRepository; + private final NotificationTableRepository notificationTableRepository; + + @Override + public List getNotificationList(String userId) { + log.info("[getNotificationList] 알림 목록 조회 시작 - User ID: {}", userId); + + IdTable idTable = idTableRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다. ID = " + userId)); + try { + List notificationResponseDtoList = idTable.getNotificationTable().stream().map(notificationTable -> NotificationResponseDto.builder() + .notificationId(notificationTable.getNotificationId()) + .notificationContent(notificationTable.getNotificationContent()) + .contentId(notificationTable.getContentId()) + .userId(notificationTable.getUserId().getId()) + .isRead(notificationTable.getIsRead()) + .isContent(notificationTable.getIsContent()) + .build()).toList(); + for(NotificationTable notificationTable : idTable.getNotificationTable()) { + notificationTable.setIsRead(1); + } + notificationTableRepository.saveAll(idTable.getNotificationTable()); + return notificationResponseDtoList; + } catch (Exception e) { + throw new IllegalArgumentException("알림 목록 조회 중 문제가 발생했습니다."); + } + } +}