thread-master/apps/backend/internal/logic/auth/onboarding.go

50 lines
1.4 KiB
Go
Raw Normal View History

2026-08-18 16:26:10 +00:00
package auth
import (
"context"
memberDomain "apps/backend/internal/module/member/domain"
radarDomain "apps/backend/internal/module/radar/domain"
"apps/backend/internal/svc"
)
// ensureOnboarding fills completed for legacy members with an empty status who
// already have a brand, product, or demand watch. An explicit pending stays
// pending so a reset (for retest) is not immediately overwritten.
func ensureOnboarding(ctx context.Context, svcCtx *svc.ServiceContext, m *memberDomain.Member) *memberDomain.Member {
if m == nil || m.OnboardingStatus != "" {
return m
}
if !hasExistingSetup(ctx, svcCtx, m.UID) {
return m
}
status := memberDomain.OnboardingCompleted
updated, err := svcCtx.Auth.UpdateUserInfo(ctx, m.UID, &memberDomain.UpdateUserInfoPatch{
OnboardingStatus: &status,
})
if err != nil || updated == nil {
return m
}
return updated
}
func hasExistingSetup(ctx context.Context, svcCtx *svc.ServiceContext, uid int64) bool {
if svcCtx == nil || uid <= 0 {
return false
}
if svcCtx.Scout != nil {
if brands, err := svcCtx.Scout.ListBrands(ctx, uid); err == nil && len(brands) > 0 {
return true
}
if products, err := svcCtx.Scout.ListAllProducts(ctx, uid); err == nil && len(products) > 0 {
return true
}
}
if svcCtx.Radar != nil {
if _, total, err := svcCtx.Radar.ListWatches(ctx, uid, radarDomain.WatchListFilter{Page: 1, PageSize: 1}); err == nil && total > 0 {
return true
}
}
return false
}