3138 lines
98 KiB
Go
3138 lines
98 KiB
Go
package application
|
||
|
||
import (
|
||
"bytes"
|
||
"context"
|
||
"finclip-app-manager/domain/entity"
|
||
"finclip-app-manager/domain/entity/proto"
|
||
"finclip-app-manager/domain/entity/proto/apiproto"
|
||
"finclip-app-manager/domain/service"
|
||
"finclip-app-manager/infrastructure/config"
|
||
"finclip-app-manager/infrastructure/utility"
|
||
"fmt"
|
||
"net/http"
|
||
"strconv"
|
||
"time"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/pkg/errors"
|
||
"github.com/tealeg/xlsx"
|
||
"gitlab.finogeeks.club/finclip-backend/apm"
|
||
)
|
||
|
||
const (
|
||
MAX_EXPIRE_DATA = 9999999999999
|
||
)
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/creation [C/S]创建小程序
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appClass //小程序分类
|
||
* @apiParam (RequestBody) {[]string} appTag //小程序标签
|
||
* @apiParam (RequestBody) {string} appType //小程序类型
|
||
* @apiParam (RequestBody) {string} coreDescription //小程序描述
|
||
* @apiParam (RequestBody) {string} logo //小程序logo
|
||
* @apiParam (RequestBody) {string} name //小程序名称
|
||
* @apiParam (RequestBody) {int} projectType //项目类型,默认 0,代表小程序,1 小游戏,2 H5
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appClass": "jinrong",
|
||
* "appTag":["a","b"],
|
||
* "appType":"c",
|
||
* "coreDescription":"详情",
|
||
* "logo":"/api/v1/netdisk/download/243454567",
|
||
* "name":"开户"
|
||
* "projectType":0
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevCreateApp(c *gin.Context) {
|
||
var (
|
||
traceCtx = apm.ApmClient().TraceContextFromGin(c)
|
||
req = proto.CreateAppReq{}
|
||
)
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("createApp bind json err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("createApp get req:%+v", req)
|
||
accountId := utility.GetUserId(c)
|
||
if accountId == "" {
|
||
log.Errorf("DevCreateApp user id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("createApp get user id:%+v", accountId)
|
||
|
||
svr := service.NewAppService()
|
||
rspData, rsp := svr.CreateApp(traceCtx, c, req, accountId)
|
||
if rspData != nil {
|
||
go autoBindingAppByCreate(rspData, accountId)
|
||
rsp.MakeRsp(c, rspData)
|
||
} else {
|
||
rsp.MakeRsp(c, gin.H{})
|
||
}
|
||
return
|
||
}
|
||
|
||
func autoBindingAppByCreate(app *entity.App, accountId string) {
|
||
svr := service.NewBindingService()
|
||
svr.AutoBindingAppByCreate(app, accountId)
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/update [C/S]更新编辑小程序
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {string} appClass //小程序分类
|
||
* @apiParam (RequestBody) {[]string} appTag //小程序标签
|
||
* @apiParam (RequestBody) {string} appType //小程序类型
|
||
* @apiParam (RequestBody) {string} coreDescription //小程序描述
|
||
* @apiParam (RequestBody) {string} logo //小程序logo
|
||
* @apiParam (RequestBody) {string} name //小程序名称
|
||
* @apiParam (RequestBody) {object} customData //小程序自定义内容
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appId":"61b32654659d2b00016264a8",
|
||
* "appClass": "jinrong",
|
||
* "appTag":["a","b"],
|
||
* "appType":"c",
|
||
* "coreDescription":"详情",
|
||
* "logo":"/api/v1/netdisk/download/243454567",
|
||
* "name":"开户",
|
||
* "customData":{
|
||
* "detailDescription":"详细信息"
|
||
* }
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevUpdateApp(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := proto.AppUpdateReq{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("updateApp bind error:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("updateApp get req:%+v", req)
|
||
if req.AppId == "" || req.Name == "" || req.CoreDescription == "" {
|
||
log.Errorf("update app req err:%+v", req)
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("update app user id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_LACK_OF_USER_ID, gin.H{})
|
||
return
|
||
}
|
||
rsp := service.NewAppService().UpdateApp(traceCtx, c, req, userId)
|
||
rsp.MakeRsp(c, gin.H{})
|
||
return
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/is_forbidden/update [C/S]禁用解禁小程序
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {int} isForbidden //0:解禁,1:禁用
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appId":"61b32654659d2b00016264a8",
|
||
* "isForbidden": 1
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevUpdateAppIsForbidden(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := proto.AppIsForbiddenUpdateReq{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("updateAppIsForbidden bind error:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("updateAppIsForbidden get req:%+v", req)
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("update app isForbidden user id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_LACK_OF_USER_ID, gin.H{})
|
||
return
|
||
}
|
||
rsp := service.NewAppService().UpdateAppIsForbidden(traceCtx, req, userId)
|
||
rsp.MakeRsp(c, gin.H{})
|
||
return
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/publish-request [C/S]提交小程序上架审核
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} id //编译id
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {string} developerId //开发者id
|
||
* @apiParam (RequestBody) {bool} needAutoPub //是否自动发布
|
||
* @apiParam (RequestBody) {object} testInfo //测试内容
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "id":"61b32654659d2b00016264a9",
|
||
* "appId":"61b32654659d2b00016264a8",
|
||
* "developerId": "61b32654659d2b00016264a7",
|
||
* "needAutoPub":true,
|
||
* "testInfo":{
|
||
* "account":"zhangsan",
|
||
* "password":"123456",
|
||
* "description":"测试使用",
|
||
* "images":[
|
||
* "logo1地址",
|
||
* "logo2地址"
|
||
* ]
|
||
* }
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevSubmitPublishRequest(c *gin.Context) {
|
||
var (
|
||
traceCtx = apm.ApmClient().TraceContextFromGin(c)
|
||
req = apiproto.SubmitPublishReqest{}
|
||
)
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("submitPublishRequest bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("submitPublishRequest req:%+v", req)
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("DevSubmitPublishRequest user id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
service.NewAppService().SubmitApp(traceCtx, c, req, userId).MakeRsp(c, gin.H{})
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/publish-request-withdrawal [C/S]撤销小程序上架审核
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {string} developerId //开发者id
|
||
* @apiParam (RequestBody) {int} sequence //小程序序列号
|
||
* @apiParam (RequestBody) {string} reason //原因
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appId":"61b32654659d2b00016264a8",
|
||
* "developerId":"61b32654659d2b00016264a7",
|
||
* "sequence": 1,
|
||
* "reason":"非法小程序"
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
type developerRequest struct {
|
||
AppID string `json:"appId" bson:"appId"`
|
||
Sequence int `json:"sequence" bson:"sequence"`
|
||
DeveloperID string `json:"developerId" bson:"developerId"`
|
||
Reason string `json:"reason" bson:"reason"`
|
||
}
|
||
|
||
func DevWithdrawPublishRequest(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := developerRequest{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("withdrawPublishRequest bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("withdrawPublishRequest get req:%+v", req)
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("withdrawPublishRequest get user id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
rsp := service.NewAppService().WithdrawPublishRequest(traceCtx, c, req.AppID, req.Sequence, userId)
|
||
rsp.MakeRsp(c, gin.H{})
|
||
//c.JSON(http.StatusOK, gin.H{})
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/publish [C/S]上架小程序
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {string} developerId //开发者id
|
||
* @apiParam (RequestBody) {int} sequence //小程序序列号
|
||
* @apiParam (RequestBody) {string} reason //原因
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appId":"61b32654659d2b00016264a8",
|
||
* "developerId":"61b32654659d2b00016264a7",
|
||
* "sequence": 1,
|
||
* "reason":"非法小程序"
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevPublishApp(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := developerRequest{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("DevPublishApp bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("DevPublishApp get req:%+v", req)
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("DevPublishApp user id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
rsp := service.NewAppService().PubApp(traceCtx, req.AppID, req.Sequence, userId)
|
||
rsp.MakeRsp(c, gin.H{})
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/unpublish [C/S]下架小程序【企业端】
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {int} sequence //小程序序列号
|
||
* @apiParam (RequestBody) {string} reason //原因
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appId":"61b32654659d2b00016264a8",
|
||
* "sequence": 1,
|
||
* "reason":"非法小程序"
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevUnpublishApp(c *gin.Context) {
|
||
unpublishAppHelp(c, true)
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/admin/apps/unpublish [C/S]下架小程序【运营端】
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {int} sequence //小程序序列号
|
||
* @apiParam (RequestBody) {string} reason //原因
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appId":"61b32654659d2b00016264a8",
|
||
* "sequence": 1,
|
||
* "reason":"非法小程序"
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func AdminUnpublishApp(c *gin.Context) {
|
||
unpublishAppHelp(c, false)
|
||
}
|
||
|
||
type unpublishRequest struct {
|
||
AppID string `json:"appId" bson:"appId"`
|
||
Sequence int `json:"sequence" bson:"sequence"`
|
||
Reason string `json:"reason" bson:"reason"`
|
||
}
|
||
|
||
func unpublishAppHelp(c *gin.Context, isDev bool) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := unpublishRequest{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("unpublishAppHelp bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
userId := utility.GetUserId(c)
|
||
svr := service.NewAppService()
|
||
rsp := svr.UnpubApp(traceCtx, c, req.AppID, req.Sequence, userId, isDev, req.Reason)
|
||
rsp.MakeRsp(c, gin.H{})
|
||
}
|
||
|
||
type approveRequest struct {
|
||
AppID string `json:"appId"`
|
||
Sequence int `json:"sequence"`
|
||
//AdministratorID string `json:"administratorId" bson:"administratorId"`
|
||
Status string `json:"status"`
|
||
Reason string `json:"reason"`
|
||
}
|
||
|
||
func AdminApproveApp(c *gin.Context) {
|
||
approveApp(c, true)
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/approval [C/S]审核小程序
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {int} sequence //小程序序列号
|
||
* @apiParam (RequestBody) {string} status //状态
|
||
* @apiParam (RequestBody) {string} reason //审核原因
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appId":"61b32654659d2b00016264a8",
|
||
* "sequence": 1,
|
||
* "status":"PublishApproved", //PublishRejected:拒绝,PublishApproved:通过
|
||
* "reason":"通过"
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevApproveApp(c *gin.Context) {
|
||
approveApp(c, false)
|
||
}
|
||
|
||
func approveApp(c *gin.Context, isAdmin bool) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := apiproto.ApproveAppReq{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("approveApp bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
req.RequestFrom = c.GetHeader("C-Open-Api")
|
||
log.Infof("approveApp get req:%+v,isAdmin:%t requestFrom:%s", req, isAdmin, req.RequestFrom)
|
||
userId := utility.GetUserId(c)
|
||
svr := service.NewAppService()
|
||
rsp := svr.ApproveApp(traceCtx, req, isAdmin, userId)
|
||
rsp.MakeRsp(c, gin.H{})
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/appInfo/rollbackList?appId=62986e87277a0d00017b782e [C/S]回滚列表
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {string} appId //小程序id
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": [
|
||
* {
|
||
* "appId": "62986e87277a0d00017b782e",
|
||
* "name": "1",
|
||
* "appClass": "jinrong",
|
||
* "appTag": [
|
||
* "zhengquankaihu"
|
||
* ],
|
||
* "appType": "Applet",
|
||
* "status": {
|
||
* "value": "Published",
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "publishingStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654156994088,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "unpublishingStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "publishingApprovalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465436,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "unpublishingApprovalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "publishedStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "unpublishedStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": "",
|
||
* "type": ""
|
||
* },
|
||
* "requestStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "approvalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465436,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "actionStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "developerId": "628b2215062d300001e36285",
|
||
* "groupId": "628b2215062d300001e36286",
|
||
* "created": 1654156994088,
|
||
* "createdBy": "15377373355",
|
||
* "customData": {
|
||
* "detailDescription": "",
|
||
* "sourceFile": [
|
||
* {
|
||
* "fileMd5": "159eed6c06432b1a4f68ced6c19a1bfe",
|
||
* "name": "app.zip",
|
||
* "sourceFileUrl": "/api/v1/mop/netdisk/download/62986eaa1f1afd0001c3698c",
|
||
* "uploadDate": 1654156973289,
|
||
* "url": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698d",
|
||
* "encryptedUrl": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698e",
|
||
* "encryptedFileMd5": "fad7bd98dbcabb560ca30f4c99121a42",
|
||
* "encryptedFileSha256": "c9e9db06725f95a4418c83d54dda3499946b8e1c894583b6477a36cc1d796668",
|
||
* "basicPackVer": "",
|
||
* "Packages": [],
|
||
* "EncryptPackages": []
|
||
* }
|
||
* ],
|
||
* "versionDescription": "1.0.0",
|
||
* "developer": "15377373355"
|
||
* },
|
||
* "version": "1.0.0",
|
||
* "sequence": 1,
|
||
* "corporationId": "",
|
||
* "coreDescription": "123",
|
||
* "logo": "https://www-cdn.finclip.com/images/ic-default.png",
|
||
* "isRollback": false,
|
||
* "testInfo": {
|
||
* "account": "",
|
||
* "password": "",
|
||
* "description": "",
|
||
* "images": []
|
||
* },
|
||
* "needAutoPub": true,
|
||
* "inGrayRelease": false,
|
||
* "expire": 0,
|
||
* "appBuildID": "62986ead277a0d00017b782f"
|
||
* },
|
||
* {...}
|
||
* ]
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func RollbackListApps(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appId := c.Query("appId")
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("RollbackListApps user id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
svr := service.NewAppService()
|
||
appVerList, err := svr.RollbackAppList(traceCtx, appId, userId)
|
||
if err != nil {
|
||
log.Errorf("RollbackListApps svr err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appVerList)
|
||
return
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/apps?bindingId=6298937b277a0d00017b7860&searchText=&searchFields=name&pageSize=10000&pageNo=0 [C/S]获取未关联小程序列表
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {string} bindingId //应用id
|
||
* @apiParam (RequestParam) {string} searchText //模糊匹配内容
|
||
* @apiParam (RequestParam) {string} searchFields //小程序id
|
||
* @apiParam (RequestParam) {string} pageNo //页码
|
||
* @apiParam (RequestParam) {string} pageSize //页大小
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "list": [
|
||
* {
|
||
* "appId": "62986e87277a0d00017b782e",
|
||
* "name": "开户",
|
||
* "appClass":"小程序类别",
|
||
* "status":{
|
||
* "value":"小程序状态"
|
||
* },
|
||
* {...}
|
||
* ]
|
||
* "total":100 //总数
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevListApps(c *gin.Context) {
|
||
bindingID := c.Query("bindingId")
|
||
if bindingID == "" {
|
||
listApps(c, true, false, false)
|
||
} else {
|
||
// MOP
|
||
listAppsToBind(c, bindingID)
|
||
}
|
||
}
|
||
|
||
func DevGetApp(c *gin.Context) {
|
||
appID := c.Param("path1")
|
||
getApp(c, appID)
|
||
}
|
||
|
||
func AdminGetApp(c *gin.Context) {
|
||
appID := c.Param("path1")
|
||
getApp(c, appID)
|
||
}
|
||
|
||
type InternalGetAppReq struct {
|
||
AppId string `form:"appId"`
|
||
}
|
||
|
||
func InternalGetApp(c *gin.Context) {
|
||
req := InternalGetAppReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("InternalGetApp err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
getApp(c, req.AppId)
|
||
}
|
||
|
||
func getApp(c *gin.Context, appId string) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
if appId == "" {
|
||
log.Errorf("getApp appid empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
svr := service.NewAppService()
|
||
appVerInfo, err := svr.GetLatestPubAppVer(traceCtx, appId)
|
||
if err != nil {
|
||
log.Debugf("getApp GetLatestPubAppVer err:%s", err.Error())
|
||
if !service.NotFound(err) {
|
||
log.Errorf("getApp err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
} else {
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appVerInfo)
|
||
return
|
||
}
|
||
appInfo, err := service.NewAppService().GetAppInfo(traceCtx, appId)
|
||
if err != nil {
|
||
log.Errorf("getApp db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appInfo)
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/apps/62986e87277a0d00017b782e/inDevelopment [C/S]获取指定小程序开发列表
|
||
* @apiGroup Finclip App Manager
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
{
|
||
"data": {
|
||
"appId": "62986e87277a0d00017b782e",
|
||
"name": "1",
|
||
"sequence": 0,
|
||
"appClass": "jinrong",
|
||
"appTag": [
|
||
"zhengquankaihu"
|
||
],
|
||
"appType": "Applet",
|
||
"status": {
|
||
"value": "Published",
|
||
"reason": "",
|
||
"lastUpdated": 1654157465456,
|
||
"modifiedBy": "自动上架"
|
||
},
|
||
"publishedStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 1654157465456,
|
||
"modifiedBy": "自动上架"
|
||
},
|
||
"unpublishedStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 0,
|
||
"modifiedBy": ""
|
||
},
|
||
"actionStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 1654157465456,
|
||
"modifiedBy": "自动上架"
|
||
},
|
||
"developerId": "628b2215062d300001e36285",
|
||
"groupId": "628b2215062d300001e36286",
|
||
"created": 1654156935640,
|
||
"createdBy": "15377373355",
|
||
"customData": {
|
||
"detailDescription": "",
|
||
"sourceFile": [
|
||
{
|
||
"fileMd5": "159eed6c06432b1a4f68ced6c19a1bfe",
|
||
"name": "app.zip",
|
||
"sourceFileUrl": "/api/v1/mop/netdisk/download/62986eaa1f1afd0001c3698c",
|
||
"uploadDate": 1654156973289,
|
||
"url": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698d",
|
||
"encryptedUrl": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698e",
|
||
"encryptedFileMd5": "fad7bd98dbcabb560ca30f4c99121a42",
|
||
"encryptedFileSha256": "c9e9db06725f95a4418c83d54dda3499946b8e1c894583b6477a36cc1d796668",
|
||
"basicPackVer": "",
|
||
"Packages": [],
|
||
"EncryptPackages": []
|
||
}
|
||
],
|
||
"versionDescription": "1.0.0",
|
||
"developer": "15377373355"
|
||
},
|
||
"version": "1.0.0",
|
||
"coreDescription": "123",
|
||
"logo": "https://www-cdn.finclip.com/images/ic-default.png",
|
||
"testInfo": {
|
||
"account": "",
|
||
"password": "",
|
||
"description": "",
|
||
"images": null
|
||
},
|
||
"expire": 9999999999999,
|
||
"isRollback": false,
|
||
"applyStatus": "",
|
||
"isForbidden": 1,
|
||
"privacySettingType": 0
|
||
},
|
||
"errcode": "OK",
|
||
"error": ""
|
||
}
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevGetAppInDevelopment(c *gin.Context) {
|
||
getAppInDevelopment(c)
|
||
}
|
||
|
||
func AdminGetAppInDevelopment(c *gin.Context) {
|
||
getAppInDevelopment(c)
|
||
}
|
||
|
||
func ClientGetAppInDevelopment(c *gin.Context) {
|
||
getAppInDevelopment(c)
|
||
}
|
||
|
||
func GetAppInDevelopment(c *gin.Context) {
|
||
getAppInDevelopment(c)
|
||
}
|
||
|
||
func getAppInDevelopment(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appID := c.Param("path1")
|
||
if appID == "" {
|
||
log.Errorf("getAppInDevelopment appid empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_LACK_OF_APPID, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("getAppInDevelopment appId:%s", appID)
|
||
appInfo, err := service.NewAppService().GetAppInfoByAppId(traceCtx, appID)
|
||
if err != nil {
|
||
log.Errorf("getAppInDevelopment err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
latestBuildInfo, err := service.NewAppAppletInfoService().GetLatestInfoByAppId(traceCtx, appID)
|
||
if err != nil && !service.NotFound(err) {
|
||
log.Errorf("GetLatestInfoByAppId err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
if !service.NotFound(err) && latestBuildInfo != nil {
|
||
appInfo.Version = latestBuildInfo.Version
|
||
appInfo.CustomData.Developer = latestBuildInfo.CustomData.Developer
|
||
appInfo.CustomData.VersionDescription = latestBuildInfo.CustomData.VersionDescription
|
||
//appInfo.CustomData.DetailDescription = ""
|
||
if len(latestBuildInfo.CustomData.SourceFile) > 0 {
|
||
info := latestBuildInfo.CustomData.SourceFile[0]
|
||
appInfo.CustomData.SourceFile = append(appInfo.CustomData.SourceFile, entity.CustomDataSourceFile{
|
||
FileMd5: info.FileMd5,
|
||
Name: info.Name,
|
||
SourceFileUrl: info.SourceFileUrl,
|
||
UploadDate: info.UploadDate,
|
||
Url: info.Url,
|
||
EncryptedUrl: info.EncryptedUrl,
|
||
EncryptedFileMd5: info.EncryptedFileMd5,
|
||
EncryptedFileSha256: info.EncryptedFileSha256,
|
||
BasicPackVer: info.BasicPackVer,
|
||
Packages: info.Packages,
|
||
EncryptPackages: info.EncryptPackages,
|
||
})
|
||
}
|
||
}
|
||
//c.JSON(http.StatusOK, appInfo)
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appInfo)
|
||
}
|
||
|
||
type AdminListAppsReq struct {
|
||
PageNo int `form:"pageNo"`
|
||
PageSize int `form:"pageSize"`
|
||
SearchFields string `form:"searchFields"`
|
||
SearchText string `form:"searchText"`
|
||
PullType string `form:"pullType"`
|
||
}
|
||
|
||
func AdminListApps(c *gin.Context) {
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
|
||
}
|
||
|
||
func AdminListAppsV2(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := AdminListAppsReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("AdminListApps bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
req.PageNo += 1
|
||
if req.PageSize == 0 || req.PageSize > 200 {
|
||
req.PageSize = 200
|
||
}
|
||
svr := service.NewAppService()
|
||
svrReq := service.ListAppsReq{
|
||
PageNo: req.PageNo,
|
||
PageSize: req.PageSize,
|
||
SearchText: req.SearchText,
|
||
PullType: req.PullType,
|
||
}
|
||
log.Infof("AdminListAppsV2 svr req:%+v", svrReq)
|
||
total, apps, err := svr.AdminListApps(traceCtx, &svrReq)
|
||
if err != nil {
|
||
log.Errorf("AdminListAppsV2 list apps err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{
|
||
"total": total,
|
||
"list": apps,
|
||
})
|
||
}
|
||
|
||
func AdminListPubApps(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := AdminListAppsReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("AdminListPubApps bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
req.PageNo += 1
|
||
if req.PageSize == 0 || req.PageSize > 200 {
|
||
req.PageSize = 200
|
||
}
|
||
svr := service.NewAppService()
|
||
svrReq := service.ListAppsReq{
|
||
PageNo: req.PageNo,
|
||
PageSize: req.PageSize,
|
||
SearchText: req.SearchText,
|
||
PullType: req.PullType,
|
||
}
|
||
log.Infof("AdminListPubApps svr req:%+v", svrReq)
|
||
total, apps, err := svr.AdminListPubApps(traceCtx, &svrReq)
|
||
if err != nil {
|
||
log.Errorf("AdminListPubApps list apps err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{
|
||
"total": total,
|
||
"list": apps,
|
||
})
|
||
}
|
||
|
||
func listApps(c *gin.Context, isDev, isAdmin, isClient bool) {
|
||
return
|
||
}
|
||
|
||
func listAppsV2(c *gin.Context, isDev, isAdmin, isClient bool) {
|
||
return
|
||
}
|
||
|
||
type listAppsToBindStatus struct {
|
||
Value string `json:"value"`
|
||
}
|
||
|
||
type ListAppsToBindRspItem struct {
|
||
AppId string `json:"appId"`
|
||
Name string `json:"name"`
|
||
AppClass string `json:"appClass"`
|
||
ApplyStatus string `json:"applyStatus"`
|
||
Status listAppsToBindStatus `json:"status"`
|
||
}
|
||
|
||
//获取应用未关联的所有小程序
|
||
func listAppsToBind(c *gin.Context, bindingID string) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := apiproto.ListAppsToBindReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("listAppsToBind bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
|
||
return
|
||
}
|
||
req.PageNo += 1
|
||
log.Infof("listAppsToBind req:%+v", req)
|
||
svr := service.NewAppService()
|
||
total, apps, err := svr.GetAppsToBinding(traceCtx, req)
|
||
if err != nil {
|
||
log.Errorf("GetAppsToBinding err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SYSTEM_CALL, gin.H{})
|
||
return
|
||
}
|
||
rspDataList := make([]ListAppsToBindRspItem, 0)
|
||
for _, v := range apps {
|
||
rspDataList = append(rspDataList, ListAppsToBindRspItem{
|
||
AppId: v.AppID,
|
||
Name: v.Name,
|
||
AppClass: v.AppClass,
|
||
ApplyStatus: v.ApplyStatus,
|
||
Status: listAppsToBindStatus{v.Status.Value},
|
||
})
|
||
}
|
||
//if config.Cfg.PublishEnv == ENV_FDEP {
|
||
// rspData, err = fillApplyStatus(traceCtx, rspData, bindingID)
|
||
// if err != nil {
|
||
// MakeRsp(c, http.StatusInternalServerError, FS_DB_ERR, gin.H{})
|
||
// return
|
||
// }
|
||
//}
|
||
c.JSON(http.StatusOK, gin.H{"total": total, "list": rspDataList})
|
||
// utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
|
||
return
|
||
}
|
||
|
||
type AdminGetAppReviewsRsp struct {
|
||
Total int `json:"total"`
|
||
List []entity.AppVersion `json:"list"`
|
||
}
|
||
|
||
func AdminGetAppReviews(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := apiproto.AdminGetAppReviewsReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("AdminGetAppReviews bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("AdminGetAppReviews req:%+v", req)
|
||
rsp := AdminGetAppReviewsRsp{
|
||
Total: 0,
|
||
List: make([]entity.AppVersion, 0),
|
||
}
|
||
total, appVers, err := service.NewAppService().AdminGetAppReviews(traceCtx, req)
|
||
if err != nil {
|
||
if service.NotFound(err) {
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rsp)
|
||
return
|
||
}
|
||
log.Errorf("AdminGetAppReviews db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
rsp.Total = total
|
||
rsp.List = appVers
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rsp)
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/statistics/apps?distinct=true&startTime=1&endTime=2&isForbidden=1 [C/S]获取小程序不同类型总数
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {bool} distinct //是否获取分布
|
||
* @apiParam (RequestParam) {int} startTime //开始时间
|
||
* @apiParam (RequestParam) {int} endTime //结束时间
|
||
* @apiParam (RequestParam) {int} isForbidden //是否包含禁用
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "created": 1,
|
||
* "submited":2,
|
||
* "approved":3,
|
||
* "published":4
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevGetStatistics(c *gin.Context) {
|
||
getStatistics(c, true)
|
||
}
|
||
|
||
func AdminGetStatistics(c *gin.Context) {
|
||
getStatistics(c, false)
|
||
}
|
||
|
||
type getStatisticsReq struct {
|
||
Distinct bool `form:"distinct"`
|
||
StartTime int64 `form:"startTime"`
|
||
EndTime int64 `form:"endTime"`
|
||
IsForbidden int `form:"isForbidden,default=2"`
|
||
}
|
||
|
||
type getStatisticsResponse struct {
|
||
Created int `json:"created"`
|
||
Submited int `json:"submited"`
|
||
Approved int `json:"approved"`
|
||
Published int `json:"published"`
|
||
}
|
||
|
||
func getStatistics(c *gin.Context, isDev bool) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := getStatisticsReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("getStatistics bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
svr := service.NewAppService()
|
||
var groupId string
|
||
if isDev {
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("getStatistics is dev but user id empty")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
accountInfo, err := hCaller.GetAccountInfo(traceCtx, userId)
|
||
if err != nil {
|
||
log.Errorf("GetAccountInfo err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SYSTEM_CALL, gin.H{})
|
||
return
|
||
}
|
||
groupId = accountInfo.OrganId
|
||
}
|
||
rsp, err := svr.AppStatistics(traceCtx, req.StartTime, req.EndTime, groupId, req.Distinct, req.IsForbidden)
|
||
if err != nil {
|
||
log.Errorf("AppStatistics svr err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, rsp)
|
||
//utility.MakeLocRsp(c, http.StatusOK, utility.OK, rsp)
|
||
}
|
||
|
||
type DevListAppsAndReviewsReq struct {
|
||
ListType string `form:"listType"`
|
||
GroupId string `form:"groupId"`
|
||
AppId string `form:"appId"`
|
||
Query string `form:"query"`
|
||
Sort string `form:"sort"`
|
||
SearchFields string `form:"searchFields"`
|
||
SearchText string `form:"searchText"`
|
||
PageSize int `form:"pageSize"`
|
||
PageNo int `form:"pageNo"`
|
||
ReviewsPageSize int `form:"reviewsPageSize"`
|
||
ReviewsPageNo int `form:"reviewsPageNo"`
|
||
}
|
||
|
||
type DevListAppsAndReviewsRsp struct {
|
||
Total int `json:"total"`
|
||
List []AppsAndReviewRspItem `json:"list"`
|
||
}
|
||
type ReviewsRsp struct {
|
||
Total int `json:"total"`
|
||
List []ReviewsRspItem `json:"list"`
|
||
}
|
||
type AppsAndReviewRspItem struct {
|
||
AppId string `json:"appId"`
|
||
Name string `json:"name"`
|
||
Logo string `json:"logo"`
|
||
Version string `json:"version"`
|
||
Status string `json:"status"`
|
||
ReviewTotal int `json:"reviewTotal"`
|
||
ReviewList []ReviewsRspItem `json:"reviewList"`
|
||
}
|
||
type ReviewsRspItem struct {
|
||
Sequence int `json:"sequence"`
|
||
Status string `json:"status"`
|
||
Version string `json:"version"`
|
||
}
|
||
|
||
func DevListAppsAndReviews(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := DevListAppsAndReviewsReq{}
|
||
if err := c.ShouldBindQuery(&req); err != nil {
|
||
log.Errorf("DevListAppsAndReviews bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("DevListAppsAndReviews req:%+v", req)
|
||
if req.ListType == "" || (req.ListType != "appsAndReviews" && req.ListType != "reviews") {
|
||
log.Errorf("DevListAppsAndReviews list type err,type:%s", req.ListType)
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
if req.PageSize == 0 || req.PageSize > 50 {
|
||
req.PageSize = 10
|
||
}
|
||
req.PageNo += 1
|
||
if req.ReviewsPageSize == 0 || req.ReviewsPageSize > 50 {
|
||
req.ReviewsPageSize = 50
|
||
}
|
||
data, rsp := service.NewAppService().ListAppAndReviews(traceCtx, req.AppId, req.PageNo, req.PageSize)
|
||
rsp.MakeRsp(c, data)
|
||
return
|
||
}
|
||
|
||
func AdminGetAppVersion(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
lang := c.Request.Header.Get("lang")
|
||
appID := c.Param("path1")
|
||
seqStr := c.Param("path3")
|
||
if appID == "" {
|
||
log.Errorf("AdminGetAppVersion appid empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_LACK_OF_APPID, gin.H{})
|
||
return
|
||
}
|
||
sequence, err := strconv.Atoi(seqStr)
|
||
if err != nil {
|
||
log.Errorf("AdminGetAppVersion sequence err,sequence:%v", seqStr)
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
userId := utility.GetUserId(c)
|
||
_, err = hCaller.GetAdminAccountInfo(traceCtx, userId)
|
||
if err != nil {
|
||
log.Errorf("DevGetAppVersion user id account info err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
appVer, err := service.NewAppService().GetAppVerInfo(traceCtx, appID, sequence)
|
||
if err != nil {
|
||
log.Errorf("AdminGetAppVersion db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
|
||
if lang == "en" {
|
||
if appVer.ActionStatus.ModifiedBy == "自动上架" {
|
||
appVer.ActionStatus.ModifiedBy = "system"
|
||
}
|
||
if appVer.ActionStatus.ModifiedBy == "管理员" {
|
||
appVer.ActionStatus.ModifiedBy = "admin"
|
||
}
|
||
if appVer.PublishedStatus.ModifiedBy == "自动上架" {
|
||
appVer.PublishedStatus.ModifiedBy = "system"
|
||
}
|
||
if appVer.PublishedStatus.ModifiedBy == "管理员" {
|
||
appVer.PublishedStatus.ModifiedBy = "admin"
|
||
}
|
||
if appVer.Status.ModifiedBy == "自动上架" {
|
||
appVer.Status.ModifiedBy = "system"
|
||
}
|
||
if appVer.Status.ModifiedBy == "管理员" {
|
||
appVer.Status.ModifiedBy = "admin"
|
||
}
|
||
if appVer.UnpublishedStatus.ModifiedBy == "自动上架" {
|
||
appVer.UnpublishedStatus.ModifiedBy = "system"
|
||
}
|
||
if appVer.UnpublishedStatus.ModifiedBy == "管理员" {
|
||
appVer.UnpublishedStatus.ModifiedBy = "admin"
|
||
}
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appVer)
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/apps/62986e87277a0d00017b782e/sequences/9 [C/S]获取指定小程序序列号的开发列表
|
||
* @apiGroup Finclip App Manager
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
{
|
||
"data": {
|
||
"appId": "62986e87277a0d00017b782e",
|
||
"name": "1",
|
||
"appClass": "jinrong",
|
||
"appTag": [
|
||
"zhengquankaihu"
|
||
],
|
||
"appType": "Applet",
|
||
"status": {
|
||
"value": "PublishApproved",
|
||
"reason": "",
|
||
"lastUpdated": 1654165268630,
|
||
"modifiedBy": "15377373355"
|
||
},
|
||
"publishingStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 1654165260773,
|
||
"modifiedBy": "15377373355"
|
||
},
|
||
"unpublishingStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 0,
|
||
"modifiedBy": ""
|
||
},
|
||
"publishingApprovalStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 1654165268630,
|
||
"modifiedBy": "15377373355"
|
||
},
|
||
"unpublishingApprovalStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 0,
|
||
"modifiedBy": ""
|
||
},
|
||
"publishedStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 0,
|
||
"modifiedBy": ""
|
||
},
|
||
"unpublishedStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 0,
|
||
"modifiedBy": "",
|
||
"type": ""
|
||
},
|
||
"requestStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 0,
|
||
"modifiedBy": ""
|
||
},
|
||
"approvalStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 1654165268630,
|
||
"modifiedBy": "15377373355"
|
||
},
|
||
"actionStatus": {
|
||
"reason": "",
|
||
"lastUpdated": 1654165260773,
|
||
"modifiedBy": "15377373355"
|
||
},
|
||
"developerId": "628b2215062d300001e36285",
|
||
"groupId": "628b2215062d300001e36286",
|
||
"created": 1654165260773,
|
||
"createdBy": "15377373355",
|
||
"customData": {
|
||
"detailDescription": "",
|
||
"sourceFile": [
|
||
{
|
||
"fileMd5": "159eed6c06432b1a4f68ced6c19a1bfe",
|
||
"name": "app.zip",
|
||
"sourceFileUrl": "/api/v1/mop/netdisk/download/62986eaa1f1afd0001c3698c",
|
||
"uploadDate": 1654156973289,
|
||
"url": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698d",
|
||
"encryptedUrl": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698e",
|
||
"encryptedFileMd5": "fad7bd98dbcabb560ca30f4c99121a42",
|
||
"encryptedFileSha256": "c9e9db06725f95a4418c83d54dda3499946b8e1c894583b6477a36cc1d796668",
|
||
"basicPackVer": "",
|
||
"Packages": [],
|
||
"EncryptPackages": []
|
||
}
|
||
],
|
||
"versionDescription": "1.0.0",
|
||
"developer": "15377373355"
|
||
},
|
||
"version": "1.0.0",
|
||
"sequence": 9,
|
||
"corporationId": "",
|
||
"coreDescription": "123",
|
||
"logo": "https://www-cdn.finclip.com/images/ic-default.png",
|
||
"isRollback": false,
|
||
"testInfo": {
|
||
"account": "",
|
||
"password": "",
|
||
"description": "",
|
||
"images": []
|
||
},
|
||
"needAutoPub": false,
|
||
"inGrayRelease": false,
|
||
"expire": 0,
|
||
"appBuildID": "62986ead277a0d00017b782f"
|
||
},
|
||
"errcode": "OK",
|
||
"error": ""
|
||
}
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevGetAppVersion(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appID := c.Param("path1")
|
||
seqStr := c.Param("path3")
|
||
lang := c.Request.Header.Get("lang")
|
||
if appID == "" {
|
||
log.Errorf("DevGetAppVersion appid empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_LACK_OF_APPID, gin.H{})
|
||
return
|
||
}
|
||
sequence, err := strconv.Atoi(seqStr)
|
||
if err != nil {
|
||
log.Errorf("DevGetAppVersion sequence err,sequence:%v", seqStr)
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
userId := utility.GetUserId(c)
|
||
accountInfo, err := hCaller.GetAccountInfo(traceCtx, userId)
|
||
if err != nil {
|
||
log.Errorf("DevGetAppVersion user id account info err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
appVer, err := service.NewAppService().GetAppVerInfo(traceCtx, appID, sequence)
|
||
if err != nil {
|
||
log.Errorf("DevGetAppVersion db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
if appVer.GroupID != accountInfo.OrganId {
|
||
log.Errorf("DevGetAppVersion organ id not match!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
|
||
if lang == "en" {
|
||
if appVer.ActionStatus.ModifiedBy == "自动上架" {
|
||
appVer.ActionStatus.ModifiedBy = "system"
|
||
}
|
||
if appVer.ActionStatus.ModifiedBy == "管理员" {
|
||
appVer.ActionStatus.ModifiedBy = "admin"
|
||
}
|
||
if appVer.PublishedStatus.ModifiedBy == "自动上架" {
|
||
appVer.PublishedStatus.ModifiedBy = "system"
|
||
}
|
||
if appVer.PublishedStatus.ModifiedBy == "管理员" {
|
||
appVer.PublishedStatus.ModifiedBy = "admin"
|
||
}
|
||
if appVer.Status.ModifiedBy == "自动上架" {
|
||
appVer.Status.ModifiedBy = "system"
|
||
}
|
||
if appVer.Status.ModifiedBy == "管理员" {
|
||
appVer.Status.ModifiedBy = "admin"
|
||
}
|
||
if appVer.UnpublishedStatus.ModifiedBy == "自动上架" {
|
||
appVer.UnpublishedStatus.ModifiedBy = "system"
|
||
}
|
||
if appVer.UnpublishedStatus.ModifiedBy == "管理员" {
|
||
appVer.UnpublishedStatus.ModifiedBy = "admin"
|
||
}
|
||
}
|
||
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appVer)
|
||
}
|
||
|
||
type AdminGetAppVerDetailReq struct {
|
||
AppId string `uri:"appId"`
|
||
Sequence int `uri:"sequence"`
|
||
}
|
||
|
||
type GetAppVerDeTailRsp struct {
|
||
AppID string `json:"appId"`
|
||
Name string `json:"name"`
|
||
GroupName string `json:"groupName"`
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/app-ver/62986e87277a0d00017b782e/9 [C/S]获取某个企业小程序列表
|
||
* @apiGroup Finclip App Manager
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {
|
||
* "appId":"62986e87277a0d00017b782e",
|
||
* "name":"开户",
|
||
* "groupName":"test"
|
||
* },
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func AdminGetAppVerDetail(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := AdminGetAppVerDetailReq{}
|
||
errRsp := make(map[string]interface{})
|
||
if err := c.BindUri(&req); err != nil {
|
||
log.Errorf("AdminGetAppVerDetail bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, errRsp)
|
||
return
|
||
}
|
||
appVer, err := service.NewAppService().GetAppVerInfo(traceCtx, req.AppId, req.Sequence)
|
||
if err != nil {
|
||
log.Errorf("AdminGetAppVerDetail err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, errRsp)
|
||
return
|
||
}
|
||
rspData := GetAppVerDeTailRsp{
|
||
AppID: appVer.AppID,
|
||
Name: appVer.Name,
|
||
GroupName: "",
|
||
}
|
||
groupInfo, err := hCaller.GetGroupInfoByGroupId(traceCtx, appVer.GroupID)
|
||
if err != nil {
|
||
log.Errorf("AdminGetAppVerDetail GetGroupInfoByGroupId err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, errRsp)
|
||
return
|
||
}
|
||
rspData.GroupName = groupInfo.GroupName
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rspData)
|
||
return
|
||
}
|
||
|
||
//获取小程序关联管理列表
|
||
type AdminGetLinkAppletsRspItem struct {
|
||
BindingInfo entity.Binding `json:"bindingInfo"`
|
||
AppIdInfo entity.AppInfo `json:"appIdInfo"`
|
||
}
|
||
type AdminGetLinkAppletsReq struct {
|
||
PageNo int `form:"pageNo"`
|
||
PageSize int `form:"pageSize"`
|
||
SearchText string `form:"searchText"`
|
||
}
|
||
|
||
func AdminGetLinkApplets(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
|
||
req := AdminGetLinkAppletsReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("AdminGetLinkApplets bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("AdminGetLinkApplets req:%+v", req)
|
||
svr := service.NewAppService()
|
||
total, rspData, err := svr.AdminGetLinkApps(traceCtx, req.SearchText, req.PageNo, req.PageSize)
|
||
if err != nil {
|
||
log.Errorf("AdminGetLinkApplets err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{
|
||
"total": total,
|
||
"list": rspData,
|
||
})
|
||
//utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
|
||
}
|
||
|
||
type AdminLinkAppletAuditsReq struct {
|
||
PageNo int `form:"pageNo"`
|
||
PageSize int `form:"pageSize"`
|
||
SearchText string `form:"searchText"`
|
||
}
|
||
|
||
func AdminLinkAppletAudits(c *gin.Context) {
|
||
//traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
//serachTxt := c.Query("searchText")
|
||
//
|
||
//pageNo, err := strconv.Atoi(c.Query("pageNo"))
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_BAD_JSON, err, "param pageNo error", nil)
|
||
// return
|
||
//}
|
||
//pageSize, err := strconv.Atoi(c.Query("pageSize"))
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_BAD_JSON, err, "param pageSize error", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//applyStatusStr := c.Query("applyStatus")
|
||
//var applyStatus []string
|
||
//if applyStatusStr != "" {
|
||
// applyStatus = strings.Split(applyStatusStr, ",")
|
||
//}
|
||
//
|
||
//models, total, err := service.LinkAppletAudits(traceCtx, serachTxt, pageNo, pageSize, applyStatus)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_DB_ERR, err, "", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//MakeRsp(c, http.StatusOK, OK, gin.H{
|
||
// "total": total,
|
||
// "list": models,
|
||
//})
|
||
}
|
||
|
||
type AdminLinkAppletAuditDetailReq struct {
|
||
AuditId string `form:"auditId"`
|
||
}
|
||
|
||
func AdminLinkAppletAuditDetail(c *gin.Context) {
|
||
//traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := AdminLinkAppletAuditDetailReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("AdminLinkAppletAuditDetail bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("AdminLinkAppletAuditDetail req:%+v", req)
|
||
//auditId := c.Query("auditId")
|
||
//if auditId == "" {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_PARAM_ERR, nil, "auditId can not be null", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//audit, err := service.LinkAppletAudit(traceCtx, auditId)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_DB_ERR, err, "", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//appTable := db.NewTable(db.TableApp)
|
||
//apps := make([]model.App, 0)
|
||
//if _, err := appTable.GetSome(traceCtx, bson.M{"appId": audit.AppId}, []string{"-Sequence"}, 1, 0, &apps); err != nil || len(apps) == 0 {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_DB_ERR, err, "", nil)
|
||
// return
|
||
//}
|
||
//app := apps[0]
|
||
//
|
||
//t := db.NewTable(db.TableAppVersion)
|
||
//appVerInfo := model.AppVersion{}
|
||
//if err := t.GetOne(traceCtx, bson.M{"appId": app.AppID, "sequence": app.Sequence}, &appVerInfo); err != nil {
|
||
// return
|
||
//}
|
||
//if t.NotFound() {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_APP_SEQUENCE_NOT_FOUND, err, "RuntimeGetAppVersionInfo get appVer not found!", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//bindingTable := db.NewTable(db.TableBinding)
|
||
//bindingInfo := model.Binding{}
|
||
//err = bindingTable.GetOne(traceCtx, bson.M{"bindingId": audit.BindingId}, &bindingInfo)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_DB_ERR, err, "", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//appDetail := model.AppDetail{}
|
||
//appDetail.AppId = app.AppID
|
||
//appDetail.Name = app.Name
|
||
//appDetail.Logo = app.Logo
|
||
//appDetail.AppClass = app.AppClass
|
||
//appDetail.AppTag = app.AppTag
|
||
//appDetail.CoreDescription = app.CoreDescription
|
||
//appDetail.Version = app.Version
|
||
//appDetail.CustomData = app.CustomData
|
||
//appDetail.TestInfo = app.TestInfo
|
||
//appDetail.Created = appVerInfo.Created
|
||
//appDetail.Sequence = app.Sequence
|
||
//
|
||
//bindingDetail := model.BindingDetail{}
|
||
//bindingDetail.Name = bindingInfo.Name
|
||
//bindingDetail.BindingId = bindingInfo.BindingID
|
||
//bindingDetail.GroupID = bindingInfo.GroupID
|
||
//bindingDetail.CreatedAt = bindingInfo.CreatedInfo.CreatedAt
|
||
//bindingDetail.GroupName = bindingInfo.GroupName
|
||
//bindingDetail.BundleInfos = bindingInfo.BundleInfos
|
||
//
|
||
//audit.AppDetail = &appDetail
|
||
//audit.BindingDetail = &bindingDetail
|
||
//
|
||
//MakeRsp(c, http.StatusOK, OK, audit)
|
||
}
|
||
|
||
type auditOperateReq struct {
|
||
Operate string `json:"operate"`
|
||
AuditId string `json:"auditId"`
|
||
Reason string `json:"reason"`
|
||
}
|
||
|
||
func AdminLinkAppletAuditOperate(c *gin.Context) {
|
||
//traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := auditOperateReq{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("AdminLinkAppletAuditOperate bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("AdminLinkAppletAuditOperate req:%+v", req)
|
||
//if req.AuditId == "" {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_PARAM_ERR, nil, "auditId can not be null", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//if req.Operate != StLinkAuditRejected && req.Operate != StLinkAuditApplied {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_PARAM_ERR, nil, "operate invalid with:"+req.Operate, nil)
|
||
// return
|
||
//}
|
||
//
|
||
//developerID := c.Request.Header.Get("X-Consumer-Custom-ID")
|
||
//accountInfo, err := provider.GetAdminAccountInfo(traceCtx, c, developerID)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_GET_ACCOUNTINFO_ERROR, err, "", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//err = service.LinkAppletAuditUpdateOperateStatus(traceCtx, req.AuditId, req.Operate, accountInfo.Account, req.Reason)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_DB_ERR, err, "", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//audit, err := service.LinkAppletAudit(traceCtx, req.AuditId)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_DB_ERR, err, "", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//if req.Operate == StLinkAuditApplied {
|
||
// bindingTable := db.NewTable(db.TableBinding)
|
||
// bindingInfo := model.Binding{}
|
||
// err := bindingTable.GetOne(traceCtx, bson.M{"bindingId": audit.BindingId}, &bindingInfo)
|
||
// if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_DB_ERR, err, "", nil)
|
||
// return
|
||
// }
|
||
//
|
||
// err = associate(c, []string{audit.AppId}, &bindingInfo, audit.GroupID, audit.AuditBy)
|
||
// if err != nil {
|
||
// return
|
||
// }
|
||
//}
|
||
//linkAuditNotify(traceCtx, &audit, req.Operate, req.Reason)
|
||
//linkAuditSmsNotify(traceCtx, c, &audit, req.Operate)
|
||
//
|
||
//MakeRsp(c, http.StatusOK, OK, nil)
|
||
//return
|
||
}
|
||
|
||
type associateOperateReq struct {
|
||
Operate string `json:"operate"`
|
||
AppId string `json:"appId"`
|
||
BindingId string `json:"bindingId"`
|
||
GroupId string `json:"groupId"`
|
||
Account string `json:"account"`
|
||
}
|
||
|
||
func AdminAssociateOperate(c *gin.Context) {
|
||
//traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := associateOperateReq{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("AdminAssociateOperate bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
if req.Operate != entity.StLinkAuditAssociate && req.Operate != entity.StLinkAuditUnAssociate {
|
||
log.Errorf("AdminAssociateOperate operate invalid !")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
|
||
if req.AppId == "" || req.BindingId == "" {
|
||
log.Errorf("appId&bindingId can not be null!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
|
||
|
||
//bindingTable := db.NewTable(db.TableBinding)
|
||
//bindingInfo := model.Binding{}
|
||
//err := bindingTable.GetOne(traceCtx, bson.M{"bindingId": req.BindingId}, &bindingInfo)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_DB_ERR, err, "", nil)
|
||
// return
|
||
//}
|
||
//
|
||
//if req.Operate == StLinkAuditAssociate {
|
||
// err = associate(c, []string{req.AppId}, &bindingInfo, req.GroupId, req.Account)
|
||
//} else {
|
||
// err = disassociate(c, []string{req.AppId}, &bindingInfo, req.GroupId, req.Account)
|
||
//}
|
||
//
|
||
//if err != nil {
|
||
// return
|
||
//}
|
||
//
|
||
//MakeRsp(c, http.StatusOK, OK, nil)
|
||
//return
|
||
}
|
||
|
||
func AdminGetAppClassPer(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
status := c.Param("status")
|
||
tp := c.DefaultQuery("tp", "query")
|
||
log.Infof("AdminGetAppClassPer get status:%s,tp:%s", status, tp)
|
||
svr := service.NewAppService()
|
||
rspData, err := svr.GetAppClassPer(traceCtx, status)
|
||
if err != nil {
|
||
log.Errorf("AdminGetAppClassPer err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("AdminGetAppClassPer rsp:%+v", rspData)
|
||
if tp == "export" {
|
||
content, err := Export(traceCtx, *rspData, status)
|
||
if err != nil {
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_EXPORT_APP_CLASS_ERR, gin.H{})
|
||
return
|
||
} else {
|
||
fileName := fmt.Sprintf("app.class.%s.xlsx", time.Now().Format("20060102"))
|
||
c.Header("Content-Disposition", `attachment; filename=`+fileName)
|
||
contentType := "application/vnd.ms-excel"
|
||
c.Data(http.StatusOK, contentType, content)
|
||
}
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rspData)
|
||
return
|
||
}
|
||
|
||
func GetLatestAppVerInfo(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appId := c.Query("appId")
|
||
if appId == "" {
|
||
log.Errorf("GetLatestAppVerInfo app id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
svr := service.NewAppService()
|
||
appVerInfo, err := svr.GetMaxSeqAppVer(traceCtx, appId)
|
||
if err != nil {
|
||
log.Errorf("GetLatestAppVerInfo db err:%s", err.Error())
|
||
if service.NotFound(err) {
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.FS_NOT_FOUND, gin.H{})
|
||
} else {
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
}
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appVerInfo)
|
||
}
|
||
|
||
//获取最新上下架小程序版本详情
|
||
func GetLatestPubAppVerInfo(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appId := c.Query("appId")
|
||
lang := c.Request.Header.Get("lang")
|
||
if appId == "" {
|
||
log.Errorf("GetLatestPubAppVerInfo app id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("GetLatestPubAppVerInfo appId:%s", appId)
|
||
svr := service.NewAppService()
|
||
appVerInfo, err := svr.GetLatestPubAppVer(traceCtx, appId)
|
||
if err != nil {
|
||
log.Errorf("GetLatestAppVerInfo db err:%s", err.Error())
|
||
if service.NotFound(err) {
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
|
||
} else {
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
}
|
||
return
|
||
}
|
||
|
||
if lang == "en" {
|
||
if appVerInfo.ActionStatus.ModifiedBy == "自动上架" {
|
||
appVerInfo.ActionStatus.ModifiedBy = "system"
|
||
}
|
||
if appVerInfo.ActionStatus.ModifiedBy == "管理员" {
|
||
appVerInfo.ActionStatus.ModifiedBy = "admin"
|
||
}
|
||
if appVerInfo.PublishedStatus.ModifiedBy == "自动上架" {
|
||
appVerInfo.PublishedStatus.ModifiedBy = "system"
|
||
}
|
||
if appVerInfo.PublishedStatus.ModifiedBy == "管理员" {
|
||
appVerInfo.PublishedStatus.ModifiedBy = "admin"
|
||
}
|
||
if appVerInfo.Status.ModifiedBy == "自动上架" {
|
||
appVerInfo.Status.ModifiedBy = "system"
|
||
}
|
||
if appVerInfo.Status.ModifiedBy == "管理员" {
|
||
appVerInfo.Status.ModifiedBy = "admin"
|
||
}
|
||
if appVerInfo.UnpublishedStatus.ModifiedBy == "自动上架" {
|
||
appVerInfo.UnpublishedStatus.ModifiedBy = "system"
|
||
}
|
||
if appVerInfo.UnpublishedStatus.ModifiedBy == "管理员" {
|
||
appVerInfo.UnpublishedStatus.ModifiedBy = "admin"
|
||
}
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appVerInfo)
|
||
}
|
||
|
||
type TitleClass struct {
|
||
Name string
|
||
Type string
|
||
}
|
||
|
||
type ExportAppClass struct {
|
||
}
|
||
|
||
func Export(ctx context.Context, data service.GetAppClassPerRsp, status string) ([]byte, error) {
|
||
return fillData(ctx, data, status)
|
||
}
|
||
|
||
func export(titlesClass []TitleClass, matrix [][]string) ([]byte, error) {
|
||
file := xlsx.NewFile()
|
||
titles := []string{}
|
||
for _, t := range titlesClass {
|
||
titles = append(titles, t.Name)
|
||
}
|
||
sheet, err := addSheet(file, "Sheet1", titles)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
for _, cells := range matrix {
|
||
row := sheet.AddRow()
|
||
for idx, value := range cells {
|
||
cell := row.AddCell()
|
||
if titlesClass[idx].Type == "int" {
|
||
intVal, _ := strconv.Atoi(value)
|
||
cell.SetInt(intVal)
|
||
} else if titlesClass[idx].Type == "percent" {
|
||
float64Val, _ := strconv.ParseFloat(value, 64)
|
||
cell.SetFloatWithFormat(float64Val, "0.00%")
|
||
} else {
|
||
cell.Value = value
|
||
}
|
||
}
|
||
}
|
||
buf := new(bytes.Buffer)
|
||
file.Write(buf)
|
||
return buf.Bytes(), nil
|
||
}
|
||
|
||
func addSheet(file *xlsx.File, name string, titles []string) (*xlsx.Sheet, error) {
|
||
if file == nil {
|
||
return nil, errors.New("xlsx file is nil")
|
||
}
|
||
sheet, err := file.AddSheet(name)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
row := sheet.AddRow()
|
||
var cell *xlsx.Cell
|
||
for _, title := range titles {
|
||
cell = row.AddCell()
|
||
cell.Value = title
|
||
}
|
||
return sheet, nil
|
||
}
|
||
|
||
func fillData(ctx context.Context, data service.GetAppClassPerRsp, status string) ([]byte, error) {
|
||
if status == "published" {
|
||
status = "是"
|
||
} else {
|
||
status = "否"
|
||
}
|
||
titles := []TitleClass{{"小程序类型", "string"}, {"是否只看上架中的小程序", "string"}, {"数量", "int"}, {"占比", "percent"}}
|
||
total := 0
|
||
matrix := [][]string{}
|
||
for _, item := range data.List {
|
||
total += item.Count
|
||
}
|
||
for _, item := range data.List {
|
||
cells := []string{}
|
||
if item.AppClassName == "" {
|
||
cells = append(cells, item.AppClass)
|
||
} else {
|
||
cells = append(cells, item.AppClassName)
|
||
}
|
||
cells = append(cells, status)
|
||
cells = append(cells, strconv.Itoa(item.Count))
|
||
cells = append(cells, fmt.Sprintf("%.4f", float64(item.Count)/float64(total)))
|
||
matrix = append(matrix, cells)
|
||
}
|
||
return export(titles, matrix)
|
||
}
|
||
|
||
type DevGetappReviewTrendDataReq struct {
|
||
StartTime int64 `form:"startTime"`
|
||
EndTime int64 `form:"endTime"`
|
||
}
|
||
type DevGetappReviewTrendDataResultItem struct {
|
||
Date string `bson:"_id" json:"date"`
|
||
Num int `bson:"num" json:"num"`
|
||
}
|
||
type DevGetappReviewTrendDataRsp struct {
|
||
ErrCode string `json:"errcode"`
|
||
Error string `json:"error"`
|
||
Data map[string]interface{} `json:"data"`
|
||
}
|
||
|
||
func DevGetappReviewTrendData(c *gin.Context) {
|
||
//traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := DevGetappReviewTrendDataReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("DevGetappReviewTrendData bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
|
||
return
|
||
}
|
||
if req.StartTime >= req.EndTime || req.EndTime <= 0 {
|
||
log.Errorf("DevGetappReviewTrendData time value err!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
|
||
return
|
||
}
|
||
//rspData := make(map[string]interface{})
|
||
//daysArry := GetTimeRangeDays(req.StartTime, req.EndTime)
|
||
//fmt.Println("days arry", daysArry)
|
||
////首先拉取start之前的累计数据
|
||
//t := db.NewTable(db.TableAppVersion)
|
||
//beforeMatchGrand := bson.M{
|
||
// "status.value": bson.M{"$nin": []string{StInDevelopment, StPublishing, StPublishWithdrawed}},
|
||
// //"approvalStatus.lastUpdated": bson.M{"$lte": req.StartTime - (24 * 60 * 60 * 1000)}, //获取前一天的时间
|
||
// "approvalStatus.lastUpdated": bson.M{"$lte": req.StartTime}, //获取前一天的时间
|
||
// "sequence": bson.M{"$ne": 0},
|
||
//}
|
||
//beforeGroup := bson.M{
|
||
// "_id": nil,
|
||
// "total": bson.M{"$sum": 1},
|
||
//}
|
||
//beforeResultList := make([]db.TotalInfo, 0)
|
||
//beforePipe := []bson.M{
|
||
// {"$match": beforeMatchGrand},
|
||
// {"$group": beforeGroup},
|
||
//}
|
||
//err := t.AggregateOnly(traceCtx, beforePipe, &beforeResultList)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusInternalServerError, FS_DB_ERR, err, "Failed to get appVersion before total", nil)
|
||
// return
|
||
//}
|
||
//fmt.Println("before total:", beforeResultList)
|
||
//beforeResult := db.TotalInfo{}
|
||
//if len(beforeResultList) > 0 {
|
||
// beforeResult = beforeResultList[0]
|
||
//}
|
||
////拉取累计审核的每天的数据
|
||
//matchGrand := bson.M{
|
||
// "status.value": bson.M{"$nin": []string{StInDevelopment, StPublishing, StPublishWithdrawed}},
|
||
// //如果开始时间=结束时间,实际取得是这一天0:0:0 -- 23:59:59
|
||
// "approvalStatus.lastUpdated": bson.M{"$gte": req.StartTime, "$lte": req.EndTime},
|
||
// "sequence": bson.M{"$ne": 0},
|
||
//}
|
||
//projectGrand := bson.M{
|
||
// "statusValue": "$status.value",
|
||
// "formatTime": bson.M{
|
||
// "$dateToString": bson.M{
|
||
// "format": "%Y-%m-%d",
|
||
// "date": bson.M{"$add": []interface{}{time.Date(1970, 1, 1, 8, 0, 0, 0, time.Local), "$approvalStatus.lastUpdated"}},
|
||
// },
|
||
// },
|
||
//}
|
||
//groupGrand := bson.M{
|
||
// "_id": "$formatTime",
|
||
// "num": bson.M{"$sum": 1},
|
||
//}
|
||
//countFilter := []bson.M{
|
||
// {"$match": matchGrand},
|
||
//}
|
||
//countFilter = append(countFilter, bson.M{
|
||
// "$group": bson.M{
|
||
// "_id": nil,
|
||
// "total": bson.M{
|
||
// "$sum": 1,
|
||
// },
|
||
// },
|
||
//})
|
||
//pipeFilter := []bson.M{
|
||
// {"$match": matchGrand},
|
||
// {"$project": projectGrand},
|
||
// {"$group": groupGrand},
|
||
// {"$sort": bson.M{"_id": 1}},
|
||
//}
|
||
//result := make([]DevGetappReviewTrendDataResultItem, 0)
|
||
//total, err := t.Aggregate(traceCtx, countFilter, pipeFilter, &result)
|
||
//if err != nil && !t.NotFound() {
|
||
// LogAndSetErrResp(c, http.StatusInternalServerError, FS_DB_ERR, err, "Failed to get appVersion", nil)
|
||
// return
|
||
//}
|
||
//rspData["trendTotal"] = total
|
||
//fmt.Printf("get data,count:%d,result:%+v\n", total, result)
|
||
////所有的日期+数据需要都返回给前端
|
||
//trendRspItemsTemp := make([]DevGetappReviewTrendDataResultItem, 0)
|
||
//for _, v := range daysArry {
|
||
// foundV := false
|
||
// var foundItem DevGetappReviewTrendDataResultItem
|
||
// for _, item := range result {
|
||
// if item.Date == v {
|
||
// foundV = true
|
||
// foundItem = item
|
||
// }
|
||
// }
|
||
// if !foundV {
|
||
// foundItem = DevGetappReviewTrendDataResultItem{
|
||
// Date: v,
|
||
// Num: 0,
|
||
// }
|
||
// }
|
||
// trendRspItemsTemp = append(trendRspItemsTemp, foundItem)
|
||
//}
|
||
////第一天需要加上之前的所有
|
||
//if len(trendRspItemsTemp) > 0 {
|
||
// trendRspItemsTemp[0].Num += beforeResult.Total
|
||
//}
|
||
////累计审核
|
||
//var preResultTotal int
|
||
//var foundItem DevGetappReviewTrendDataResultItem
|
||
//trendRspItems := make([]DevGetappReviewTrendDataResultItem, 0)
|
||
//isFirst := true
|
||
//for _, v := range trendRspItemsTemp {
|
||
// if isFirst {
|
||
// foundItem = DevGetappReviewTrendDataResultItem{Date: v.Date, Num: v.Num}
|
||
// preResultTotal = v.Num
|
||
// isFirst = false
|
||
// } else {
|
||
// foundItem = DevGetappReviewTrendDataResultItem{Date: v.Date, Num: preResultTotal + v.Num}
|
||
// preResultTotal = foundItem.Num
|
||
// }
|
||
// trendRspItems = append(trendRspItems, foundItem)
|
||
//}
|
||
////新增审核
|
||
//var preItem DevGetappReviewTrendDataResultItem
|
||
//AddNewRspItems := make([]DevGetappReviewTrendDataResultItem, 0)
|
||
//isFirst = true
|
||
//for _, item := range trendRspItems {
|
||
// if isFirst {
|
||
// foundItem = DevGetappReviewTrendDataResultItem{Num: 0, Date: item.Date}
|
||
// isFirst = false
|
||
// } else {
|
||
// foundItem = DevGetappReviewTrendDataResultItem{Num: item.Num - preItem.Num, Date: item.Date}
|
||
// }
|
||
// preItem = item
|
||
// AddNewRspItems = append(AddNewRspItems, foundItem)
|
||
//}
|
||
//
|
||
//rspData["trend"] = trendRspItems
|
||
//rspData["addNew"] = AddNewRspItems
|
||
//
|
||
////rsp := DevGetappReviewTrendDataRsp{}
|
||
////rsp.ErrCode = "OK"
|
||
////rsp.Error = ""
|
||
////rsp.Data = rspData
|
||
//c.JSON(http.StatusOK, rspData)
|
||
}
|
||
|
||
type AdminListInDevAppHandReq struct {
|
||
PullType string `form:"pullType"`
|
||
PageNo int `form:"pageNo"`
|
||
PageSize int `form:"pageSize"`
|
||
SearchTxt string `form:"searchTxt"`
|
||
SortType string `form:"sortType"`
|
||
}
|
||
type AdminListInDevAppHandRspItem struct {
|
||
AppId string `json:"appId"`
|
||
Name string `json:"name"`
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/admin//apps-v2/in-development?pageNo=1&pageSize=10&searchTxt=&sortType=created&pullType=dev-list [C/S]获取小程序开发列表【运营端】
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {string} pageNo //页码
|
||
* @apiParam (RequestParam) {string} pageSize //页大小
|
||
* @apiParam (RequestParam) {string} sortType //排序类型
|
||
* @apiParam (RequestParam) {string} pullType //指定类别条件
|
||
* @apiParam (RequestParam) {string} searchTxt //搜索内容
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
{
|
||
"data": {
|
||
"total": 1,
|
||
"list": [
|
||
{
|
||
"appId": "62986e87277a0d00017b782e",
|
||
"name":"开户"
|
||
}
|
||
]
|
||
},
|
||
"errcode": "OK",
|
||
"error": ""
|
||
}
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func AdminListInDevAppHand(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := AdminListInDevAppHandReq{}
|
||
if err := c.Bind(&req); err != nil {
|
||
log.Errorf("AdminListInDevAppHand bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
if req.PageSize == 0 {
|
||
req.PageSize = 50
|
||
}
|
||
if req.SortType == "" {
|
||
req.SortType = "-created"
|
||
}
|
||
req.PageNo += 1
|
||
svrReq := service.ListAppsReq{
|
||
PullType: req.PullType,
|
||
SortType: req.SortType,
|
||
PageNo: req.PageNo,
|
||
PageSize: req.PageSize,
|
||
SearchText: req.SearchTxt,
|
||
UserId: "",
|
||
IsDev: false,
|
||
}
|
||
log.Infof("AdminListInDevAppHand req:%+v", svrReq)
|
||
svr := service.NewAppService()
|
||
total, apps, err := svr.AdminListApps(traceCtx, &svrReq)
|
||
if err != nil {
|
||
log.Errorf("AdminListInDevAppHand err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
rspData := make(map[string]interface{})
|
||
rspData["total"] = total
|
||
list := make([]AdminListInDevAppHandRspItem, 0)
|
||
for _, v := range apps {
|
||
list = append(list, AdminListInDevAppHandRspItem{
|
||
Name: v.Name,
|
||
AppId: v.AppID,
|
||
})
|
||
}
|
||
rspData["list"] = list
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rspData)
|
||
return
|
||
}
|
||
|
||
type GetAppGroupIdRsp struct {
|
||
GroupID string `json:"groupId"`
|
||
Name string `json:"name"`
|
||
Logo string `json:"logo"`
|
||
CoreDescription string `json:"coreDescription"`
|
||
Version string `json:"version" bson:"version"`
|
||
Sequence int `json:"sequence" bson:"sequence"`
|
||
}
|
||
|
||
func GetAppGroupIdByAppId(c *gin.Context) {
|
||
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appId := c.Param("appId")
|
||
if appId == "" {
|
||
log.Errorf("GetAppInFoByAppId appId id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
appInfo, err := service.NewAppService().GetAppInfo(traceCtx, appId)
|
||
if err != nil {
|
||
log.Errorf("getApp db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
rsp := GetAppGroupIdRsp{}
|
||
rsp.GroupID = appInfo.GroupID
|
||
rsp.Name = appInfo.Name
|
||
rsp.Logo = appInfo.Logo
|
||
rsp.CoreDescription = appInfo.CoreDescription
|
||
rsp.Sequence = appInfo.Sequence
|
||
rsp.Version = appInfo.Version
|
||
//log.Debugln("GetAppInFoByAppIdRsp", rsp)
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rsp)
|
||
return
|
||
}
|
||
func UpdateHistoryAppMsg(c *gin.Context) {
|
||
//traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
//err := client.NotifySpider{}.UpdateHistoryAppMsg(traceCtx)
|
||
//if err != nil {
|
||
// log.Errorf("UpdateHistoryAppMsg err:%s", err.Error())
|
||
//}
|
||
//MakeRsp(c, http.StatusOK, common.OK, nil)
|
||
return
|
||
}
|
||
|
||
func UpdateAppInfo(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := apiproto.UpdateAppInfoReq{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("UpdateAppInfo bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("UpdateAppInfo get req:%+v", req)
|
||
if req.AppId == "" {
|
||
log.Errorf("UpdateAppInfo appId empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_LACK_OF_APPID, gin.H{})
|
||
return
|
||
}
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("UpdateAppInfo user id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
|
||
return
|
||
}
|
||
if len(req.UpInfo.CustomData.SourceFile) == 0 {
|
||
log.Errorf("UpdateAppInfo SourceFile empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
|
||
return
|
||
}
|
||
err := service.NewAppService().UpdateBuildInfo(traceCtx, c, userId, req)
|
||
if err != nil {
|
||
log.Errorf("UpdateBuildInfo err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
|
||
return
|
||
}
|
||
|
||
type listAppVersionsReq struct {
|
||
PageNo int `form:"pageNo"`
|
||
PageSize int `form:"pageSize"`
|
||
SearchText string `form:"searchText"`
|
||
DeveloperId string `form:"developerId"`
|
||
}
|
||
|
||
/*
|
||
?appId=&status=Deleted,InDevelopment&isIncludeStatus=false&pageNo=0&pageSize=10&sort=-publishingStatusLastUpdated&searchFields=&searchText=
|
||
*/
|
||
|
||
func DevListAppVersions(c *gin.Context) {
|
||
//listAppVersions(c, true, false)
|
||
return
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/apps/sequences-v2?appId=62986e87277a0d00017b782e&pageNo=0&pageSize=100&sort=-sequence&searchFields=&searchText= [C/S]获取小程序审核历史
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {string} appId //小程序id
|
||
* @apiParam (RequestParam) {string} pageNo //页码
|
||
* @apiParam (RequestParam) {string} pageSize //页大小
|
||
* @apiParam (RequestParam) {string} sort //排序类型
|
||
* @apiParam (RequestParam) {string} searchFields //搜索域
|
||
* @apiParam (RequestParam) {string} searchText //搜索内容
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "list": [
|
||
* {
|
||
* "appId": "62986e87277a0d00017b782e",
|
||
* "name": "1",
|
||
* "appClass": "jinrong",
|
||
* "appTag": [
|
||
* "zhengquankaihu"
|
||
* ],
|
||
* "appType": "Applet",
|
||
* "status": {
|
||
* "value": "Published",
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "publishingStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654156994088,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "unpublishingStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "publishingApprovalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465436,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "unpublishingApprovalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "publishedStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "unpublishedStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": "",
|
||
* "type": ""
|
||
* },
|
||
* "requestStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "approvalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465436,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "actionStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "developerId": "628b2215062d300001e36285",
|
||
* "groupId": "628b2215062d300001e36286",
|
||
* "created": 1654156994088,
|
||
* "createdBy": "15377373355",
|
||
* "customData": {
|
||
* "detailDescription": "",
|
||
* "sourceFile": [
|
||
* {
|
||
* "fileMd5": "159eed6c06432b1a4f68ced6c19a1bfe",
|
||
* "name": "app.zip",
|
||
* "sourceFileUrl": "/api/v1/mop/netdisk/download/62986eaa1f1afd0001c3698c",
|
||
* "uploadDate": 1654156973289,
|
||
* "url": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698d",
|
||
* "encryptedUrl": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698e",
|
||
* "encryptedFileMd5": "fad7bd98dbcabb560ca30f4c99121a42",
|
||
* "encryptedFileSha256": "c9e9db06725f95a4418c83d54dda3499946b8e1c894583b6477a36cc1d796668",
|
||
* "basicPackVer": "",
|
||
* "Packages": [],
|
||
* "EncryptPackages": []
|
||
* }
|
||
* ],
|
||
* "versionDescription": "1.0.0",
|
||
* "developer": "15377373355"
|
||
* },
|
||
* "version": "1.0.0",
|
||
* "sequence": 1,
|
||
* "corporationId": "",
|
||
* "coreDescription": "123",
|
||
* "logo": "https://www-cdn.finclip.com/images/ic-default.png",
|
||
* "isRollback": false,
|
||
* "testInfo": {
|
||
* "account": "",
|
||
* "password": "",
|
||
* "description": "",
|
||
* "images": []
|
||
* },
|
||
* "needAutoPub": true,
|
||
* "inGrayRelease": false,
|
||
* "expire": 0,
|
||
* "appBuildID": "62986ead277a0d00017b782f"
|
||
* },
|
||
* {...}
|
||
* ]
|
||
* "total": 100
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
|
||
func NewDevListAppSeqList(c *gin.Context) {
|
||
newGetAppVerList(c, "dev")
|
||
}
|
||
|
||
type AdminListAppSeqListReq struct {
|
||
PageNo int `form:"pageNo"`
|
||
PageSize int `form:"pageSize"`
|
||
SearchText string `form:"searchText"`
|
||
Type string `form:"type"`
|
||
OrganTraceId string `form:"organTraceId"`
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/apps/audit/list?pageNo=0&pageSize=100&type=pendingReview&organTraceId=24234&searchText= [C/S]获取某个企业小程序列表
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {string} pageNo //页码
|
||
* @apiParam (RequestParam) {string} pageSize //页大小
|
||
* @apiParam (RequestParam) {string} type //类型,pendingReview:待审核,reviewed:已审核,revoked:已撤销
|
||
* @apiParam (RequestParam) {string} organTraceId //企业id
|
||
* @apiParam (RequestParam) {string} searchText //搜索内容
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "list": [
|
||
* {
|
||
* "appId": "62986e87277a0d00017b782e",
|
||
* "name": "1",
|
||
* "appClass": "jinrong",
|
||
* "appTag": [
|
||
* "zhengquankaihu"
|
||
* ],
|
||
* "appType": "Applet",
|
||
* "status": {
|
||
* "value": "Published",
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "publishingStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654156994088,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "unpublishingStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "publishingApprovalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465436,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "unpublishingApprovalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "publishedStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "unpublishedStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": "",
|
||
* "type": ""
|
||
* },
|
||
* "requestStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 0,
|
||
* "modifiedBy": ""
|
||
* },
|
||
* "approvalStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465436,
|
||
* "modifiedBy": "15377373355"
|
||
* },
|
||
* "actionStatus": {
|
||
* "reason": "",
|
||
* "lastUpdated": 1654157465456,
|
||
* "modifiedBy": "自动上架"
|
||
* },
|
||
* "developerId": "628b2215062d300001e36285",
|
||
* "groupId": "628b2215062d300001e36286",
|
||
* "created": 1654156994088,
|
||
* "createdBy": "15377373355",
|
||
* "customData": {
|
||
* "detailDescription": "",
|
||
* "sourceFile": [
|
||
* {
|
||
* "fileMd5": "159eed6c06432b1a4f68ced6c19a1bfe",
|
||
* "name": "app.zip",
|
||
* "sourceFileUrl": "/api/v1/mop/netdisk/download/62986eaa1f1afd0001c3698c",
|
||
* "uploadDate": 1654156973289,
|
||
* "url": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698d",
|
||
* "encryptedUrl": "/api/v1/mop/netdisk/download/62986ead1f1afd0001c3698e",
|
||
* "encryptedFileMd5": "fad7bd98dbcabb560ca30f4c99121a42",
|
||
* "encryptedFileSha256": "c9e9db06725f95a4418c83d54dda3499946b8e1c894583b6477a36cc1d796668",
|
||
* "basicPackVer": "",
|
||
* "Packages": [],
|
||
* "EncryptPackages": []
|
||
* }
|
||
* ],
|
||
* "versionDescription": "1.0.0",
|
||
* "developer": "15377373355"
|
||
* },
|
||
* "version": "1.0.0",
|
||
* "sequence": 1,
|
||
* "corporationId": "",
|
||
* "coreDescription": "123",
|
||
* "logo": "https://www-cdn.finclip.com/images/ic-default.png",
|
||
* "isRollback": false,
|
||
* "testInfo": {
|
||
* "account": "",
|
||
* "password": "",
|
||
* "description": "",
|
||
* "images": []
|
||
* },
|
||
* "needAutoPub": true,
|
||
* "inGrayRelease": false,
|
||
* "expire": 0,
|
||
* "appBuildID": "62986ead277a0d00017b782f"
|
||
* },
|
||
* {...}
|
||
* ]
|
||
* "total": 100
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func AdminListAppSeqList(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := AdminListAppSeqListReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("listAppVersions bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("AdminListAppSeqList req:%+v", req)
|
||
req.PageNo += 1
|
||
|
||
total, list, err := service.NewAppService().AdminListAppVer(traceCtx, req.PageNo, req.PageSize, req.SearchText, req.Type, req.OrganTraceId)
|
||
if err != nil {
|
||
log.Errorf("AdminListAppSeqList err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{"list": list, "total": total})
|
||
}
|
||
|
||
func AdminListAppVersions(c *gin.Context) {
|
||
listAppVersions(c, false, true)
|
||
}
|
||
|
||
func listAppVersions(c *gin.Context, isDev, isAdmin bool) {
|
||
//traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := apiproto.ListAppsToBindReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("listAppVersions bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
//queryFilter, sortFilter, searchFilter, pageSize, pageNo, err := GetCommonParam(c)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_BAD_JSON, err, "Failed to get params", nil)
|
||
// return
|
||
//}
|
||
//if len(sortFilter) == 0 {
|
||
// sortFilter = []string{"-created"}
|
||
//}
|
||
//baseFilter := bson.M{}
|
||
//calledByDev := isDev
|
||
//operatorID := ""
|
||
//if isDev || isAdmin || isClient {
|
||
// operatorID = c.Request.Header.Get("x-consumer-custom-id")
|
||
//} else if developerID != "" {
|
||
// operatorID = developerID
|
||
// calledByDev = true
|
||
//}
|
||
//if calledByDev {
|
||
// groupID, err := provider.GetGroupID(traceCtx, c, operatorID)
|
||
// if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusInternalServerError, FS_GET_GROUP_FAILED, err, operatorID, nil)
|
||
// return
|
||
// }
|
||
// baseFilter = bson.M{
|
||
// "groupId": groupID,
|
||
// "sequence": bson.M{"$ne": 0},
|
||
// "status.value": bson.M{"$ne": StDeleted},
|
||
// }
|
||
//} else {
|
||
// baseFilter = bson.M{
|
||
// "sequence": bson.M{"$ne": 0},
|
||
// "status.value": bson.M{"$ne": StDeleted},
|
||
// }
|
||
//}
|
||
//
|
||
//filter := baseFilter
|
||
//if len(searchFilter) > 0 {
|
||
// filter = bson.M{"$and": []bson.M{filter, searchFilter}}
|
||
//}
|
||
//if len(queryFilter) > 0 {
|
||
// filter = bson.M{"$and": []bson.M{filter, queryFilter}}
|
||
//}
|
||
//appVers := make([]model.AppVersion, 0)
|
||
//t := db.NewTable(db.TableAppVersion)
|
||
//total, err := t.GetSome(traceCtx, filter, sortFilter, pageSize, pageNo, &appVers)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusInternalServerError, FS_DB_ERR, err, "Failed to get appVersion", nil)
|
||
// return
|
||
//}
|
||
//c.JSON(http.StatusOK, gin.H{
|
||
// "total": total,
|
||
// "list": appVers,
|
||
//})
|
||
}
|
||
|
||
func newGetAppVerList(c *gin.Context, t string) {
|
||
var (
|
||
traceCtx = apm.ApmClient().TraceContextFromGin(c)
|
||
req = apiproto.ListAppVerReq{}
|
||
)
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("list app ver bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("get app seq req:%+v", req)
|
||
if req.PageSize == 0 {
|
||
req.PageSize = 100
|
||
}
|
||
req.PageNo += 1
|
||
svr := service.NewAppService()
|
||
total, appVers, err := svr.ListAppVer(traceCtx, req.AppId, req.PageNo, req.PageSize)
|
||
if err != nil {
|
||
log.Errorf("ListAppVer err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
rsp := make(map[string]interface{})
|
||
rsp["total"] = total
|
||
rsp["list"] = appVers
|
||
c.JSON(http.StatusOK, rsp)
|
||
//utility.MakeLocRsp(c, http.StatusOK, utility.OK, rsp)
|
||
}
|
||
|
||
type ListAppsInDevelopmentReq struct {
|
||
GroupId string `form:"groupId"`
|
||
}
|
||
|
||
func DevListAppsInDevelopment(c *gin.Context) {
|
||
listAppsInDevelopment(c, true, false, false)
|
||
}
|
||
|
||
func AdminListAppsInDevelopment(c *gin.Context) {
|
||
listAppsInDevelopment(c, false, true, false)
|
||
}
|
||
|
||
func ClientListAppsInDevelopment(c *gin.Context) {
|
||
listAppsInDevelopment(c, false, false, true)
|
||
}
|
||
|
||
func ListAppsInDevelopment(c *gin.Context) {
|
||
listAppsInDevelopment(c, false, false, false)
|
||
}
|
||
|
||
func listAppsInDevelopment(c *gin.Context, isDev, isAdmin, isClient bool) {
|
||
//traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
|
||
//developerID := c.Query("developerId")
|
||
//queryFilter, sortFilter, searchFilter, pageSize, pageNo, err := GetCommonParam(c)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusBadRequest, FS_BAD_JSON, err, "Failed to get param", nil)
|
||
// return
|
||
//}
|
||
//if len(sortFilter) == 0 {
|
||
// sortFilter = []string{"-created"}
|
||
//}
|
||
//baseFilter := bson.M{}
|
||
//calledByDev := isDev
|
||
//operatorID := ""
|
||
//if isDev || isAdmin || isClient {
|
||
// operatorID = c.GetHeader("X-Consumer-Custom-Id")
|
||
//} else if developerID != "" {
|
||
// operatorID = developerID
|
||
// calledByDev = true
|
||
//}
|
||
//if calledByDev {
|
||
// groupID, err := provider.GetGroupID(traceCtx, c, operatorID)
|
||
// if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusInternalServerError, FS_GET_GROUP_FAILED, err, developerID, nil)
|
||
// return
|
||
// }
|
||
// baseFilter = bson.M{
|
||
// "sequence": 0,
|
||
// "groupId": groupID,
|
||
// "status.value": bson.M{"$ne": StDeleted},
|
||
// }
|
||
//} else {
|
||
// baseFilter = bson.M{
|
||
// "sequence": 0,
|
||
// "status.value": bson.M{"$ne": StDeleted},
|
||
// }
|
||
//}
|
||
//filter := baseFilter
|
||
//if len(searchFilter) > 0 {
|
||
// filter = bson.M{"$and": []bson.M{filter, searchFilter}}
|
||
//}
|
||
//if len(queryFilter) > 0 {
|
||
// filter = bson.M{"$and": []bson.M{filter, queryFilter}}
|
||
//}
|
||
//appVers := make([]model.AppVersion, 0)
|
||
//t := db.NewTable(db.TableAppVersion)
|
||
//total, err := t.GetSome(traceCtx, filter, sortFilter, pageSize, pageNo, &appVers)
|
||
//if err != nil {
|
||
// LogAndSetErrResp(c, http.StatusInternalServerError, FS_DB_ERR, err, "Failed to get appVersion", nil)
|
||
// return
|
||
//}
|
||
//c.JSON(http.StatusOK, gin.H{
|
||
// "total": total,
|
||
// "list": appVers,
|
||
//})
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
|
||
}
|
||
|
||
type AdminListIndevlopmentAppsReq struct {
|
||
GroupId string `form:"groupId"`
|
||
PageNo int `form:"pageNo"`
|
||
PageSize int `form:"pageSize"`
|
||
}
|
||
|
||
func AdminListIndevlopmentApps(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := AdminListIndevlopmentAppsReq{}
|
||
if err := c.BindQuery(&req); err != nil {
|
||
log.Errorf("AdminListApps err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
req.PageNo += 1
|
||
svr := service.NewAppService()
|
||
svrReq := service.ListAppsReq{
|
||
GroupId: req.GroupId,
|
||
PageNo: req.PageNo,
|
||
PageSize: req.PageSize,
|
||
}
|
||
total, list, err := svr.AdminListApps(traceCtx, &svrReq)
|
||
if err != nil {
|
||
log.Errorf("AdminListApps err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
rspList := []entity.App{}
|
||
|
||
for _, v := range list {
|
||
if v.Expire == MAX_EXPIRE_DATA {
|
||
v.Expire = 0
|
||
}
|
||
rspList = append(rspList, v)
|
||
}
|
||
rspData := make(map[string]interface{})
|
||
rspData["total"] = total
|
||
rspData["list"] = rspList
|
||
c.JSON(http.StatusOK, rspData)
|
||
return
|
||
}
|
||
|
||
type DevListAppHandReq struct {
|
||
PullType string `form:"pullType"`
|
||
PageNo int `form:"pageNo"`
|
||
PageSize int `form:"pageSize"`
|
||
SearchText string `form:"searchTxt"`
|
||
SortType string `form:"sortType"`
|
||
}
|
||
|
||
type DevListAppsRspItem struct {
|
||
AppId string `json:"appId"`
|
||
GroupId string `json:"groupId"`
|
||
GroupName string `json:"groupName"`
|
||
AppClass string `json:"appClass"`
|
||
AppTag []string `json:"appTag"`
|
||
Name string `json:"name"`
|
||
Created int64 `json:"created"`
|
||
Updated int64 `json:"updated"`
|
||
Logo string `json:"logo"`
|
||
Desc string `json:"desc"`
|
||
Status string `json:"status"`
|
||
IsForbidden int `json:"isForbidden"` //是否禁用 0:未禁用 1:禁用
|
||
}
|
||
type DevListAppsRsp struct {
|
||
Total int `json:"total"`
|
||
List []DevListAppsRspItem `json:"list"`
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/apps/inDevelopment-v2?pageNo=1&pageSize=10&searchTxt=&sortType=created&pullType=dev-list [C/S]获取小程序开发列表
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {string} pageNo //页码
|
||
* @apiParam (RequestParam) {string} pageSize //页大小
|
||
* @apiParam (RequestParam) {string} sortType //排序类型
|
||
* @apiParam (RequestParam) {string} pullType //指定类别条件
|
||
* @apiParam (RequestParam) {string} searchTxt //搜索内容
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
{
|
||
"data": {
|
||
"total": 1,
|
||
"list": [
|
||
{
|
||
"appId": "62986e87277a0d00017b782e",
|
||
"groupId": "628b2215062d300001e36286",
|
||
"groupName": "个人-15377373355",
|
||
"appClass": "jinrong",
|
||
"appTag": [
|
||
"zhengquankaihu"
|
||
],
|
||
"name": "1",
|
||
"created": 1654156935640,
|
||
"expire": 0,
|
||
"logo": "https://www-cdn.finclip.com/images/ic-default.png",
|
||
"desc": "123",
|
||
"status": "Published",
|
||
"isForbidden": 1
|
||
}
|
||
]
|
||
},
|
||
"errcode": "OK",
|
||
"error": ""
|
||
}
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func DevListAppHand(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := DevListAppHandReq{}
|
||
if err := c.Bind(&req); err != nil {
|
||
log.Errorf("DevListAppHand bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("DevListAppHand req:%+v", req)
|
||
userId := utility.GetUserId(c)
|
||
if userId == "" {
|
||
log.Errorf("DevListAppHand bind err:%s", "user id empty")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
accountInfo, err := hCaller.GetGroupInfoByUserId(traceCtx, userId)
|
||
if err != nil {
|
||
log.Errorf("DevListAppHand GetGroupInfoByUserId err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
if req.PageNo == 0 {
|
||
req.PageNo = 1
|
||
}
|
||
if req.PageSize == 0 {
|
||
req.PageSize = 10
|
||
}
|
||
svrReq := service.ListAppsReq{
|
||
PullType: req.PullType,
|
||
SortType: req.SortType,
|
||
PageNo: req.PageNo,
|
||
PageSize: req.PageSize,
|
||
SearchText: req.SearchText,
|
||
UserId: userId,
|
||
IsDev: true,
|
||
}
|
||
log.Infof("DevListAppHand req:%+v", svrReq)
|
||
svr := service.NewAppService()
|
||
total, appList, err := svr.DevListApps(traceCtx, &svrReq)
|
||
if err != nil {
|
||
log.Errorf("DevListAppHand err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
/*licenseInfo, err := hCaller.GetLicense(traceCtx)
|
||
if err != nil {
|
||
log.Errorf("DevListAppHand GetLicense err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SYSTEM_CALL, gin.H{})
|
||
return
|
||
}*/
|
||
succRspData := DevListAppsRsp{Total: total, List: make([]DevListAppsRspItem, 0)}
|
||
for _, v := range appList {
|
||
item := DevListAppsRspItem{
|
||
AppId: v.AppID,
|
||
GroupId: v.GroupID,
|
||
GroupName: accountInfo.GroupName,
|
||
AppClass: v.AppClass,
|
||
AppTag: v.AppTag,
|
||
Name: v.Name,
|
||
Created: v.Created,
|
||
Updated: v.Status.LastUpdated,
|
||
Logo: v.Logo,
|
||
Desc: v.CoreDescription,
|
||
Status: v.Status.Value,
|
||
IsForbidden: v.IsForbidden,
|
||
}
|
||
//item.Expire = getExpire(item.Expire, licenseInfo.ExpireTime)
|
||
succRspData.List = append(succRspData.List, item)
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, succRspData)
|
||
return
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/v1/mop/finstore/dev/apps/privacy/setting [C/S]保存,更新小程序的隐私配置接口
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestBody) {string} appId //小程序id
|
||
* @apiParam (RequestBody) {int} commitType //提交类型 1:本小程序开发者承诺并保证,未以任何方式处理用户的任何信息。如后续有处理用户信息,会及时更新《小程序隐私保护指引》 2:本小程序处理了用户信息,将如实填写并及时更新用户信息处理情况
|
||
* @apiParam (RequestBody) {userMessageType} userMessageType //用户使用类型
|
||
* @apiParam (RequestBody) {[]SdkMessageInfoObj} sdkMessage //sdk信息
|
||
* @apiParam (RequestBody) {contactInfo} contactInfo //联系方式
|
||
* @apiParam (RequestBody) {int} fixedStorageTime //固定存储时间
|
||
* @apiParam (RequestBody) {bool} isShortestTime //是否是最短时间
|
||
* @apiParam (RequestBody) {string} additionalDocName //补充文档名称
|
||
* @apiParam (RequestBody) {string} additionalDocNetDiskId //补充文档网盘id
|
||
* @apiParam (RequestBody) {string} additionalDocContent //补充文档内容
|
||
* @apiParamExample {json} Request-Example:
|
||
* {
|
||
* "appId": "61f4f3ce5d3ef200013d9240",
|
||
* "commitType":1,
|
||
* "userMessageType": {
|
||
* "userMes":"", //用户信息
|
||
* "locationMes":"", //位置信息
|
||
* "microphone":"", //麦克风
|
||
* "camera":"", //摄像头
|
||
* "equipmentMes":"", //设备信息
|
||
* "addressBook":"", //通讯录
|
||
* "photoAlbum":"", //相册
|
||
* "calendar":"", //日历
|
||
* "operationLog":"", //操作日志
|
||
* "bluetooth":"", //蓝牙
|
||
* "others":"", //其他
|
||
* "othersExt":"", //其他
|
||
* },
|
||
* "sdkMessage":[{
|
||
* "name":"SDK名称", //SDK名称
|
||
* "provider":"提供方" //提供方
|
||
* },
|
||
* {
|
||
* "name":"名称2", //SDK名称
|
||
* "provider":"提供方2" //提供方
|
||
* },
|
||
* {...}
|
||
* ],
|
||
* "contactInfo":{
|
||
* "phone":"13033333333", //电话
|
||
* "email":"133@qq.com", //邮箱
|
||
* "other":"其他" //其他
|
||
* },
|
||
* "fixedStorageTime":1,
|
||
* "isShortestTime":false,
|
||
* "additionalDocName":"文件.txt",
|
||
* "additionalDocNetDiskId":"61f4f3ce5d3ef200013d9240" //网盘Id
|
||
* "additionalDocContent":"补充内容" //网盘Id
|
||
* }
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "data": {},
|
||
* "errcode": "OK",
|
||
* "error": ""
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
|
||
func DevPrivacySetting(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
req := apiproto.PrivacySettingReq{}
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Errorf("UpdateAppInfo bind err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
log.Infof("DevPrivacySetting get req:%+v", req)
|
||
if req.AppId == "" {
|
||
log.Errorf("DevPrivacySetting appId empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_LACK_OF_APPID, gin.H{})
|
||
return
|
||
}
|
||
|
||
err := service.NewAppService().SavePrivacySetting(traceCtx, req)
|
||
if err != nil {
|
||
log.Errorf("DevGetAppVersion db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, nil)
|
||
return
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/v1/mop/finstore/dev/app/privacy/get/61f4f3ce5d3ef200013d9240 [C/S]获取小程序的隐私配置接口
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {string} appId 小程序id
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "errcode": "OK",
|
||
* "error": "",
|
||
* "data":{
|
||
* "appId": "61f4f3ce5d3ef200013d9240",
|
||
* "commitType":1,
|
||
* "userMessageType": {
|
||
* "userMes":"", //用户信息
|
||
* "locationMes":"", //位置信息
|
||
* "microphone":"", //麦克风
|
||
* "camera":"", //摄像头
|
||
* "equipmentMes":"", //设备信息
|
||
* "addressBook":"", //通讯录
|
||
* "photoAlbum":"", //相册
|
||
* "calendar":"", //日历
|
||
* "operationLog":"", //操作日志
|
||
* "bluetooth":"", //蓝牙
|
||
* "others":"", //其他
|
||
* "othersExt":"",
|
||
* },
|
||
* "sdkMessage":[{
|
||
* "name":"SDK名称", //SDK名称
|
||
* "provider":"提供方" //提供方
|
||
* },
|
||
* {
|
||
* "name":"名称2", //SDK名称
|
||
* "provider":"提供方2" //提供方
|
||
* },
|
||
* {...}
|
||
* ],
|
||
* "contactInfo":{
|
||
* "phone":"13033333333", //电话
|
||
* "email":"133@qq.com", //邮箱
|
||
* "other":"其他" //其他
|
||
* },
|
||
* "fixedStorageTime":1,
|
||
* "isShortestTime":false,
|
||
* "additionalDocName":"文件.txt",
|
||
* "additionalDocContent":"111111",
|
||
* "additionalDocNetDiskId":"61f4f3ce5d3ef200013d9240" //网盘Id
|
||
* "isFirstSave":false,
|
||
* "effectiveTime":1657003167000 //生效时间
|
||
* "updateTime":1657003167000 //更新时间
|
||
* }
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
func GetPrivacySettingInfo(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appId := c.Param("appId")
|
||
if appId == "" {
|
||
log.Errorf("GetAppInFoByAppId appId id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
result, err := service.NewAppService().GetPrivacySettingInfo(traceCtx, appId)
|
||
if err != nil {
|
||
log.Errorf("DevGetAppVersion db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, result)
|
||
return
|
||
}
|
||
|
||
/**
|
||
* @api {DELETE} /api/v1/mop/finstore/dev/app/privacy/del/61f4f3ce5d3ef200013d9240 [C/S]删除小程序的隐私配置
|
||
* @apiGroup Finclip App Manager
|
||
* @apiParam (RequestParam) {string} appId 小程序id
|
||
* @apiSuccessExample {json} Success Status:
|
||
* HTTP/1.1 200 OK
|
||
* {
|
||
* "errcode": "OK",
|
||
* "error": "",
|
||
* "data":{}
|
||
* }
|
||
* @apiErrorExample Error Status:
|
||
* HTTP/1.1 !=200 服务端异常
|
||
*/
|
||
|
||
func DelPrivacySettingInfo(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appId := c.Param("appId")
|
||
if appId == "" {
|
||
log.Errorf("GetAppInFoByAppId appId id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
err := service.NewAppService().DelPrivacySettingInfo(traceCtx, appId)
|
||
if err != nil {
|
||
log.Errorf("DelPrivacySettingInfo db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, nil)
|
||
return
|
||
}
|
||
|
||
func InternalGetPrivacySettingInfo(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appId := c.Param("appId")
|
||
if appId == "" {
|
||
log.Errorf("GetAppInFoByAppId appId id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
result, err := service.NewAppService().InternalGetPrivacySettingInfo(traceCtx, appId)
|
||
if err != nil {
|
||
if service.NotFound(err) {
|
||
utility.MakeLocRsp(c, http.StatusNotFound, utility.FS_NOT_FOUND, gin.H{})
|
||
return
|
||
}
|
||
log.Errorf("DevGetAppVersion db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, result)
|
||
return
|
||
}
|
||
|
||
func InternalGetAppSearchDataInfo(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
appId := c.Param("appId")
|
||
if appId == "" {
|
||
log.Errorf("GetAppInFoByAppId appId id empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
result, err := service.NewAppService().InternalGetAppSearchDataInfo(traceCtx, appId)
|
||
if err != nil {
|
||
if service.NotFound(err) {
|
||
utility.MakeLocRsp(c, http.StatusNotFound, utility.FS_NOT_FOUND, gin.H{})
|
||
return
|
||
}
|
||
log.Errorf("DevGetAppVersion db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, result)
|
||
return
|
||
}
|
||
|
||
func InternalGetAppInfoBySearchText(c *gin.Context) {
|
||
traceCtx := apm.ApmClient().TraceContextFromGin(c)
|
||
searchText := c.Query("searchText")
|
||
if searchText == "" {
|
||
log.Errorf("InternalGetAppInfoBySearchText empty!")
|
||
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
|
||
return
|
||
}
|
||
result, err := service.NewAppService().InternalGetAppInfoBySearchText(traceCtx, searchText)
|
||
if err != nil {
|
||
log.Errorf("DevGetAppVersion db err:%s", err.Error())
|
||
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
|
||
return
|
||
}
|
||
utility.MakeLocRsp(c, http.StatusOK, utility.OK, result)
|
||
return
|
||
}
|
||
|
||
func getExpire(ms int64, licenseExp int64) int64 {
|
||
if ms == MAX_EXPIRE_DATA {
|
||
return 0
|
||
}
|
||
//非uat环境取license过期时间
|
||
if !config.Cfg.IsUatEnv() {
|
||
return licenseExp
|
||
}
|
||
return ms
|
||
}
|