Skip to content

Commit aaf44c8

Browse files
authored
Merge pull request #107 from Team-Shaka/feat/104
Feat/104 FCM 푸시 알림 관련 로직 추가, API 추가
2 parents 308466f + c07e65b commit aaf44c8

File tree

9 files changed

+106
-7
lines changed

9 files changed

+106
-7
lines changed

src/main/java/treehouse/server/api/notification/business/NotificationService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import treehouse.server.api.notification.presentation.dto.NotificationRequestDTO;
1111
import treehouse.server.api.notification.presentation.dto.NotificationResponseDTO;
1212
import treehouse.server.api.treehouse.implementation.TreehouseQueryAdapter;
13+
import treehouse.server.api.user.implement.UserQueryAdapter;
1314
import treehouse.server.global.entity.User.User;
1415
import treehouse.server.global.entity.member.Member;
1516
import treehouse.server.global.entity.notification.Notification;
1617
import treehouse.server.global.entity.treeHouse.TreeHouse;
18+
import treehouse.server.global.fcm.service.FcmService;
1719

1820
import java.util.Comparator;
1921
import java.util.List;
@@ -31,6 +33,8 @@ public class NotificationService {
3133

3234
private final TreehouseQueryAdapter treehouseQueryAdapter;
3335

36+
private final FcmService fcmService;
37+
3438
/**
3539
* 알림 생성하는 로직
3640
* @param user
@@ -42,8 +46,9 @@ public void createNotification(User user, Long treehouseId, NotificationRequestD
4246
TreeHouse treeHouse = treehouseQueryAdapter.getTreehouseById(treehouseId);
4347
Member sender = memberQueryAdapter.findByUserAndTreehouse(user, treeHouse);
4448
Member receiver = memberQueryAdapter.findById(request.getReceiverId());
45-
4649
Notification notification = NotificationMapper.toNotification(sender, receiver, request, reactionName);
50+
51+
fcmService.sendFcmMessage(receiver.getUser(), notification.getTitle(), notification.getBody());
4752
notificationCommandAdapter.createNotification(notification);
4853
}
4954

src/main/java/treehouse/server/api/user/business/UserMapper.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import jakarta.annotation.PostConstruct;
44
import lombok.*;
55
import org.springframework.stereotype.Component;
6+
import treehouse.server.api.user.presentation.dto.UserRequestDTO;
67
import treehouse.server.api.user.presentation.dto.UserResponseDTO;
78
import treehouse.server.global.entity.User.User;
89
import treehouse.server.global.entity.User.UserRole;
@@ -80,4 +81,18 @@ public static UserResponseDTO.withdraw toWithdraw(User user) {
8081
.userId(user.getId())
8182
.build();
8283
}
84+
85+
public static UserResponseDTO.pushAgree toPushAgree(User user, UserRequestDTO.pushAgreeDto request) {
86+
return UserResponseDTO.pushAgree.builder()
87+
.userId(user.getId())
88+
.isPushAgree(request.isPushAgree())
89+
.build();
90+
}
91+
92+
public static UserResponseDTO.saveFcmToken toSaveFcmToken(User user, boolean isSuccess) {
93+
return UserResponseDTO.saveFcmToken.builder()
94+
.userId(user.getId())
95+
.isSaveFcmToken(isSuccess)
96+
.build();
97+
}
8398
}

src/main/java/treehouse/server/api/user/business/UserService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import treehouse.server.global.exception.GlobalErrorCode;
1717
import treehouse.server.global.exception.ThrowClass.AuthException;
1818
import treehouse.server.global.exception.ThrowClass.GeneralException;
19+
import treehouse.server.global.fcm.service.FcmService;
1920
import treehouse.server.global.redis.service.RedisService;
2021
import treehouse.server.global.security.jwt.dto.TokenDTO;
2122
import treehouse.server.global.security.provider.TokenProvider;
@@ -39,6 +40,8 @@ public class UserService {
3940
private final InvitationQueryAdapter invitationQueryAdapter;
4041
private final UserRepository userRepository;
4142

43+
private final FcmService fcmService;
44+
4245
@Transactional(readOnly = true)
4346
public UserResponseDTO.checkName checkName(UserRequestDTO.checkName request){
4447
return UserMapper.toCheckNameDTO(userQueryAdapter.checkName(request));
@@ -97,4 +100,10 @@ public UserResponseDTO.withdraw withdraw(User user) {
97100

98101
return UserMapper.toWithdraw(user);
99102
}
103+
104+
@Transactional
105+
public UserResponseDTO.pushAgree updatePushAgree(User user, UserRequestDTO.pushAgreeDto request){
106+
boolean pushAgree = user.updatePushAgree(request.isPushAgree());
107+
return UserMapper.toPushAgree(user, request);
108+
}
100109
}

src/main/java/treehouse/server/api/user/presentation/UserApi.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import treehouse.server.api.user.presentation.dto.UserResponseDTO;
1313
import treehouse.server.global.common.CommonResponse;
1414
import treehouse.server.global.entity.User.User;
15+
import treehouse.server.global.fcm.dto.FCMDto;
16+
import treehouse.server.global.fcm.service.FcmService;
1517
import treehouse.server.global.security.handler.annotation.AuthMember;
1618

1719
@RestController
@@ -23,6 +25,7 @@
2325
public class UserApi {
2426

2527
private final UserService userService;
28+
private final FcmService fcmService;
2629

2730
@PostMapping("/checkName")
2831
@Operation(summary = "아이디 중복 체크 ✅", description = "서비스에서 사용할 유저이름을 중복 체크합니다.")
@@ -69,6 +72,26 @@ public CommonResponse<UserResponseDTO.checkUserStatus> checkPhoneAuth(
6972
public CommonResponse<UserResponseDTO.withdraw> withdraw(
7073
@AuthMember @Parameter(hidden = true) User user
7174
){
75+
fcmService.deleteAllFcmToken(user);
7276
return CommonResponse.onSuccess(userService.withdraw(user));
7377
}
78+
79+
@PostMapping("/push-agree")
80+
@Operation(summary = "푸시 알림 동의 API 🔑✅️", description = "푸시 알림 동의 API입니다.")
81+
public CommonResponse<UserResponseDTO.pushAgree> pushAgree(
82+
@AuthMember @Parameter(hidden = true) User user,
83+
@RequestBody UserRequestDTO.pushAgreeDto request
84+
){
85+
return CommonResponse.onSuccess(userService.updatePushAgree(user,request));
86+
}
87+
88+
89+
@PostMapping("/fcm-token")
90+
@Operation(summary = "FCM 토큰 저장 API 🔑✅️", description = "FCM 토큰 저장 API입니다.")
91+
public CommonResponse<UserResponseDTO.saveFcmToken> saveFcmToken(
92+
@AuthMember @Parameter(hidden = true) User user,
93+
@RequestBody FCMDto.saveFcmTokenDto request
94+
){
95+
return CommonResponse.onSuccess(fcmService.saveFcmToken(user,request));
96+
}
7497
}

src/main/java/treehouse/server/api/user/presentation/dto/UserRequestDTO.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import jakarta.validation.constraints.NotBlank;
44
import jakarta.validation.constraints.NotNull;
5-
import lombok.AccessLevel;
6-
import lombok.Builder;
7-
import lombok.Getter;
8-
import lombok.NoArgsConstructor;
5+
import lombok.*;
96

107

118
public class UserRequestDTO {
@@ -64,4 +61,9 @@ public String toString() {
6461
public static class checkUserStatus {
6562
private String phoneNumber;
6663
}
64+
65+
@Getter
66+
public static class pushAgreeDto{
67+
boolean pushAgree;
68+
}
6769
}

src/main/java/treehouse/server/api/user/presentation/dto/UserResponseDTO.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,22 @@ public static class loginMember {
8181
public static class withdraw {
8282
private Long userId;
8383
}
84+
85+
@Builder
86+
@Getter
87+
@NoArgsConstructor
88+
@AllArgsConstructor
89+
public static class pushAgree {
90+
private Long userId;
91+
private boolean isPushAgree;
92+
}
93+
94+
@Builder
95+
@Getter
96+
@NoArgsConstructor
97+
@AllArgsConstructor
98+
public static class saveFcmToken {
99+
private Long userId;
100+
private boolean isSaveFcmToken;
101+
}
84102
}

src/main/java/treehouse/server/global/entity/User/FcmToken.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.*;
55
import org.hibernate.annotations.DynamicInsert;
66
import org.hibernate.annotations.DynamicUpdate;
7+
import treehouse.server.global.entity.common.BaseDateTimeEntity;
78

89
@Getter
910
@Builder
@@ -12,7 +13,7 @@
1213
@DynamicUpdate
1314
@AllArgsConstructor(access = AccessLevel.PROTECTED)
1415
@NoArgsConstructor(access = AccessLevel.PROTECTED)
15-
public class FcmToken {
16+
public class FcmToken extends BaseDateTimeEntity {
1617

1718
@Id
1819
@GeneratedValue(strategy = GenerationType.IDENTITY)

src/main/java/treehouse/server/global/exception/GlobalErrorCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,9 @@ public enum GlobalErrorCode implements BaseErrorCode{
9999
PHONE_AUTH_WRONG(BAD_REQUEST, "NCP400_2", "잘못된 인증 번호 입니다."),
100100
PHONE_AUTH_TIMEOUT(BAD_REQUEST, "NCP400_3", "인증 시간이 초과되었습니다."),
101101

102+
FCM_ALREADY_EXISTS_TOKEN(BAD_REQUEST, "FCM400_1", "이미 저장되어 있는 FCM 토큰입니다."),
102103
FCM_ACCESS_TOKEN_REQUEST_ERROR(INTERNAL_SERVER_ERROR, "FCM500_2", "서버 에러, FCM 서버에 AccessToken 요청할 때 에러 발생."),
103-
FCM_SEND_MESSAGE_ERROR(INTERNAL_SERVER_ERROR, "FCM500_3", "서버 에러, FCM 서버에 메시지를 전송할 때 에러 발생. FcmToken이 유효한지 확인해주세요.");
104+
FCM_SEND_MESSAGE_ERROR(INTERNAL_SERVER_ERROR , "FCM500_3", "서버 에러, FCM 서버에 메시지를 전송할 때 에러 발생. FcmToken이 유효한지 확인해주세요.");
104105

105106
;
106107

src/main/java/treehouse/server/global/fcm/service/FcmService.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99
import org.slf4j.LoggerFactory;
1010
import org.springframework.stereotype.Service;
1111
import org.springframework.transaction.annotation.Transactional;
12+
import treehouse.server.api.user.business.UserMapper;
1213
import treehouse.server.api.user.persistence.FcmTokenRepository;
14+
import treehouse.server.api.user.presentation.dto.UserResponseDTO;
1315
import treehouse.server.global.entity.User.FcmToken;
1416
import treehouse.server.global.entity.User.User;
1517
import treehouse.server.global.exception.GlobalErrorCode;
1618
import treehouse.server.global.exception.ThrowClass.FcmException;
19+
import treehouse.server.global.fcm.dto.FCMDto;
1720

1821
import java.util.List;
1922

@@ -44,6 +47,23 @@ public void testFCMService(String fcmToken)
4447
}
4548
}
4649

50+
@Transactional(readOnly = false)
51+
public UserResponseDTO.saveFcmToken saveFcmToken(User user, FCMDto.saveFcmTokenDto request) {
52+
boolean isSuccess = false;
53+
logger.error("토큰 값 : {}",request.getFcmToken());
54+
if (fcmTokenRepository.existsByUserAndToken(user, request.getFcmToken())) {
55+
throw new FcmException(GlobalErrorCode.FCM_ALREADY_EXISTS_TOKEN);
56+
}else{
57+
fcmTokenRepository.save(FcmToken.builder()
58+
.user(user)
59+
.token(request.getFcmToken())
60+
.build()
61+
);
62+
isSuccess = true;
63+
}
64+
return UserMapper.toSaveFcmToken(user, isSuccess);
65+
}
66+
4767

4868
public void sendFcmMessage(User receiver, String title, String body) {
4969
if (receiver.isPushAgree() == false) {
@@ -76,4 +96,9 @@ public void sendFcmMessage(User receiver, String title, String body) {
7696

7797

7898
}
99+
100+
@Transactional
101+
public void deleteAllFcmToken(User user) {
102+
fcmTokenRepository.deleteAllByUser(user);
103+
}
79104
}

0 commit comments

Comments
 (0)