finclip-app-manager/application/app_build_info.go

1010 lines
34 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package application
import (
"finclip-app-manager/domain/entity"
"finclip-app-manager/domain/entity/proto/apiproto"
"finclip-app-manager/domain/repository"
"finclip-app-manager/domain/service"
"finclip-app-manager/infrastructure/config"
"finclip-app-manager/infrastructure/utility"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"gitlab.finogeeks.club/finclip-backend/apm"
)
/**
* @api {POST} {{URL_PREFIX}}/apps/builds [C/S][MOP]获取当前app的可审核版本
* @apiGroup Finclip App Manager
* @apiVersion __API_VERSION__
* @apiPrivate
*
* @apiParam (RequestBody) {string} [developerId] 开发者idURL_PREFIX为/api/v1/finstore时填写
* @apiParam (RequestBody) {string} appId 应用id
* @apiParam (RequestBody) {bool=true,false} needAutoPub=false 审核通过是否自动上架
* @apiSuccessExample {json} Success-Response:
{}
*/
type GetAppBuildsReq struct {
AppId string `form:"appId"`
PageSize int `form:"pageSize"`
PageNo int `form:"pageNo"`
}
type GetAppBuildsRspItem struct {
Id string `json:"id" bson:"id"`
BuildInfoId string `json:"buildInfoId" bson:"buildInfoId"`
Source string `json:"source" bson:"source"` // 该上传版本的状态: build:正常版本, trail:被设置为体验版
AppID string `json:"appId" bson:"appId"`
GroupID string `json:"groupId" bson:"groupId"`
Created int64 `json:"created" bson:"created"` //创建该编译版本的时间
UserId string `json:"userId" bson:"userId"`
CreatedBy string `json:"createdBy" bson:"createdBy"` //创建人
CustomData entity.CustomDataInfo `json:"customData" bson:"customData"`
Version string `json:"version" bson:"version"`
StartParams entity.AppStartParams `json:"startParams" bson:"startParams"`
Status bool `json:"status" bson:"status"`
IsSecurityAuditPass int `json:"isSecurityAuditPass" bson:"isSecurityAuditPass"` //安全审核是否通过0未通过 1通过
}
/**
* @api {GET} /api/v1/mop/finstore/dev/appInfo/builds?appId=62986ead277a0d00017b782f [C/S]获取编译开发列表
* @apiGroup Finclip App Manager
* @apiParam (RequestParam) {string} appId //小程序id
* @apiSuccessExample {json} Success Status:
* HTTP/1.1 200 OK
* {
* "data": {
* "appBuilds": [
* {
* "id": "62986ead277a0d00017b782f",
* "buildInfoId": "ac8f47cf-65a9-43d8-b2ac-34fba808707a",
* "source": "build",
* "appId": "62986e87277a0d00017b782e",
* "groupId": "628b2215062d300001e36286",
* "created": 1654156973289,
* "userId": "628b2215062d300001e36285",
* "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",
* "startParams": {
* "pathAndQuery": ""
* },
* "status": true
* }
* ],
* "total": 1
* },
* "errcode": "OK",
* "error": ""
* }
* @apiErrorExample Error Status:
* HTTP/1.1 !=200 服务端异常
*/
func GetAppBuilds(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
req := GetAppBuildsReq{}
if err := c.BindQuery(&req); err != nil {
log.Errorf("GetAppBuilds bind err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
return
}
pageNo := c.DefaultQuery("pageNo", "0")
pageSize := c.DefaultQuery("pageSize", "20") //config.GetConfig().CodePackageNumLimit
pageNoInt, _ := strconv.Atoi(pageNo)
pageNoInt += 1
pageSizeInt, _ := strconv.Atoi(pageSize)
appId := c.Query("appId")
userId := utility.GetUserId(c)
log.Infof("GetAppBuilds req:%+v,pageNo:%d,pageSize:%d,userId:%s", req, pageNoInt, pageSizeInt, userId)
svr := service.NewAppAppletInfoService()
appBuilds, total, err := svr.GetAppBuilds(traceCtx, userId, appId, pageSizeInt, pageNoInt)
if err != nil {
log.Errorf("GetAppBuilds err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SYSTEM_CALL, gin.H{})
return
}
log.Debugf("appBuilds:%+v", appBuilds)
res := make([]GetAppBuildsRspItem, 0)
for _, v := range appBuilds {
item := GetAppBuildsRspItem{
Id: v.Id,
BuildInfoId: v.BuildInfoId,
Source: v.Source,
AppID: v.AppID,
GroupID: v.GroupID,
Created: v.Created,
UserId: v.UserId,
CreatedBy: v.CreatedBy,
CustomData: entity.CustomDataInfo{
VersionDescription: v.CustomData.VersionDescription,
SourceFile: v.CustomData.SourceFile,
Developer: v.CustomData.Developer,
},
Version: v.Version,
StartParams: entity.AppStartParams{},
Status: v.Status,
}
if config.GetConfig().IsOpenAuditSecurity {
auditInfo, err := hCaller.GetAuditDataInfoByBuildInfoId(traceCtx, v.BuildInfoId)
log.Debugln("GetAuditDataInfoByBuildInfoId:%v", utility.InterfaceToJsonString(auditInfo))
if err != nil {
log.Errorf("GetAuditDataInfoByBuildInfoId err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SYSTEM_CALL, gin.H{})
return
}
item.IsSecurityAuditPass = 0
//0无1审核中2通过3不通过
if auditInfo.Data.Status == 2 {
item.IsSecurityAuditPass = 1
}
//0无 1审批通过
if auditInfo.Data.OperOpinion == 1 {
item.IsSecurityAuditPass = 1
}
} else {
item.IsSecurityAuditPass = 1
}
res = append(res, item)
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{"appBuilds": res, "total": total})
}
type WechatInfoRsp struct {
WechatAppSecret string `json:"wechatAppSecret" bson:"wechatAppSecret"`
WechatAppId string `json:"wechatAppId" bson:"wechatAppId"`
WechatPath string `json:"wechatPath" bson:"wechatPath"`
WechatSize string `json:"wechatSize" bson:"wechatSize"`
QrcodeUrl string `json:"qrcodeUrl" bson:"qrcodeUrl"`
QrcodeDownloadUrl string `json:"qrcodeDownloadUrl" bson:"qrcodeDownloadUrl"`
Updated int64 `json:"updated" bson:"updated"`
ShowHint bool `json:"showHint" bson:"-"` // 是否展示提示
}
type GetLatestAppInfoRsp struct {
OnlineAppInfo interface{} `json:"onlineAppInfo"` //线上小程序详情
ReviewVersion interface{} `json:"reviewVersion"` //最新审核版本信息
TrialVersion interface{} `json:"trialVersion"` //最新体验版本信息
ExtInfo map[string]interface{} `json:"extInfo"` //额外数据 extInfo: {trialQrcodeHasRead: true}
WechatInfo interface{} `json:"wechatInfo"`
WechatLoginInfo interface{} `json:"wechatLoginInfo"`
}
/**
* @api {GET} /api/v1/mop/finstore/dev/appInfo/latest?appId=62986ead277a0d00017b782f [C/S]获取最新线上版、最新审核版本、最新体验版
* @apiGroup Finclip App Manager
* @apiParam (RequestParam) {string} appId //小程序id
* @apiSuccessExample {json} Success Status:
* HTTP/1.1 200 OK
{
"data": {
"onlineAppInfo": {
"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"
},
"reviewVersion": {
"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"
},
"trialVersion": {},
"extInfo": {
"trialQrcodeHasRead": true
},
"wechatInfo": {
"wechatAppSecret": "",
"wechatAppId": "",
"wechatPath": "",
"wechatSize": "",
"qrcodeUrl": "",
"qrcodeDownloadUrl": "",
"updated": 1654157465456,
"showHint": false
},
"wechatLoginInfo": {
"wechatOriginId": "",
"profileUrl": "",
"phoneUrl": ""
}
},
"errcode": "OK",
"error": ""
}
* @apiErrorExample Error Status:
* HTTP/1.1 !=200 服务端异常
*/
//GetLatestAppInfo 获取最新线上版、最新审核版本、最新体验版
func GetLatestAppInfo(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
appID := c.Query("appId")
if appID == "" {
log.Errorf("GetLatestAppInfo appid empty!")
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_LACK_OF_APPID, gin.H{})
return
}
svr := service.NewAppService()
buildInfoSvr := service.NewAppAppletInfoService()
developerID := c.Request.Header.Get("X-Consumer-Custom-ID")
groupInfo, _ := hCaller.GetGroupInfoByUserId(traceCtx, developerID)
app, err := svr.GetAppInfo(traceCtx, appID)
if repository.NotFound(err) {
utility.MakeLocRsp(c, http.StatusNotFound, utility.FS_APP_ID_NOT_FOUND, gin.H{})
return
} else if groupInfo.GroupID != app.GroupID {
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_APPID_ORGANID_ERR, gin.H{})
return
}
var developer string
if app.CustomData.Developer != "" {
developer = app.CustomData.Developer
} else {
developer = app.CreatedBy
app.CustomData.Developer = developer
}
rspData := GetLatestAppInfoRsp{
OnlineAppInfo: gin.H{},
ReviewVersion: gin.H{},
TrialVersion: gin.H{},
ExtInfo: gin.H{},
}
latestPubVer, err := svr.GetLatestPubAppVer(traceCtx, appID)
if err != nil {
if !repository.NotFound(err) {
log.Errorf("GetLatestAppInfo GetLatestPubAppVer err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
return
}
} else {
rspData.OnlineAppInfo = latestPubVer
}
reviewVersion, err := svr.GetLatestReviewAppVer(traceCtx, appID)
if err != nil {
if !repository.NotFound(err) {
log.Errorf("GetLatestAppInfo GetLatestReviewAppVer err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
return
}
} else {
//且没有上、下架的版本
if reviewVersion.Status.Value != entity.StPublished && reviewVersion.Status.Value != entity.StUnpublished {
rspData.ReviewVersion = reviewVersion
}
}
trialInfo, err := buildInfoSvr.DevGetTrialInfo(traceCtx, appID)
if err != nil {
log.Debugln("GetTrailInfoByAppId err:%s", err.Error())
if repository.NotFound(err) {
log.Debugln("GetLatestAppInfo DevGetTrialInfo err:%s", err.Error())
//utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
rspData.TrialVersion = gin.H{}
} else {
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
return
}
} else {
if trialInfo.CustomData.Developer == "" {
trialInfo.CustomData.Developer = developer
}
rspData.TrialVersion = trialInfo
trialAppQrRedDotHasRead, err := hCaller.IsTrialHasRead(traceCtx, trialInfo.Id, developerID)
if err != nil {
log.Errorf("GetLatestAppInfo IsTrialHasRead err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
return
}
log.Debugln("trialQrcodeHasRead :%s", trialAppQrRedDotHasRead)
rspData.ExtInfo["trialQrcodeHasRead"] = trialAppQrRedDotHasRead
}
if trialInfo != nil {
rspData.TrialVersion = trialInfo
}
//extInfo := make(map[string]interface{})
rspData.ExtInfo["trialQrcodeHasRead"] = true
if trialInfo != nil {
hasRead, _ := hCaller.IsTrialHasRead(traceCtx, trialInfo.Id, utility.GetUserId(c))
log.Debugln("trialQrcodeHasRead :%s", hasRead)
rspData.ExtInfo["trialQrcodeHasRead"] = hasRead
}
//rspData.ExtInfo = extInfo
wechatInfoRsp := WechatInfoRsp{}
wechatInfo, err := hCaller.GetWeChatInfo(traceCtx, appID)
if err == nil {
wechatInfoRsp.Updated = wechatInfo.Updated
wechatInfoRsp.QrcodeDownloadUrl = wechatInfo.QrcodeDownloadUrl
wechatInfoRsp.QrcodeUrl = wechatInfo.QrcodeUrl
wechatInfoRsp.WechatPath = wechatInfo.WechatPath
wechatInfoRsp.WechatAppId = wechatInfo.WechatAppId
wechatInfoRsp.WechatAppSecret = wechatInfo.WechatAppSecret
wechatInfoRsp.WechatSize = wechatInfo.WechatSize
if wechatInfo.Updated == 0 {
wechatInfoRsp.Updated = app.PublishedStatus.LastUpdated
}
isShowHint, _ := hCaller.IsShowHint(traceCtx, appID, developerID)
wechatInfoRsp.ShowHint = isShowHint
rspData.WechatInfo = wechatInfoRsp
} else {
log.Errorf("GetWeChatInfo err:%s", err.Error())
}
wechatLoginInfo, err := hCaller.GetWeChatLoginInfo(traceCtx, appID)
if err != nil {
log.Errorf("GetWeChatInfo err:%s", err.Error())
} else {
rspData.WechatLoginInfo = wechatLoginInfo
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rspData)
}
func GetAppAdminAccount(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
appID := c.Param("appId")
svr := service.NewAppService()
app, err := svr.GetAppInfo(traceCtx, appID)
if err != nil {
if repository.NotFound(err) {
utility.MakeLocRsp(c, http.StatusNotFound, utility.FS_APP_ID_NOT_FOUND, gin.H{})
} else {
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
}
return
}
groupInfo, err := hCaller.GetGroupInfoByGroupId(traceCtx, app.GroupID)
if err != nil {
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SYSTEM_CALL, gin.H{})
} else {
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{"adminAccountId": groupInfo.AdminAccountId, "groupId": groupInfo.GroupID})
}
}
type UpdateTrailAppReq struct {
Id string `json:"id"`
AppId string `json:"appId"`
Type string `json:"type"`
}
/**
* @api {POST} /api/v1/mop/finstore/dev/trial/operate [C/S]添加体验版小程序
* @apiGroup Finclip App Manager
* @apiParam (RequestBody) {string} id //编译id
* @apiParam (RequestBody) {string} appId //小程序id
* @apiParam (RequestBody) {string} type //add:添加cancel:取消
* @apiParamExample {json} Request-Example:
* {
* "id":"61b32654659d2b00016264a9",
* "appId":"61b32654659d2b00016264a8",
* "type": "add"
* }
* @apiSuccessExample {json} Success Status:
* HTTP/1.1 200 OK
* {
* "data": {},
* "errcode": "OK",
* "error": ""
* }
* @apiErrorExample Error Status:
* HTTP/1.1 !=200 服务端异常
*/
func UpdateTrialApp(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
req := UpdateTrailAppReq{}
if err := c.BindJSON(&req); err != nil {
log.Errorf("UpdateTrialApp bind err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
log.Infof("UpdateTrialApp req:%+v", req)
userId := utility.GetUserId(c)
if req.Id == "" || req.Type == "" || userId == "" {
log.Errorf("UpdateTrialApp req:[%+v] or user id:[%s] err", req, userId)
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
svr := service.NewAppAppletInfoService()
err := svr.UpdateTrialApp(traceCtx, userId, req.Id, req.Type, req.AppId)
if err != nil {
log.Errorf("UpdateTrialApp get info err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
return
}
/**
* @api {POST} /api/v1/mop/finstore/dev/trial/path-query [C/S]更新体验版小程序path
* @apiGroup Finclip App Manager
* @apiParam (RequestBody) {string} traceId //编译id
* @apiParam (RequestBody) {string} pathAndQuery //path
* @apiParamExample {json} Request-Example:
* {
* "traceId":"61b32654659d2b00016264a9",
* "pathAndQuery":"abc"
* }
* @apiSuccessExample {json} Success Status:
* HTTP/1.1 200 OK
* {
* "data": {},
* "errcode": "OK",
* "error": ""
* }
* @apiErrorExample Error Status:
* HTTP/1.1 !=200 服务端异常
*/
func UpdateTrialAppPathAndQueryHand(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
req := apiproto.UpdateTrialAppPathReq{}
if err := c.BindJSON(&req); err != nil {
log.Errorf("UpdateTrialAppPathHand bind err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
log.Infof("UpdateTrialAppPathHand req:%+v", req)
if req.TraceId == "" {
log.Errorf("UpdateTrialAppPathHand trace id empty,req:%+v", req)
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
userId := utility.GetUserId(c)
if userId == "" {
log.Errorf("UpdateTrialAppPathHand user id empty,req:%+v", req)
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
svr := service.NewAppAppletInfoService()
err := svr.UpdateTrialAppPathAndQueryHand(traceCtx, userId, req.TraceId, req.PathAndQuery)
if err != nil {
log.Errorf("GetTrialInfoById err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{})
return
}
/**
* @api {GET} /api/v1/mop/finstore/dev/trial/info?appId=61b32654659d2b00016264a8 [C/S]获取小程序体验版信息
* @apiGroup Finclip App Manager
* @apiParam (RequestBody) {string} traceId //编译id
* @apiParam (RequestBody) {string} pathAndQuery //path
* @apiParamExample {json} Request-Example:
* {
* "traceId":"61b32654659d2b00016264a9",
* "pathAndQuery":"abc"
* }
* @apiSuccessExample {json} Success Status:
* HTTP/1.1 200 OK
{
"data": {
"qrcodeHasRead":true, //二维码是否已读
"info":{
"id":"id",
"buildInfoId":"编译id",
"source":"build", //build:正常版本, trail:被设置为体验版
"appId":"61b32654659d2b00016264a8",
"groupId":"企业id",
"created":1660291974, //创建时间
"userId":"用户id",
"createdBy":"创建人",
"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",
"startParams": {
"pathAndQuery": ""
},
"status":true
}
}
"errcode": "OK",
"error": ""
}
* @apiErrorExample Error Status:
* HTTP/1.1 !=200 服务端异常
*/
func GetTrialAppInfo(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
appId := c.Query("appId")
log.Infof("GetTrialAppInfo app id:%+v", appId)
userId := utility.GetUserId(c)
if appId == "" || userId == "" {
log.Errorf("GetTrialAppInfo appId:[%s] or userId:[%s] empty, err", appId, userId)
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
svr := service.NewAppAppletInfoService()
rspData, err := svr.GetTrialAppInfo(traceCtx, userId, appId)
if err != nil {
log.Errorf("GetTrialInfoById err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rspData)
return
}
// GetBuildAppInfo 获取由编译列表衍生的小程序详情
//目前包括临时小程序、体验版小程序
func GetBuildAppInfo(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
req := apiproto.GetBuildAppInfoReq{}
if err := c.BindJSON(&req); err != nil {
log.Errorf("GetBuildAppInfo bind err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
sdkKey := utility.GetSdkKey(c)
log.Infof("GetBuildAppInfo req:%+v,sdk key:%s", req, sdkKey)
svr := service.NewAppService()
appInfo, rsp := svr.GetBuildInfo(traceCtx, req, sdkKey)
if appInfo == nil {
rsp.MakeRsp(c, gin.H{})
} else {
rsp.MakeRsp(c, appInfo)
}
return
}
func GetBuildInfoById(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
t := c.Query("type")
codeId := c.Query("codeId")
if codeId == "" {
log.Errorf("GetBuildInfoById type or code id is empty,t:[%s],code id:[%s]", t, codeId)
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
svr := service.NewAppAppletInfoService()
appInfo, err := svr.GetInfoById(traceCtx, codeId)
if err != nil {
log.Errorf("GetInfoById err:%s", err.Error())
if service.NotFound(err) {
utility.MakeLocRsp(c, http.StatusNotFound, utility.FS_NOT_FOUND, gin.H{})
return
}
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
return
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appInfo)
return
}
func GetInfoByBuildInfoId(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
buildInfoId := c.Query("buildInfoId")
if buildInfoId == "" {
log.Errorf("GetBuildInfoById type or code id is empty:[%s]", buildInfoId)
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
svr := service.NewAppAppletInfoService()
appInfo, err := svr.GetInfoByBuildInfoId(traceCtx, buildInfoId)
if err != nil {
log.Errorf("GetInfoById err:%s", err.Error())
if service.NotFound(err) {
utility.MakeLocRsp(c, http.StatusNotFound, utility.FS_NOT_FOUND, gin.H{})
return
}
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_DB_ERR, gin.H{})
return
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, appInfo)
return
}
func GetManageAppList(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
sdkKey := c.GetHeader(entity.SDKKEY_HEADER_KEY)
userId := c.Query("userId")
apiServer := c.Query("apiServer")
log.Infof("GetManageAppList req sdkKey:[%s],userId:[%s]", sdkKey, userId)
if sdkKey == "" || userId == "" || apiServer == "" {
log.Errorf("GetManageAppList type or appid is nil !")
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
svr := service.NewAppAppletInfoService()
rspData, rsp := svr.GetManageAppList(traceCtx, userId, sdkKey, apiServer)
if rspData == nil {
rsp.MakeRsp(c, gin.H{})
} else {
rsp.MakeRsp(c, rspData)
}
return
}
func GetManageAppVerList(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
listType := c.Query("listType")
appId := c.Query("appId")
apiServer := c.Query("apiServer")
log.Infof("GetManageAppVerList req appId:[%s],listType:[%s],apiServer:[%s]", appId, listType, apiServer)
if listType == "" || appId == "" {
log.Errorf("GetManageAppVerList type or appid is nil !")
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
svr := service.NewAppAppletInfoService()
rspData, rsp := svr.GetManageAppVerList(traceCtx, listType, appId, apiServer)
if rspData == nil {
rsp.MakeRsp(c, gin.H{})
} else {
rsp.MakeRsp(c, rspData)
}
return
}
func FixDevListStatus(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
svr := service.NewAppAppletInfoService()
rsp := svr.FixDevListStatus(traceCtx)
rsp.MakeRsp(c, gin.H{})
return
}
type GenOfflinePackageInfoHandReq struct {
AppId string `json:"appId"`
Sequence int `json:"seq"`
}
/**
* @api {POST} /api/v1/mop/finstore/dev/package/offline [C/S]生成离线包下载信息
* @apiGroup Finclip App Manager
* @apiParam (RequestBody) {string} appId //小程序id
* @apiParam (RequestBody) {int} seq //小程序序列号
* @apiParamExample {json} Request-Example:
* {
* "appId":"61b32654659d2b00016264a8",
* "seq": 1,
* }
* @apiSuccessExample {json} Success Status:
* HTTP/1.1 200 OK
* {
* "data": {
* "netdiskId":"61b32654659d2b00016264a9" //网盘id
* },
* "errcode": "OK",
* "error": ""
* }
* @apiErrorExample Error Status:
* HTTP/1.1 !=200 服务端异常
*/
//GenOfflinePackageInfoHand 离线包下载信息获取
func GenOfflinePackageInfoHand(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
userId := utility.GetUserId(c)
if userId == "" {
log.Errorf("user id empty")
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
req := GenOfflinePackageInfoHandReq{}
if err := c.BindJSON(&req); err != nil {
log.Errorf("GenOfflinePackageInfoHand bind err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_PARAM_ERR, gin.H{})
return
}
log.Infof("GenOfflinePackageInfoHand req:%v", req)
svr := service.NewAppService()
fileId, err := svr.GenOfflinePackageInfo(traceCtx, req.AppId, req.Sequence, userId)
if err != nil {
log.Errorf("app ver service gen offline package err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SERVER_ERR, gin.H{})
return
}
//todo test
utility.MakeLocRsp(c, http.StatusOK, utility.OK, gin.H{"netdiskId": fileId})
}
type GetBindingIdBySdkKeyHandReq struct {
SdkKey string `form:"sdkKey"`
AppId string `form:"appId"`
OrganId string `form:"organId"`
}
func GetBindingIdBySdkKeyHand(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
req := GetBindingIdBySdkKeyHandReq{}
if err := c.Bind(&req); err != nil {
log.Errorf("GetBindingIdBySdkKeyHand bind err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, gin.H{})
return
}
if req.SdkKey == "" {
log.Errorf("GetBindingIdBySdkKeyHand sdk key empty")
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_SDKKEY_NOT, gin.H{})
return
}
log.Debugf("GetBindingIdBySdkKeyHand sdkkey=%s, appId=%s", req.SdkKey, req.AppId)
svr := service.NewBindingService()
info, err := svr.GetBindInfoByParam(traceCtx, req.SdkKey, req.OrganId, req.AppId)
if err != nil {
log.Errorf("GetBindingIdBySdkKeyHand bind err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SERVICE_UNAVAILABLE, gin.H{})
return
}
rspData := gin.H{
"bindingId": info.BindingID,
"owner": info.Owner,
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, rspData)
return
}
func GetBindingInfoBySdkKeyHand(c *gin.Context) {
traceCtx := apm.ApmClient().TraceContextFromGin(c)
req := GetBindingIdBySdkKeyHandReq{}
if err := c.ShouldBindJSON(&req); err != nil {
log.Errorf("GetBindingInfoBySdkKeyHand ShouldBindJSON err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_BAD_JSON, make(map[string]interface{}))
return
}
if req.SdkKey == "" {
log.Errorf("GetBindingIdBySdkKeyHand sdk key empty")
utility.MakeLocRsp(c, http.StatusBadRequest, utility.FS_SDKKEY_NOT, gin.H{})
return
}
log.Debugf("GetBindingIdBySdkKeyHand sdkkey=%s, appId=%s", req.SdkKey)
svr := service.NewBindingService()
info, err := svr.GetBindingBySdkKey(traceCtx, req.SdkKey)
if err != nil {
log.Errorf("GetBindingIdBySdkKeyHand bind err:%s", err.Error())
utility.MakeLocRsp(c, http.StatusInternalServerError, utility.FS_SERVICE_UNAVAILABLE, gin.H{})
return
}
utility.MakeLocRsp(c, http.StatusOK, utility.OK, info)
return
}