78 lines
1.4 KiB
Go
78 lines
1.4 KiB
Go
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
|
|
}
|