package repository import ( "errors" "log" "strings" "github.com/ascyii/qrank/src/utils" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "gorm.io/gorm" ) func FindUser(ref any) *User { // Session case if c, ok := ref.(*gin.Context); ok { session := sessions.Default(c) if uid := session.Get("user_id"); uid != nil { var u User if err := db.First(&u, uid.(uint)).Error; err == nil { return &u } return nil } } // String handle case if h, ok := ref.(string); ok { h = strings.TrimSpace(h) if h == "" { return nil } var u User var err error if strings.Contains(h, "@") { err = db.Where("LOWER(email) = ?", strings.ToLower(h)).First(&u).Error } else { err = db.Where("username = ?", h).First(&u).Error } if err == nil { return &u } } return nil } func FindOrCreateUserFromEmail(email string) *User { var u User // Try to find existing user err := db.Where("email = ?", email).First(&u).Error // TODO: This makes bad logs if err == nil { return &u } if !errors.Is(err, gorm.ErrRecordNotFound) { log.Println("Find user:", err) return nil } // Create a new user u = User{ Email: email, Username: utils.DefaultUsername(), Elo: 1500, } if err := EnsureUniqueUsernameAndSlug(&u); err != nil { log.Println("Ensure unique:", err) } if err := db.Create(&u).Error; err != nil { log.Println("Create user:", err) return nil } return &u }