Actions
이슈 #437
진행중
JL
HP
[Go backport] FriendsService user_id 전환 — Phase 4
이슈 #437:
[Go backport] FriendsService user_id 전환 — Phase 4
시작일:
2026/05/14
완료일:
2026/05/14 (약 6달 지연)
진척도:
0%
추정시간:
설명
배경¶
GoTrue 인증 전환 후속 작업(Phase 4). 현재 FriendsService 는 여전히 wallet_address + accounts.id FK 모델에 의존하고 있으며, GoTrue 사용자에게 reward wallet 이 아직 없으면 FriendsHandler.requireWallet 가 WalletFromContext 에서 빈 문자열을 받아 Unauthenticated 거부하는 문제가 있다.
작업 범위¶
DB 스키마 v14 (clean rewrite)¶
-
friends.inviter_id, invitee_id(BIGINT, accounts.id FK) →inviter_user_id, invitee_user_id(UUID).UNIQUE(inviter_user_id, invitee_user_id)+ 인덱스 -
referral_claims.account_id(BIGINT) →user_id(UUID) + 인덱스 -
rewards_log.account_id(BIGINT) →user_id(UUID) + 인덱스 -
accounts.referral_code(UNIQUE) 유지 — referral code 발급 주체는 여전히 account - clean rewrite: 세 테이블 TRUNCATE
Store¶
-
store/friends.go재작성: 모든 이름을 user_id 인자로 교체-
GetFriendCount,GetActiveFriendCount,GetNetworkFriendsCount,GetInviterUserID,GetInvitees,GetInviterChain CreateFriendship(inviterUserID, inviteeUserID)CreateReferralClaim(userID, rewardType, rewardAmount)-
GetClaimedRewards(userID),HasClaimed(userID, type, amount) DeleteFriendsByInviter(inviterUserID)
-
-
store/accounts.go::CreditAccount은 Phase 2 이후 이미 user_id ledger 경로로 통합되었으므로 시그니쳐 그대로. 대신 새 helperCreditAccountByUserID(userID, delta, reason, refCode)으로 별표
Proto¶
-
friends.proto:-
FriendsSummaryResponse.inviter_address(wallet) →inviter_user_id(UUID) +inviter_display_name -
FriendInfo.wallet_address→user_id+ (display_name이다 이미username필드가 있으므로 별도 추가 안 함) -
EngageResponse.inviter_address→inviter_user_id -
GetReferralCodeResponse.wallet_address→user_id
-
Handler¶
-
handler/friends.go:-
requireWallet(ctx)→requireUser(ctx)(user JWT 없으면 Unauthenticated) - 이후
db.GetAccountByUserID(userID)로 account 조회 - 모든 store 접근을 user_id 기반 helper 로 교체
-
db.RecordReferralEarning은aggregated_earnings.user_id채워 넣으므로 user_id 을 받도록 시그니쳐 확장
-
제외 (추후 이슈)¶
-
nodes.owner_wallet_address컬럼 제거 -
virtual_node_*스키마 user_id 직접 키 전환
DoD¶
-
make build,make test통과 - FriendsService 7개 RPC 가 GoTrue user JWT 없으면 Unauthenticated 거부
- 친구 관계 + 리퍼럴 리워드 + completion bonus 모두 user_id 키로 적립 / 조회
-
각 reward claim 이
wallet_adjustmentsledger 에 철저히 기록 (Phase 2 경로 재사용)
관련 이슈¶
- 이전 phase: #434(Phase 1, 해결), #435(Phase 2, 해결), #436(Phase 3, 해결)
- DB 스키마 변경 — #254 refs 동반
JL James Lee이(가) 6달 전에 변경
- 상태을(를) 신규에서 해결(으)로 변경되었습니다.
Phase 4 구현 완료¶
commit:server|de617cf
적용된 변경¶
DB 스키마 v14 (clean rewrite)
-
friends:inviter_id/invitee_id(BIGINT) →inviter_user_id/invitee_user_id(UUID).UNIQUE(inviter_user_id, invitee_user_id)+ 2개 인덱스 -
referral_claims:account_id→user_id(UUID) + 인덱스(user_id, claimed_at DESC) -
rewards_log:account_id→user_id(UUID) + 인덱스 -
accounts.referral_codeUNIQUE 유지 — referral code 발급 주체는 여전히 account
Store
-
store/friends.go전체 재작성. 모든 helper 가 user_id 인자로 교체:-
GetFriendCount(userID),GetActiveFriendCount(userID),GetNetworkFriendsCount(userID) -
GetInviterUserID(userID),GetInvitees(userID),GetInviterChain(userID, maxDepth) -
CreateFriendship(inviterUserID, inviteeUserID)— ON CONFLICT DO NOTHING -
GetClaimedRewards(userID),HasClaimed(userID, type, amount),CreateReferralClaim(userID, type, amount) -
DeleteFriendsByInviter(inviterUserID)(이전nodes.go의 중복 제거)
-
-
CreditAccountByUserID(userID, delta, reason, refCode)신규 helper (Phase 2 의 ledger 경로 그대로 타고도록 경로 축소) -
RecordReferralEarning을 user_id 인자 도입으로 확장: aggregated_earnings.user_id 추가 (Phase 2 에서 변경된 스키마와 일치)
Proto
-
FriendsSummaryResponse.inviter_address→inviter_user_id+inviter_display_name -
FriendInfo.wallet_address→user_id -
EngageResponse.inviter_address→inviter_user_id -
GetReferralCodeResponse.wallet_address→user_id - Phase 2의 DiscardUnknown 덕분에 이전 wallet_address 기반 클라이언트가 계속 동작
Handler
-
handler/friends.go:-
requireWallet(ctx)→requireUser(ctx). AuthContext로부터 user_id 추출, 계정이 없으면EnsureAccountForUser로 자동 materialize - 7개 RPC(GetSummary / ListFriends / GetReferralCode / Engage / GetRewards / ClaimReward / ClaimCompletionBonus) 모두 caller user_id 로 동작
- Reward claim 은
CreditAccountByUserID로 wallet_adjustments 에 기록 -
usernameOrDefault에 display_name > username > email 우선순위 추가
-
-
handler/pool.go::SeedFriends: 데모 친구도 이제 합성 user_id 할당 후 friends 관계 생성. 이랇에 초대자 계정이 user_id 미연결 이면 FailedPrecondition -
handler/stubs.go::UserService.GetUser: account.UserID 로 friend_count 조회 (넘어우면 0) -
handler/friends_halving_test.go: ctxWithUser + seedUserWithWallet + UpdateLastActiveByUser 패턴으로 재작성
검증¶
-
go build ./...PASS -
go vet ./...PASS -
go test ./...PASS (handler/store/sdk/admin 전부, integration 테스트는 TEST_DATABASE_URL 미설정으로 skip)
DoD 체크¶
-
make build,make test통과 - FriendsService 7개 RPC 가 GoTrue user JWT 없으면 Unauthenticated 거부
- 친구 관계 + 리퍼럴 리워드 + completion bonus 모두 user_id 키로 적립 / 조회
-
각 reward claim 이
wallet_adjustmentsledger 에 기록 (Phase 2 경로 재사용)
후속 (추후 이슈)¶
-
nodes.owner_wallet_address컬럼 제거 -
virtual_node_assignments/virtual_node_credits/virtual_node_packages스키마 user_id 직접 전환
CP Chris Park이(가) 6달 전에 변경
- 담당자을(를) James Lee에서 Henry Park(으)로 변경되었습니다.
Actions