diff --git a/app/api/controller/user.go b/app/api/controller/user.go new file mode 100644 index 0000000..13bea7a --- /dev/null +++ b/app/api/controller/user.go @@ -0,0 +1,18 @@ +package controller + +import ( + "net/http" + "twin-api/app/api/service" + + "git.u8t.cn/open/go-server/session" + "github.com/gin-gonic/gin" +) + +type User struct { + sess *session.ApiSession +} + +func (u *User) Verify(ctx *gin.Context) { + res := service.NewUser(ctx).Verify() + ctx.JSON(http.StatusOK, res) +} diff --git a/app/api/service/user.go b/app/api/service/user.go new file mode 100644 index 0000000..db0eb2d --- /dev/null +++ b/app/api/service/user.go @@ -0,0 +1,206 @@ +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 User struct { + sess *session.ApiSession + params map[string]any + 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) Verify() *response.Response { + // 检查免费使用时间 + if resp := u.FreeCheck(); resp != nil { + return resp + } + + // 检查会员状况 + if resp := u.VipCheck(); resp != nil { + return resp + } + // 检查包更新状况 + if resp := u.PkgCheck(); resp != nil { + return resp + } + + resp := response.New(u.ctx, config.Success, "success") + resp.Window(&response.Window{Title: "", Close: true}) + resp.Data.Buttons = make([]response.Button, 0) + return resp +} + +func (u *User) FreeCheck() *response.Response { + var resp *response.Response + free := time.Unix(u.sess.GetUserInfo().ActiveTime, 0).AddDate(0, 0, cast.ToInt(u.params[config.ServiceFreeDay])) + if free.Unix() >= time.Now().Unix() { + // 提示需要充值 + resp = response.New(u.ctx, config.VipExpire, u.params[config.ServiceVipExpireNotice].(string)) + button := &response.Button{ + Text: u.params[config.ServiceVipExpireButton].(string), + Url: u.params[config.ServiceVipExpireUrl].(string), + } + window := &response.Window{Close: false} + resp.Botton(button) + resp.Window(window) + + return resp + } + + return resp +} + +func (u *User) VipCheck() *response.Response { + var resp *response.Response + expire := u.sess.GetUserInfo().VipExpireTime + if expire == -1 { + return nil + } + + if expire < time.Now().Unix() { + resp = response.New(u.ctx, config.VipExpire, u.params[config.ServiceVipExpireNotice].(string)) + button := &response.Button{ + Text: u.params[config.ServiceVipExpireButton].(string), + Url: u.params[config.ServiceVipExpireUrl].(string), + } + window := &response.Window{Close: false} + resp.Botton(button) + resp.Window(window) + } + + 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[config.ServiceUserPackageLack].(string)) + button := &response.Button{ + Text: u.params[config.ServicePackageLackButton].(string), + Url: u.params[config.ServicePackageLackUrl].(string), + } + window := &response.Window{Close: false} + resp.Botton(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[config.ServiceForceUpdateNotice].(string)}) + return resp + } + + // 判断是否提示更新 + if resp = u.expireCheck(userPkg, cast.ToInt(u.params[config.ServiceUpdateBeforeDay])); resp != nil { + msg := fmt.Sprintf(u.params[config.ServiceUpdateNotice].(string), 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[config.ServiceContactCustomer].(string)) + window := &response.Window{Close: false} + resp.Window(window) + return resp + } + } + + // 否则返回强制更新 + message := u.params[config.ServiceForceUpdateNotice].(string) + if pkg.Name != userPkg.Pkg.Name { + message = u.params[config.ServiceUpdateOtherNotice].(string) + } + resp = response.New(u.ctx, config.NeedUpgrade, message) + button := &response.Button{ + Text: u.params[config.ServiceInstallButton].(string), + Url: pkg.Link, + } + window := &response.Window{Close: false} + resp.Botton(button) + resp.Window(window) + } + + return resp +}