package auth import ( "errors" "time" "hfb_sys/backend/internal/model" "gorm.io/gorm" "gorm.io/gorm/clause" ) type UserRepository struct { db *gorm.DB } func NewUserRepository(db *gorm.DB) *UserRepository { return &UserRepository{db: db} } func (r *UserRepository) FindByID(id uint64) (*model.User, error) { var user model.User if err := r.db.First(&user, id).Error; err != nil { return nil, err } return &user, nil } func (r *UserRepository) UpdateProfile(id uint64, nickname string, avatarURL string) (*model.User, error) { if err := r.db.Model(&model.User{}).Where("id = ?", id).Updates(map[string]any{ "nickname": nickname, "avatar_url": avatarURL, }).Error; err != nil { return nil, err } return r.FindByID(id) } func (r *UserRepository) FindOrCreateByPhone(phone string) (*model.User, error) { now := time.Now() user := model.User{ Phone: phone, Nickname: "用户" + phone[len(phone)-4:], RealnameStatus: "unverified", RiskStatus: "normal", CreditScore: 100, Status: "active", LastLoginAt: &now, } err := r.db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "phone"}}, DoUpdates: clause.AssignmentColumns([]string{"last_login_at", "updated_at"}), }).Create(&user).Error if err != nil { return nil, err } var found model.User if err := r.db.Where("phone = ?", phone).First(&found).Error; err != nil { return nil, err } return &found, nil } func IsNotFound(err error) bool { return errors.Is(err, gorm.ErrRecordNotFound) }