package repository import ( "context" "errors" "github.com/cloudprint/cloudprint-backend/internal/model" "gorm.io/gorm" ) type UserRepository struct { db *gorm.DB } func NewUserRepository(db *gorm.DB) *UserRepository { return &UserRepository{db: db} } func (r *UserRepository) Create(ctx context.Context, user *model.User) error { return r.db.WithContext(ctx).Create(user).Error } func (r *UserRepository) GetByID(ctx context.Context, id int32) (*model.User, error) { var user model.User err := r.db.WithContext(ctx).First(&user, id).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } return nil, err } return &user, nil } func (r *UserRepository) GetByOpenid(ctx context.Context, openid string) (*model.User, error) { var user model.User err := r.db.WithContext(ctx).Where("openid = ?", openid).First(&user).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } return nil, err } return &user, nil } func (r *UserRepository) Update(ctx context.Context, user *model.User) error { return r.db.WithContext(ctx).Save(user).Error } func (r *UserRepository) UpdateBalance(ctx context.Context, userID int32, balance float64) error { return r.db.WithContext(ctx).Model(&model.User{}).Where("id = ?", userID).Update("balance", balance).Error } func (r *UserRepository) DeductBalance(ctx context.Context, userID int32, amount float64) error { return r.db.WithContext(ctx).Model(&model.User{}). Where("id = ? AND balance >= ?", userID, amount). Update("balance", gorm.Expr("balance - ?", amount)).Error } func (r *UserRepository) AddBalance(ctx context.Context, userID int32, amount float64) error { return r.db.WithContext(ctx).Model(&model.User{}).Where("id = ?", userID). Update("balance", gorm.Expr("balance + ?", amount)).Error }