package service import ( "basic.com/pubsub/protomsg.git" "basic.com/valib/bhomeclient.git" "basic.com/valib/licence.git" "basic.com/valib/logger.git" "encoding/json" "errors" "github.com/satori/go.uuid" "time" "vamicro/appcenter-service/models" "vamicro/appcenter-service/vo" "vamicro/config" "vamicro/extend/util" ) type SdkService struct { bk bhomeclient.Broker } func NewSdkService(broker bhomeclient.Broker) *SdkService { return &SdkService{ bk: broker, } } type res struct { Code int `json:"code"` Success bool `json:"success"` Msg string `json:"msg"` Data interface{} `json:"data"` } func GetLicenseFromShopCenter(sdkId string) (string, error) { url := "http://" + util.GetShopUrl() + "/data/api-s/sdk/dev/license" machineCode := licence.GetMachineCode() logger.Debug("url:", url, "machineCode:", machineCode) paramBody := map[string]interface{}{ "devId": config.Server.AnalyServerId, "sdkId": sdkId, } header := map[string]string{ "Authorization": token, } respBody, err := util.DoPostRequest(url, util.CONTENT_TYPE_JSON, paramBody, nil, header, time.Second*2) if err != nil { logger.Debug("DoPostRequest err:", err) return "", nil } var r res if err = json.Unmarshal(respBody, &r); err != nil { logger.Debug("unmarshal err:", err) return "", nil } bts, _ := json.Marshal(r.Data) var m map[string]interface{} if err := json.Unmarshal(bts, &m); err != nil { return "", err } if lce, ok := m["license"]; ok { return lce.(string), nil } return "", errors.New("未获取到授权信息") } //实时监视本机算法是否已授权 func (sv SdkService) WatchLicense() { for { var sdkE models.Sdk sdks, err := sdkE.FindAll("") if err == nil && sdks != nil { for _, s := range sdks { if s.AuthState3rd == models.AuthState3rd_UnAuth || s.AuthState3rd == models.AuthState3rd_expired { //查看商城中此算法是否已更新授权信息 if lceStr, err := GetLicenseFromShopCenter(s.Id); err == nil { sdkE.Update3rdLicense(s.Id, lceStr, models.AuthState3rd_Authed) } } } } time.Sleep(10 * time.Second) } } func (sv SdkService) Register(argBody *vo.SdkRegisterVo) bool { var err error tx := models.GetDB().Begin() defer func() { if err != nil && tx != nil { tx.Rollback() } }() var sdkE models.Sdk rows, _ := sdkE.SelectById(argBody.Id) registerSdk := argBody.Copy2Sdk() if rows > 0 { //update if err = tx.Table(sdkE.TableName()).Save(®isterSdk).Error; err != nil { return false } } else { if err = tx.Table(sdkE.TableName()).Create(®isterSdk).Error; err != nil { logger.Debug("register create sdk err:", err) return false } } //deal args if err = tx.Exec("delete from sdk_arg where sdk_id=?", sdkE.Id).Error; err != nil { logger.Debug("register del sdkarg err:", err) return false } if argBody.Args != nil { for _, argVo := range argBody.Args { if argVo.Name == "" || argVo.Alias == "" || argVo.Type == "" { err = errors.New("sdk arg error") logger.Debug("register sdk err:", err) return false } sdkArgE := models.SdkArgEntity{ Id: uuid.NewV4().String(), SdkId: argBody.Id, Scope: argVo.Scope, } sdkArgE.SdkArg = argVo.Copy2SdkArg() if sdkArgE.ArgType == "" { sdkArgE.ArgType = "target" //如果为空,认为是目标 } if err = tx.Table(sdkArgE.TableName()).Create(&sdkArgE).Error; err != nil { logger.Debug("register sdk err:", err) return false } //处理算法参数枚举值 if err = tx.Exec("delete from dictionary where type=?", argVo.Alias).Error; err != nil { logger.Debug("register sdk err:", err) return false } if argVo.Dics != nil && len(argVo.Dics) > 0 { for _, argValEle := range argVo.Dics { argValDic := models.Dictionary{ Id: uuid.NewV4().String(), Value: argValEle.Value, Name: argValEle.Name, Type: argVo.Alias, Sort: argValEle.Sort, ParentId: argBody.Id, //属于哪个算法 } if err = tx.Table(argValDic.TableName()).Create(&argValDic).Error; err != nil { logger.Debug("register sdk err:", err) return false } } } } } tx.Commit() sv.AddDbChangeMsg(protomsg.DbAction_Insert) return true } func (sv SdkService) AddDbChangeMsg(action protomsg.DbAction) { pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Sdk, Action: action, } pb, _ := json.Marshal(pMsg) sv.bk.Publish(ProcName, pb) }