finclip-app-manager/application/app_build_info.go

1010 lines
34 KiB
Go
Raw Normal View History

2023-10-31 14:07:26 +08:00
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
}