Skip to content

Commit 6e66ebc

Browse files
authored
feat(): 디바이스 플랫폼 추가 (#293)
* feat: 유저 디바이스 테이블에 플랫폼 필드 추가 * feat: 유저 디바이스 api에 플랫폼 필드 추가 * feat: 플랫폼 추가에 따른 비즈니스 로직 및 리포지토리 수정 * feat: 알림 설정 도메인의 api에도 플랫폼 필드 추가 * fix: 바뀐 커맨드에 맞게 매퍼도 수정 * feat: fcm 발송에 안드로이드 설정 추가 * test: 플랫폼 필드 추가를 반영한 테스트 수정
1 parent d6686e4 commit 6e66ebc

17 files changed

Lines changed: 130 additions & 68 deletions

src/main/java/org/devkor/apu/saerok_server/domain/notification/api/NotificationSettingController.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.devkor.apu.saerok_server.domain.notification.api.dto.response.ToggleNotificationResponse;
1515
import org.devkor.apu.saerok_server.domain.notification.application.NotificationSettingCommandService;
1616
import org.devkor.apu.saerok_server.domain.notification.application.NotificationSettingQueryService;
17+
import org.devkor.apu.saerok_server.domain.notification.core.entity.DevicePlatform;
1718
import org.devkor.apu.saerok_server.domain.notification.mapper.NotificationSettingWebMapper;
1819
import org.devkor.apu.saerok_server.global.security.principal.UserPrincipal;
1920
import org.springframework.security.access.prepost.PreAuthorize;
@@ -45,9 +46,11 @@ public class NotificationSettingController {
4546
public NotificationSettingsResponse getNotificationSettings(
4647
@AuthenticationPrincipal UserPrincipal userPrincipal,
4748
@Parameter(description = "디바이스 ID", required = true, example = "device-123")
48-
@RequestParam String deviceId
49+
@RequestParam String deviceId,
50+
@Parameter(description = "디바이스 플랫폼", required = true, example = "IOS")
51+
@RequestParam DevicePlatform platform
4952
) {
50-
return notificationSettingQueryService.getNotificationSettings(userPrincipal.getId(), deviceId);
53+
return notificationSettingQueryService.getNotificationSettings(userPrincipal.getId(), deviceId, platform);
5154
}
5255

5356
@PatchMapping("/toggle")

src/main/java/org/devkor/apu/saerok_server/domain/notification/api/UserDeviceController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.devkor.apu.saerok_server.domain.notification.api.dto.request.RegisterTokenRequest;
1212
import org.devkor.apu.saerok_server.domain.notification.api.dto.response.RegisterUserDeviceResponse;
1313
import org.devkor.apu.saerok_server.domain.notification.application.UserDeviceCommandService;
14+
import org.devkor.apu.saerok_server.domain.notification.core.entity.DevicePlatform;
1415
import org.devkor.apu.saerok_server.domain.notification.mapper.UserDeviceWebMapper;
1516
import org.devkor.apu.saerok_server.global.security.principal.UserPrincipal;
1617
import org.springframework.http.HttpStatus;
@@ -71,9 +72,10 @@ public RegisterUserDeviceResponse registerUserDevice(
7172
)
7273
public void deleteDevice(
7374
@AuthenticationPrincipal UserPrincipal userPrincipal,
74-
@PathVariable String deviceId
75+
@PathVariable String deviceId,
76+
@RequestParam DevicePlatform platform
7577
) {
76-
userDeviceCommandService.deleteDevice(userPrincipal.getId(), deviceId);
78+
userDeviceCommandService.deleteDevice(userPrincipal.getId(), deviceId, platform);
7779
}
7880

7981
@Hidden
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package org.devkor.apu.saerok_server.domain.notification.api.dto.request;
22

33
import io.swagger.v3.oas.annotations.media.Schema;
4+
import org.devkor.apu.saerok_server.domain.notification.core.entity.DevicePlatform;
45

56
@Schema(description = "사용자 디바이스 등록/갱신 요청 DTO")
67
public record RegisterTokenRequest(
78
@Schema(description = "디바이스 고유 식별자", example = "device-123", requiredMode = Schema.RequiredMode.REQUIRED)
89
String deviceId,
910

1011
@Schema(description = "푸시 알림 수신용 토큰 (FCM 토큰)", example = "fGKdE...", requiredMode = Schema.RequiredMode.REQUIRED)
11-
String token
12+
String token,
13+
14+
@Schema(description = "디바이스 플랫폼", example = "IOS", requiredMode = Schema.RequiredMode.REQUIRED)
15+
DevicePlatform platform
1216
) {
1317
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package org.devkor.apu.saerok_server.domain.notification.api.dto.request;
22

33
import io.swagger.v3.oas.annotations.media.Schema;
4+
import org.devkor.apu.saerok_server.domain.notification.core.entity.DevicePlatform;
45
import org.devkor.apu.saerok_server.domain.notification.core.entity.NotificationType;
56

67
/** 알림 설정 토글 요청 (type 기반) */
78
public record ToggleNotificationRequest(
89
@Schema(description = "디바이스 식별자", example = "device-123")
910
String deviceId,
1011

12+
@Schema(description = "디바이스 플랫폼", example = "IOS")
13+
DevicePlatform platform,
14+
1115
@Schema(description = "알림 식별자", example = "LIKED_ON_COLLECTION")
1216
NotificationType type
1317
) {}

src/main/java/org/devkor/apu/saerok_server/domain/notification/application/NotificationSettingCommandService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class NotificationSettingCommandService {
2424
private final NotificationSettingWebMapper notificationSettingWebMapper;
2525

2626
public ToggleNotificationResponse toggleNotificationSetting(ToggleNotificationSettingCommand command) {
27-
UserDevice device = userDeviceRepository.findByUserIdAndDeviceId(command.userId(), command.deviceId())
27+
UserDevice device = userDeviceRepository.findByUserIdAndDeviceIdAndPlatform(command.userId(), command.deviceId(), command.platform())
2828
.orElseThrow(() -> new NotFoundException("해당 디바이스를 찾을 수 없어요"));
2929

3030
backfillService.ensureDefaults(device);

src/main/java/org/devkor/apu/saerok_server/domain/notification/application/NotificationSettingQueryService.java

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

33
import lombok.RequiredArgsConstructor;
44
import org.devkor.apu.saerok_server.domain.notification.api.dto.response.NotificationSettingsResponse;
5+
import org.devkor.apu.saerok_server.domain.notification.core.entity.DevicePlatform;
56
import org.devkor.apu.saerok_server.domain.notification.core.entity.NotificationSetting;
67
import org.devkor.apu.saerok_server.domain.notification.core.entity.UserDevice;
78
import org.devkor.apu.saerok_server.domain.notification.core.repository.NotificationSettingRepository;
@@ -24,8 +25,8 @@ public class NotificationSettingQueryService {
2425
private final NotificationSettingBackfillService backfillService;
2526
private final NotificationSettingWebMapper mapper;
2627

27-
public NotificationSettingsResponse getNotificationSettings(Long userId, String deviceId) {
28-
UserDevice userDevice = userDeviceRepository.findByUserIdAndDeviceId(userId, deviceId)
28+
public NotificationSettingsResponse getNotificationSettings(Long userId, String deviceId, DevicePlatform platform) {
29+
UserDevice userDevice = userDeviceRepository.findByUserIdAndDeviceIdAndPlatform(userId, deviceId, platform)
2930
.orElseThrow(() -> new NotFoundException("해당 디바이스를 찾을 수 없어요"));
3031

3132
// 쓰기 가능한 독립 트랜잭션에서 처리

src/main/java/org/devkor/apu/saerok_server/domain/notification/application/UserDeviceCommandService.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44
import org.devkor.apu.saerok_server.domain.notification.api.dto.response.RegisterUserDeviceResponse;
55
import org.devkor.apu.saerok_server.domain.notification.application.dto.RegisterUserDeviceCommand;
6+
import org.devkor.apu.saerok_server.domain.notification.core.entity.DevicePlatform;
67
import org.devkor.apu.saerok_server.domain.notification.core.entity.UserDevice;
78
import org.devkor.apu.saerok_server.domain.notification.core.repository.UserDeviceRepository;
89
import org.devkor.apu.saerok_server.domain.notification.core.repository.NotificationSettingRepository;
@@ -31,18 +32,19 @@ public RegisterUserDeviceResponse registerUserDevice(RegisterUserDeviceCommand c
3132
.orElseThrow(() -> new NotFoundException("존재하지 않는 사용자 id예요"));
3233

3334
if (command.deviceId() == null || command.deviceId().isEmpty()
34-
|| command.token() == null || command.token().isEmpty()) {
35-
throw new BadRequestException("deviceId와 token은 필수입니다");
35+
|| command.token() == null || command.token().isEmpty()
36+
|| command.platform() == null) {
37+
throw new BadRequestException("deviceId, token, platform은 필수입니다");
3638
}
3739

3840
UserDevice userDevice = userDeviceRepository
39-
.findByUserIdAndDeviceId(command.userId(), command.deviceId())
41+
.findByUserIdAndDeviceIdAndPlatform(command.userId(), command.deviceId(), command.platform())
4042
.map(existing -> {
4143
existing.updateToken(command.token());
4244
return existing;
4345
})
4446
.orElseGet(() -> {
45-
UserDevice newDevice = UserDevice.create(user, command.deviceId(), command.token());
47+
UserDevice newDevice = UserDevice.create(user, command.deviceId(), command.token(), command.platform());
4648
userDeviceRepository.save(newDevice);
4749
userDeviceRepository.flush();
4850
return newDevice;
@@ -53,11 +55,12 @@ public RegisterUserDeviceResponse registerUserDevice(RegisterUserDeviceCommand c
5355
return userDeviceWebMapper.toRegisterUserDeviceResponse(command, true);
5456
}
5557

56-
public void deleteDevice(Long userId, String deviceId) {
58+
public void deleteDevice(Long userId, String deviceId, DevicePlatform platform) {
5759
userRepository.findById(userId).orElseThrow(() -> new NotFoundException("존재하지 않는 사용자 id예요"));
58-
userDeviceRepository.findByUserIdAndDeviceId(userId, deviceId).orElseThrow(() -> new NotFoundException("해당 디바이스를 찾을 수 없어요"));
60+
userDeviceRepository.findByUserIdAndDeviceIdAndPlatform(userId, deviceId, platform)
61+
.orElseThrow(() -> new NotFoundException("해당 디바이스를 찾을 수 없어요"));
5962

60-
userDeviceRepository.deleteByUserIdAndDeviceId(userId, deviceId);
63+
userDeviceRepository.deleteByUserIdAndDeviceIdAndPlatform(userId, deviceId, platform);
6164
}
6265

6366
public void deleteAllTokens(Long userId) {
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package org.devkor.apu.saerok_server.domain.notification.application.dto;
22

3+
import org.devkor.apu.saerok_server.domain.notification.core.entity.DevicePlatform;
4+
35
public record RegisterUserDeviceCommand(
46
Long userId,
57
String deviceId,
6-
String token
8+
String token,
9+
DevicePlatform platform
710
) {}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package org.devkor.apu.saerok_server.domain.notification.application.dto;
22

3+
import org.devkor.apu.saerok_server.domain.notification.core.entity.DevicePlatform;
34
import org.devkor.apu.saerok_server.domain.notification.core.entity.NotificationType;
45

56
public record ToggleNotificationSettingCommand(
67
Long userId,
78
String deviceId,
9+
DevicePlatform platform,
810
NotificationType type
911
) {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.devkor.apu.saerok_server.domain.notification.core.entity;
2+
3+
/**
4+
* 디바이스 플랫폼 타입.
5+
*
6+
* <p>푸시 알림 발송 시 플랫폼별로 다른 설정을 적용하기 위해 사용됩니다.</p>
7+
*/
8+
public enum DevicePlatform {
9+
IOS,
10+
ANDROID
11+
}

0 commit comments

Comments
 (0)