Skip to content

Commit 29feb73

Browse files
authored
[MERGE] Merge pull request #284 from Team-WSS/fix/#281
[FIX] 누락된 푸시알림 구현 추가
2 parents cad1a38 + 2dcb563 commit 29feb73

File tree

15 files changed

+308
-48
lines changed

15 files changed

+308
-48
lines changed

src/main/java/org/websoso/WSSServer/controller/UserController.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.springframework.web.bind.annotation.RestController;
2121
import org.websoso.WSSServer.domain.User;
2222
import org.websoso.WSSServer.dto.feed.UserFeedsGetResponse;
23+
import org.websoso.WSSServer.dto.notification.PushSettingGetResponse;
24+
import org.websoso.WSSServer.dto.notification.PushSettingRequest;
2325
import org.websoso.WSSServer.dto.user.EditMyInfoRequest;
2426
import org.websoso.WSSServer.dto.user.EditProfileStatusRequest;
2527
import org.websoso.WSSServer.dto.user.FCMTokenRequest;
@@ -215,9 +217,26 @@ public ResponseEntity<UserIdAndNicknameResponse> getUserIdAndNicknameAndGender(P
215217
public ResponseEntity<Void> registerFCMToken(Principal principal,
216218
@Valid @RequestBody FCMTokenRequest fcmTokenRequest) {
217219
User user = userService.getUserOrException(Long.valueOf(principal.getName()));
218-
userService.registerFCMToken(user, fcmTokenRequest.fcmToken());
220+
return userService.registerFCMToken(user, fcmTokenRequest)
221+
? ResponseEntity.status(CREATED).build()
222+
: ResponseEntity.status(NO_CONTENT).build();
223+
}
224+
225+
@GetMapping("/push-settings")
226+
public ResponseEntity<PushSettingGetResponse> getPushSettingValue(Principal principal) {
227+
User user = userService.getUserOrException(Long.valueOf(principal.getName()));
219228
return ResponseEntity
220229
.status(OK)
230+
.body(userService.getPushSettingValue(user));
231+
}
232+
233+
@PostMapping("/push-settings")
234+
public ResponseEntity<Void> registerPushSetting(Principal principal,
235+
@Valid @RequestBody PushSettingRequest pushSettingRequest) {
236+
User user = userService.getUserOrException(Long.valueOf(principal.getName()));
237+
userService.registerPushSetting(user, pushSettingRequest.isPushEnabled());
238+
return ResponseEntity
239+
.status(NO_CONTENT)
221240
.build();
222241
}
223242
}

src/main/java/org/websoso/WSSServer/domain/User.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,6 @@ public class User extends BaseEntity {
5050
@Column(nullable = false)
5151
private String socialId;
5252

53-
@Column
54-
private String fcmToken;
55-
5653
@Column(columnDefinition = "varchar(10)", nullable = false)
5754
private String nickname;
5855
//TODO 일부 특수문자 제외, 앞뒤 공백 불가능
@@ -77,6 +74,9 @@ public class User extends BaseEntity {
7774
@Column(columnDefinition = "Boolean default true", nullable = false)
7875
private Boolean isProfilePublic;
7976

77+
@Column(columnDefinition = "Boolean default true", nullable = false)
78+
private Boolean isPushEnabled;
79+
8080
@Enumerated(EnumType.STRING)
8181
@Column(nullable = false)
8282
@ColumnDefault("'USER'")
@@ -94,6 +94,9 @@ public class User extends BaseEntity {
9494
@OneToMany(mappedBy = "user", cascade = ALL, orphanRemoval = true)
9595
private List<ReportedComment> reportedComments = new ArrayList<>();
9696

97+
@OneToMany(mappedBy = "user", cascade = ALL, orphanRemoval = true)
98+
private List<UserDevice> userDevices = new ArrayList<>();
99+
97100
public void updateProfileStatus(Boolean profileStatus) {
98101
this.isProfilePublic = profileStatus;
99102
}
@@ -126,6 +129,7 @@ private User(String socialId, String nickname, String email) {
126129
this.birth = Year.now();
127130
this.avatarId = 1;
128131
this.isProfilePublic = true;
132+
this.isPushEnabled = true;
129133
this.role = USER;
130134
this.socialId = socialId;
131135
this.nickname = nickname;
@@ -141,7 +145,7 @@ public void editMyInfo(EditMyInfoRequest editMyInfoRequest) {
141145
this.birth = Year.of(editMyInfoRequest.birth());
142146
}
143147

144-
public void updateFCMToken(String fcmToken) {
145-
this.fcmToken = fcmToken;
148+
public void updatePushSetting(boolean isPushEnabled) {
149+
this.isPushEnabled = isPushEnabled;
146150
}
147151
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.websoso.WSSServer.domain;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.FetchType;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.JoinColumn;
10+
import jakarta.persistence.ManyToOne;
11+
import lombok.AccessLevel;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
15+
@Entity
16+
@Getter
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
public class UserDevice {
19+
20+
@Id
21+
@GeneratedValue(strategy = GenerationType.IDENTITY)
22+
@Column(nullable = false)
23+
private Long userDeviceId;
24+
25+
@Column
26+
private String fcmToken;
27+
28+
@Column(nullable = false)
29+
private String deviceIdentifier;
30+
31+
@ManyToOne(fetch = FetchType.LAZY)
32+
@JoinColumn(name = "user_id", nullable = false)
33+
private User user;
34+
35+
private UserDevice(String fcmToken, String deviceIdentifier, User user) {
36+
this.fcmToken = fcmToken;
37+
this.deviceIdentifier = deviceIdentifier;
38+
this.user = user;
39+
}
40+
41+
public static UserDevice create(String fcmToken, String deviceIdentifier, User user) {
42+
return new UserDevice(fcmToken, deviceIdentifier, user);
43+
}
44+
45+
public void updateFcmToken(String fcmToken) {
46+
this.fcmToken = fcmToken;
47+
}
48+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.websoso.WSSServer.dto.notification;
2+
3+
public record PushSettingGetResponse(
4+
Boolean isPushEnabled
5+
) {
6+
7+
public static PushSettingGetResponse of(Boolean isPushEnabled) {
8+
return new PushSettingGetResponse(isPushEnabled);
9+
}
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.websoso.WSSServer.dto.notification;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
public record PushSettingRequest(
6+
@NotNull(message = "푸시 알림 설정 값은 null일 수 없습니다.")
7+
Boolean isPushEnabled
8+
) {
9+
}

src/main/java/org/websoso/WSSServer/dto/user/FCMTokenRequest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
public record FCMTokenRequest(
66
@NotBlank(message = "FCM Token 값은 null 이거나, 공백일 수 없습니다.")
7-
String fcmToken
7+
String fcmToken,
8+
9+
@NotBlank(message = "디바이스 식별자 값 null 이거나, 공백일 수 없습니다.")
10+
String deviceIdentifier
811
) {
912
}

src/main/java/org/websoso/WSSServer/notification/FCMService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ private Message createMessage(String targetFCMToken, FCMMessageRequest fcmMessag
4747
.putData("body", fcmMessageRequest.body())
4848
.putData("feedId", fcmMessageRequest.feedId())
4949
.putData("view", fcmMessageRequest.view())
50+
.putData("notificationId", fcmMessageRequest.notificationId())
5051
.setApnsConfig(apnsConfig)
5152
.build();
5253
}
@@ -77,6 +78,7 @@ private MulticastMessage createMulticastMessage(List<String> targetFCMTokens, FC
7778
.putData("body", fcmMessageRequest.body())
7879
.putData("feedId", fcmMessageRequest.feedId())
7980
.putData("view", fcmMessageRequest.view())
81+
.putData("notificationId", fcmMessageRequest.notificationId())
8082
.setApnsConfig(apnsConfig)
8183
.build();
8284
}

src/main/java/org/websoso/WSSServer/notification/dto/FCMMessageRequest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ public record FCMMessageRequest(
44
String title,
55
String body,
66
String feedId,
7-
String view
7+
String view,
8+
String notificationId
89
) {
910

10-
public static FCMMessageRequest of(String title, String body, String feedId, String view) {
11-
return new FCMMessageRequest(title, body, feedId, view);
11+
public static FCMMessageRequest of(String title, String body, String feedId, String view, String notificationId) {
12+
return new FCMMessageRequest(title, body, feedId, view, notificationId);
1213
}
1314
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.websoso.WSSServer.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.stereotype.Repository;
5+
import org.websoso.WSSServer.domain.NotificationType;
6+
7+
@Repository
8+
public interface NotificationTypeRepository extends JpaRepository<NotificationType, Long> {
9+
10+
NotificationType findByNotificationTypeName(String notificationTypeName);
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.websoso.WSSServer.repository;
2+
3+
import java.util.Optional;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
import org.websoso.WSSServer.domain.UserDevice;
7+
8+
@Repository
9+
public interface UserDeviceRepository extends JpaRepository<UserDevice, Long> {
10+
11+
Optional<UserDevice> findByDeviceIdentifier(String deviceIdentifier);
12+
}

0 commit comments

Comments
 (0)