package auth import ( "context" "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(ctx context.Context, id uint64) (*model.User, error) { var user model.User if err := r.db.WithContext(ctx).First(&user, id).Error; err != nil { return nil, err } return &user, nil } func (r *UserRepository) UpdateProfile(ctx context.Context, id uint64, nickname string, avatarURL string) (*model.User, error) { if err := r.db.WithContext(ctx).Model(&model.User{}).Where("id = ?", id).Updates(map[string]any{ "nickname": nickname, "avatar_url": avatarURL, }).Error; err != nil { return nil, err } return r.FindByID(ctx, id) } func (r *UserRepository) FindOrCreateByPhone(ctx context.Context, 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.WithContext(ctx).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.WithContext(ctx).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) }