|
|
|
package model
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"git.noahlan.cn/northlan/ntools-go/gorm-zero/gormx"
|
|
|
|
"git.noahlan.cn/northlan/ntools-go/uuid"
|
|
|
|
"github.com/jinzhu/now"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"live-service/common/nerr"
|
|
|
|
"live-service/common/timex"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
var _ UserEliteModel = (*customUserEliteModel)(nil)
|
|
|
|
|
|
|
|
type (
|
|
|
|
// UserEliteModel is an interface to be customized, add more methods here,
|
|
|
|
// and implement the added methods in customUserEliteModel.
|
|
|
|
UserEliteModel interface {
|
|
|
|
userEliteModel
|
|
|
|
// FindByUserId 查找用户所有列表
|
|
|
|
FindByUserId(ctx context.Context, tx *gorm.DB, userId int64) ([]UserElite, error)
|
|
|
|
// Addon 添加新的或延长时间
|
|
|
|
Addon(ctx context.Context, tx *gorm.DB, userId, eliteId int64, duration time.Duration, forever bool) error
|
|
|
|
}
|
|
|
|
|
|
|
|
customUserEliteModel struct {
|
|
|
|
*defaultUserEliteModel
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
// NewUserEliteModel returns a model for the database table.
|
|
|
|
func NewUserEliteModel(conn *gorm.DB) UserEliteModel {
|
|
|
|
return &customUserEliteModel{
|
|
|
|
defaultUserEliteModel: newUserEliteModel(conn),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *customUserEliteModel) FindByUserId(ctx context.Context, tx *gorm.DB, userId int64) ([]UserElite, error) {
|
|
|
|
var resp []UserElite
|
|
|
|
err := gormx.WithTx(ctx, m.DB, tx).Table(m.table).
|
|
|
|
Where("user_id = ?", userId).Find(&resp).Error
|
|
|
|
err = gormx.WrapSelectErr(err)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return resp, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *customUserEliteModel) Addon(ctx context.Context, tx *gorm.DB, userId, eliteId int64, duration time.Duration, forever bool) error {
|
|
|
|
return m.TransactCtx(ctx, tx, func(tx *gorm.DB) error {
|
|
|
|
userElite, err := m.FindOneByUserIdEliteId(ctx, tx, userId, eliteId)
|
|
|
|
if err != nil {
|
|
|
|
if !errors.Is(err, gormx.ErrNotFound) {
|
|
|
|
return nerr.NewWithCode(nerr.DBError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
today := now.BeginningOfDay()
|
|
|
|
|
|
|
|
if userElite == nil {
|
|
|
|
err = m.Insert(ctx, tx, &UserElite{
|
|
|
|
Id: uuid.NextId(),
|
|
|
|
UserId: userId,
|
|
|
|
EliteId: eliteId,
|
|
|
|
Forever: BitBool(forever),
|
|
|
|
StartTime: today,
|
|
|
|
EndTime: today.Add(duration),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nerr.NewWithCode(nerr.DBError)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// update
|
|
|
|
if !timex.DayExpire(today, userElite.EndTime, bool(userElite.Forever)) {
|
|
|
|
// 未过期,endTime直接添加1day
|
|
|
|
userElite.EndTime = userElite.EndTime.Add(duration)
|
|
|
|
err = m.Update(ctx, tx, userElite)
|
|
|
|
if err != nil {
|
|
|
|
return nerr.NewWithCode(nerr.DBError)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// 过期,更新日期
|
|
|
|
err = m.Update(ctx, tx, &UserElite{
|
|
|
|
Id: userElite.Id,
|
|
|
|
UserId: userId,
|
|
|
|
EliteId: eliteId,
|
|
|
|
Forever: BitBool(forever),
|
|
|
|
StartTime: today,
|
|
|
|
EndTime: today.Add(duration),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nerr.NewWithCode(nerr.DBError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
}
|