Compare commits

..

2 Commits

Author SHA1 Message Date
7db63d2d92 Merge pull request 'Fix: 지갑 미발견 시 자동 생성 fallback 추가' (#1) from fix/wallet-auto-create into main
All checks were successful
Server CI/CD / lint-and-build (push) Successful in 21s
Server CI/CD / deploy (push) Successful in 1m0s
Reviewed-on: #1
2026-03-19 02:30:28 +00:00
83c583c04d Fix: 지갑 미발견 시 자동 생성 fallback 추가
resolveUsername()에서 user_wallets 레코드가 없는 유저(레거시/마이그레이션 누락)에 대해
CreateWallet을 자동 호출하여 지갑을 즉시 생성. unique constraint 충돌 시 재조회로
동시성 안전 처리.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 11:28:38 +09:00

View File

@@ -34,6 +34,8 @@ func (s *Service) SetUserResolver(fn func(username string) (uint, error)) {
}
// resolveUsername converts a username to the user's on-chain pubKeyHex.
// If the user exists but has no wallet (e.g. legacy user or failed creation),
// a wallet is auto-created on the fly.
func (s *Service) resolveUsername(username string) (string, error) {
if s.userResolver == nil {
return "", fmt.Errorf("user resolver not configured")
@@ -44,7 +46,17 @@ func (s *Service) resolveUsername(username string) (string, error) {
}
uw, err := s.repo.FindByUserID(userID)
if err != nil {
return "", fmt.Errorf("wallet not found")
// 지갑이 없으면 자동 생성 시도
uw, err = s.CreateWallet(userID)
if err != nil {
// unique constraint 위반 — 다른 고루틴이 먼저 생성 완료
uw, err = s.repo.FindByUserID(userID)
if err != nil {
return "", fmt.Errorf("wallet auto-creation failed: %w", err)
}
} else {
log.Printf("INFO: auto-created wallet for userID=%d (username=%s)", userID, username)
}
}
return uw.PubKeyHex, nil
}