twin-api/app/api/service/user.go

222 lines
5.7 KiB
Go

package service
import (
"fmt"
"time"
"twin-api/app/api/response"
"twin-api/app/common/dao"
"twin-api/app/common/model"
"twin-api/base/config"
"git.u8t.cn/open/go-server/session"
"github.com/gin-gonic/gin"
"github.com/spf13/cast"
)
type Params map[string]any
func (p Params) Str(key string) string {
return cast.ToString(p[key])
}
func (p Params) Int(key string) int {
return cast.ToInt(p[key])
}
type User struct {
sess *session.ApiSession
params Params
ctx *gin.Context
}
func NewUser(ctx *gin.Context) *User {
u := new(User)
u.params = make(map[string]any)
u.ctx = ctx
if v := ctx.Keys[session.ContextSession]; v != nil {
if v, ok := v.(*session.ApiSession); ok {
u.sess = v
}
}
if u.sess == nil {
panic(config.ErrPermission.New())
}
exp := u.sess.GetExperiment()
// 初始化参数
for k, v := range config.KeysDefault {
u.params[k] = exp.GetParam(k, v)
}
return u
}
func (u *User) resp(code int, msgKey string) *response.Response {
return response.New(u.ctx, code, u.params.Str(msgKey))
}
// 判断注册时间
// 判断免费使用时间
// 判断是否有会员
// 包更新判断
// 判断包是否提示强制更新
// 判断包是否提示更新
func (u *User) success() *response.Response {
resp := u.resp(config.Success, "success").
Window(&response.Window{Title: "", Close: true}).
AddButton("", "", "")
return resp
}
func (u *User) Verify() *response.Response {
// 检查会员状况
if resp := u.VipCheck(); resp != nil {
return resp
}
// 检查包更新状况
if resp := u.PkgCheck(); resp != nil {
return resp
}
return u.success()
}
func (u *User) VipCheck() *response.Response {
var resp *response.Response
expire := u.sess.GetUserInfo().VipExpireTime
if expire == -1 {
return nil
}
free := time.Unix(u.sess.GetUserInfo().ActiveTime, 0).AddDate(0, 0, u.params.Int(config.ServiceFreeDay)).Unix()
if free-u.sess.GetUserInfo().ActiveTime > 0 {
return nil
}
//
if expire < time.Now().Unix() {
resp = response.New(u.ctx, config.VipExpire, u.params.Str(config.ServiceVipExpireNotice))
window := &response.Window{Close: false}
resp.Window(window)
buttons := make([]*response.Button, 0)
// 首次支付按钮
if u.sess.GetUserInfo().VipCreateTime == 0 {
if u.params[config.ServiceFirstPayWay] == config.FirstRechargeByCoupon {
resp.Message(u.params.Str(config.ServerCouponNotice))
buttons = append(buttons, New(u.params).CouponButton()...)
} else {
buttons = append(buttons, New(u.params).PayButton()...)
}
} else {
if u.params[config.ServicePayWay] == config.FirstRechargeByCoupon {
resp.Message(u.params.Str(config.ServerCouponNotice))
buttons = append(buttons, New(u.params).CouponButton()...)
} else {
buttons = append(buttons, New(u.params).PayButton()...)
}
}
resp.Button(buttons...)
}
return resp
}
func (u *User) PkgCheck() *response.Response {
var resp *response.Response
var userPkg *model.UserPkgInfo
var pkg *model.Pkg
var err error
user := u.sess.GetUserInfo()
if userPkg, err = dao.NewUserPkg().GetLatest(user.Id); err != nil {
panic(config.ErrDb.New().Append(err))
}
if userPkg == nil {
pkg, err = dao.NewPackage().GetByPkgName("")
if err != nil {
panic(config.ErrDb.New().Append(err))
}
if pkg == nil {
panic(config.ErrData.New().Append(err))
}
resp = response.New(u.ctx, config.UerNoPkg, u.params.Str(config.ServiceUserPackageLack))
button := &response.Button{
Text: u.params.Str(config.ServicePackageLackButton),
Url: u.params.Str(config.ServicePackageLackUrl),
Type: config.ButtonClick,
}
window := &response.Window{Close: false}
resp.Button(button)
resp.Window(window)
return resp
}
// 先判断是否强制更新
if resp = u.expireCheck(userPkg, cast.ToInt(u.params[config.ServiceForceUpdateDay])); resp != nil {
resp.Window(&response.Window{Close: false, Title: u.params.Str(config.ServiceForceUpdateNotice)})
return resp
}
// 判断是否提示更新
if resp = u.expireCheck(userPkg, cast.ToInt(u.params[config.ServiceUpdateBeforeDay])); resp != nil {
msg := fmt.Sprintf(u.params.Str(config.ServiceUpdateNotice), time.Unix(userPkg.Pkg.ExpireTime, 0).Format("2006-01-02"))
resp.Window(&response.Window{Close: true, Title: msg})
return resp
}
return resp
}
// 判断包是否在有效时间内
func (u *User) expireCheck(userPkg *model.UserPkgInfo, day int) *response.Response {
var pkg *model.Pkg
var err error
var resp *response.Response
expire := time.Now().AddDate(0, 0, day)
if time.Unix(userPkg.Pkg.ExpireTime, 0).Before(expire) {
// 提示强制更新
// 查询当前有无最新可用的包
// 1. 先查询当前包有无可用
if pkg, err = dao.NewPackage().GetByPkgName(userPkg.Pkg.Name); err != nil {
panic(config.ErrDb.New().Append(err))
}
// 2. 无则查询其他可用包
if pkg == nil || time.Unix(pkg.ExpireTime, 0).Before(expire) {
if pkg, err = dao.NewPackage().GetByPkgName(""); err != nil {
panic(config.ErrDb.New().Append(err))
}
// 3. 如果都不可用,则提示联系客服
if pkg == nil {
resp = response.New(u.ctx, config.NoPkg, u.params.Str(config.ServiceContactCustomer))
window := &response.Window{Close: false}
resp.Window(window)
return resp
}
}
// 否则返回强制更新
message := u.params.Str(config.ServiceForceUpdateNotice)
if pkg.Name != userPkg.Pkg.Name {
message = u.params.Str(config.ServiceUpdateOtherNotice)
}
resp = response.New(u.ctx, config.NeedUpgrade, message)
button := &response.Button{
Text: u.params.Str(config.ServiceInstallButton),
Url: pkg.Link,
Type: config.ButtonClick,
}
window := &response.Window{Close: false}
resp.Button(button)
resp.Window(window)
}
return resp
}