@@ -0,0 +1,363 @@
|
||||
/*
|
||||
* @Description: In User Settings Edit
|
||||
* @Author: your name
|
||||
* @Date: 2019-08-28 17:35:29
|
||||
* @LastEditTime: 2019-08-30 11:25:44
|
||||
* @LastEditors: Please set LastEditors
|
||||
*/
|
||||
package versionmod
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"91porn-server/common/db"
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/models"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
var mdb *db.MongoDB
|
||||
|
||||
const (
|
||||
Normal = 0
|
||||
TF = 1 //ios 测试包
|
||||
VESTBAG = 2 //马甲包
|
||||
|
||||
Ios = "ios"
|
||||
Adr = "android"
|
||||
H5 = "h5"
|
||||
)
|
||||
|
||||
// VersionBody request body
|
||||
type VersionBody struct {
|
||||
Code int64 `json:"code" bson:"code"` //排序字段
|
||||
VersionName string `json:"verName" bson:"verName"` //版本名字
|
||||
Platform string `json:"platform" bson:"platform"` //平台 ios
|
||||
Description string `json:"description" bson:"description"` //描述
|
||||
ForcedUpdate bool `json:"forcedUpdate" bson:"ForcedUpdate"` //是否强制更新
|
||||
URL string `json:"url" bson:"url"` //下载链接
|
||||
IosUrl string `json:"iosUrl" bson:"iosUrl"` //商店包下载链接
|
||||
}
|
||||
|
||||
// Version 版本检测表
|
||||
type Version struct {
|
||||
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` //id
|
||||
Code int64 `json:"code" bson:"code"` //排序字段
|
||||
VersionName string `json:"verName" bson:"verName"` //版本名字
|
||||
Platform string `json:"platform" bson:"platform" ` //平台 ios
|
||||
Description string `json:"description" bson:"description"` //描述
|
||||
URL string `json:"url" bson:"url"` //下载链接
|
||||
ForcedUpdate bool `json:"forcedUpdate" bson:"forcedUpdate"` //是否强制更新
|
||||
IsActive bool `json:"isActive" bson:"isActive"` //是否启用
|
||||
BuildID string `json:"buildId" bson:"buildId"` //包安装ID
|
||||
PassCheck bool `json:"passCheck" bson:"passCheck"` //是否提审通过
|
||||
Origin int64 `json:"origin" bson:"origin"` //表示来源 0 表示 正常 1 TF版
|
||||
IsUpgrade bool `json:"isUpgrade" bson:"isUpgrade"` //是否是当前版本升级到新版
|
||||
SpecVersion string `json:"specVersion" bson:"specVersion"` //指定升级的版本
|
||||
CreatedAt time.Time `form:"createdAt" json:"createdAt" bson:"createdAt"` //记录创建时间
|
||||
VersionRange VersionRange `json:"versionRange" bson:"versionRange"` //版本范围 适用于版本版本升级的范围 如果全部为空 则表示全部版本都可升级
|
||||
}
|
||||
|
||||
type VersionRange struct {
|
||||
Major string `json:"major" bson:"major"`
|
||||
Minor string `json:"minor" bson:"minor"`
|
||||
}
|
||||
|
||||
// VersionUpdateReq 版本检测表
|
||||
type VersionUpdateReq struct {
|
||||
Platform *string `json:"platform" bson:"platform,omitempty" ` //平台 ios
|
||||
Description *string `json:"description" bson:"description,omitempty"` //描述
|
||||
URL *string `json:"url" form:"url" bson:"url,omitempty"` //下载链接
|
||||
ForcedUpdate *bool `json:"forcedUpdate" bson:"forcedUpdate,omitempty"` //是否强制更新
|
||||
IsActive *bool `json:"isActive" bson:"isActive,omitempty"` //是否启用
|
||||
BuildID *string `json:"buildId" bson:"buildId,omitempty"` //包安装ID
|
||||
PassCheck *bool `json:"passCheck" bson:"passCheck,omitempty"` //是否提审通过
|
||||
Origin *int64 `json:"origin,omitempty" bson:"origin,omitempty"` //表示来源 0 表示 正常 1 TF版
|
||||
IsUpgrade *bool `json:"isUpgrade" bson:"isUpgrade"` //是否是当前版本升级到新版
|
||||
SpecVersion *string `json:"specVersion" bson:"specVersion,omitempty"` //指定升级的版本
|
||||
VersionRange VersionRange `json:"versionRange" bson:"versionRange"`
|
||||
}
|
||||
|
||||
// VersionQueryReq 查询参数
|
||||
type VersionQueryReq struct {
|
||||
ID *string `form:"id" json:"_id,omitempty" bson:"_id"` //id
|
||||
VersionName *string `form:"verName" json:"verName,omitempty" bson:"verName"` //版本名字
|
||||
Platform *string `form:"platform" json:"platform,omitempty" bson:"platform" ` //平台 ios
|
||||
Description *string `form:"description" json:"description,omitempty" bson:"description"` //描述
|
||||
URL *string `form:"url" json:"url,omitempty" bson:"url"` //下载链接
|
||||
ForcedUpdate *bool `form:"forcedUpdate" json:"forcedUpdate,omitempty" bson:"forcedUpdate"` //是否强制更新
|
||||
}
|
||||
|
||||
func Init() {
|
||||
mdb = db.Init(table)
|
||||
initIndex()
|
||||
}
|
||||
|
||||
const table = models.Version
|
||||
|
||||
// InitIndex 设置index
|
||||
func initIndex() {
|
||||
many := []mongo.IndexModel{
|
||||
{
|
||||
Keys: bson.D{{Key: "verName", Value: 1}, {Key: "buildId", Value: 1}, {Key: "platform", Value: 1}},
|
||||
Options: options.Index().SetUnique(true).SetPartialFilterExpression(bson.M{"buildId": bson.M{"$gt": ""}}),
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "buildId", Value: 1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "origin", Value: 1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "platform", Value: 1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "isActive", Value: 1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "createdAt", Value: 1}},
|
||||
},
|
||||
}
|
||||
if _, err := coll().CreateIndex(many); err != nil {
|
||||
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
|
||||
}
|
||||
}
|
||||
|
||||
func coll() *db.MongoTool {
|
||||
return mdb.Coll(table)
|
||||
}
|
||||
|
||||
func insertCheck(nv *Version) error {
|
||||
ov, err := FindVersion(nv.Platform)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if nv.Code >= ov.Code {
|
||||
return nil
|
||||
}
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "insertCheck", table, "errors.New", err),
|
||||
log.Any("nv", nv),
|
||||
)
|
||||
return errors.New("version is too low")
|
||||
}
|
||||
|
||||
// Insert 插入一条记录
|
||||
func Insert(v *Version) error {
|
||||
if err := insertCheck(v); err != nil {
|
||||
return err
|
||||
}
|
||||
v.CreatedAt = time.Now()
|
||||
if _, err := coll().InsertOne(v); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Insert", table, "InsertOne", err),
|
||||
log.Any("v", v),
|
||||
)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Delete 删除
|
||||
func Delete(id primitive.ObjectID) error {
|
||||
if _, err := coll().DeleteById(id); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Delete", table, "DeleteById", err),
|
||||
log.Any("id", id),
|
||||
)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Update 修改
|
||||
func Update(id primitive.ObjectID, set VersionUpdateReq) error {
|
||||
if _, err := coll().UpdateOne(bson.M{"_id": id}, bson.M{"$set": set}); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Update", table, "UpdateOne", err),
|
||||
log.Any("id", id),
|
||||
log.Any("set", set),
|
||||
)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// FindMany 查找所有版本
|
||||
func FindMany(filter bson.M, opts *options.FindOptions) (total int64, data []*Version, err error) {
|
||||
if err = coll().Find(&data, filter, opts); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindMany", table, "Find", err),
|
||||
log.Any("filter", filter),
|
||||
)
|
||||
return
|
||||
}
|
||||
total, err = coll().Count(filter)
|
||||
if err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindMany", table, "Count", err),
|
||||
log.Any("filter", filter),
|
||||
)
|
||||
return
|
||||
}
|
||||
if total == 0 {
|
||||
data = make([]*Version, 0)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Verlist 查找所有版本
|
||||
func Verlist() (data []*Version) {
|
||||
var infos []*Version
|
||||
filter := bson.M{"isActive": true, "origin": 0} //排除掉 ios tf 版的
|
||||
if err := coll().Find(&infos, filter); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Verlist", table, "Find", err),
|
||||
log.Any("filter", filter),
|
||||
)
|
||||
return
|
||||
}
|
||||
var maxIOS, maxAn, maxH5 Version
|
||||
data = make([]*Version, 0, len(infos)*3)
|
||||
for _, v := range infos {
|
||||
if v == nil {
|
||||
continue
|
||||
}
|
||||
if v.Platform == Ios && v.Code > maxIOS.Code {
|
||||
maxIOS = *v
|
||||
}
|
||||
if v.Platform == Adr && v.Code > maxAn.Code {
|
||||
maxAn = *v
|
||||
}
|
||||
if v.Platform == H5 && v.Code > maxH5.Code {
|
||||
maxH5 = *v
|
||||
}
|
||||
}
|
||||
data = append(data, &maxIOS)
|
||||
data = append(data, &maxAn)
|
||||
data = append(data, &maxH5)
|
||||
return
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: FindVersion 查找最新版本信息
|
||||
* @param {type}
|
||||
* @return:
|
||||
*/
|
||||
func FindVersion(pName string) (data Version, err error) {
|
||||
opts := options.FindOneOptions{
|
||||
Sort: bson.D{{Key: "code", Value: -1}},
|
||||
}
|
||||
if err = coll().FindOne(&data, bson.M{"platform": pName, "origin": 0, "isActive": true}, &opts); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindVersion", table, "FindOne", err),
|
||||
log.Any("pName", pName),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func FindVersionExcluedBuildId(pName string) (data Version, err error) {
|
||||
opts := options.FindOneOptions{
|
||||
Sort: bson.D{{Key: "code", Value: -1}},
|
||||
}
|
||||
if err = coll().FindOne(&data, bson.M{"platform": pName, "origin": 0, "isActive": true}, &opts); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindVersionExcluedBuildId", table, "FindOne", err),
|
||||
log.Any("pName", pName),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 是否通过提包审核
|
||||
func CheckPass(ver, buildId string) (pass bool, err error) {
|
||||
data := Version{}
|
||||
if err = coll().FindOne(&data, bson.M{"verName": ver, "buildId": buildId}); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CheckPass", table, "FindOne", err),
|
||||
log.Any("ver", ver),
|
||||
log.Any("buildId", buildId),
|
||||
)
|
||||
return
|
||||
}
|
||||
return data.PassCheck, nil
|
||||
}
|
||||
|
||||
func FindVersionBaseOnBuildId(buildId string) (data *Version, err error) {
|
||||
opts := options.FindOneOptions{
|
||||
Sort: bson.D{{Key: "code", Value: -1}},
|
||||
}
|
||||
if err = coll().FindOne(&data, bson.M{"buildId": buildId, "isActive": true, "passCheck": true}, &opts); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindVersionBaseOnBuildId", table, "FindOne", err),
|
||||
log.Any("buildId", buildId),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 根据平台buildId 查找版本信息 目的是确认当前buildId 对应的包是否是IOS TF包
|
||||
func FindVersionBaseOnBuildIdAndPlatForm(buildId, platform string) (data *Version, err error) {
|
||||
opts := options.FindOneOptions{
|
||||
Sort: bson.D{{Key: "code", Value: -1}},
|
||||
}
|
||||
if err = coll().FindOne(&data, bson.M{"buildId": buildId, "platform": platform, "isActive": true}, &opts); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindVersionBaseOnBuildIdAndPlatForm", table, "FindOne", err),
|
||||
log.Any("buildId", buildId),
|
||||
log.Any("platform", platform),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 根据平台 版本 还有 build 查看当前版本呢信息
|
||||
func FindOneVersionByPlatVerBuild(platform, ver, buildId string) (data *Version, err error) {
|
||||
if err = coll().FindOne(&data, bson.M{"platform": platform, "verName": ver, "buildId": buildId}); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindOneVersionByPlatVerBuild", table, "FindOne", err),
|
||||
log.Any("platform", platform),
|
||||
log.Any("verName", ver),
|
||||
log.Any("buildId", buildId),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 根据平台和版本 查找版本信息 限于正常版
|
||||
func FindOneVersionByPlatVer(platform, ver string) (data *Version, err error) {
|
||||
if err = coll().FindOne(&data, bson.M{"platform": platform, "verName": ver, "origin": 0}); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindOneVersionByPlatVer", table, "FindOne", err),
|
||||
log.Any("platform", platform),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func FindOneByID(id primitive.ObjectID) (data *Version, err error) {
|
||||
if err = coll().FindOne(&data, bson.M{"_id": id}); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindOneByID", table, "FindOne", err),
|
||||
log.Any("id", id),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// FindTF 查找所有版本
|
||||
func FindTF() (data []*Version) {
|
||||
var limit int64 = 1
|
||||
opt := options.FindOptions{
|
||||
Limit: &limit,
|
||||
Sort: bson.D{{Key: "code", Value: -1}},
|
||||
}
|
||||
filter := bson.M{"isActive": true, "origin": 1} //排除掉 ios tf 版的
|
||||
if err := coll().Find(&data, filter, &opt); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Verlist", table, "Find", err),
|
||||
log.Any("filter", filter),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user