fix: avoid invite referrer search ambiguous SQL
This commit is contained in:
parent
3f465e4490
commit
36833deb15
@ -27,12 +27,16 @@ func (r *Repository) FindInviteReferrerByCode(ctx context.Context, appCode strin
|
|||||||
row := r.db.QueryRowContext(ctx, `
|
row := r.db.QueryRowContext(ctx, `
|
||||||
SELECT `+userSelectColumns+`
|
SELECT `+userSelectColumns+`
|
||||||
FROM users
|
FROM users
|
||||||
INNER JOIN user_invite_codes codes
|
|
||||||
ON codes.app_code = users.app_code
|
|
||||||
AND codes.owner_user_id = users.user_id
|
|
||||||
WHERE users.app_code = ?
|
WHERE users.app_code = ?
|
||||||
AND codes.code = ?
|
AND EXISTS (
|
||||||
AND codes.status = ?
|
SELECT 1
|
||||||
|
FROM user_invite_codes codes
|
||||||
|
WHERE codes.app_code = users.app_code
|
||||||
|
AND codes.owner_user_id = users.user_id
|
||||||
|
AND codes.code = ?
|
||||||
|
AND codes.status = ?
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
`, appCode, inviteCode, invitedomain.CodeStatusActive)
|
`, appCode, inviteCode, invitedomain.CodeStatusActive)
|
||||||
inviter, err := ScanUser(row)
|
inviter, err := ScanUser(row)
|
||||||
|
|||||||
@ -0,0 +1,61 @@
|
|||||||
|
package user_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
userdomain "hyapp/services/user-service/internal/domain/user"
|
||||||
|
"hyapp/services/user-service/internal/testutil/mysqltest"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestFindInviteReferrerByCodeDoesNotAmbiguouslySelectUserProjection(t *testing.T) {
|
||||||
|
repo := mysqltest.NewRepository(t)
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
createInviteReferrerUser(t, repo, 12001, "166001", 1000)
|
||||||
|
inviter, err := repo.GetUser(ctx, 12001)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("get inviter failed: %v", err)
|
||||||
|
}
|
||||||
|
if inviter.InviteOverview.MyInviteCode == "" {
|
||||||
|
t.Fatalf("expected inviter primary invite code")
|
||||||
|
}
|
||||||
|
|
||||||
|
found, err := repo.FindInviteReferrerByCode(ctx, "lalu", inviter.InviteOverview.MyInviteCode)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("find invite referrer by code failed: %v", err)
|
||||||
|
}
|
||||||
|
if found.UserID != inviter.UserID {
|
||||||
|
t.Fatalf("invite referrer mismatch: got=%d want=%d", found.UserID, inviter.UserID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func createInviteReferrerUser(t *testing.T, repo *mysqltest.Repository, userID int64, displayUserID string, nowMs int64) {
|
||||||
|
t.Helper()
|
||||||
|
err := repo.CreateUserWithIdentity(context.Background(), userdomain.User{
|
||||||
|
AppCode: "lalu",
|
||||||
|
UserID: userID,
|
||||||
|
DefaultDisplayUserID: displayUserID,
|
||||||
|
CurrentDisplayUserID: displayUserID,
|
||||||
|
CurrentDisplayUserIDKind: userdomain.DisplayUserIDKindDefault,
|
||||||
|
Username: "invite-referrer",
|
||||||
|
Gender: "male",
|
||||||
|
Country: "SG",
|
||||||
|
ProfileCompleted: true,
|
||||||
|
ProfileCompletedAtMs: nowMs,
|
||||||
|
Status: userdomain.StatusActive,
|
||||||
|
OnboardingStatus: userdomain.OnboardingStatusCompleted,
|
||||||
|
CreatedAtMs: nowMs,
|
||||||
|
UpdatedAtMs: nowMs,
|
||||||
|
}, userdomain.Identity{
|
||||||
|
AppCode: "lalu",
|
||||||
|
UserID: userID,
|
||||||
|
DisplayUserID: displayUserID,
|
||||||
|
DefaultDisplayUserID: displayUserID,
|
||||||
|
DisplayUserIDKind: userdomain.DisplayUserIDKindDefault,
|
||||||
|
Status: userdomain.DisplayUserIDStatusActive,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("create invite referrer user %d failed: %v", userID, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user