프로젝트

일반

사용자정보

Actions

이슈 #437

진행중
JL HP

[Go backport] FriendsService user_id 전환 — Phase 4

이슈 #437: [Go backport] FriendsService user_id 전환 — Phase 4

James Lee이(가) 약 6시간 전에 추가함.

상태:
해결
우선순위:
보통
담당자:
목표버전:
시작일:
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 경로로 통합되었으므로 시그니쳐 그대로. 대신 새 helper CreditAccountByUserID(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_adjustments ledger 에 철저히 기록 (Phase 2 경로 재사용)

관련 이슈

  • 이전 phase: #434(Phase 1, 해결), #435(Phase 2, 해결), #436(Phase 3, 해결)
  • DB 스키마 변경 — #254 refs 동반

연결된 일감 3 (3 건 진행 중 — 모두 미완료)

다음 일감과 관련됨: 이슈 #254: 8-2. 데이터베이스 스키마 설계 (사용자. 앱. 일정)진행James Lee2026/04/282026/04/29

Actions
다음 일감을 우선 진행: 이슈 #436: [Go backport] Admin Dev Console GoTrue UI — Phase 3해결Henry Park2026/05/132026/05/13

Actions
다음에 진행할 일감: 이슈 #438: [Go backport] Legacy wallet_address 컬럼 제거 — Phase 5 (final cleanup)해결Henry Park2026/05/152026/05/15

Actions

JL James Lee이(가) 6달 전에 변경 Actions #1

  • 완료일을(를) 2026/05/14(으)로 지정되었습니다.
  • 시작일을(를) 2026/05/11에서 2026/05/14(으)로 변경되었습니다.
  • 다음 일감을 우선 진행:에 이슈 #436: [Go backport] Admin Dev Console GoTrue UI — Phase 3이(가) 추가되었습니다.

JL James Lee이(가) 6달 전에 변경 Actions #2

  • 다음 일감과 관련됨:에 이슈 #254: 8-2. 데이터베이스 스키마 설계 (사용자. 앱. 일정)이(가) 추가되었습니다.

JL James Lee이(가) 6달 전에 변경 Actions #3

  • 상태을(를) 신규에서 해결(으)로 변경되었습니다.

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_code UNIQUE 유지 — 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_adjustments ledger 에 기록 (Phase 2 경로 재사용)

후속 (추후 이슈)

  • nodes.owner_wallet_address 컬럼 제거
  • virtual_node_assignments / virtual_node_credits / virtual_node_packages 스키마 user_id 직접 전환

JL James Lee이(가) 6달 전에 변경 Actions #4

  • 다음에 진행할 일감:에 이슈 #438: [Go backport] Legacy wallet_address 컬럼 제거 — Phase 5 (final cleanup)이(가) 추가되었습니다.

CP Chris Park이(가) 6달 전에 변경 Actions #5

  • 담당자을(를) James Lee에서 Henry Park(으)로 변경되었습니다.
Actions

내보내기 PDF Atom