Skip to content

Commit ef6e795

Browse files
authored
Merge pull request #225 from ASSU-org/refactor/#217-device-token-register
[FEAT/#217]
2 parents cce76ee + d660c29 commit ef6e795

File tree

3 files changed

+39
-11
lines changed

3 files changed

+39
-11
lines changed

src/main/java/com/assu/server/domain/deviceToken/entity/DeviceToken.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class DeviceToken extends BaseEntity {
1818
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="member_id", nullable=false)
1919
private Member member;
2020

21-
@Column(nullable=false, length=200, unique=true)
21+
@Column(nullable=false, length=200)
2222
private String token;
2323

2424
@Setter

src/main/java/com/assu/server/domain/deviceToken/repository/DeviceTokenRepository.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,10 @@ public interface DeviceTokenRepository extends JpaRepository<DeviceToken, Long>
2020
void deactivateTokens(@Param("tokens") List<String> tokens);
2121

2222
Optional<DeviceToken> findByToken(String token);
23+
24+
// 같은 회원 + 같은 토큰 있는지 확인
25+
Optional<DeviceToken> findByMemberIdAndToken(Long memberId, String token);
26+
27+
// 같은 회원이 가진 모든 토큰 (비활성화용)
28+
List<DeviceToken> findAllByMemberId(Long memberId);
2329
}

src/main/java/com/assu/server/domain/deviceToken/service/DeviceTokenServiceImpl.java

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,41 @@ public class DeviceTokenServiceImpl implements DeviceTokenService {
2121
@Transactional
2222
@Override
2323
public Long register(String tokenId, Long memberId) {
24-
Member member = memberRepository.findMemberById(memberId).orElseThrow(
25-
() -> new GeneralException(ErrorStatus.NO_SUCH_MEMBER)
26-
);
27-
if (member == null) {
28-
throw new DatabaseException(ErrorStatus.NO_SUCH_MEMBER);
24+
Member member = memberRepository.findMemberById(memberId)
25+
.orElseThrow(() -> new GeneralException(ErrorStatus.NO_SUCH_MEMBER));
26+
27+
// 1) 같은 회원 + 같은 토큰이 이미 있으면 → active = true 로만 복구
28+
// (가장 정확한 쿼리: findByMemberIdAndToken)
29+
var sameTokenOpt = deviceTokenRepository.findByMemberIdAndToken(memberId, tokenId);
30+
if (sameTokenOpt.isPresent()) {
31+
DeviceToken exist = sameTokenOpt.get();
32+
exist.setActive(true);
33+
deviceTokenRepository.save(exist);
34+
return exist.getId();
35+
}
36+
37+
// 2) 같은 회원 + 다른 토큰 → 그 회원의 기존 active 토큰 전부 비활성화
38+
// (현재 보유 메서드 활용: 활성 토큰 문자열 가져와 deactivate)
39+
var activeTokens = deviceTokenRepository.findActiveTokensByMemberId(memberId);
40+
if (!activeTokens.isEmpty()) {
41+
// 현재 등록하려는 tokenId 와 다른 것들만 비활성화
42+
var toDeactivate = activeTokens.stream()
43+
.filter(t -> !t.equals(tokenId))
44+
.toList();
45+
if (!toDeactivate.isEmpty()) {
46+
deviceTokenRepository.deactivateTokens(toDeactivate);
47+
}
2948
}
3049

31-
DeviceToken dt = deviceTokenRepository.findByToken(tokenId)
32-
.map(deviceToken -> { deviceToken.setActive(true); return deviceToken; })
33-
.orElse(DeviceToken.builder().member(member).token(tokenId).active(true).build());
34-
deviceTokenRepository.save(dt);
50+
// 3) 새 토큰 insert (다른 회원이 같은 토큰을 갖고 있어도 상관 없이 insert)
51+
DeviceToken newToken = DeviceToken.builder()
52+
.member(member)
53+
.token(tokenId)
54+
.active(true)
55+
.build();
56+
deviceTokenRepository.save(newToken);
3557

36-
return dt.getId();
58+
return newToken.getId();
3759
}
3860

3961
@Transactional

0 commit comments

Comments
 (0)