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 }