1056 lines
32 KiB
Go
1056 lines
32 KiB
Go
package mongo
|
|
|
|
import (
|
|
"context"
|
|
"finclip-app-manager/domain/entity"
|
|
"finclip-app-manager/domain/entity/proto/apiproto"
|
|
"finclip-app-manager/infrastructure/db/entity/mongo"
|
|
"finclip-app-manager/infrastructure/utility"
|
|
"finclip-app-manager/infrastructure/utils"
|
|
"time"
|
|
|
|
"gitlab.finogeeks.club/finclip-backend-v2/finclip-mgo/bson"
|
|
)
|
|
|
|
type AppRepo struct {
|
|
}
|
|
|
|
func NewAppRepo() *AppRepo {
|
|
return &AppRepo{}
|
|
}
|
|
|
|
func (ar *AppRepo) AppCount(ctx context.Context, organId string) (int, error) {
|
|
match := bson.M{"isForbidden": 0}
|
|
if organId != "" {
|
|
match["organId"] = organId
|
|
}
|
|
return appTable.Count(ctx, match)
|
|
}
|
|
|
|
func (ar *AppRepo) InsertApp(ctx context.Context, info entity.App) error {
|
|
mgoInfo := tr.CovertAppToMgo(&info)
|
|
return appTable.Insert(ctx, mgoInfo)
|
|
}
|
|
|
|
func (ar *AppRepo) InsertAppVer(ctx context.Context, info entity.AppVersion) error {
|
|
mgoInfo := tr.CovertAppVerToMgo(&info)
|
|
return appVerTable.Insert(ctx, mgoInfo)
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppInfo(ctx context.Context, appId string) (entity.App, error) {
|
|
mgoInfo := mongo.App{}
|
|
err := appTable.GetOne(ctx, bson.M{"appId": appId}, &mgoInfo)
|
|
if err != nil {
|
|
if NotFound(err) {
|
|
return entity.App{}, entity.NotFoundErr
|
|
}
|
|
log.Errorf("GetAppInfo err:%s", err.Error())
|
|
return entity.App{}, err
|
|
}
|
|
return *tr.CovertAppToEntity(&mgoInfo), nil
|
|
}
|
|
|
|
func (ar *AppRepo) UpdateApp(ctx context.Context, info entity.App) error {
|
|
mgoInfo := tr.CovertAppToMgo(&info)
|
|
return appTable.UpSert(bson.M{"appId": info.AppID}, mgoInfo)
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppVerInfo(ctx context.Context, appId string, seq int) (entity.AppVersion, error) {
|
|
mgoInfo := mongo.AppVersion{}
|
|
err := appVerTable.GetOne(ctx, bson.M{"appId": appId, "sequence": seq}, &mgoInfo)
|
|
if err != nil {
|
|
if NotFound(err) {
|
|
return entity.AppVersion{}, entity.NotFoundErr
|
|
}
|
|
log.Errorf("GetAppInfo err:%s", err.Error())
|
|
return entity.AppVersion{}, err
|
|
}
|
|
return *tr.CovertAppVerToEntity(&mgoInfo), nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetOnlineAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
|
|
mgoInfo := mongo.AppVersion{}
|
|
match := bson.M{"appId": appId, "status.value": entity.StPublished}
|
|
err := appVerTable.GetSortOne(ctx, match, []string{"-sequence"}, &mgoInfo)
|
|
if err != nil {
|
|
if NotFound(err) {
|
|
return entity.AppVersion{}, entity.NotFoundErr
|
|
}
|
|
return entity.AppVersion{}, err
|
|
}
|
|
return *tr.CovertAppVerToEntity(&mgoInfo), nil
|
|
}
|
|
|
|
func (ar *AppRepo) SubmitApp(ctx context.Context, req entity.SubmitAppReq, expire int64, userId string) error {
|
|
nowMaxSeq := 0
|
|
maxAppVerInfo, err := ar.GetMaxSeqAppVer(ctx, req.AppId)
|
|
if err == nil {
|
|
nowMaxSeq = maxAppVerInfo.Sequence
|
|
} else {
|
|
if err != entity.NotFoundErr {
|
|
return err
|
|
}
|
|
}
|
|
buildInfo, err := NewAppBuildInfoMongoRepo().GetInfoById(ctx, req.BuildId)
|
|
if NotFound(err) {
|
|
buildInfo, err = NewAppBuildInfoMongoRepo().GetInfoByBuildId(ctx, req.BuildId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
log.Debugln("SubmitApp buildInfo:%+v", buildInfo)
|
|
appInfo, err := ar.GetAppInfo(ctx, req.AppId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
now := utils.GetNowMs()
|
|
appVerInfo := mongo.AppVersion{
|
|
AppID: appInfo.AppID,
|
|
Name: appInfo.Name,
|
|
AppClass: appInfo.AppClass,
|
|
AppTag: appInfo.AppTag,
|
|
AppType: entity.AppTypeApplet,
|
|
Status: mongo.Status{
|
|
Reason: "",
|
|
Value: entity.StPublishing,
|
|
LastUpdated: now,
|
|
ModifiedBy: req.Account,
|
|
},
|
|
PublishingStatus: mongo.SpecificStatus{
|
|
Reason: "",
|
|
LastUpdated: now,
|
|
ModifiedBy: req.Account,
|
|
},
|
|
UnpublishingStatus: mongo.SpecificStatus{},
|
|
PublishingApprovalStatus: mongo.SpecificStatus{},
|
|
UnpublishingApprovalStatus: mongo.SpecificStatus{},
|
|
PublishedStatus: mongo.SpecificStatus{},
|
|
UnpublishedStatus: mongo.UnpublishedStatus{},
|
|
RequestStatus: mongo.SpecificStatus{},
|
|
ApprovalStatus: mongo.SpecificStatus{},
|
|
ActionStatus: mongo.SpecificStatus{
|
|
Reason: "",
|
|
LastUpdated: now,
|
|
ModifiedBy: req.Account,
|
|
},
|
|
DeveloperID: userId,
|
|
GroupID: appInfo.GroupID,
|
|
Created: now,
|
|
CreatedBy: req.Account,
|
|
CustomData: tr.CovertCustomDataToMgo(buildInfo.CustomData),
|
|
Version: buildInfo.Version,
|
|
Sequence: nowMaxSeq + 1,
|
|
CoreDescription: appInfo.CoreDescription,
|
|
Logo: appInfo.Logo,
|
|
TestInfo: tr.CovertTestInfoToMgo(req.TestInfo),
|
|
NeedAutoPub: req.NeedAutoPub,
|
|
InGrayRelease: false,
|
|
Expire: expire,
|
|
AppBuildID: req.BuildId,
|
|
}
|
|
appVerInfo.CustomData.DetailDescription = appInfo.CustomData.DetailDescription
|
|
|
|
return appVerTable.Insert(ctx, appVerInfo)
|
|
}
|
|
|
|
func (ar *AppRepo) WithdrawPubApp(ctx context.Context, appId string, seq int, account string) error {
|
|
params := map[string]interface{}{}
|
|
now := utils.GetNowMs()
|
|
params["status"] = mongo.Status{
|
|
Value: entity.StPublishWithdrawed,
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
}
|
|
filter := bson.M{
|
|
"appId": appId,
|
|
"sequence": seq,
|
|
}
|
|
return appVerTable.UpdateOne(ctx, filter, bson.M{"$set": params})
|
|
}
|
|
|
|
func (ar *AppRepo) GetMaxSeqAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
|
|
mgoInfo := mongo.AppVersion{}
|
|
match := bson.M{"appId": appId}
|
|
err := appVerTable.GetSortOne(ctx, match, []string{"-sequence"}, &mgoInfo)
|
|
if err != nil {
|
|
if NotFound(err) {
|
|
return entity.AppVersion{}, entity.NotFoundErr
|
|
}
|
|
return entity.AppVersion{}, err
|
|
}
|
|
return *tr.CovertAppVerToEntity(&mgoInfo), nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetLatestPubAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
|
|
mgoInfo := mongo.AppVersion{}
|
|
match := bson.M{"appId": appId, "publishedStatus.lastUpdated": bson.M{"$ne": 0}}
|
|
err := appVerTable.GetSortOne(ctx, match, []string{"-publishedStatus.lastUpdated"}, &mgoInfo)
|
|
if err != nil {
|
|
if NotFound(err) {
|
|
return entity.AppVersion{}, entity.NotFoundErr
|
|
}
|
|
return entity.AppVersion{}, err
|
|
}
|
|
return *tr.CovertAppVerToEntity(&mgoInfo), nil
|
|
}
|
|
|
|
func (ar *AppRepo) UpdateAppVerAppName(ctx context.Context, appId, appName string) error {
|
|
return nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetNowPubAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
|
|
mgoInfo := mongo.AppVersion{}
|
|
match := bson.M{"appId": appId, "status.value": entity.StPublished}
|
|
err := appVerTable.GetSortOne(ctx, match, []string{"-status.lastUpdated"}, &mgoInfo)
|
|
if err != nil {
|
|
if NotFound(err) {
|
|
return entity.AppVersion{}, entity.NotFoundErr
|
|
}
|
|
return entity.AppVersion{}, err
|
|
}
|
|
return *tr.CovertAppVerToEntity(&mgoInfo), nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetLatestReviewAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
|
|
mgoInfo := mongo.AppVersion{}
|
|
//match := bson.M{"appId": appId, "status.value": bson.M{"$in": []string{entity.StPublishing, entity.StPublishWithdrawed, entity.StPublishApproved, entity.StPublishRejected, entity.StPublished, entity.StUnpublished}}}
|
|
match := bson.M{"appId": appId, "publishingStatus.lastUpdated": bson.M{"$ne": 0}}
|
|
err := appVerTable.GetSortOne(ctx, match, []string{"-sequence"}, &mgoInfo)
|
|
if err != nil {
|
|
if NotFound(err) {
|
|
return entity.AppVersion{}, entity.NotFoundErr
|
|
}
|
|
return entity.AppVersion{}, err
|
|
}
|
|
return *tr.CovertAppVerToEntity(&mgoInfo), nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAllPermitGrayPubVers(ctx context.Context, appId string, maxSeq int) ([]entity.AppVersion, error) {
|
|
filter := bson.M{"appId": appId, "status.value": entity.StPublishApproved, "sequence": bson.M{"$gt": maxSeq}}
|
|
list := make([]mongo.AppVersion, 0)
|
|
_, err := appVerTable.GetAll(ctx, filter, []string{"-sequence"}, &list)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) PubApp(ctx context.Context, appId string, seq int, account string, isDev, isRollback bool) error {
|
|
//结束所有低版本的灰度
|
|
err := appVerTable.UpdateAll(ctx, bson.M{"appId": appId, "sequence": bson.M{"$lte": seq}}, bson.M{"$set": bson.M{"inGrayRelease": false}})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
now := time.Now().UnixNano() / 1e6
|
|
//下架之前上架的小程序版本
|
|
oldAppVer, err := ar.GetNowPubAppVer(ctx, appId)
|
|
if err != nil && !NotFound(err) {
|
|
return err
|
|
}
|
|
if !NotFound(err) {
|
|
unpublishedStatus := mongo.UnpublishedStatus{
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
Type: entity.TypeUnpublishedDueToNewSeq, // Mark the type.
|
|
}
|
|
//if !isDev {
|
|
// unpublishedStatus.Type = entity.TypeUnpublishedByAdmin
|
|
//}
|
|
unPubUpInfo := map[string]interface{}{
|
|
"unpublishedStatus": unpublishedStatus,
|
|
"status": mongo.Status{
|
|
Value: entity.StUnpublished,
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
},
|
|
}
|
|
err = appVerTable.UpdateOne(ctx, bson.M{"appId": oldAppVer.AppID, "sequence": oldAppVer.Sequence}, bson.M{"$set": unPubUpInfo})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
//上架当前小程序版本
|
|
upInfo := make(map[string]interface{})
|
|
upInfo["status"] = mongo.Status{
|
|
Value: entity.StPublished,
|
|
Reason: "",
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
}
|
|
upInfo["publishedStatus"] = mongo.SpecificStatus{
|
|
Reason: "",
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
}
|
|
upInfo["actionStatus"] = mongo.SpecificStatus{
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
}
|
|
//修改小程序元数据信息
|
|
err = appTable.UpdateOne(ctx, bson.M{"appId": appId}, bson.M{"$set": upInfo})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
upInfo["isRollback"] = isRollback
|
|
err = appVerTable.UpdateOne(ctx, bson.M{"appId": appId, "sequence": seq}, bson.M{"$set": upInfo})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (ar *AppRepo) ListApps(ctx context.Context, groupId string, pageNo, pageSize int, searchText string, sortType, pullType string) (int, []entity.App, error) {
|
|
list := make([]mongo.App, 0)
|
|
sortList := make([]string, 0)
|
|
switch sortType {
|
|
case "-created":
|
|
sortList = append(sortList, "-created") //按创建时间倒序排序
|
|
case "created":
|
|
sortList = append(sortList, "created") //按创建时间正序排序
|
|
case "-expire":
|
|
sortList = append(sortList, "-expire") //按过期时间倒序排序
|
|
case "expire":
|
|
sortList = append(sortList, "expire") //按过期时间正序排序
|
|
default:
|
|
sortList = append(sortList, "-created")
|
|
|
|
}
|
|
filter := bson.M{}
|
|
if groupId != "" {
|
|
filter["groupId"] = groupId
|
|
}
|
|
if searchText != "" {
|
|
r := bson.RegEx{Pattern: searchText, Options: "i"}
|
|
filter["$or"] = []bson.M{{"name": r}, {"appId": r}}
|
|
}
|
|
switch pullType {
|
|
case "published":
|
|
filter["status.value"] = entity.StPublished
|
|
}
|
|
total, err := appTable.GetSome(ctx, filter, sortList, pageSize, pageNo, &list)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.App, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppToEntity(&temp))
|
|
}
|
|
return total, result, err
|
|
}
|
|
|
|
func (ar *AppRepo) ListAppVers(ctx context.Context, pageNo, pageSize int, searchText string, t string, groupId string) (int, []entity.AppVersion, error) {
|
|
filter := bson.M{}
|
|
filterList := make([]bson.M, 0)
|
|
if groupId != "" {
|
|
filterList = append(filterList, bson.M{
|
|
"groupId": groupId,
|
|
})
|
|
}
|
|
filterList = append(filterList, bson.M{
|
|
"sequence": bson.M{"$ne": 0},
|
|
})
|
|
if searchText != "" {
|
|
r := bson.RegEx{Pattern: searchText, Options: "i"}
|
|
filterList = append(filterList, bson.M{"$or": []bson.M{
|
|
{"name": r},
|
|
{"appId": r},
|
|
}})
|
|
}
|
|
sortList := make([]string, 0)
|
|
sortList = append(sortList, "-publishingStatus.lastUpdated")
|
|
switch t {
|
|
case "pendingReview": //待审核
|
|
filterList = append(filterList, bson.M{"status.value": bson.M{"$in": []string{entity.StPublishing, entity.StUnpublishing}}})
|
|
case "reviewed": //已审核
|
|
filterList = append(filterList, bson.M{"status.value": bson.M{"$nin": []string{entity.StPublishing, entity.StPublishWithdrawed}}})
|
|
case "revoked": //已撤销
|
|
//PublishWithdrawed
|
|
filterList = append(filterList, bson.M{"status.value": bson.M{"$in": []string{entity.StPublishWithdrawed}}})
|
|
//default:
|
|
}
|
|
filter["$and"] = filterList
|
|
log.Debugln("filter:%v", filter)
|
|
list := make([]mongo.AppVersion, 0)
|
|
total, err := appVerTable.GetSome(ctx, filter, sortList, pageSize, pageNo, &list)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return total, result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) UnpubApp(ctx context.Context, appId string, seq int, account, reason string, isDev bool) error {
|
|
unpublishedType := ""
|
|
if isDev {
|
|
unpublishedType = entity.TypeUnpublishedByDev
|
|
} else {
|
|
unpublishedType = entity.TypeUnpublishedByAdmin
|
|
}
|
|
now := time.Now().UnixNano() / 1e6
|
|
params := map[string]interface{}{}
|
|
params["status"] = mongo.Status{
|
|
Value: entity.StUnpublished,
|
|
ModifiedBy: account,
|
|
LastUpdated: now,
|
|
Reason: reason,
|
|
}
|
|
params["unpublishedStatus"] = mongo.UnpublishedStatus{
|
|
ModifiedBy: account,
|
|
LastUpdated: now,
|
|
Reason: reason,
|
|
Type: unpublishedType,
|
|
}
|
|
params["actionStatus"] = mongo.SpecificStatus{
|
|
ModifiedBy: account,
|
|
LastUpdated: now,
|
|
Reason: reason,
|
|
}
|
|
err := appVerTable.UpdateOne(ctx, bson.M{"appId": appId, "sequence": seq}, bson.M{"$set": params})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return appTable.UpdateOne(ctx, bson.M{"appId": appId}, bson.M{"$set": params})
|
|
}
|
|
|
|
func (ar *AppRepo) ApproveApp(ctx context.Context, appId string, seq int, account, reason string, isPass bool) error {
|
|
params := map[string]interface{}{}
|
|
now := utils.GetNowMs()
|
|
if isPass {
|
|
params["status"] = entity.Status{
|
|
Value: entity.StPublishApproved,
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
Reason: reason,
|
|
}
|
|
} else {
|
|
params["status"] = entity.Status{
|
|
Value: entity.StPublishRejected,
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
Reason: reason,
|
|
}
|
|
}
|
|
params["publishingApprovalStatus"] = mongo.SpecificStatus{
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
Reason: reason,
|
|
}
|
|
params["approvalStatus"] = mongo.SpecificStatus{
|
|
LastUpdated: now,
|
|
ModifiedBy: account,
|
|
Reason: reason,
|
|
}
|
|
return appVerTable.UpdateOne(ctx, bson.M{"appId": appId, "sequence": seq}, bson.M{"$set": params})
|
|
}
|
|
|
|
func (ar *AppRepo) ListAppVersByAppId(ctx context.Context, appId string, pageNo, pageSize int) (int, []entity.AppVersion, error) {
|
|
filter := bson.M{
|
|
"appId": appId,
|
|
"sequence": bson.M{"$ne": 0},
|
|
"status.value": bson.M{"$ne": entity.StDeleted},
|
|
}
|
|
list := make([]mongo.AppVersion, 0)
|
|
total, err := appVerTable.GetSome(ctx, filter, []string{"-sequence"}, pageSize, pageNo, &list)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return total, result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppReviews(ctx context.Context, req apiproto.AdminGetAppReviewsReq) (int, []entity.AppVersion, error) {
|
|
return 0, nil, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAllPublishedVerList(ctx context.Context, appId string) ([]entity.AppVersion, int, error) {
|
|
filter := bson.M{
|
|
"appId": appId,
|
|
"status.value": entity.StPublished,
|
|
}
|
|
list := make([]mongo.AppVersion, 0)
|
|
total, err := appVerTable.GetAll(ctx, filter, []string{"-sequence"}, &list)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return result, total, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetPublishedAppList(ctx context.Context, pageNo, pageSize int, searchText string) ([]entity.AppVersion, int, error) {
|
|
filter := bson.M{
|
|
"status.value": entity.StPublished,
|
|
}
|
|
if searchText != "" {
|
|
r := bson.RegEx{Pattern: searchText, Options: "i"}
|
|
filter["$or"] = []bson.M{
|
|
{"name": r},
|
|
{"appId": r},
|
|
}
|
|
}
|
|
list := make([]mongo.AppVersion, 0)
|
|
total, err := appVerTable.GetSome(ctx, filter, []string{"-created"}, pageSize, pageNo, &list)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return result, total, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAllVers(ctx context.Context, appId string) ([]entity.AppVersion, int, error) {
|
|
filter := bson.M{
|
|
"appId": appId,
|
|
}
|
|
list := make([]mongo.AppVersion, 0)
|
|
total, err := appVerTable.GetAll(ctx, filter, []string{"-sequence"}, &list)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return result, total, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppsByAppIds(ctx context.Context, appIds []string) ([]entity.App, error) {
|
|
list := make([]mongo.App, 0)
|
|
_, err := appTable.GetAllV2(ctx, bson.M{"appId": bson.M{"$in": appIds}}, []string{"-created"}, &list)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result := make([]entity.App, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppToEntity(&temp))
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppsByGroupIds(ctx context.Context, groupIds []string) (int, []entity.App, error) {
|
|
list := make([]mongo.App, 0)
|
|
total, err := appTable.GetAllV2(ctx, bson.M{"groupId": bson.M{"$in": groupIds}}, []string{"-created"}, &list)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.App, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppToEntity(&temp))
|
|
}
|
|
return total, result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppsToBinding(ctx context.Context, bindingId string, pageNo, pageSize int, searchText string) (int, []entity.App, error) {
|
|
br := NewBindingByMongoRepo()
|
|
bindingInfo, err := br.GetBindingByBindingId(ctx, bindingId)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
//获取应用关联的小程序Id
|
|
assAppIdList := make([]string, 0)
|
|
for _, v := range bindingInfo.AppInfos {
|
|
assAppIdList = append(assAppIdList, v.AppID)
|
|
}
|
|
filter := bson.M{"groupId": bindingInfo.GroupID, "appId": bson.M{"$nin": assAppIdList}}
|
|
if searchText != "" {
|
|
filter["name"] = bson.RegEx{
|
|
Pattern: searchText,
|
|
Options: "i",
|
|
}
|
|
}
|
|
list := make([]mongo.App, 0)
|
|
total, err := appTable.GetSome(ctx, filter, []string{"-created"}, pageSize, pageNo, &list)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.App, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppToEntity(&temp))
|
|
}
|
|
return total, result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetLinkAppsByBindingId(ctx context.Context, bindingId string, pageNo, pageSize int, searchText string) (int, []entity.App, error) {
|
|
br := NewBindingByMongoRepo()
|
|
bindingInfo, err := br.GetBindingByBindingId(ctx, bindingId)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
//获取应用关联的小程序Id
|
|
assAppIdList := make([]string, 0)
|
|
for _, v := range bindingInfo.AppInfos {
|
|
assAppIdList = append(assAppIdList, v.AppID)
|
|
}
|
|
list := make([]mongo.App, 0)
|
|
total, err := appTable.GetSome(ctx, bson.M{"groupId": bindingInfo.GroupID, "appId": bson.M{"$in": assAppIdList}}, []string{"-created"}, pageSize, pageNo, &list)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.App, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppToEntity(&temp))
|
|
}
|
|
return total, result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetLinkAppsBySDKKey(ctx context.Context, sdkKey string, pageNo, pageSize int) (int, []entity.App, error) {
|
|
br := NewBindingByMongoRepo()
|
|
bindingInfos, err := br.GetBindListBySdkKey(ctx, sdkKey)
|
|
log.Infof(utility.InterfaceToJsonString(bindingInfos))
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
//获取应用关联的小程序Id
|
|
assAppIdList := make([]string, 0)
|
|
for _, v := range bindingInfos {
|
|
for _, y := range v.AppInfos {
|
|
assAppIdList = append(assAppIdList, y.AppID)
|
|
}
|
|
}
|
|
|
|
list := make([]mongo.App, 0)
|
|
total, err := appTable.GetSome(ctx, bson.M{"status.value": entity.StPublished, "appId": bson.M{"$in": assAppIdList}}, []string{"-created"}, pageSize, pageNo, &list)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.App, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppToEntity(&temp))
|
|
}
|
|
return total, result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) AdminGetLinkApps(ctx context.Context, pageNo, pageSize int, searchText string) (int, []entity.AdminGetLinkAppsRspItem, error) {
|
|
//这里需要连接三个表 app表、binding表、typeConfig表
|
|
//todo 做优化的时候进行修改
|
|
type TempItem struct {
|
|
Id bson.ObjectId `bson:"_id"`
|
|
AppIdDetail struct {
|
|
AppId string `bson:"appId"`
|
|
Name string `bson:"name"`
|
|
Sequence int `bson:"sequence"`
|
|
} `bson:"appIdDetail"`
|
|
AppInfos struct {
|
|
AssociatedAt int64 `bson:"associatedAt"`
|
|
} `bson:"app_infos"`
|
|
BindingId string `bson:"binding_id"`
|
|
GroupName string `bson:"group_name"`
|
|
Name string `bson:"name"`
|
|
}
|
|
binds := make([]TempItem, 0)
|
|
//连接app表
|
|
lookupFind := bson.M{"from": AppTableName, "localField": "app_infos.appId", "foreignField": "appId", "as": "appIdDetail"}
|
|
//分组
|
|
unwindValue := "$app_infos"
|
|
//小程序创建时间倒序
|
|
sortValue := bson.M{"app_infos.associatedAt": -1}
|
|
skipValue := pageNo * pageSize
|
|
limitValue := pageSize
|
|
//模糊匹配
|
|
matchValue := bson.M{
|
|
"$or": []bson.M{
|
|
{"name": bson.M{"$regex": bson.RegEx{Pattern: searchText, Options: "i"}}},
|
|
{"appIdDetail.name": bson.M{"$regex": bson.RegEx{Pattern: searchText, Options: "i"}}},
|
|
{"group_name": bson.M{"$regex": bson.RegEx{Pattern: searchText, Options: "i"}}},
|
|
},
|
|
}
|
|
//typeConfig 小程序开发匹配namespace为appClass的
|
|
//typeConfigMatchValue := bson.M{"appClassDetail.namespace": "appClass"}
|
|
//需要的字段
|
|
projectValue := bson.M{
|
|
"binding_id": 1,
|
|
"appClassDetail.customData.chinese": 1,
|
|
"appIdDetail.name": 1,
|
|
"appIdDetail.appId": 1,
|
|
"appIdDetail.sequence": 1,
|
|
"name": 1,
|
|
"group_name": 1,
|
|
"app_infos.associatedAt": 1,
|
|
}
|
|
//连接typeConfig表
|
|
//appClassLookup := bson.M{"from": "typeConfig", "localField": "appIdDetail.appClass", "foreignField": "value", "as": "appClassDetail"}
|
|
pipSelector := []bson.M{
|
|
{"$unwind": unwindValue},
|
|
{"$lookup": lookupFind},
|
|
{"$match": matchValue},
|
|
{"$sort": sortValue},
|
|
{"$skip": skipValue},
|
|
{"$limit": limitValue},
|
|
{"$unwind": "$appIdDetail"},
|
|
//{"$lookup": appClassLookup},
|
|
//{"$match": typeConfigMatchValue},
|
|
//{"$unwind": "$appClassDetail"},
|
|
{"$project": projectValue},
|
|
}
|
|
countSelector := []bson.M{
|
|
{"$unwind": unwindValue},
|
|
{"$lookup": lookupFind},
|
|
{"$match": matchValue},
|
|
{"$group": bson.M{"_id": nil, "total": bson.M{"$sum": 1}}},
|
|
}
|
|
log.Infof("pipe selector:%+v,countSelector:%+v\n", pipSelector, countSelector)
|
|
err := bindingTable.Aggregate(ctx, pipSelector, &binds)
|
|
if err != nil && !NotFound(err) {
|
|
return 0, nil, err
|
|
}
|
|
total, err := bindingTable.AggregateCount(ctx, countSelector)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.AdminGetLinkAppsRspItem, 0)
|
|
for _, v := range binds {
|
|
item := entity.AdminGetLinkAppsRspItem{}
|
|
item.Id = v.Id.Hex()
|
|
item.AppIdDetail.AppId = v.AppIdDetail.AppId
|
|
item.AppIdDetail.Name = v.AppIdDetail.Name
|
|
item.AppIdDetail.Sequence = v.AppIdDetail.Sequence
|
|
item.AppInfos.AssociatedAt = v.AppInfos.AssociatedAt
|
|
item.BindingId = v.BindingId
|
|
item.GroupName = v.GroupName
|
|
item.Name = v.Name
|
|
|
|
result = append(result, item)
|
|
}
|
|
return total, result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) UpdateGrayStatus(ctx context.Context, appId string, seq int, status bool) error {
|
|
err := appVerTable.UpdateOne(ctx, bson.M{"appId": appId, "sequence": seq}, bson.M{"$set": bson.M{"inGrayRelease": status}})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (ar *AppRepo) UpdateExpire(ctx context.Context, appId string, expire int64) error {
|
|
err := appTable.UpdateOne(ctx, bson.M{"appId": appId}, bson.M{"$set": bson.M{"expire": expire}})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (ar *AppRepo) UpdateExpireAppVersion(ctx context.Context, appId string, seq int, expire int64) error {
|
|
err := appVerTable.UpdateOne(ctx, bson.M{"appId": appId, "sequence": seq}, bson.M{"$set": bson.M{"expire": expire}})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetRollbackAbleList(ctx context.Context, groupId, appId string, latestPubSeq int) ([]entity.AppVersion, error) {
|
|
appVers := make([]mongo.AppVersion, 0)
|
|
limitVersion := 5 // 最近5个版本, 不是最近下架的5个版本
|
|
filter := bson.M{
|
|
"appId": appId,
|
|
"groupId": groupId,
|
|
"status.value": bson.M{"$eq": entity.StUnpublished},
|
|
"sequence": bson.M{"$gte": latestPubSeq - limitVersion, "$lt": latestPubSeq},
|
|
"$or": []bson.M{
|
|
{"unpublishedStatus.type": entity.TypeUnpublishedByDev},
|
|
{"unpublishedStatus.type": entity.TypeUnpublishedDueToNewSeq},
|
|
},
|
|
}
|
|
_, err := appVerTable.GetSome(ctx, filter, []string{"-sequence"}, limitVersion, 1, &appVers)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range appVers {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetCreatedStatistics(ctx context.Context, startTime, endTime int64, groupId string, isForbidden int) (int, error) {
|
|
filter := bson.M{}
|
|
if groupId != "" {
|
|
filter["groupId"] = groupId
|
|
}
|
|
if startTime != -1 && startTime != 0 {
|
|
filter["created"] = bson.M{"$gt": startTime}
|
|
}
|
|
if endTime != -1 && endTime != 0 {
|
|
if _, ok := filter["created"]; ok {
|
|
filter["created"] = bson.M{"$gt": startTime, "$lte": endTime}
|
|
}
|
|
}
|
|
switch isForbidden {
|
|
case entity.APP_FORBIDDEN_NOT_STATUS:
|
|
filter["$or"] = []bson.M{{"isForbidden": entity.APP_FORBIDDEN_NOT_STATUS}, {"isForbidden": bson.M{"$exists": false}}}
|
|
case entity.APP_FORBIDDEN_IS_STATUS:
|
|
filter["isForbidden"] = entity.APP_FORBIDDEN_IS_STATUS
|
|
}
|
|
log.Debugf("GetCreatedStatistics filter:%+v", filter)
|
|
return appTable.Count(ctx, filter)
|
|
}
|
|
|
|
func (ar *AppRepo) GetPublishedStatistics(ctx context.Context, startTime, endTime int64, groupId string) (int, error) {
|
|
filter := bson.M{}
|
|
if groupId != "" {
|
|
filter["groupId"] = groupId
|
|
}
|
|
if startTime != -1 && startTime != 0 {
|
|
filter["publishedStatus.lastUpdated"] = bson.M{"$gt": startTime}
|
|
}
|
|
if endTime != -1 && endTime != 0 {
|
|
filter["publishedStatus.lastUpdated"] = bson.M{"$gt": startTime, "$lte": endTime}
|
|
}
|
|
filter["status.value"] = entity.StPublished
|
|
return appTable.Count(ctx, filter)
|
|
}
|
|
|
|
//GetSubmittedStatistics 累计审核的小程序----只要小程序被审核过都算
|
|
func (ar *AppRepo) GetSubmittedStatistics(ctx context.Context, startTime, endTime int64, groupId string, distinct bool) (int, error) {
|
|
filter := bson.M{}
|
|
if groupId != "" {
|
|
filter["groupId"] = groupId
|
|
}
|
|
if startTime != -1 && startTime != 0 {
|
|
filter = bson.M{"$and": []bson.M{
|
|
filter,
|
|
{
|
|
"publishingStatus.lastUpdated": bson.M{"$gt": startTime},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
if endTime != -1 && endTime != 0 {
|
|
filter = bson.M{"$and": []bson.M{
|
|
filter,
|
|
{
|
|
"publishingStatus.lastUpdated": bson.M{"$lte": endTime},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
filter = bson.M{"$and": []bson.M{
|
|
filter,
|
|
{
|
|
"status.value": bson.M{
|
|
"$ne": entity.StInDevelopment,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
if distinct {
|
|
aggregate := []bson.M{
|
|
{
|
|
"$project": bson.M{
|
|
"appId": 1,
|
|
"publishingStatus": 1,
|
|
"status": 1,
|
|
},
|
|
},
|
|
{
|
|
"$match": filter,
|
|
},
|
|
{
|
|
"$group": bson.M{
|
|
"_id": "appId",
|
|
"total": bson.M{"$sum": 1},
|
|
},
|
|
},
|
|
}
|
|
return appVerTable.AggregateCount(ctx, aggregate)
|
|
}
|
|
return appVerTable.Count(ctx, filter)
|
|
}
|
|
|
|
//审核通过小程序
|
|
func (ar *AppRepo) GetApprovedStatistics(ctx context.Context, startTime, endTime int64, groupId string, distinct bool) (int, error) {
|
|
filter := bson.M{}
|
|
if groupId != "" {
|
|
filter["groupId"] = groupId
|
|
}
|
|
filter = bson.M{
|
|
"$and": []bson.M{
|
|
filter,
|
|
{
|
|
"status.value": bson.M{
|
|
"$in": []string{
|
|
entity.StPublishApproved,
|
|
entity.StPublished,
|
|
entity.StUnpublishing,
|
|
entity.StUnpublishApproved,
|
|
entity.StUnpublishRejected,
|
|
entity.StUnpublished,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
if distinct {
|
|
return appTable.Count(ctx, filter)
|
|
}
|
|
return appVerTable.Count(ctx, filter)
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppClassPer(ctx context.Context, status string) ([]entity.AppClassPerRsp, error) {
|
|
match := bson.M{}
|
|
if status != "" {
|
|
if status == "published" {
|
|
match["status.value"] = entity.StPublished
|
|
}
|
|
}
|
|
group := bson.M{"_id": "$appClass", "count": bson.M{"$sum": 1}}
|
|
|
|
type perRsp struct {
|
|
Class string `bson:"class"`
|
|
Count int `bson:"count"`
|
|
Name []string `bson:"name"`
|
|
}
|
|
lookUp := bson.M{
|
|
"from": TypeConfigTableName,
|
|
"localField": "_id",
|
|
"foreignField": "value",
|
|
"as": "classInfo",
|
|
}
|
|
project := bson.M{
|
|
"class": "$_id",
|
|
"count": 1,
|
|
"name": "$classInfo.chinese",
|
|
}
|
|
perRspList := make([]perRsp, 0)
|
|
pipSelector := []bson.M{
|
|
{"$match": match},
|
|
{"$group": group},
|
|
{"$lookup": lookUp},
|
|
{"$project": project},
|
|
}
|
|
err := appTable.AggregateOnly(ctx, pipSelector, &perRspList)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
rspData := make([]entity.AppClassPerRsp, 0)
|
|
for _, v := range perRspList {
|
|
rspData = append(rspData, entity.AppClassPerRsp{
|
|
Class: v.Class,
|
|
Count: v.Count,
|
|
Name: v.Name,
|
|
})
|
|
}
|
|
return rspData, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppVerLimitByIdentity(ctx context.Context, t, appId, identity string, limit int) ([]entity.AppVersion, error) {
|
|
list := make([]mongo.AppVersion, 0)
|
|
var filter bson.M
|
|
//默认md5
|
|
filter = bson.M{"appId": appId, "customData.sourceFile.fileMd5": identity}
|
|
if t == "sha256" {
|
|
filter = bson.M{"appId": appId, "customData.sourceFile.encryptedFileSha256": identity}
|
|
}
|
|
err := appVerTable.OnlyGetSome(ctx, filter, []string{"-sequence"}, limit, 1, &list)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetGrayStatisticsVerList(ctx context.Context, appId string, seq int, begin, end int64) (int, []entity.AppVersion, error) {
|
|
filter := bson.M{
|
|
"appId": appId,
|
|
"sequence": bson.M{"$lt": seq},
|
|
}
|
|
if end == 0 {
|
|
filter["$or"] = []bson.M{
|
|
{"status.value": entity.StPublished},
|
|
{"status.value": entity.StUnpublished, "unpublishedStatus.lastUpdated": bson.M{"$gte": begin}},
|
|
}
|
|
} else {
|
|
filter["$or"] = []bson.M{
|
|
{"status.value": entity.StPublished, "publishedStatus.lastUpdated": bson.M{"$lte": end}},
|
|
{"status.value": entity.StUnpublished, "$or": []bson.M{
|
|
{"publishedStatus.lastUpdated": bson.M{"$gte": begin, "$lte": end}},
|
|
{"unpublishedStatus.lastUpdated": bson.M{"$gte": begin, "$lte": end}},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
log.Debugf("GetGrayStatisticsVerList filter:%+v", filter)
|
|
sort := []string{"sequence"}
|
|
list := make([]mongo.AppVersion, 0)
|
|
num, err := appVerTable.GetAll(ctx, filter, sort, &list)
|
|
if err != nil {
|
|
log.Errorf("GetGrayStatisticsVerList db err:%s", err.Error())
|
|
return 0, nil, err
|
|
}
|
|
result := make([]entity.AppVersion, 0)
|
|
for _, v := range list {
|
|
temp := v
|
|
result = append(result, *tr.CovertAppVerToEntity(&temp))
|
|
}
|
|
return num, result, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppClassList(ctx context.Context) ([]entity.CItem, error) {
|
|
appClassList := make([]entity.CItem, 0)
|
|
group := bson.M{"_id": "$appClass"}
|
|
pipSelector := []bson.M{
|
|
{"$group": group},
|
|
}
|
|
err := appTable.AggregateOnly(ctx, pipSelector, &appClassList)
|
|
if err != nil {
|
|
return make([]entity.CItem, 0), err
|
|
}
|
|
|
|
return appClassList, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppTagList(ctx context.Context) ([]entity.TagItem, error) {
|
|
appTagList := make([]entity.TagItem, 0)
|
|
group := bson.M{"_id": "$appTag"}
|
|
pipSelector := []bson.M{
|
|
{"$group": group},
|
|
}
|
|
err := appTable.AggregateOnly(ctx, pipSelector, &appTagList)
|
|
if err != nil {
|
|
return make([]entity.TagItem, 0), err
|
|
}
|
|
|
|
return appTagList, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppsBySearchText(ctx context.Context, searchText string) ([]entity.App, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
func (ar *AppRepo) GetAppByCreator(ctx context.Context, phone string) ([]entity.App, error) {
|
|
return nil, nil
|
|
}
|