Skip to content

Commit 7a85578

Browse files
committed
feat: FCM 토큰 등록/삭제 API 추가
1 parent 48e6ccd commit 7a85578

5 files changed

Lines changed: 100 additions & 0 deletions

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.semosan.api.domain.notification.controller;
2+
3+
import com.semosan.api.common.response.ApiResponse;
4+
import com.semosan.api.common.status.SuccessStatus;
5+
import com.semosan.api.domain.notification.dto.FcmTokenDeleteRequest;
6+
import com.semosan.api.domain.notification.dto.FcmTokenRegisterRequest;
7+
import com.semosan.api.domain.notification.service.FcmTokenService;
8+
import jakarta.validation.Valid;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
12+
import org.springframework.web.bind.annotation.DeleteMapping;
13+
import org.springframework.web.bind.annotation.PostMapping;
14+
import org.springframework.web.bind.annotation.RequestBody;
15+
import org.springframework.web.bind.annotation.RequestMapping;
16+
import org.springframework.web.bind.annotation.RestController;
17+
18+
@RestController
19+
@RequestMapping("/api/fcm")
20+
@RequiredArgsConstructor
21+
public class FcmTokenController {
22+
23+
private final FcmTokenService fcmTokenService;
24+
25+
@PostMapping("/tokens")
26+
public ResponseEntity<ApiResponse<Void>> register(
27+
@AuthenticationPrincipal Long userId,
28+
@Valid @RequestBody FcmTokenRegisterRequest request
29+
) {
30+
fcmTokenService.register(userId, request.token(), request.deviceType());
31+
return ApiResponse.success(SuccessStatus.FCM_TOKEN_REGISTER_SUCCESS);
32+
}
33+
34+
@DeleteMapping("/tokens")
35+
public ResponseEntity<ApiResponse<Void>> delete(
36+
@Valid @RequestBody FcmTokenDeleteRequest request
37+
) {
38+
fcmTokenService.delete(request.token());
39+
return ApiResponse.success(SuccessStatus.FCM_TOKEN_DELETE_SUCCESS);
40+
}
41+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.semosan.api.domain.notification.dto;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
5+
public record FcmTokenDeleteRequest(
6+
@NotBlank String token
7+
) {
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.semosan.api.domain.notification.dto;
2+
3+
import com.semosan.api.domain.user.enums.DeviceType;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
7+
public record FcmTokenRegisterRequest(
8+
@NotBlank String token,
9+
@NotNull DeviceType deviceType
10+
) {
11+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.semosan.api.domain.notification.service;
2+
3+
import com.semosan.api.domain.notification.entity.FcmToken;
4+
import com.semosan.api.domain.notification.repository.FcmTokenRepository;
5+
import com.semosan.api.domain.user.enums.DeviceType;
6+
import lombok.RequiredArgsConstructor;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.stereotype.Service;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
@Slf4j
12+
@Service
13+
@RequiredArgsConstructor
14+
public class FcmTokenService {
15+
16+
private final FcmTokenRepository fcmTokenRepository;
17+
18+
/**
19+
* 토큰 등록
20+
* 같은 토큰이 이미 있으면 (다른 유저로 로그인 등) 소유자/디바이스 갱신
21+
*/
22+
@Transactional
23+
public void register(Long userId, String token, DeviceType deviceType) {
24+
fcmTokenRepository.findByToken(token).ifPresentOrElse(
25+
existing -> existing.reassignTo(userId, deviceType),
26+
() -> fcmTokenRepository.save(FcmToken.create(userId, token, deviceType))
27+
);
28+
}
29+
30+
/**
31+
* 토큰 삭제
32+
* 로그아웃 시 호출하면 될 듯
33+
*/
34+
@Transactional
35+
public void delete(String token) {
36+
fcmTokenRepository.deleteByToken(token);
37+
}
38+
}

src/main/java/com/semosan/api/domain/user/entity/User.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public class User extends BaseEntity {
6363
@Column(name = "weight")
6464
private Double weight;
6565

66+
// 이거 삭제해야할 듯 -> fcm_tokens 테이블을 따로 뺌
67+
// 충돌날까봐 아직 건드리진 않음
6668
@Column(name = "fcm_token", length = 255)
6769
private String fcmToken;
6870

0 commit comments

Comments
 (0)