package controllers
|
|
import (
|
"bytes"
|
"encoding/json"
|
"strconv"
|
"vamicro/appcenter-service/models"
|
"vamicro/appcenter-service/service"
|
"vamicro/appcenter-service/vo"
|
|
"basic.com/pubsub/protomsg.git"
|
"basic.com/valib/bhomeclient.git"
|
"basic.com/valib/logger.git"
|
)
|
|
type SdkController struct {
|
}
|
|
// @Summary 算法注册
|
// @Description 算法注册
|
// @Accept json
|
// @Produce json
|
// @Tags sdk
|
// @Param reqMap body vo.SdkVo true "算法注册参数"
|
// @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"",success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}"
|
// @Router /data/api-v/sdk/register [POST]
|
func (sc SdkController) Register(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var reqBody vo.SdkRegisterVo
|
|
c.BindJSON(&reqBody)
|
if reqBody.Id == "" || reqBody.SdkType == "" || reqBody.SdkName == "" || reqBody.Icon == "" {
|
return &bhomeclient.Reply{Success: false, Msg: "参数有误"}
|
}
|
logger.Debug("sdk register paramBody:", reqBody)
|
sv := service.NewSdkService(h.Bk)
|
if sv.Register(&reqBody) {
|
return &bhomeclient.Reply{Success: true, Msg: "算法注册成功"}
|
} else {
|
return &bhomeclient.Reply{Success: false, Msg: "注册失败"}
|
}
|
}
|
|
// @Summary 查找所有算法
|
// @Description 查找所有算法
|
// @Produce json
|
// @Tags sdk
|
// @Param sdkName query string false "可选参数"
|
// @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"算法列表",success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"[]",success:false}"
|
// @Router /data/api-v/sdk/findAllSdk [GET]
|
func (sc SdkController) FindAllSdk(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
sdkName := c.Query("sdkName")
|
insStr := c.Query("installed") //如果未传此参数,则表示查所有
|
userId := c.Header("Login_user_id")
|
ok := false
|
if insStr != "" {
|
ok = true
|
}
|
logger.Debugf("FindAllSdk sdkName=%v, insStr=%v, ok=%v, userId=%v", sdkName, insStr, ok, userId)
|
installed, _ := strconv.ParseBool(insStr)
|
|
sdks := service.GetSdkList(sdkName, insStr, userId) //本机已安装的算法
|
if ok && !installed { //传了installed参数
|
nSdks := make([]service.SdkInsOrUpgrade, 0)
|
for _, s := range sdks {
|
if !s.Installed {
|
nSdks = append(nSdks, s)
|
}
|
}
|
return &bhomeclient.Reply{Success: true, Data: nSdks}
|
} else {
|
return &bhomeclient.Reply{Success: true, Data: sdks}
|
}
|
}
|
|
// @Summary 根据id获取算法信息
|
// @Description 根据id获取算法信息
|
// @Produce json
|
// @Tags sdk
|
// @Param id query string true "算法id,必填"
|
// @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"算法信息",success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}"
|
// @Router /data/api-v/sdk/getById [GET]
|
func (sc SdkController) GetById(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var sdk models.Sdk
|
|
id := c.Query("id")
|
if id == "" {
|
return &bhomeclient.Reply{Success: false, Msg: "参数有误"}
|
}
|
rows, err := sdk.SelectById(id)
|
if err != nil || rows == 0 {
|
return &bhomeclient.Reply{Success: false, Msg: "记录不存在"}
|
}
|
|
var sdkVo = vo.SdkVo{}
|
sdkVo.Sdk = sdk
|
sdkVo.Args = sdk.GetSdkArgs(id, models.SCOPE_CAMERARULE)
|
return &bhomeclient.Reply{Success: true, Data: sdkVo}
|
}
|
|
// @Summary 根据taskId获取算法信息
|
// @Description 根据taskId获取算法信息
|
// @Produce json
|
// @Tags sdk
|
// @Param taskId query string true "taskId,必填"
|
// @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"算法信息",success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}"
|
// @Router /data/api-v/sdk/findByTaskId [GET]
|
func (sc SdkController) FindByTaskId(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
taskId := c.Query("taskId")
|
if taskId == "" {
|
return &bhomeclient.Reply{Success: false, Msg: "参数有误"}
|
}
|
var sdk models.Sdk
|
sdks, err := sdk.FindByTaskId(taskId)
|
if err != nil {
|
return &bhomeclient.Reply{Success: false, Msg: "查询失败"}
|
}
|
var sdkVoArr []vo.SdkVo
|
for _, sdk := range sdks {
|
sdkVo := vo.SdkVo{}
|
sdkVo.Sdk = sdk
|
sdkVo.Args = sdk.GetSdkArgs(sdk.Id, models.SCOPE_CAMERARULE)
|
sdkVoArr = append(sdkVoArr, sdkVo)
|
}
|
|
if err != nil {
|
return &bhomeclient.Reply{Success: false, Msg: "记录不存在"}
|
} else {
|
return &bhomeclient.Reply{Success: true, Data: sdkVoArr}
|
}
|
}
|
|
// @Summary 获取所有算法通道数量设置
|
// @Description 获取所有算法通道数量设置
|
// @Produce json
|
// @Tags sdk
|
// @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"",success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}"
|
// @Router /data/api-v/sdk/getAllSdkChanSet [GET]
|
func (sc SdkController) GetAllSdkChanSet(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var scs models.SdkChanSet
|
list, err := scs.FindAll()
|
if err != nil {
|
return &bhomeclient.Reply{Success: false, Msg: "内部错误"}
|
} else {
|
return &bhomeclient.Reply{Success: true, Data: list}
|
}
|
}
|
|
type SdkChanUpdateArg struct {
|
SdkType string `json:"sdk_type" binding:"required"`
|
ChanNum int `json:"chan_num" binding:"required"`
|
}
|
|
// @Summary 更新算法通道数量设置
|
// @Description 更新算法通道数量设置
|
// @Produce json
|
// @Tags sdk
|
// @Param reqBody body controllers.SdkChanUpdateArg true "通道数量设置参数"
|
// @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"",success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}"
|
// @Router /data/api-v/sdk/updateSdkChanSet [POST]
|
func (sc SdkController) UpdateSdkChanSet(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var reqBody SdkChanUpdateArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{Success: false, Msg: "参数有误"}
|
}
|
var scs = models.SdkChanSet{
|
SdkType: reqBody.SdkType,
|
ChanNum: reqBody.ChanNum,
|
}
|
b, _ := scs.Update()
|
if b {
|
pMsg := protomsg.DbChangeMessage{
|
Table: protomsg.TableChanged_T_SdkChanSet,
|
Action: protomsg.DbAction_Update,
|
}
|
pb, _ := json.Marshal(pMsg)
|
h.Bk.Publish("sdk-service", pb)
|
return &bhomeclient.Reply{Success: true, Msg: "更新成功"}
|
} else {
|
return &bhomeclient.Reply{Success: false, Msg: "更新失败"}
|
}
|
}
|
|
// @Summary 更新算法默认场景参数
|
// @Description 更新算法默认场景参数
|
// @Produce json
|
// @Tags sdk
|
// @Param reqBody body vo.SdkArgDefault true "通道数量设置参数"
|
// @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"",success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}"
|
// @Router /data/api-v/sdk/updateSdkArgConfig [POST]
|
func (sc SdkController) UpdateSdkArgConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var reqBody vo.SdkArgDefault
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{Success: false, Msg: "参数有误"}
|
}
|
var sdk models.Sdk
|
rows, err := sdk.SelectById(reqBody.SdkId)
|
if err != nil || rows == 0 {
|
return &bhomeclient.Reply{Success: false, Msg: "算法id不存在"}
|
}
|
bf := bytes.NewBuffer([]byte{})
|
jsonEncoder := json.NewEncoder(bf)
|
jsonEncoder.SetEscapeHTML(false)
|
jsonEncoder.Encode(reqBody.DefArgs)
|
sdk.ArgDef = bf.String()
|
b, err := sdk.Update()
|
if err != nil {
|
return &bhomeclient.Reply{Success: false, Msg: err.Error()}
|
}
|
if b {
|
pMsg := protomsg.DbChangeMessage{
|
Table: protomsg.TableChanged_T_Sdk,
|
Action: protomsg.DbAction_Update,
|
}
|
pb, _ := json.Marshal(pMsg)
|
h.Bk.Publish("sdk-service", pb)
|
return &bhomeclient.Reply{Success: true, Msg: "更新成功"}
|
} else {
|
return &bhomeclient.Reply{Success: false, Msg: "更新失败"}
|
}
|
}
|
|
// @Summary 算法安装包上传(分块检查)
|
// @Description 算法安装包上传(分块检查)
|
// @Accept multipart/form-data
|
// @Produce json
|
// @Tags 算法
|
// @Param chunkNumber formData int true "当前是第几个分块"
|
// @Param chunkSize formData int true "每一块的大小"
|
// @Param currentChunkSize formData int true "当前块的大小"
|
// @Param identifier formData string true "整个文件的唯一标识,目前是md5"
|
// @Param filename formData string true "文件名称"
|
// @Param relativePath formData string true "文件在客户端电脑的路径"
|
// @Param totalChunks formData int true "文件总块数"
|
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
|
// @Router /data/api-v/sdk/upload [get]
|
func (sc SdkController) Upload(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
chunkNumber, e1 := strconv.Atoi(c.Query("chunkNumber"))
|
chunkSize, e2 := strconv.Atoi(c.Query("chunkSize"))
|
currentChunkSize, e3 := strconv.Atoi(c.Query("currentChunkSize"))
|
identifier := c.Query("identifier")
|
filename := c.Query("filename")
|
relativePath := c.Query("relativePath")
|
totalChunks, e5 := strconv.Atoi(c.Query("totalChunks"))
|
if identifier == "" || e1 != nil || e2 != nil || e3 != nil || e5 != nil {
|
return &bhomeclient.Reply{Msg: "参数有误"}
|
}
|
userId := c.Header("Login_user_id")
|
var arg = service.FileChunkCheckVo{
|
UserId: userId,
|
FileName: filename,
|
Identifier: identifier,
|
RelativePath: relativePath,
|
TotalChunks: totalChunks,
|
ChunkNumber: chunkNumber,
|
ChunkSize: chunkSize,
|
CurrentChunkSize: currentChunkSize,
|
}
|
var sv service.SysService
|
if b := sv.CheckUpdateFile(&arg); b {
|
//c.String(http.StatusOK,"found")
|
return &bhomeclient.Reply{Success: true, Data: "found"}
|
} else {
|
//c.String(http.StatusNoContent,"")
|
return &bhomeclient.Reply{Success: true, Data: ""}
|
}
|
}
|
|
// @Security ApiKeyAuth
|
// @Summary 算法安装包上传
|
// @Description 算法安装包上传
|
// @Accept multipart/form-data
|
// @Produce json
|
// @Tags 算法
|
// @Param chunkNumber formData int true "当前是第几个分块"
|
// @Param chunkSize formData int true "每一块的大小"
|
// @Param currentChunkSize formData int true "当前块的大小"
|
// @Param totalSize formData string true "文件总大小"
|
// @Param identifier formData string true "整个文件的唯一标识,目前是md5"
|
// @Param filename formData string true "文件名称"
|
// @Param relativePath formData string true "文件在客户端电脑的路径"
|
// @Param totalChunks formData int true "文件总块数"
|
// @Param file formData file true "文件分片内容"
|
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
|
// @Router /data/api-v/sdk/upload [post]
|
func (sc SdkController) UploadPack(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
chunkNumber, e1 := strconv.Atoi(c.PostForm("chunkNumber"))
|
chunkSize, e2 := strconv.Atoi(c.PostForm("chunkSize"))
|
currentChunkSize, e3 := strconv.Atoi(c.PostForm("currentChunkSize"))
|
totalSize, e4 := strconv.ParseInt(c.PostForm("totalSize"), 10, 64)
|
identifier := c.PostForm("identifier")
|
filename := c.PostForm("filename")
|
relativePath := c.PostForm("relativePath")
|
totalChunks, e5 := strconv.Atoi(c.PostForm("totalChunks"))
|
file, e6 := c.FormFile()
|
//file, header, e6 := c.Request.FormFile("file")
|
if identifier == "" || e1 != nil || e2 != nil || e3 != nil || e4 != nil || e5 != nil || e6 != nil {
|
return &bhomeclient.Reply{Msg: "参数有误"}
|
}
|
userId := c.Header("Login_user_id")
|
var arg = service.FileUploadVo{
|
UserId: userId,
|
FileName: filename,
|
Identifier: identifier,
|
RelativePath: relativePath,
|
TotalSize: totalSize,
|
TotalChunks: totalChunks,
|
ChunkNumber: chunkNumber,
|
ChunkSize: chunkSize,
|
CurrentChunkSize: currentChunkSize,
|
File: file,
|
//Header: header,
|
}
|
var sv service.SysService
|
if b, _, msg := sv.PatchUpload(&arg); b {
|
//if isComplete { //上传完毕需要自动触发安装
|
// var sv service.SdkInstallService
|
// if b,err := sv.SdkInstall(identifier, filename);b {
|
// util.ResponseFormat(c,&code.Code{http.StatusOK, true, "算法安装成功"},"算法安装成功")
|
// return
|
// } else {
|
// util.ResponseFormat(c,&code.Code{http.StatusBadRequest, false, "算法安装失败"},err.Error())
|
// return
|
// }
|
//}
|
return &bhomeclient.Reply{Success: true, Msg: "上传完成"}
|
} else {
|
return &bhomeclient.Reply{Msg: msg}
|
}
|
}
|
|
// @Security ApiKeyAuth
|
// @Summary 上传完成获取安装信息
|
// @Description 上传完成获取安装信息
|
// @Produce json
|
// @Tags 算法
|
// @Param identifier formData string true "整个文件的唯一标识,目前是md5"
|
// @Param filename formData string true "文件名称"
|
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
|
// @Router /data/api-v/sdk/showInstallInfo [post]
|
func (sc SdkController) ShowInstallInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
identifier := c.Query("identifier")
|
filename := c.Query("filename")
|
logger.Debug("showInstallInfo identifier:", identifier, "filename:", filename)
|
if identifier == "" || filename == "" {
|
return &bhomeclient.Reply{Success: false, Msg: "参数有误"}
|
}
|
var sv service.SdkInstallService
|
b, d, err := sv.ShowInstallInfo(identifier, filename)
|
if b {
|
return &bhomeclient.Reply{Success: true, Data: d}
|
} else {
|
return &bhomeclient.Reply{Msg: err.Error()}
|
}
|
}
|
|
// @Security ApiKeyAuth
|
// @Summary 上传完成开始安装
|
// @Description 上传完成开始安装
|
// @Produce json
|
// @Tags 算法
|
// @Param identifier formData string true "整个文件的唯一标识,目前是md5"
|
// @Param filename formData string true "文件名称"
|
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
|
// @Router /data/api-v/sdk/install [post]
|
func (sc SdkController) Install(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
identifier := c.Query("identifier")
|
filename := c.Query("filename")
|
logger.Debug("showInstallInfo identifier:", identifier, "filename:", filename)
|
if identifier == "" || filename == "" {
|
return &bhomeclient.Reply{Success: false, Msg: "参数有误"}
|
}
|
|
var sv service.SdkInstallService
|
if b, err := sv.PackInstall(identifier, filename, h); b {
|
return &bhomeclient.Reply{Success: true, Msg: "安装成功"}
|
} else {
|
return &bhomeclient.Reply{Msg: err.Error()}
|
}
|
}
|
|
// @Security ApiKeyAuth
|
// @Summary 卸载算法
|
// @Description 卸载算法
|
// @Produce json
|
// @Tags 算法
|
// @Param reqBody body controllers.DelSdk true "卸载参数"
|
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
|
// @Router /data/api-v/sdk/unInstall [post]
|
func (sc SdkController) UnInstall(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var reqBody DelSdk
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{Success: false, Msg: "参数有误"}
|
}
|
var sdkE models.Sdk
|
if sdkE.DeleteById(reqBody.SdkId) {
|
pMsg := protomsg.DbChangeMessage{
|
Table: protomsg.TableChanged_T_Sdk,
|
Action: protomsg.DbAction_Delete,
|
}
|
pb, _ := json.Marshal(pMsg)
|
h.Bk.Publish(service.ProcName, pb)
|
return &bhomeclient.Reply{Success: true, Msg: "卸载成功"}
|
} else {
|
return &bhomeclient.Reply{Success: false, Msg: "卸载失败"}
|
}
|
}
|
|
// @Security ApiKeyAuth
|
// @Summary 从商城下载或升级算法
|
// @Description 从商城下载或升级算法
|
// @Produce json
|
// @Tags 算法
|
// @Param path query string true "算法id"
|
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
|
// @Router /data/api-v/sdk/sdkDownload [get]
|
func (sc SdkController) SdkDownLoad(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
id := c.Query("path")
|
if id == "" {
|
return &bhomeclient.Reply{Msg: "下载算法参数有误"}
|
}
|
|
if service.IsInstalling(id) {
|
return &bhomeclient.Reply{Success: true, Msg: "安装中,请稍候..."}
|
}
|
|
if b, err := service.DownloadOrUpgrade(id, h); b {
|
return &bhomeclient.Reply{Success: true, Msg: "算法安装成功"}
|
} else {
|
return &bhomeclient.Reply{Msg: err.Error()}
|
}
|
}
|
|
// @Security ApiKeyAuth
|
// @Summary 应用中心中未购买的算法列表
|
// @Description 应用中心中未购买的算法列表
|
// @Produce json
|
// @Tags 算法
|
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
|
// @Router /data/api-v/sdk/buyList [get]
|
func (sc SdkController) BuyList(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
sdkName := c.Query("sdkName")
|
logger.Debug("BuyList sdkName:", sdkName)
|
var sv service.SdkInstallService
|
list := sv.GetBuyList(sdkName)
|
if list == nil {
|
list = make([]service.SdkWithArg, 0)
|
}
|
|
return &bhomeclient.Reply{Success: true, Data: list}
|
}
|
|
// @Security ApiKeyAuth
|
// @Summary 使用激活码激活安装算法
|
// @Description 使用激活码激活安装算法
|
// @Produce json
|
// @Tags 算法
|
// @Param code query string true "激活码"
|
// @Param sdkId query string true "算法id"
|
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
|
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
|
// @Router /data/api-v/sdk/active [get]
|
func (sc SdkController) Active(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
cod := c.Query("code")
|
sdkId := c.Query("sdkId")
|
if sdkId == "" {
|
return &bhomeclient.Reply{Msg: "算法id不能为空"}
|
}
|
var sv service.SdkInstallService
|
d, err := sv.Active(cod, sdkId)
|
if err == nil {
|
// 激活成功
|
var sdk models.Sdk
|
if err := sdk.UpdateCode(sdkId, cod); err != nil {
|
return &bhomeclient.Reply{Msg: err.Error()}
|
}
|
return &bhomeclient.Reply{Success: true, Data: d}
|
} else {
|
return &bhomeclient.Reply{Msg: err.Error()}
|
}
|
}
|
|
type DelSdk struct {
|
SdkId string `json:"sdkId" binding:"required"`
|
}
|