Files
qrank/src/repository/crud.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
}