From bcce0048c289c6f43ca47322aa4e944b39042222 Mon Sep 17 00:00:00 2001 From: parkha Date: Thu, 1 Aug 2024 10:04:43 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NotificationController.java | 11 +++++ .../notification/domain/Notification.java | 43 +++++++++++++++++++ .../repository/NotificationRepository.java | 9 ++++ .../service/NotificationService.java | 11 +++++ .../beginnerfitbe/user/domain/User.java | 9 ++-- 5 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/example/beginnerfitbe/notification/controller/NotificationController.java create mode 100644 src/main/java/com/example/beginnerfitbe/notification/domain/Notification.java create mode 100644 src/main/java/com/example/beginnerfitbe/notification/repository/NotificationRepository.java create mode 100644 src/main/java/com/example/beginnerfitbe/notification/service/NotificationService.java diff --git a/src/main/java/com/example/beginnerfitbe/notification/controller/NotificationController.java b/src/main/java/com/example/beginnerfitbe/notification/controller/NotificationController.java new file mode 100644 index 0000000..f5f9995 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/notification/controller/NotificationController.java @@ -0,0 +1,11 @@ +package com.example.beginnerfitbe.notification.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/notification") +@RequiredArgsConstructor +public class NotificationController { +} diff --git a/src/main/java/com/example/beginnerfitbe/notification/domain/Notification.java b/src/main/java/com/example/beginnerfitbe/notification/domain/Notification.java new file mode 100644 index 0000000..040d50f --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/notification/domain/Notification.java @@ -0,0 +1,43 @@ +package com.example.beginnerfitbe.notification.domain; + +import com.example.beginnerfitbe.user.domain.User; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Notification { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long notificationId; + + @Column(nullable = false) + private boolean notificationCheck; + + @Column(nullable = false) + private LocalDateTime notificationDate; + + @Column(nullable = false) + private String notificationMessage; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userId") + private User users; + + @Builder + public Notification(User users, boolean notificationCheck, String notificationMessage ) { + this.users = users; + this.notificationCheck = notificationCheck; + this.notificationDate = LocalDateTime.now(); + this.notificationMessage = notificationMessage; + } + + +} diff --git a/src/main/java/com/example/beginnerfitbe/notification/repository/NotificationRepository.java b/src/main/java/com/example/beginnerfitbe/notification/repository/NotificationRepository.java new file mode 100644 index 0000000..ebe40fa --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/notification/repository/NotificationRepository.java @@ -0,0 +1,9 @@ +package com.example.beginnerfitbe.notification.repository; + +import com.example.beginnerfitbe.notification.domain.Notification; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface NotificationRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/beginnerfitbe/notification/service/NotificationService.java b/src/main/java/com/example/beginnerfitbe/notification/service/NotificationService.java new file mode 100644 index 0000000..6a89d64 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/notification/service/NotificationService.java @@ -0,0 +1,11 @@ +package com.example.beginnerfitbe.notification.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor +public class NotificationService { +} diff --git a/src/main/java/com/example/beginnerfitbe/user/domain/User.java b/src/main/java/com/example/beginnerfitbe/user/domain/User.java index c2f686b..8c49a6e 100644 --- a/src/main/java/com/example/beginnerfitbe/user/domain/User.java +++ b/src/main/java/com/example/beginnerfitbe/user/domain/User.java @@ -2,11 +2,7 @@ import com.example.beginnerfitbe.attendance.domain.Attendance; import com.example.beginnerfitbe.challengeparticipant.domain.ChallengeParticipant; -import com.example.beginnerfitbe.declaration.domain.Declaration; -import com.example.beginnerfitbe.like.domain.PostLike; -import com.example.beginnerfitbe.playlist.domain.Playlist; -import com.example.beginnerfitbe.post.domain.Post; -import com.example.beginnerfitbe.scrap.domain.Scrap; +import com.example.beginnerfitbe.notification.domain.Notification; import com.example.beginnerfitbe.weight.domain.WeightRecord; import jakarta.persistence.*; import lombok.*; @@ -71,6 +67,9 @@ public class User { @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) private List challengeParticipants = new ArrayList<>(); + @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) + private List notifications = new ArrayList<>(); + @Builder public User(String email, String name, String password, String profileUrl, double height, double weight, double targetWeight, String date, String targetDate, int exerciseTime, List exerciseIntensity, List exerciseGoals, List concernedAreas) { From 737641b84daea9e3a36c7057f9813163603c8f10 Mon Sep 17 00:00:00 2001 From: parkha Date: Thu, 1 Aug 2024 15:44:56 +0900 Subject: [PATCH 2/6] =?UTF-8?q?alarm=EC=9D=B4=EB=A6=84=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/controller/AlarmController.java | 4 ++++ .../domain/Alarm.java} | 21 +++++++++---------- .../alarm/repository/AlarmRepository.java | 4 ++++ .../alarm/service/AlarmService.java | 4 ++++ .../controller/NotificationController.java | 11 ---------- .../repository/NotificationRepository.java | 9 -------- .../service/NotificationService.java | 11 ---------- .../beginnerfitbe/user/domain/User.java | 3 --- 8 files changed, 22 insertions(+), 45 deletions(-) create mode 100644 src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java rename src/main/java/com/example/beginnerfitbe/{notification/domain/Notification.java => alarm/domain/Alarm.java} (54%) create mode 100644 src/main/java/com/example/beginnerfitbe/alarm/repository/AlarmRepository.java create mode 100644 src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java delete mode 100644 src/main/java/com/example/beginnerfitbe/notification/controller/NotificationController.java delete mode 100644 src/main/java/com/example/beginnerfitbe/notification/repository/NotificationRepository.java delete mode 100644 src/main/java/com/example/beginnerfitbe/notification/service/NotificationService.java diff --git a/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java b/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java new file mode 100644 index 0000000..bd1ae2a --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java @@ -0,0 +1,4 @@ +package com.example.beginnerfitbe.alarm.controller; + +public class AlarmController { +} diff --git a/src/main/java/com/example/beginnerfitbe/notification/domain/Notification.java b/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java similarity index 54% rename from src/main/java/com/example/beginnerfitbe/notification/domain/Notification.java rename to src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java index 040d50f..1c4cb61 100644 --- a/src/main/java/com/example/beginnerfitbe/notification/domain/Notification.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java @@ -1,4 +1,4 @@ -package com.example.beginnerfitbe.notification.domain; +package com.example.beginnerfitbe.alarm.domain; import com.example.beginnerfitbe.user.domain.User; import jakarta.persistence.*; @@ -12,32 +12,31 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Notification { +public class Alarm { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long notificationId; + private Long alarmId; @Column(nullable = false) - private boolean notificationCheck; + private boolean alarmChecked; @Column(nullable = false) - private LocalDateTime notificationDate; + private LocalDateTime alarmDate; @Column(nullable = false) - private String notificationMessage; + private String alarmMessage; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "userId") private User users; @Builder - public Notification(User users, boolean notificationCheck, String notificationMessage ) { + public Alarm(User users, boolean alarmChecked, String notificationMessage ) { this.users = users; - this.notificationCheck = notificationCheck; - this.notificationDate = LocalDateTime.now(); - this.notificationMessage = notificationMessage; + this.alarmChecked = alarmChecked; + this.alarmDate = LocalDateTime.now(); + this.alarmMessage = alarmMessage; } - } diff --git a/src/main/java/com/example/beginnerfitbe/alarm/repository/AlarmRepository.java b/src/main/java/com/example/beginnerfitbe/alarm/repository/AlarmRepository.java new file mode 100644 index 0000000..3c2a0ee --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/alarm/repository/AlarmRepository.java @@ -0,0 +1,4 @@ +package com.example.beginnerfitbe.alarm.repository; + +public class AlarmRepository { +} diff --git a/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java b/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java new file mode 100644 index 0000000..184ff14 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java @@ -0,0 +1,4 @@ +package com.example.beginnerfitbe.alarm.service; + +public class AlarmService { +} diff --git a/src/main/java/com/example/beginnerfitbe/notification/controller/NotificationController.java b/src/main/java/com/example/beginnerfitbe/notification/controller/NotificationController.java deleted file mode 100644 index f5f9995..0000000 --- a/src/main/java/com/example/beginnerfitbe/notification/controller/NotificationController.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.beginnerfitbe.notification.controller; - -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/notification") -@RequiredArgsConstructor -public class NotificationController { -} diff --git a/src/main/java/com/example/beginnerfitbe/notification/repository/NotificationRepository.java b/src/main/java/com/example/beginnerfitbe/notification/repository/NotificationRepository.java deleted file mode 100644 index ebe40fa..0000000 --- a/src/main/java/com/example/beginnerfitbe/notification/repository/NotificationRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.beginnerfitbe.notification.repository; - -import com.example.beginnerfitbe.notification.domain.Notification; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface NotificationRepository extends JpaRepository { -} diff --git a/src/main/java/com/example/beginnerfitbe/notification/service/NotificationService.java b/src/main/java/com/example/beginnerfitbe/notification/service/NotificationService.java deleted file mode 100644 index 6a89d64..0000000 --- a/src/main/java/com/example/beginnerfitbe/notification/service/NotificationService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.beginnerfitbe.notification.service; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@Transactional -@RequiredArgsConstructor -public class NotificationService { -} diff --git a/src/main/java/com/example/beginnerfitbe/user/domain/User.java b/src/main/java/com/example/beginnerfitbe/user/domain/User.java index 8c49a6e..4b06765 100644 --- a/src/main/java/com/example/beginnerfitbe/user/domain/User.java +++ b/src/main/java/com/example/beginnerfitbe/user/domain/User.java @@ -2,7 +2,6 @@ import com.example.beginnerfitbe.attendance.domain.Attendance; import com.example.beginnerfitbe.challengeparticipant.domain.ChallengeParticipant; -import com.example.beginnerfitbe.notification.domain.Notification; import com.example.beginnerfitbe.weight.domain.WeightRecord; import jakarta.persistence.*; import lombok.*; @@ -67,8 +66,6 @@ public class User { @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) private List challengeParticipants = new ArrayList<>(); - @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) - private List notifications = new ArrayList<>(); @Builder From 8f8927755e619fdd132bb766b419bfd45832c3df Mon Sep 17 00:00:00 2001 From: "ugauga19892556@gmail.com" Date: Fri, 2 Aug 2024 01:02:50 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EC=B6=94=ED=9B=84=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/controller/AlarmController.java | 36 +++++++++++++++++++ .../beginnerfitbe/alarm/domain/Alarm.java | 6 ++-- .../beginnerfitbe/alarm/dto/AlarmDTO.java | 31 ++++++++++++++++ .../alarm/repository/AlarmRepository.java | 12 ++++++- .../alarm/service/AlarmService.java | 34 ++++++++++++++++++ .../comment/service/CommentService.java | 8 ++++- .../friend/service/FriendService.java | 12 +++++++ .../beginnerfitbe/user/domain/User.java | 3 ++ 8 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/example/beginnerfitbe/alarm/dto/AlarmDTO.java diff --git a/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java b/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java index bd1ae2a..b020097 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java @@ -1,4 +1,40 @@ package com.example.beginnerfitbe.alarm.controller; +import com.example.beginnerfitbe.alarm.domain.Alarm; +import com.example.beginnerfitbe.alarm.dto.AlarmDTO; +import com.example.beginnerfitbe.alarm.service.AlarmService; +import com.example.beginnerfitbe.jwt.util.JwtUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/alarm") +@RequiredArgsConstructor public class AlarmController { + + private final AlarmService alarmService; + private final JwtUtil jwtUtil; // JwtUtil 주입 + + @GetMapping + public ResponseEntity> getAlarms(HttpServletRequest request) { + // JWT 토큰에서 사용자 ID 추출 + String token = jwtUtil.resolveToken(request); + Long userId = jwtUtil.getUserId(token.substring(7)); + + // 사용자 ID로 알림 조회 + List alarms = alarmService.getAlarmsByUserId(userId); + List alarmDTOs = alarms.stream() + .map(AlarmDTO::fromEntity) + .collect(Collectors.toList()); + return ResponseEntity.ok(alarmDTOs); + } + + } diff --git a/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java b/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java index 1c4cb61..432d9fb 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java @@ -29,11 +29,11 @@ public class Alarm { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "userId") - private User users; + private User user; @Builder - public Alarm(User users, boolean alarmChecked, String notificationMessage ) { - this.users = users; + public Alarm(User user, boolean alarmChecked, String alarmMessage ) { + this.user = user; this.alarmChecked = alarmChecked; this.alarmDate = LocalDateTime.now(); this.alarmMessage = alarmMessage; diff --git a/src/main/java/com/example/beginnerfitbe/alarm/dto/AlarmDTO.java b/src/main/java/com/example/beginnerfitbe/alarm/dto/AlarmDTO.java new file mode 100644 index 0000000..2695279 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/alarm/dto/AlarmDTO.java @@ -0,0 +1,31 @@ +package com.example.beginnerfitbe.alarm.dto; + +import com.example.beginnerfitbe.alarm.domain.Alarm; +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AlarmDTO { + + private Long alarmId; + private boolean alarmChecked; + private LocalDateTime alarmDate; + private String alarmMessage; + private Long userId; + + public static AlarmDTO fromEntity(Alarm alarm) { + return AlarmDTO.builder() + .alarmId(alarm.getAlarmId()) + .alarmChecked(alarm.isAlarmChecked()) + .alarmDate(alarm.getAlarmDate()) + .alarmMessage(alarm.getAlarmMessage()) + .userId(alarm.getUser().getId()) + .build(); + } + +} diff --git a/src/main/java/com/example/beginnerfitbe/alarm/repository/AlarmRepository.java b/src/main/java/com/example/beginnerfitbe/alarm/repository/AlarmRepository.java index 3c2a0ee..fffcc76 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/repository/AlarmRepository.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/repository/AlarmRepository.java @@ -1,4 +1,14 @@ package com.example.beginnerfitbe.alarm.repository; -public class AlarmRepository { +import com.example.beginnerfitbe.alarm.domain.Alarm; +import com.example.beginnerfitbe.user.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface AlarmRepository extends JpaRepository { + + List findByUser(User user); } diff --git a/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java b/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java index 184ff14..3f7893d 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java @@ -1,4 +1,38 @@ package com.example.beginnerfitbe.alarm.service; +import com.example.beginnerfitbe.alarm.domain.Alarm; +import com.example.beginnerfitbe.alarm.repository.AlarmRepository; +import com.example.beginnerfitbe.user.domain.User; +import com.example.beginnerfitbe.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor public class AlarmService { + + private final AlarmRepository alarmRepository; + private final UserRepository userRepository; + + public void createAlarm(User receiver, String alarmMessage) { + Alarm alarm = Alarm.builder() + .user(receiver) + .alarmChecked(false) + .alarmMessage(alarmMessage) + .build(); + alarmRepository.save(alarm); + + System.out.println("Alarm created: " + alarm); + } + + + public List getAlarmsByUserId(Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); + return alarmRepository.findByUser(user); + } } diff --git a/src/main/java/com/example/beginnerfitbe/comment/service/CommentService.java b/src/main/java/com/example/beginnerfitbe/comment/service/CommentService.java index 38d0ef5..87335a4 100644 --- a/src/main/java/com/example/beginnerfitbe/comment/service/CommentService.java +++ b/src/main/java/com/example/beginnerfitbe/comment/service/CommentService.java @@ -1,5 +1,6 @@ package com.example.beginnerfitbe.comment.service; +import com.example.beginnerfitbe.alarm.service.AlarmService; import com.example.beginnerfitbe.comment.domain.Comment; import com.example.beginnerfitbe.comment.dto.CommentCreateDto; import com.example.beginnerfitbe.comment.dto.CommentDto; @@ -26,8 +27,9 @@ public class CommentService { private final PostRepository postRepository; private final UserRepository userRepository; private final CommentRepository commentRepository; + private final AlarmService alarmService; - public ResponseEntity create(Long userId, Long postId,CommentCreateDto commentCreateDto){ + public ResponseEntity create(Long userId, Long postId, CommentCreateDto commentCreateDto){ Post post = postRepository.findById(postId).orElseThrow(() -> new IllegalArgumentException("not found post")); User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("not found user")); @@ -39,6 +41,10 @@ public ResponseEntity create(Long userId, Long postId,CommentCrea .build(); commentRepository.save(comment); + + String alarmMessage = user.getName() + " 님이 댓글을 달았습니다."; + alarmService.createAlarm(post.getUser(), alarmMessage); // 알림 생성 + return ResponseEntity.ok(StateResponse.builder().code("SUCCESS").message("댓글을 성공적으로 생성했습니다.").build()); } diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java index 08fd640..ac033ec 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -1,5 +1,6 @@ package com.example.beginnerfitbe.friend.service; +import com.example.beginnerfitbe.alarm.service.AlarmService; import com.example.beginnerfitbe.friend.domain.Friend; import com.example.beginnerfitbe.friend.dto.FriendDTO; import com.example.beginnerfitbe.friend.repository.FriendRepository; @@ -23,6 +24,7 @@ public class FriendService { private final FriendRepository friendRepository; private final UserRepository userRepository; + private final AlarmService alarmService; @Transactional public FriendDTO sendPathRequest(Long senderId, Long receiverId) { @@ -61,6 +63,11 @@ else if (reexistingFriend.isPresent()) { .build(); Friend savedFriend = friendRepository.save(friend); + + // 알림 메시지 생성 + String alarmMessage = sender.getName() + " 님이 친구신청을 보냈습니다."; + alarmService.createAlarm(receiver, alarmMessage); // 알림 생성 + return FriendDTO.fromEntity(savedFriend); } } @@ -101,6 +108,11 @@ else if (reexistingFriend.isPresent()) { .build(); Friend savedFriend = friendRepository.save(friend); + + // 알림 메시지 생성 + String alarmMessage = sender.getName() + " 님이 친구신청을 보냈습니다."; + alarmService.createAlarm(receiver, alarmMessage); // 알림 생성 + return FriendDTO.fromEntity(savedFriend); } diff --git a/src/main/java/com/example/beginnerfitbe/user/domain/User.java b/src/main/java/com/example/beginnerfitbe/user/domain/User.java index 4b06765..9718cb6 100644 --- a/src/main/java/com/example/beginnerfitbe/user/domain/User.java +++ b/src/main/java/com/example/beginnerfitbe/user/domain/User.java @@ -1,5 +1,6 @@ package com.example.beginnerfitbe.user.domain; +import com.example.beginnerfitbe.alarm.domain.Alarm; import com.example.beginnerfitbe.attendance.domain.Attendance; import com.example.beginnerfitbe.challengeparticipant.domain.ChallengeParticipant; import com.example.beginnerfitbe.weight.domain.WeightRecord; @@ -66,6 +67,8 @@ public class User { @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) private List challengeParticipants = new ArrayList<>(); + @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) + private List alarms = new ArrayList<>(); @Builder From 8b0454da65e40dccc6a776d68da2c07c7d924ec0 Mon Sep 17 00:00:00 2001 From: parkha Date: Fri, 2 Aug 2024 15:33:43 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../beginnerfitbe/alarm/domain/Alarm.java | 8 ++++-- .../beginnerfitbe/alarm/domain/AlarmType.java | 8 ++++++ .../alarm/service/AlarmService.java | 6 ++-- .../ChallengeParticipantRepository.java | 2 +- .../service/ChallengeParticipantService.java | 28 +++++++++++++++++-- .../comment/service/CommentService.java | 5 ++-- .../friend/service/FriendService.java | 18 +++++++----- 7 files changed, 58 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/example/beginnerfitbe/alarm/domain/AlarmType.java diff --git a/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java b/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java index 432d9fb..01f197b 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java @@ -31,12 +31,16 @@ public class Alarm { @JoinColumn(name = "userId") private User user; + @Column(nullable = false) + @Enumerated(EnumType.STRING) // Enum 값을 문자열로 저장 + private AlarmType alarmType; // 추가된 enum 필드 + @Builder - public Alarm(User user, boolean alarmChecked, String alarmMessage ) { + public Alarm(User user, boolean alarmChecked, String alarmMessage, AlarmType alarmType) { this.user = user; this.alarmChecked = alarmChecked; this.alarmDate = LocalDateTime.now(); this.alarmMessage = alarmMessage; + this.alarmType = alarmType; } - } diff --git a/src/main/java/com/example/beginnerfitbe/alarm/domain/AlarmType.java b/src/main/java/com/example/beginnerfitbe/alarm/domain/AlarmType.java new file mode 100644 index 0000000..13b7090 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/alarm/domain/AlarmType.java @@ -0,0 +1,8 @@ +package com.example.beginnerfitbe.alarm.domain; + +public enum AlarmType { + FRIEND_REQUEST, // 친구 요청 + COMMENT_ALARM, // 게시글 댓글 알림 + CHALLENGE_REMINDER, // 오늘의 챌린지 남은 알림 + FRIEND_ACCEPTANCE // 친구 수락 알림 +} \ No newline at end of file diff --git a/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java b/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java index 3f7893d..afb094b 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java @@ -1,6 +1,7 @@ package com.example.beginnerfitbe.alarm.service; import com.example.beginnerfitbe.alarm.domain.Alarm; +import com.example.beginnerfitbe.alarm.domain.AlarmType; import com.example.beginnerfitbe.alarm.repository.AlarmRepository; import com.example.beginnerfitbe.user.domain.User; import com.example.beginnerfitbe.user.repository.UserRepository; @@ -18,15 +19,14 @@ public class AlarmService { private final AlarmRepository alarmRepository; private final UserRepository userRepository; - public void createAlarm(User receiver, String alarmMessage) { + public void createAlarm(User receiver, String alarmMessage, AlarmType alarmType) { Alarm alarm = Alarm.builder() .user(receiver) .alarmChecked(false) .alarmMessage(alarmMessage) + .alarmType(alarmType) // 알림 타입 추가 .build(); alarmRepository.save(alarm); - - System.out.println("Alarm created: " + alarm); } diff --git a/src/main/java/com/example/beginnerfitbe/challengeparticipant/repository/ChallengeParticipantRepository.java b/src/main/java/com/example/beginnerfitbe/challengeparticipant/repository/ChallengeParticipantRepository.java index 1566422..293801b 100644 --- a/src/main/java/com/example/beginnerfitbe/challengeparticipant/repository/ChallengeParticipantRepository.java +++ b/src/main/java/com/example/beginnerfitbe/challengeparticipant/repository/ChallengeParticipantRepository.java @@ -23,5 +23,5 @@ public interface ChallengeParticipantRepository extends JpaRepository userIds); - + } diff --git a/src/main/java/com/example/beginnerfitbe/challengeparticipant/service/ChallengeParticipantService.java b/src/main/java/com/example/beginnerfitbe/challengeparticipant/service/ChallengeParticipantService.java index 1a8a3a2..158ebf2 100644 --- a/src/main/java/com/example/beginnerfitbe/challengeparticipant/service/ChallengeParticipantService.java +++ b/src/main/java/com/example/beginnerfitbe/challengeparticipant/service/ChallengeParticipantService.java @@ -1,5 +1,7 @@ package com.example.beginnerfitbe.challengeparticipant.service; +import com.example.beginnerfitbe.alarm.domain.AlarmType; +import com.example.beginnerfitbe.alarm.service.AlarmService; import com.example.beginnerfitbe.challengeparticipant.domain.ChallengeParticipant; import com.example.beginnerfitbe.challengeparticipant.dto.ChallengeParticipantDTO; import com.example.beginnerfitbe.challengeparticipant.dto.ChallengeRankingDto; @@ -26,6 +28,7 @@ public class ChallengeParticipantService { private final ChallengeParticipantRepository challengeParticipantRepository; private final UserRepository userRepository; private final FriendRepository friendRepository; + private final AlarmService alarmService; public List getAcceptedFriends(Long userId) { // 수락된 친구 목록 가져오기 @@ -175,9 +178,30 @@ public void completeChallenge(Long userId, Long challengeId) { .findByUserIdAndChallenge_ChallengeIdAndChallengeCompletedDate(userId, challengeId, currentDate) .orElseThrow(() -> new RuntimeException("Challenge participant not found")); // 예외 처리 - // isCompleted를 true로 변경 - participant.setCompleted(true); // setter 메서드 필요 + + participant.setCompleted(true); // isCompleted를 true로 변경 challengeParticipantRepository.save(participant); // 변경사항 저장 + + + // 해당 사용자의 오늘 날짜에 해당하는 챌린지 참가자 목록 가져오기 (challengeId 제거) + List participants = challengeParticipantRepository + .findByUserIdAndChallengeCompletedDate(userId, currentDate); + + // isCompleted가 true인 참가자의 수를 세기 + long completedCount = participants.stream() + .filter(ChallengeParticipant::isCompleted) + .count(); + + // completedCount가 2일 경우 알림 생성 + if (completedCount == 2) { + String alarmMessage = ""; + // 알림 생성 + alarmService.createAlarm(participant.getUser(), alarmMessage, AlarmType.CHALLENGE_REMINDER); + } + + + + } public void notcompleteChallenge(Long userId, Long challengeId) { diff --git a/src/main/java/com/example/beginnerfitbe/comment/service/CommentService.java b/src/main/java/com/example/beginnerfitbe/comment/service/CommentService.java index 87335a4..1e181b8 100644 --- a/src/main/java/com/example/beginnerfitbe/comment/service/CommentService.java +++ b/src/main/java/com/example/beginnerfitbe/comment/service/CommentService.java @@ -1,5 +1,6 @@ package com.example.beginnerfitbe.comment.service; +import com.example.beginnerfitbe.alarm.domain.AlarmType; import com.example.beginnerfitbe.alarm.service.AlarmService; import com.example.beginnerfitbe.comment.domain.Comment; import com.example.beginnerfitbe.comment.dto.CommentCreateDto; @@ -42,8 +43,8 @@ public ResponseEntity create(Long userId, Long postId, CommentCre commentRepository.save(comment); - String alarmMessage = user.getName() + " 님이 댓글을 달았습니다."; - alarmService.createAlarm(post.getUser(), alarmMessage); // 알림 생성 + String alarmMessage = user.getName() + " "+postId; + alarmService.createAlarm(post.getUser(), alarmMessage, AlarmType.COMMENT_ALARM); // 알림 생성 return ResponseEntity.ok(StateResponse.builder().code("SUCCESS").message("댓글을 성공적으로 생성했습니다.").build()); } diff --git a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java index ac033ec..bb0120d 100644 --- a/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java +++ b/src/main/java/com/example/beginnerfitbe/friend/service/FriendService.java @@ -1,5 +1,6 @@ package com.example.beginnerfitbe.friend.service; +import com.example.beginnerfitbe.alarm.domain.AlarmType; import com.example.beginnerfitbe.alarm.service.AlarmService; import com.example.beginnerfitbe.friend.domain.Friend; import com.example.beginnerfitbe.friend.dto.FriendDTO; @@ -53,7 +54,6 @@ else if (reexistingFriend.isPresent()) { throw new RuntimeException("이미 친구 요청이 온 사용자입니다. 친구 요청을 수락해주세요."); } - else { Friend friend = Friend.builder() .sender(sender) @@ -64,9 +64,8 @@ else if (reexistingFriend.isPresent()) { Friend savedFriend = friendRepository.save(friend); - // 알림 메시지 생성 - String alarmMessage = sender.getName() + " 님이 친구신청을 보냈습니다."; - alarmService.createAlarm(receiver, alarmMessage); // 알림 생성 + String alarmMessage = sender.getName(); + alarmService.createAlarm(receiver, alarmMessage, AlarmType.FRIEND_REQUEST); return FriendDTO.fromEntity(savedFriend); } @@ -109,9 +108,8 @@ else if (reexistingFriend.isPresent()) { Friend savedFriend = friendRepository.save(friend); - // 알림 메시지 생성 - String alarmMessage = sender.getName() + " 님이 친구신청을 보냈습니다."; - alarmService.createAlarm(receiver, alarmMessage); // 알림 생성 + String alarmMessage = sender.getName(); + alarmService.createAlarm(receiver, alarmMessage, AlarmType.FRIEND_REQUEST); return FriendDTO.fromEntity(savedFriend); } @@ -222,6 +220,12 @@ public void acceptFriendRequest(Long senderId, Long receiverId) { friend.accept(); friendRepository.save(friend); + + // 알림 메시지 생성 + String alarmMessage =friend.getReceiver().getName(); + + // 알림 생성 + alarmService.createAlarm(friend.getSender(), alarmMessage, AlarmType.FRIEND_ACCEPTANCE); } public void rejectFriendRequest(Long senderId, Long receiverId) { From f042f1482dbf616bfc2e87502997245f50ca53d3 Mon Sep 17 00:00:00 2001 From: parkha Date: Fri, 2 Aug 2024 15:50:31 +0900 Subject: [PATCH 5/6] =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=95=8C=EB=A6=BC=20=EC=9D=BD=EC=9D=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/controller/AlarmController.java | 17 ++++++++++++++--- .../beginnerfitbe/alarm/domain/Alarm.java | 6 ++---- .../beginnerfitbe/alarm/dto/AlarmDTO.java | 3 +++ .../alarm/service/AlarmService.java | 16 +++++++++++++++- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java b/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java index b020097..03679c6 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/controller/AlarmController.java @@ -7,9 +7,7 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; @@ -36,5 +34,18 @@ public ResponseEntity> getAlarms(HttpServletRequest request) { return ResponseEntity.ok(alarmDTOs); } + // 알림 체크 처리 + @PutMapping("/{alarmId}/check") + public ResponseEntity checkAlarm(HttpServletRequest request, @PathVariable Long alarmId) { + + String token = jwtUtil.resolveToken(request); + Long userId = jwtUtil.getUserId(token.substring(7)); + + // 알림 체크 처리 + alarmService.checkAlarm(userId, alarmId); + + return ResponseEntity.ok().build(); + } + } diff --git a/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java b/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java index 01f197b..1fea645 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/domain/Alarm.java @@ -2,15 +2,13 @@ import com.example.beginnerfitbe.user.domain.User; import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDateTime; @Entity @Getter +@Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Alarm { diff --git a/src/main/java/com/example/beginnerfitbe/alarm/dto/AlarmDTO.java b/src/main/java/com/example/beginnerfitbe/alarm/dto/AlarmDTO.java index 2695279..61303e4 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/dto/AlarmDTO.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/dto/AlarmDTO.java @@ -1,6 +1,7 @@ package com.example.beginnerfitbe.alarm.dto; import com.example.beginnerfitbe.alarm.domain.Alarm; +import com.example.beginnerfitbe.alarm.domain.AlarmType; import lombok.*; import java.time.LocalDateTime; @@ -17,6 +18,7 @@ public class AlarmDTO { private LocalDateTime alarmDate; private String alarmMessage; private Long userId; + private AlarmType alarmType; public static AlarmDTO fromEntity(Alarm alarm) { return AlarmDTO.builder() @@ -25,6 +27,7 @@ public static AlarmDTO fromEntity(Alarm alarm) { .alarmDate(alarm.getAlarmDate()) .alarmMessage(alarm.getAlarmMessage()) .userId(alarm.getUser().getId()) + .alarmType(alarm.getAlarmType()) .build(); } diff --git a/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java b/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java index afb094b..2a3520e 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/service/AlarmService.java @@ -29,10 +29,24 @@ public void createAlarm(User receiver, String alarmMessage, AlarmType alarmType) alarmRepository.save(alarm); } - public List getAlarmsByUserId(Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); return alarmRepository.findByUser(user); } + + public void checkAlarm(Long userId, Long alarmId) { + // alarmId에 해당하는 알림 객체 찾기 + Alarm alarm = alarmRepository.findById(alarmId) + .orElseThrow(() -> new RuntimeException("해당 알림이 존재하지 않습니다.")); + + // 알림의 userId와 일치하는지 확인 + if (!alarm.getUser().getId().equals(userId)) { + throw new RuntimeException("해당 알림을 가진 사용자를 찾을 수 없습니다."); + } + + // alarmChecked를 true로 변경 + alarm.setAlarmChecked(true); + alarmRepository.save(alarm); // 변경사항 저장 + } } From c1185b9ee9b8d205062badd461bbe52dde72e529 Mon Sep 17 00:00:00 2001 From: parkha Date: Fri, 2 Aug 2024 16:05:13 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/beginnerfitbe/alarm/domain/AlarmType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/beginnerfitbe/alarm/domain/AlarmType.java b/src/main/java/com/example/beginnerfitbe/alarm/domain/AlarmType.java index 13b7090..2efe4f4 100644 --- a/src/main/java/com/example/beginnerfitbe/alarm/domain/AlarmType.java +++ b/src/main/java/com/example/beginnerfitbe/alarm/domain/AlarmType.java @@ -1,7 +1,7 @@ package com.example.beginnerfitbe.alarm.domain; public enum AlarmType { - FRIEND_REQUEST, // 친구 요청 + FRIEND_REQUEST, // 친구 요청 COMMENT_ALARM, // 게시글 댓글 알림 CHALLENGE_REMINDER, // 오늘의 챌린지 남은 알림 FRIEND_ACCEPTANCE // 친구 수락 알림