|
@@ -2,14 +2,22 @@ package service
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"context"
|
|
"context"
|
|
|
|
|
+ "errors"
|
|
|
|
|
+ "fmt"
|
|
|
|
|
+ "strconv"
|
|
|
|
|
+ "time"
|
|
|
|
|
+
|
|
|
"dsbqj-admin/app/task"
|
|
"dsbqj-admin/app/task"
|
|
|
"dsbqj-admin/model/mongo/version"
|
|
"dsbqj-admin/model/mongo/version"
|
|
|
|
|
+ "dsbqj-admin/tool"
|
|
|
|
|
|
|
|
"github.com/kamva/mgm/v3"
|
|
"github.com/kamva/mgm/v3"
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
+const versionExternalReqTimeoutSec = 30 * 60
|
|
|
|
|
+
|
|
|
type VersionReloadService struct {
|
|
type VersionReloadService struct {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -110,6 +118,113 @@ func (service *VersionEditService) Edit() error {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+type VersionProdService struct {
|
|
|
|
|
+ Id string `json:"id" binding:"required"`
|
|
|
|
|
+ IsProd bool `json:"isProd"`
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (service *VersionProdService) Update() error {
|
|
|
|
|
+ objectId, err := primitive.ObjectIDFromHex(service.Id)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ coll := mgm.Coll(&version.Version{})
|
|
|
|
|
+ var current version.Version
|
|
|
|
|
+ if err := coll.FindByID(objectId, ¤t); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if service.IsProd {
|
|
|
|
|
+ if _, err := coll.UpdateMany(
|
|
|
|
|
+ context.Background(),
|
|
|
|
|
+ bson.M{"_id": bson.M{"$ne": objectId}},
|
|
|
|
|
+ bson.M{"$set": bson.M{"isProd": false}},
|
|
|
|
|
+ ); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ _, err = coll.UpdateOne(
|
|
|
|
|
+ context.Background(),
|
|
|
|
|
+ bson.M{"_id": objectId},
|
|
|
|
|
+ bson.M{"$set": bson.M{"isProd": service.IsProd}},
|
|
|
|
|
+ )
|
|
|
|
|
+ return err
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type VersionExternalConfigService struct {
|
|
|
|
|
+ Channel string `form:"channel" json:"channel" binding:"required"`
|
|
|
|
|
+ Version string `form:"version" json:"version" binding:"required"`
|
|
|
|
|
+ AbVer *string `form:"abVer" json:"abVer"`
|
|
|
|
|
+ MD5 *string `form:"md5" json:"md5"`
|
|
|
|
|
+ TimeSec int64 `form:"timesec" json:"timesec" binding:"required"`
|
|
|
|
|
+ Sign string `form:"sign" json:"sign" binding:"required"`
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (service *VersionExternalConfigService) Save() error {
|
|
|
|
|
+ if service.AbVer == nil && service.MD5 == nil {
|
|
|
|
|
+ return errors.New("abVer or md5 is required")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ filterDoc := bson.M{
|
|
|
|
|
+ "channel": service.Channel,
|
|
|
|
|
+ "version": service.Version,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ coll := mgm.Coll(&version.Version{})
|
|
|
|
|
+ var current version.Version
|
|
|
|
|
+ if err := coll.First(filterDoc, ¤t); err != nil {
|
|
|
|
|
+ return errors.New("version not found")
|
|
|
|
|
+ }
|
|
|
|
|
+ if current.IsProd {
|
|
|
|
|
+ return errors.New("production version does not allow external upload")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ updateDoc := bson.M{}
|
|
|
|
|
+ if service.AbVer != nil {
|
|
|
|
|
+ updateDoc["abVer"] = *service.AbVer
|
|
|
|
|
+ }
|
|
|
|
|
+ if service.MD5 != nil {
|
|
|
|
|
+ updateDoc["md5"] = *service.MD5
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ _, err := coll.UpdateOne(
|
|
|
|
|
+ context.Background(),
|
|
|
|
|
+ bson.M{"_id": current.ID},
|
|
|
|
|
+ bson.M{"$set": updateDoc},
|
|
|
|
|
+ )
|
|
|
|
|
+ return err
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (service *VersionExternalConfigService) ValidateAuth() error {
|
|
|
|
|
+ deltaTime := time.Now().Unix() - service.TimeSec
|
|
|
|
|
+ if deltaTime < 0 {
|
|
|
|
|
+ deltaTime = -deltaTime
|
|
|
|
|
+ }
|
|
|
|
|
+ if deltaTime > versionExternalReqTimeoutSec {
|
|
|
|
|
+ return fmt.Errorf("timesec timeout")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ params := map[string]any{
|
|
|
|
|
+ "channel": service.Channel,
|
|
|
|
|
+ "version": service.Version,
|
|
|
|
|
+ "timesec": strconv.FormatInt(service.TimeSec, 10),
|
|
|
|
|
+ }
|
|
|
|
|
+ if service.AbVer != nil {
|
|
|
|
|
+ params["abVer"] = *service.AbVer
|
|
|
|
|
+ }
|
|
|
|
|
+ if service.MD5 != nil {
|
|
|
|
|
+ params["md5"] = *service.MD5
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ sign := tool.GenSign(params)
|
|
|
|
|
+ if sign != service.Sign {
|
|
|
|
|
+ return fmt.Errorf("sign error")
|
|
|
|
|
+ }
|
|
|
|
|
+ return nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
type VersionDeleteService struct {
|
|
type VersionDeleteService struct {
|
|
|
Id string `json:"id" binding:"required"`
|
|
Id string `json:"id" binding:"required"`
|
|
|
}
|
|
}
|