|
|
@@ -12,11 +12,23 @@ import (
|
|
|
"dsbqj-admin/pkg/logger"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "go.mongodb.org/mongo-driver/bson"
|
|
|
+ "go.mongodb.org/mongo-driver/mongo/options"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"sync"
|
|
|
)
|
|
|
|
|
|
+var validProj = map[string]bool{
|
|
|
+ "bzst": true,
|
|
|
+ "ds20": true,
|
|
|
+}
|
|
|
+
|
|
|
+var validOs = map[string]bool{
|
|
|
+ "ios": true,
|
|
|
+ "android": true,
|
|
|
+}
|
|
|
+
|
|
|
type THotUpdateVerManager struct {
|
|
|
mu sync.RWMutex
|
|
|
versionMap map[string]map[string]*TGetVersionRsp // proj:os:versionInfo
|
|
|
@@ -39,26 +51,31 @@ func GetTHotUpdateVerManager() *THotUpdateVerManager {
|
|
|
}
|
|
|
|
|
|
func (this *THotUpdateVerManager) Init() {
|
|
|
- _, err := this.GetMaxVerInfo("bzst", "ios")
|
|
|
+ _, err := this.GetMaxPubVerInfo("bzst", "ios")
|
|
|
if err != nil {
|
|
|
logger.Error(err.Error())
|
|
|
}
|
|
|
- _, err = this.GetMaxVerInfo("bzst", "android")
|
|
|
+ _, err = this.GetMaxPubVerInfo("bzst", "android")
|
|
|
if err != nil {
|
|
|
logger.Error(err.Error())
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (this *THotUpdateVerManager) GetMaxVerInfo(proj, os string) (*TGetVersionRsp, error) {
|
|
|
-
|
|
|
+func (this *THotUpdateVerManager) GetMaxPubVerInfo(proj, os string) (*TGetVersionRsp, error) {
|
|
|
if proj == "" || os == "" {
|
|
|
return nil, errors.New("project or os can't be empty")
|
|
|
}
|
|
|
+ if !validProj[proj] {
|
|
|
+ return nil, fmt.Errorf("project:%s invalid", proj)
|
|
|
+ }
|
|
|
+ if !validOs[os] {
|
|
|
+ return nil, fmt.Errorf("os:%s invalid", os)
|
|
|
+ }
|
|
|
|
|
|
if ver, err := this.getVersionMapBy(proj, os); err == nil {
|
|
|
return ver, nil
|
|
|
} else {
|
|
|
- versionRsp, err := this.findMaxVersion(proj, os)
|
|
|
+ versionRsp, err := this.findDBMaxPubVersion(proj, os)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
@@ -67,6 +84,15 @@ func (this *THotUpdateVerManager) GetMaxVerInfo(proj, os string) (*TGetVersionRs
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 内部API调用
|
|
|
+func (this *THotUpdateVerManager) GetMaxVerInfo(proj, os string) (*TGetVersionRsp, error) {
|
|
|
+ if proj == "" || os == "" {
|
|
|
+ return nil, errors.New("project or os can't be empty")
|
|
|
+ }
|
|
|
+ return this.findDBMaxVersion(proj, os)
|
|
|
+}
|
|
|
+
|
|
|
+// 内部API调用
|
|
|
func (this *THotUpdateVerManager) AddVersion(req *TAddVersionReq) error {
|
|
|
if !this.isInvalid(req) {
|
|
|
return errors.New("version is invalid")
|
|
|
@@ -78,20 +104,48 @@ func (this *THotUpdateVerManager) AddVersion(req *TAddVersionReq) error {
|
|
|
PackageUrl: req.PackageUrl,
|
|
|
RemoteVersionUrl: req.RemoteVersionUrl,
|
|
|
RemoteManifestUrl: req.RemoteManifestUrl,
|
|
|
+ Status: hotupdate.DEF_VER_STATUS_NONE,
|
|
|
}
|
|
|
- err := this.versionDB.Create(mVersion)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
+ return this.versionDB.Create(mVersion)
|
|
|
+}
|
|
|
+
|
|
|
+func (this *THotUpdateVerManager) ChangeStatus(id string, status int16) (*TGetVersionRsp, error) {
|
|
|
+ if id == "" {
|
|
|
+ return nil, errors.New("id can't be empty")
|
|
|
}
|
|
|
- verRsp := &TGetVersionRsp{
|
|
|
- Version: req.Version,
|
|
|
- PackageUrl: req.PackageUrl,
|
|
|
- RemoteVersionUrl: req.RemoteVersionUrl,
|
|
|
- RemoteManifestUrl: req.RemoteManifestUrl,
|
|
|
+ if status != hotupdate.DEF_VER_STATUS_NONE && status != hotupdate.DEF_VER_STATUS_PUBLIC {
|
|
|
+ return nil, fmt.Errorf("invalid status %d", status)
|
|
|
}
|
|
|
- this.updateVersionMap(req.Proj, req.Os, verRsp)
|
|
|
+ updateMap := make(map[string]interface{})
|
|
|
+ updateMap["status"] = status
|
|
|
+ mVersion, err := this.versionDB.Update(id, updateMap)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ logger.Info("after update mVersion", mVersion)
|
|
|
+ vRsp := &TGetVersionRsp{}
|
|
|
+ vRsp.FromMVersion(mVersion)
|
|
|
+ return vRsp, nil
|
|
|
+}
|
|
|
|
|
|
- return nil
|
|
|
+// 内部API调用 分页获取version list
|
|
|
+func (this *THotUpdateVerManager) GetVersionList(start, limit int64) ([]*TGetVersionRsp, error) {
|
|
|
+ opts := options.Find().
|
|
|
+ SetSort(bson.M{"created_at": -1}). // 按版本降序
|
|
|
+ SetSkip(start).
|
|
|
+ SetLimit(limit)
|
|
|
+
|
|
|
+ dbVersionArr, err := this.versionDB.Find(nil, opts)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ rspArr := make([]*TGetVersionRsp, len(dbVersionArr))
|
|
|
+ for _, mVersion := range dbVersionArr {
|
|
|
+ vRsp := &TGetVersionRsp{}
|
|
|
+ vRsp.FromMVersion(&mVersion)
|
|
|
+ rspArr = append(rspArr, vRsp)
|
|
|
+ }
|
|
|
+ return rspArr, nil
|
|
|
}
|
|
|
|
|
|
func (this *THotUpdateVerManager) getVersionMapBy(proj, os string) (*TGetVersionRsp, error) {
|
|
|
@@ -119,7 +173,7 @@ func (this *THotUpdateVerManager) updateVersionMap(proj, os string, versionRsp *
|
|
|
|
|
|
// 版本号是递增的
|
|
|
func (this *THotUpdateVerManager) isInvalid(req *TAddVersionReq) bool {
|
|
|
- curVersion, err := this.GetMaxVerInfo(req.Proj, req.Os)
|
|
|
+ curVersion, err := this.findDBMaxVersion(req.Proj, req.Os)
|
|
|
if err != nil {
|
|
|
// 默认只有系统初始化时
|
|
|
return true
|
|
|
@@ -128,28 +182,44 @@ func (this *THotUpdateVerManager) isInvalid(req *TAddVersionReq) bool {
|
|
|
return CompareVersion(req.Version, curVersion.Version) == 1
|
|
|
}
|
|
|
|
|
|
-func (this *THotUpdateVerManager) findMaxVersion(proj, os string) (*TGetVersionRsp, error) {
|
|
|
+// 对外的最大version
|
|
|
+func (this *THotUpdateVerManager) findDBMaxPubVersion(proj, os string) (*TGetVersionRsp, error) {
|
|
|
+ return this.findMaxVersionByStatus(proj, os, hotupdate.DEF_VER_STATUS_PUBLIC)
|
|
|
+}
|
|
|
+
|
|
|
+// 查找数据库中最大的version
|
|
|
+func (this *THotUpdateVerManager) findDBMaxVersion(proj, os string) (*TGetVersionRsp, error) {
|
|
|
if proj == "" || os == "" {
|
|
|
return nil, errors.New("project or os can't be empty")
|
|
|
}
|
|
|
+ return this.findMaxVersionByStatus(proj, os, hotupdate.DEF_VER_STATUS_INVALID)
|
|
|
+}
|
|
|
|
|
|
- versions, num, err := this.versionDB.ListByProjectAndOS(proj, os, 1, 20)
|
|
|
- // 因为是按时间降序 潜规则最近一条的version最大
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
+func (this *THotUpdateVerManager) findMaxVersionByStatus(proj, os string, status int16) (*TGetVersionRsp, error) {
|
|
|
+ if proj == "" || os == "" {
|
|
|
+ return nil, errors.New("project or os can't be empty")
|
|
|
+ }
|
|
|
+
|
|
|
+ filte := bson.M{
|
|
|
+ "project": proj,
|
|
|
+ "os": os,
|
|
|
}
|
|
|
- logger.Debug("versions:", num, versions)
|
|
|
- if num == 0 {
|
|
|
- return nil, errors.New(fmt.Sprintf("proj:%s os:%s not find", proj, os))
|
|
|
+ if status == hotupdate.DEF_VER_STATUS_PUBLIC || status == hotupdate.DEF_VER_STATUS_NONE {
|
|
|
+ filte["status"] = status
|
|
|
}
|
|
|
+ opts := options.Find().
|
|
|
+ SetSort(bson.M{"created_at": -1})
|
|
|
|
|
|
- versionObj := versions[0]
|
|
|
- versionRsp := &TGetVersionRsp{
|
|
|
- Version: versionObj.Version,
|
|
|
- PackageUrl: versionObj.PackageUrl,
|
|
|
- RemoteManifestUrl: versionObj.RemoteManifestUrl,
|
|
|
- RemoteVersionUrl: versionObj.RemoteVersionUrl,
|
|
|
+ versionArr, err := this.versionDB.Find(filte, opts)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ if len(versionArr) == 0 {
|
|
|
+ return nil, errors.New("version not found")
|
|
|
}
|
|
|
+ mVersion := versionArr[0]
|
|
|
+ versionRsp := &TGetVersionRsp{}
|
|
|
+ versionRsp.FromMVersion(&mVersion)
|
|
|
return versionRsp, nil
|
|
|
}
|
|
|
|