137 lines
3.4 KiB
Go
137 lines
3.4 KiB
Go
package repository
|
|
|
|
import (
|
|
"carrotskin/internal/model"
|
|
"carrotskin/pkg/database"
|
|
"errors"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// CreateUser 创建用户
|
|
func CreateUser(user *model.User) error {
|
|
db := database.MustGetDB()
|
|
return db.Create(user).Error
|
|
}
|
|
|
|
// FindUserByID 根据ID查找用户
|
|
func FindUserByID(id int64) (*model.User, error) {
|
|
db := database.MustGetDB()
|
|
var user model.User
|
|
err := db.Where("id = ? AND status != -1", id).First(&user).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
// FindUserByUsername 根据用户名查找用户
|
|
func FindUserByUsername(username string) (*model.User, error) {
|
|
db := database.MustGetDB()
|
|
var user model.User
|
|
err := db.Where("username = ? AND status != -1", username).First(&user).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
// FindUserByEmail 根据邮箱查找用户
|
|
func FindUserByEmail(email string) (*model.User, error) {
|
|
db := database.MustGetDB()
|
|
var user model.User
|
|
err := db.Where("email = ? AND status != -1", email).First(&user).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
// UpdateUser 更新用户
|
|
func UpdateUser(user *model.User) error {
|
|
db := database.MustGetDB()
|
|
return db.Save(user).Error
|
|
}
|
|
|
|
// UpdateUserFields 更新指定字段
|
|
func UpdateUserFields(id int64, fields map[string]interface{}) error {
|
|
db := database.MustGetDB()
|
|
return db.Model(&model.User{}).Where("id = ?", id).Updates(fields).Error
|
|
}
|
|
|
|
// DeleteUser 软删除用户
|
|
func DeleteUser(id int64) error {
|
|
db := database.MustGetDB()
|
|
return db.Model(&model.User{}).Where("id = ?", id).Update("status", -1).Error
|
|
}
|
|
|
|
// CreateLoginLog 创建登录日志
|
|
func CreateLoginLog(log *model.UserLoginLog) error {
|
|
db := database.MustGetDB()
|
|
return db.Create(log).Error
|
|
}
|
|
|
|
// CreatePointLog 创建积分日志
|
|
func CreatePointLog(log *model.UserPointLog) error {
|
|
db := database.MustGetDB()
|
|
return db.Create(log).Error
|
|
}
|
|
|
|
// UpdateUserPoints 更新用户积分(事务)
|
|
func UpdateUserPoints(userID int64, amount int, changeType, reason string) error {
|
|
db := database.MustGetDB()
|
|
return db.Transaction(func(tx *gorm.DB) error {
|
|
// 获取当前用户积分
|
|
var user model.User
|
|
if err := tx.Where("id = ?", userID).First(&user).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
balanceBefore := user.Points
|
|
balanceAfter := balanceBefore + amount
|
|
|
|
// 检查积分是否足够
|
|
if balanceAfter < 0 {
|
|
return errors.New("积分不足")
|
|
}
|
|
|
|
// 更新用户积分
|
|
if err := tx.Model(&user).Update("points", balanceAfter).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// 创建积分日志
|
|
log := &model.UserPointLog{
|
|
UserID: userID,
|
|
ChangeType: changeType,
|
|
Amount: amount,
|
|
BalanceBefore: balanceBefore,
|
|
BalanceAfter: balanceAfter,
|
|
Reason: reason,
|
|
}
|
|
|
|
return tx.Create(log).Error
|
|
})
|
|
}
|
|
|
|
// UpdateUserAvatar 更新用户头像
|
|
func UpdateUserAvatar(userID int64, avatarURL string) error {
|
|
db := database.MustGetDB()
|
|
return db.Model(&model.User{}).Where("id = ?", userID).Update("avatar", avatarURL).Error
|
|
}
|
|
|
|
// UpdateUserEmail 更新用户邮箱
|
|
func UpdateUserEmail(userID int64, email string) error {
|
|
db := database.MustGetDB()
|
|
return db.Model(&model.User{}).Where("id = ?", userID).Update("email", email).Error
|
|
}
|