package mongo import ( "context" "finclip-app-manager/domain/entity" "finclip-app-manager/domain/entity/proto/apiproto" "finclip-app-manager/domain/repository" "strings" "time" mgo "gitlab.finogeeks.club/finclip-backend-v2/finclip-mgo" "gitlab.finogeeks.club/finclip-backend-v2/finclip-mgo/bson" ) var _ repository.IBindingRepo = new(BindingByMongoRepo) type BindingByMongoRepo struct { } func NewBindingByMongoRepo() *BindingByMongoRepo { return &BindingByMongoRepo{} } // 这张表暂时废弃 //type BundleInfoMongo struct { // BindingId string `json:"bindingId" bson:"binding_id"` // BundleID string `json:"bundleId" bson:"bundle_id"` // GroupID string `json:"groupId" bson:"group_id"` //企业ID // Remark string `json:"remark" bson:"remark"` // SDKKey string `json:"SDKKey" bson:"sdk_key"` // SDKID string `json:"SDKID" bson:"sdk_id"` // IsFirstCreate string `json:"isFirstCreate" bson:"is_first_create"` //是否第一次创建 // CreatedAt int64 `json:"createdAt" bson:"created_at"` // CreatedAccount string `json:"createdAccount" bson:"created_account"` // CreatedBy string `json:"createdBy" bson:"created_by"` //} // BundleInfoData 驼峰换下划线,给BindingMongo使用 type BundleInfoData struct { BundleID string `json:"bundle_id" bson:"bundle_id"` Remark string `json:"remark" bson:"remark"` SDKKey string `json:"sdk_key" bson:"sdk_key"` SDKID string `json:"sdk_id" bson:"sdk_id"` IsFirstCreate bool `json:"is_first_create" bson:"is_first_create"` //是否第一次创建 CreatedAt int64 `json:"created_at" bson:"created_at"` CreatedAccount string `json:"created_account" bson:"created_account"` CreatedBy string `json:"created_by" bson:"created_by"` IsForbidden int `json:"is_forbidden" bson:"is_forbidden"` IsReview int `json:"is_review" bson:"is_review"` } type AppInfo struct { AppID string `json:"appId" bson:"appId"` AssociatedAt int64 `json:"associatedAt" bson:"associatedAt"` AssociatedBy string `json:"associatedBy" bson:"associatedBy"` } type BindingMongo struct { BindingID string `json:"bindingId" bson:"binding_id"` //应用的id Name string `json:"name" bson:"name"` //应用名称 BundleInfos []BundleInfoData `json:"bundleInfos" bson:"bundle_infos"` //bundle ids CreatedInfoBy string `json:"createdInfoBy" bson:"created_info_by"` CreatedInfoAt int64 `json:"createdInfoAt" bson:"created_info_at"` CreatedInfoAccount string `json:"createdInfoAccount" bson:"created_info_account"` GroupID string `json:"groupId" bson:"group_id"` //企业ID GroupName string `json:"groupName" bson:"group_name"` //企业名称(为了查询) CooperateStatusValue string `json:"cooperateStatusValue" bson:"cooperate_status_value"` CooperateStatusReason string `json:"cooperateStatusReason" bson:"cooperate_status_reason"` CooperateStatusLastUpdated int64 `json:"cooperateStatusLastUpdated" bson:"cooperate_status_last_updated"` CooperateStatusModifiedBy string `json:"cooperateStatusModifiedBy" bson:"cooperate_status_modified_by"` CooperateValidStatusReason string `json:"cooperateValidStatusReason" bson:"cooperate_valid_status_reson"` CooperateValidStatusLastUpdated int64 `json:"cooperateValidStatusLastUpdated" bson:"cooperate_valid_status_last_updated"` CooperateValidStatusModifiedBy string `json:"cooperateValidStatusModifiedBy" bson:"cooperate_valid_status_modified_by"` CooperateInvalidStatusReason string `json:"cooperateInvalidStatusReason" bson:"cooperate_invalid_status_reson"` CooperateInvalidStatusLastUpdated int64 `json:"cooperateInvalidStatusLastUpdated" bson:"cooperate_invalid_status_last_updated"` CooperateInvalidStatusModifiedBy string `json:"cooperateInvalidStatusModifiedBy" bson:"cooperate_invalid_status_modified_by"` AppInfos []AppInfo `json:"appInfos" bson:"app_infos"` //appid 的信息 Owner string `json:"owner" bson:"owner"` //所属企业 Expire int64 `json:"expire" bson:"expire"` ApiServer string `json:"apiServer" bson:"api_server"` //子域名 PlatForm int `json:"platform" bson:"platform"` //来源平台 AutoBind int `json:"autoBind" bson:"auto_bind"` //自动关联小程序 HiddenBundle int `json:"hiddenBundle" bson:"hidden_bundle"` //隐藏bundle信息 FromBindingID string `json:"fromBindingId" bson:"from_binding_id"` //来源ID } func (b BindingByMongoRepo) GetInfo(ctx context.Context, bindingId string) (*entity.Binding, error) { bindingMongo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"binding_id": bindingId}, &bindingMongo) if err != nil { return nil, err } result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) GetByGroupIdAndName(ctx context.Context, groupId string, name string, isAdmin bool) (*entity.Binding, error) { bindingMongo := BindingMongo{} filter := bson.M{} if isAdmin { filter["group_id"] = groupId filter["name"] = name filter["platform"] = entity.BINGING_PLATFORM_OPER } else { filter["group_id"] = groupId filter["name"] = name filter["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}} } err := bindingTable.GetOne(ctx, filter, &bindingMongo) if err != nil { return nil, err } //bundleInfoMongos := make([]BundleInfoMongo, 0) //_, err = bindingTable.GetAll(ctx, bson.M{"binding_id": bindingMongo.BindingID}, []string{}, &bundleInfoMongos) //if err != nil { // return nil, err //} // //result := convertBindingMongoToBinding(bindingMongo, bundleInfoMongos) result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) GetByApiServer(ctx context.Context, apiServer string) (entity.Binding, error) { bindingMongo := BindingMongo{} res := entity.Binding{} err := bindingTable.GetOne(ctx, bson.M{"api_server": apiServer}, &bindingMongo) if err != nil { return res, err } //bundleInfoMongos := make([]BundleInfoMongo, 0) //_, err = bindingTable.GetAll(ctx, bson.M{"binding_id": bindingMongo.BindingID}, []string{}, &bundleInfoMongos) //if err != nil { // return nil, err //} // //result := convertBindingMongoToBinding(bindingMongo, bundleInfoMongos) result := convertBindingMongoToBinding(bindingMongo) return result, err } func (b BindingByMongoRepo) GetInfoByParams(ctx context.Context, sdkKey, organId, appId string) (*entity.Binding, error) { bindingMongo := BindingMongo{} filters := []bson.M{} filters = append(filters, bson.M{"bundle_infos": bson.M{"$elemMatch": bson.M{"sdk_key": sdkKey}}}) //bson.M{"bundleInfos.SDKKey": bson.M{"$in": []string{sdkKey}}} if appId != "" { filters = append(filters, bson.M{"app_infos": bson.M{"$elemMatch": bson.M{"appId": appId}}}) } if organId != "" { filters = append(filters, bson.M{"group_id": organId}) } filter := bson.M{"$and": filters} err := bindingTable.GetOne(ctx, filter, &bindingMongo) if err != nil { return nil, err } result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) GetInfoBySdkKeyOrganId(ctx context.Context, organId, sdkKey string) (*entity.Binding, error) { bindingMongo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"group_id": organId, "bundle_infos.sdk_key": sdkKey}, &bindingMongo) if err != nil { return nil, err } result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) GetAllSdkKey(ctx context.Context, organId string) ([]string, error) { bindingMongos := make([]BindingMongo, 0) _, err := bindingTable.GetAll(ctx, bson.M{"group_id": organId}, []string{}, &bindingMongos) if err != nil { return nil, err } result := make([]string, 0) for _, v := range bindingMongos { //result := make([]string, 0) //bundleInfoMongos := make([]BundleInfoMongo, 0) //_, err = bundleInfoTable.GetAll(ctx, bson.M{"binding_id": v.BindingID}, []string{}, bundleInfoMongos) //if err != nil { // return nil, err //} for _, bundleInfo := range v.BundleInfos { result = append(result, bundleInfo.SDKKey) } } return result, err } func (b BindingByMongoRepo) GetBindListBySdkKey(ctx context.Context, sdkKey string) ([]entity.Binding, error) { bindingMongos := make([]BindingMongo, 0) _, err := bindingTable.GetAll(ctx, bson.M{"bundle_infos.sdk_key": sdkKey}, []string{"created_info_at"}, &bindingMongos) if err != nil { return nil, err } bindings := make([]entity.Binding, 0) for _, bindingMongo := range bindingMongos { //bundleInfoMongos := make([]BundleInfoMongo, 0) //_, err = bundleInfoTable.GetAll(ctx, bson.M{"binding_id": bindingMongo.BindingID}, []string{}, bundleInfoMongos) //if err != nil { // return nil, err //} //bindings = append(bindings, convertBindingMongoToBinding(bindingMongo, bundleInfoMongos)) bindings = append(bindings, convertBindingMongoToBinding(bindingMongo)) } return bindings, err } func (b BindingByMongoRepo) SdkKeyExi(ctx context.Context, sdkKey string) (bool, error) { if _, ok := entity.SdkExiCache.Get(sdkKey); ok { return true, nil } count, err := bindingTable.Count(ctx, bson.M{"bundle_infos.sdk_key": sdkKey}) if err != nil { return false, err } if count > 0 { entity.SdkExiCache.Set(sdkKey, true, -1) return true, err } return false, err } func (b BindingByMongoRepo) Insert(ctx context.Context, bind *entity.Binding) error { err := bindingTable.Insert(ctx, convertBindingToBindingMongo(bind)) if err != nil { return err } //for _, v := range bind.BundleInfos { // err = bundleInfoTable.Insert(ctx, convertBundleInfoToBundleInfoMongo(bind.BindingID, bind.GroupID, v)) //} return err } func (b BindingByMongoRepo) Count(ctx context.Context) (int, error) { return bindingTable.Count(ctx, bson.M{}) } func (b BindingByMongoRepo) GetCountByStatus(ctx context.Context, status string, platform int) (int, error) { filter := bson.M{} filter["cooperate_status_value"] = "Valid" /*switch platform { case entity.BINGING_PLATFORM_OPER: filter["platform"] = entity.BINGING_PLATFORM_OPER filter["fromBindingId"] = "" case entity.BINGING_PLATFORM_ORGAN: filter["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}} default: filter["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_OPER, "fromBindingId": ""}, {"$or": []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}}}} }*/ filter["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_OPER, "group_id": ""}, {"$or": []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}}}} return bindingTable.Count(ctx, filter) } func (b BindingByMongoRepo) GetBundleIdNum(ctx context.Context) (int, error) { //校验bundingId的数量 pipSelect := []bson.M{ {"$match": bson.M{"bundle_infos": bson.M{"$elemMatch": bson.M{"is_forbidden": 0}}}}, {"$unwind": "$bundleInfos"}, {"$group": bson.M{"_id": nil, "total": bson.M{"$sum": 1}}}, } bundleIdTotal, err := bindingTable.AggregateCount(ctx, pipSelect) if err != nil && !b.NotFound(err) { log.Errorf("GetBundleIdNum err:", err.Error()) return 0, err } if b.NotFound(err) { bundleIdTotal = 0 return 0, nil } return bundleIdTotal, nil } func (b BindingByMongoRepo) GetBundleIdLimitHand(ctx context.Context, groupId string) (int, error) { //校验bundingId的数量 pipSelect := []bson.M{ //{"$match": bson.M{"group_id": groupId}}, {"$match": bson.M{"group_id": groupId, "bundle_infos": bson.M{"$elemMatch": bson.M{"is_forbidden": 0}}}}, {"$unwind": "$bundle_infos"}, {"$group": bson.M{"_id": nil, "total": bson.M{"$sum": 1}}}, } bundleIdTotal, err := bindingTable.AggregateCount(ctx, pipSelect) if err != nil && !b.NotFound(err) { return 0, err } if b.NotFound(err) { bundleIdTotal = 0 return 0, nil } return bundleIdTotal, nil } func (b BindingByMongoRepo) GetBundleLimit(ctx context.Context) (int, error) { //return bundleTable.Count(ctx, bson.M{}) return bundleTable.Count(ctx, bson.M{"is_forbidden": 0}) } func (b BindingByMongoRepo) GetBindingByBindingId(ctx context.Context, bindingId string) (*entity.Binding, error) { bindingMongo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"binding_id": bindingId}, &bindingMongo) if err != nil { return nil, err } result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) GetBindingByGroupIdAndBindingId(ctx context.Context, groupId string, bindingId string) (*entity.Binding, error) { bindingMongo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"group_id": groupId, "binding_id": bindingId}, &bindingMongo) if err != nil { return nil, err } //bundleInfoMongos := make([]BundleInfoMongo, 0) //_, err = bindingTable.GetAll(ctx, bson.M{"binding_id": bindingMongo.BindingID}, []string{}, &bundleInfoMongos) //if err != nil { // return nil, err //} // //result := convertBindingMongoToBinding(bindingMongo, bundleInfoMongos) result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) GetBindingByGroupIdAndSdkKey(ctx context.Context, groupId string, sdkKey string) (*entity.Binding, error) { bindingMongo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"group_id": groupId, "bundle_infos.sdk_key": sdkKey}, &bindingMongo) if err != nil { return nil, err } result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) UpdateBundleInfosByGroupIdAndBindId(ctx context.Context, groupId string, bindingId string, infos []entity.BundleInfo) error { bundleInfoDatas := make([]BundleInfoData, 0) for _, v := range infos { bundleInfoData := BundleInfoData{ BundleID: v.BundleID, Remark: v.Remark, SDKKey: v.SDKKey, SDKID: v.SDKID, IsFirstCreate: v.IsFirstCreate, CreatedAt: v.CreatedAt, CreatedAccount: v.CreatedAccount, CreatedBy: v.CreatedBy, IsForbidden: v.IsForbidden, } bundleInfoDatas = append(bundleInfoDatas, bundleInfoData) } return bindingTable.UpdateOne(ctx, bson.M{"group_id": groupId, "binding_id": bindingId}, bson.M{"$set": bson.M{"bundle_infos": bundleInfoDatas}}) } func (b BindingByMongoRepo) AppendBundles(ctx context.Context, bindingId, groupId string, bundles []entity.BundleInfo) error { bindingInfo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"binding_id": bindingId}, &bindingInfo) if err != nil { return err } bundleInfoDatas := make([]BundleInfoData, 0) bundleInfoDatas = append(bundleInfoDatas, bindingInfo.BundleInfos...) for _, v := range bundles { bundleInfoData := BundleInfoData{ BundleID: v.BundleID, Remark: v.Remark, SDKKey: v.SDKKey, SDKID: v.SDKID, IsFirstCreate: v.IsFirstCreate, CreatedAt: v.CreatedAt, CreatedAccount: v.CreatedAccount, CreatedBy: v.CreatedBy, IsForbidden: v.IsForbidden, } bundleInfoDatas = append(bundleInfoDatas, bundleInfoData) } return bindingTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, bson.M{"$set": bson.M{"bundle_infos": bundleInfoDatas}}) } func (b BindingByMongoRepo) UpdateBundleIsView(ctx context.Context, reviews []apiproto.BundleReviewItem, isReview int) error { return nil } func (b BindingByMongoRepo) ListReviewBundle(ctx context.Context, pageSize int, pageNo int, searchText string, isReview int) (int64, []entity.ReviewBundleInfo, error) { return 0, nil, nil } func (b BindingByMongoRepo) CheckReviewBySdkKey(ctx context.Context, sdkKey string) bool { return false } func (b BindingByMongoRepo) GetReviewBindBySdkKey(ctx context.Context, sdkKey string) (*entity.ReviewBundleInfo, error) { return nil, nil } func (b BindingByMongoRepo) UpdateBundles(ctx context.Context, bindingId, groupId string, bundles []entity.BundleInfo) error { bundleInfoDatas := make([]BundleInfoData, 0) for _, v := range bundles { bundleInfoData := BundleInfoData{ BundleID: v.BundleID, Remark: v.Remark, SDKKey: v.SDKKey, SDKID: v.SDKID, IsFirstCreate: v.IsFirstCreate, CreatedAt: v.CreatedAt, CreatedAccount: v.CreatedAccount, CreatedBy: v.CreatedBy, IsForbidden: v.IsForbidden, IsReview: v.IsReview, } bundleInfoDatas = append(bundleInfoDatas, bundleInfoData) } return bindingTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, bson.M{"$set": bson.M{"bundle_infos": bundleInfoDatas}}) } func (b BindingByMongoRepo) GetByBindIdList(ctx context.Context, ids []string) ([]entity.Binding, error) { bindingMongos := make([]BindingMongo, 0) _, err := bindingTable.GetAll(ctx, bson.M{"binding_id": bson.M{"$in": ids}}, []string{}, &bindingMongos) if err != nil { return nil, err } bindings := make([]entity.Binding, 0) for _, bindingMongo := range bindingMongos { //bundleInfoMongos := make([]BundleInfoMongo, 0) //_, err = bundleInfoTable.GetAll(ctx, bson.M{"binding_id": bindingMongo.BindingID}, []string{}, bundleInfoMongos) //if err != nil { // return nil, err //} // //bindings = append(bindings, convertBindingMongoToBinding(bindingMongo, bundleInfoMongos)) bindings = append(bindings, convertBindingMongoToBinding(bindingMongo)) } return bindings, err } func (b BindingByMongoRepo) GetBindListByGroupId(ctx context.Context, groupId string, pageSize int, pageNo int) ([]entity.Binding, int, error) { bindingMongos := make([]BindingMongo, 0) filter := bson.M{"group_id": groupId} filter["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}} total, err := bindingTable.GetSome(ctx, filter, []string{"-created_info_at"}, pageSize, pageNo, &bindingMongos) if err != nil { return make([]entity.Binding, 0), 0, err } bindings := make([]entity.Binding, 0) for _, bindingMongo := range bindingMongos { //bundleInfoMongos := make([]BundleInfoMongo, 0) //_, err = bundleInfoTable.GetAll(ctx, bson.M{"binding_id": bindingMongo.BindingID}, []string{}, bundleInfoMongos) //if err != nil { // return make([]entity.Binding, 0), 0, err //} // //bindings = append(bindings, convertBindingMongoToBinding(bindingMongo, bundleInfoMongos)) bindings = append(bindings, convertBindingMongoToBinding(bindingMongo)) } return bindings, total, err } func (b BindingByMongoRepo) UpdateRelatedBindingCooperate(ctx context.Context, bindingId string, status entity.Status, specificStatus entity.SpecificStatus, cooperate bool) error { if cooperate { return bindingTable.UpdateAll(ctx, bson.M{"from_binding_id": bindingId, "platform": entity.BINGING_PLATFORM_OPER}, bson.M{"$set": bson.M{"cooperate_status_value": status.Value, "cooperate_status_last_updated": status.LastUpdated, "cooperate_status_modified_by": status.ModifiedBy, "cooperate_valid_status_last_updated": specificStatus.LastUpdated, "cooperate_valid_status_modified_by": specificStatus.ModifiedBy}}) } else { return bindingTable.UpdateAll(ctx, bson.M{"from_binding_id": bindingId, "platform": entity.BINGING_PLATFORM_OPER}, bson.M{"$set": bson.M{"cooperate_status_value": status.Value, "cooperate_status_last_updated": status.LastUpdated, "cooperate_status_modified_by": status.ModifiedBy, "cooperate_invalid_status_last_updated": specificStatus.LastUpdated, "cooperate_invalid_status_modified_by": specificStatus.ModifiedBy}}) } } func (b BindingByMongoRepo) AppendApps(ctx context.Context, bindingId string, apps []entity.AppInfo) error { bindingInfo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"binding_id": bindingId}, &bindingInfo) if err != nil { return err } appsInfo := make([]AppInfo, 0) appsInfo = append(appsInfo, bindingInfo.AppInfos...) for _, v := range apps { app := AppInfo{ AppID: v.AppID, AssociatedAt: v.AssociatedAt, AssociatedBy: v.AssociatedBy, } appsInfo = append(appsInfo, app) } return bindingTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, bson.M{"$set": bson.M{"app_infos": appsInfo}}) } func (b BindingByMongoRepo) RemoveApps(ctx context.Context, bindingId string, appIds []string) error { rmAppsMap := make(map[string]bool) for _, appId := range appIds { rmAppsMap[appId] = true } bindingInfo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"binding_id": bindingId}, &bindingInfo) if err != nil { return err } appsInfo := make([]AppInfo, 0) for _, app := range bindingInfo.AppInfos { if _, ok := rmAppsMap[app.AppID]; !ok { appsInfo = append(appsInfo, app) } } return bindingTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, bson.M{"$set": bson.M{"app_infos": appsInfo}}) } func (b BindingByMongoRepo) UpdateByBindId(ctx context.Context, bindingId string, bind *entity.Binding) error { err := bindingTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, convertBindingToBindingMongo(bind)) if err != nil { return err } //for _, v := range bind.BundleInfos { // err = bundleInfoTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, convertBundleInfoToBundleInfoMongo(bind.BindingID, bind.GroupID, v)) //} return err } func (b BindingByMongoRepo) UpdateBindingInfo(ctx context.Context, bindingId string, info map[string]interface{}, platform int) error { if platform == entity.BINGING_PLATFORM_OPER { err := bindingTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, bson.M{"$set": info}) if err != nil { return err } return bindingTable.UpdateAll(ctx, bson.M{"from_binding_id": bindingId}, bson.M{"$set": info}) } else { return bindingTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, bson.M{"$set": info}) } } func (b BindingByMongoRepo) UpdateBindingGroupName(ctx context.Context, groupId, groupName string) error { return nil } func (b BindingByMongoRepo) UpdateExpire(ctx context.Context, bindingId string, expire int64) error { err := bindingTable.UpdateOne(ctx, bson.M{"binding_id": bindingId}, bson.M{"$set": bson.M{"expire": expire}}) if err != nil { return err } return nil } func (b BindingByMongoRepo) BundleIdCount(ctx context.Context, groupId string) (int, error) { var pipSelect []bson.M if groupId == "" { pipSelect = []bson.M{ {"$match": bson.M{"bundle_infos": bson.M{"$elemMatch": bson.M{"is_forbidden": 0}}}}, {"$unwind": "$bundleInfos"}, {"$group": bson.M{"_id": nil, "total": bson.M{"$sum": 1}}}, } } else { pipSelect = []bson.M{ {"$match": bson.M{"groupId": groupId, "bundle_infos": bson.M{"$elemMatch": bson.M{"is_forbidden": 0}}}}, {"$unwind": "$bundleInfos"}, {"$group": bson.M{"_id": nil, "total": bson.M{"$sum": 1}}}, } } bundleIdTotal, err := bindingTable.AggregateCount(ctx, pipSelect) if err != nil && !b.NotFound(err) { log.Errorf("updateLicenseValid get bundle id count err:%s", err.Error()) return 0, err } if b.NotFound(err) { bundleIdTotal = 0 return 0, nil } return bundleIdTotal, nil } func (b BindingByMongoRepo) GetBundleByGroupIdAndBundleId(ctx context.Context, groupId string, bundleId string) (*entity.Binding, error) { //bundleInfoMongo := BundleInfoMongo{} //err := bundleInfoTable.GetOne(ctx, bson.M{"group_id": groupId, "bundle_id": bundleId}, &bundleInfoMongo) //if err != nil { // return nil, err //} // //return convertBundleInfoMongoToBundleInfo(bundleInfoMongo), err bindingMongo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"group_id": groupId, "bundle_infos.bundle_id": bson.M{"$in": []string{bundleId}}}, &bindingMongo) if err != nil { return nil, err } result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) GetbundlesByBundleId(ctx context.Context, bundleId string) (*entity.Binding, error) { //bundleInfoMongo := BundleInfoMongo{} //err := bundleInfoTable.GetOne(ctx, bson.M{"bundle_id": bundleId}, &bundleInfoMongo) //if err != nil { // return nil, err //} // //return convertBundleInfoMongoToBundleInfo(bundleInfoMongo), err bindingMongo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"bundle_infos.bundle_id": bson.M{"$in": []string{bundleId}}}, &bindingMongo) if err != nil { return nil, err } result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) GetBindingsBySearch(ctx context.Context, pageSize int, pageNo int, sort string, searchText string, searchFields string, cooperateStatus string, platform int) ([]entity.Binding, int, error) { bindingMongos := make([]BindingMongo, 0) sortColumn := make([]string, 0) switch sort { case "-created": sortColumn = append(sortColumn, "-created_info_at") //按创建时间排序 case "-expire": sortColumn = append(sortColumn, "-expire") //按过期时间倒序排序 case "expire": sortColumn = append(sortColumn, "expire") //按过期时间正序排序 default: sortColumn = append(sortColumn, "-created_info_at") //按创建时间倒序排序 } filter := []bson.M{} if searchText != "" && searchFields != "" { sf := bson.M{} r := bson.RegEx{Pattern: searchText, Options: "i"} searchFilter := make([]bson.M, 0) for _, v := range strings.Split(searchFields, ",") { searchFilter = append(searchFilter, bson.M{v: r}) } sf["$or"] = searchFilter filter = append(filter, sf) } if cooperateStatus != "all" { q := bson.M{"cooperateStatus.value": cooperateStatus} filter = append(filter, q) } switch platform { case entity.BINGING_PLATFORM_OPER: filter = append(filter, bson.M{"platform": entity.BINGING_PLATFORM_OPER, "group_id": ""}) case entity.BINGING_PLATFORM_ORGAN: q := bson.M{} q["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}} filter = append(filter, q) default: q := bson.M{} q["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_OPER, "group_id": ""}, {"$or": []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}}}} filter = append(filter, q) } total, err := bindingTable.GetSome(ctx, bson.M{"$and": filter}, sortColumn, pageSize, pageNo, &bindingMongos) bindings := make([]entity.Binding, 0) for _, bindingMongo := range bindingMongos { bindings = append(bindings, convertBindingMongoToBinding(bindingMongo)) } return bindings, total, err } func (b BindingByMongoRepo) GetBindingsByAppId(ctx context.Context, pageSize int, pageNo int, appId string) ([]entity.Binding, int, error) { bindingMongos := make([]BindingMongo, 0) filter := bson.M{"app_infos.appId": appId} total, err := bindingTable.GetSome(ctx, filter, []string{"-created_info_at"}, pageSize, pageNo, &bindingMongos) bindings := make([]entity.Binding, 0) for _, bindingMongo := range bindingMongos { bindings = append(bindings, convertBindingMongoToBinding(bindingMongo)) } return bindings, total, err } func (b BindingByMongoRepo) GetDevListBinding(ctx context.Context, pageSize int, pageNo int, sort string, searchText string, pullType string, groupId string, bindStatus string, platform int) ([]entity.Binding, int, error) { bindingMongos := make([]BindingMongo, 0) sortColumn := make([]string, 0) switch sort { case "-created": sortColumn = append(sortColumn, "-created_info_at") //按创建时间排序 case "-expire": sortColumn = append(sortColumn, "-expire") //按过期时间倒序排序 case "expire": sortColumn = append(sortColumn, "expire") //按过期时间正序排序 default: sortColumn = append(sortColumn, "-created_info_at") //按创建时间倒序排序 } filter := []bson.M{} filter = append(filter, bson.M{"group_id": groupId}) switch pullType { case "recently-expire": q := bson.M{} beginData := time.Now().UnixNano() / 1e6 endData := time.Now().AddDate(0, 0, 30).UnixNano() / 1e6 q["expire"] = bson.M{"$gte": beginData, "$lte": endData} filter = append(filter, q) } switch bindStatus { case "Valid": filter = append(filter, bson.M{"cooperate_status_value": "Valid"}) case "Invalid": filter = append(filter, bson.M{"cooperate_status_value": "Invalid"}) } if searchText != "" { q := bson.M{} r := bson.RegEx{Pattern: searchText, Options: "i"} q["$or"] = []bson.M{{"name": bson.M{"$regex": r}}} filter = append(filter, q) } switch platform { case entity.BINGING_PLATFORM_OPER: filter = append(filter, bson.M{"platform": entity.BINGING_PLATFORM_OPER}) case entity.BINGING_PLATFORM_ORGAN: q := bson.M{} q["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}} filter = append(filter, q) default: q := bson.M{} q["$or"] = []bson.M{{"platform": entity.BINGING_PLATFORM_OPER}, {"$or": []bson.M{{"platform": entity.BINGING_PLATFORM_ORGAN}, {"platform": bson.M{"$exists": false}}}}} filter = append(filter, q) } total, err := bindingTable.GetSome(ctx, bson.M{"$and": filter}, sortColumn, pageSize, pageNo, &bindingMongos) bindings := make([]entity.Binding, 0) for _, bindingMongo := range bindingMongos { bindings = append(bindings, convertBindingMongoToBinding(bindingMongo)) } return bindings, total, err } func (b BindingByMongoRepo) GetBindingBySdkKey(ctx context.Context, sdkKey string) (*entity.Binding, error) { bindingMongo := BindingMongo{} err := bindingTable.GetOne(ctx, bson.M{"bundle_infos.sdk_key": sdkKey}, &bindingMongo) if err != nil { return nil, err } result := convertBindingMongoToBinding(bindingMongo) return &result, err } func (b BindingByMongoRepo) ListAutoBindAppBinding(ctx context.Context, groupId string) ([]string, error) { bindingMongos := make([]BindingMongo, 0) _, err := bindingTable.GetAll(ctx, bson.M{"auto_bind": 1, "platform": entity.BINGING_PLATFORM_OPER, "group_id": groupId}, []string{}, &bindingMongos) if err != nil { return nil, err } result := []string{} for _, binding := range bindingMongos { result = append(result, binding.BindingID) } return result, nil } func (b BindingByMongoRepo) ListCopyOperBinding(ctx context.Context, bindingId string) ([]string, []entity.Binding, error) { bindingMongos := make([]BindingMongo, 0) _, err := bindingTable.GetAll(ctx, bson.M{"platform": entity.BINGING_PLATFORM_OPER, "from_binding_id": bindingId}, []string{}, &bindingMongos) if err != nil { return nil, nil, err } result := []string{} bindings := make([]entity.Binding, 0) for _, binding := range bindingMongos { result = append(result, binding.BindingID) bindings = append(bindings, convertBindingMongoToBinding(binding)) } return result, bindings, nil } func (b BindingByMongoRepo) ListBindings(ctx context.Context, groupId string, searchText string, pageNo int, pageSize int) ([]entity.Binding, int, error) { bindingMongos := make([]BindingMongo, 0) sortColumn := make([]string, 0) sortColumn = append(sortColumn, "-created_info_at") //按创建时间排序 filter := bson.M{} if groupId != "" { filter["group_id"] = groupId } if searchText != "" { r := bson.RegEx{Pattern: searchText, Options: "i"} filter["$or"] = []bson.M{{"name": r}, {"group_name": r}, {"bundle_infos.bundle_id": r}} } total, err := bindingTable.GetSome(ctx, filter, sortColumn, pageSize, pageNo, &bindingMongos) bindings := make([]entity.Binding, 0) for _, bindingMongo := range bindingMongos { bindings = append(bindings, convertBindingMongoToBinding(bindingMongo)) } return bindings, total, err } func (b BindingByMongoRepo) GetAllAssBinds(ctx context.Context, appId string) ([]entity.Binding, error) { bindings := make([]BindingMongo, 0) err := bindingTable.OnlyGetAll(ctx, bson.M{"app_infos.appId": appId}, []string{}, &bindings) if err != nil { return nil, err } result := make([]entity.Binding, 0) for _, bindingMongo := range bindings { result = append(result, convertBindingMongoToBinding(bindingMongo)) } return result, nil } func (b BindingByMongoRepo) NotFound(err error) bool { return err == mgo.ErrNotFound } func (b BindingByMongoRepo) UpdateBundleIdIsForbidden(ctx context.Context, bundleId string) error { return bindingTable.UpdateAll(ctx, bson.M{"bundle_infos": bson.M{"$elemMatch": bson.M{"bundle_id": bundleId}}}, bson.M{"$set": bson.M{"is_forbidden": 1}}) } func (b BindingByMongoRepo) UpdateBundleIdPlatform(ctx context.Context, bundleId, platform string) error { return bindingTable.UpdateAll(ctx, bson.M{"bundle_infos": bson.M{"$elemMatch": bson.M{"bundle_id": bundleId}}}, bson.M{"$set": bson.M{"remark": platform}}) } func (b BindingByMongoRepo) UpdateBundleBindingId(ctx context.Context, bundleId, bindingId, toBindingId string) error { return nil } func convertBindingMongoToBinding(bindingMongo BindingMongo) entity.Binding { result := entity.Binding{} bundleInfos := make([]entity.BundleInfo, 0) for _, v := range bindingMongo.BundleInfos { bundleInfo := entity.BundleInfo{ BundleID: v.BundleID, Remark: v.Remark, SDKKey: v.SDKKey, SDKID: v.SDKID, IsFirstCreate: v.IsFirstCreate, CreatedAt: v.CreatedAt, CreatedAccount: v.CreatedAccount, CreatedBy: v.CreatedBy, IsForbidden: v.IsForbidden, IsReview: v.IsReview, } bundleInfos = append(bundleInfos, bundleInfo) } appInfos := make([]entity.AppInfo, 0) for _, v := range bindingMongo.AppInfos { item := entity.AppInfo{ AppID: v.AppID, AssociatedAt: v.AssociatedAt, AssociatedBy: v.AssociatedBy, } appInfos = append(appInfos, item) } createInfo := entity.CreatedInfo{ CreatedBy: bindingMongo.CreatedInfoBy, CreatedAt: bindingMongo.CreatedInfoAt, } cooperateStatus := entity.Status{ Value: bindingMongo.CooperateStatusValue, Reason: bindingMongo.CooperateStatusReason, LastUpdated: bindingMongo.CooperateStatusLastUpdated, ModifiedBy: bindingMongo.CooperateStatusModifiedBy, } cooperateValidStatus := entity.SpecificStatus{ Reason: bindingMongo.CooperateValidStatusReason, LastUpdated: bindingMongo.CooperateValidStatusLastUpdated, ModifiedBy: bindingMongo.CooperateValidStatusModifiedBy, } cooperateInvalidStatus := entity.SpecificStatus{ Reason: bindingMongo.CooperateInvalidStatusReason, LastUpdated: bindingMongo.CooperateInvalidStatusLastUpdated, ModifiedBy: bindingMongo.CooperateInvalidStatusModifiedBy, } //var appInfos []entity.AppInfo //json.Unmarshal([]byte(bindingMongo.AppInfos), &appInfos) result.BindingID = bindingMongo.BindingID result.Name = bindingMongo.Name result.BundleInfos = bundleInfos result.CreatedInfo = createInfo result.GroupID = bindingMongo.GroupID result.GroupName = bindingMongo.GroupName result.CooperateStatus = cooperateStatus result.CooperateValidStatus = cooperateValidStatus result.CooperateInvalidStatus = cooperateInvalidStatus result.AppInfos = appInfos result.Owner = bindingMongo.Owner result.Expire = bindingMongo.Expire result.ApiServer = bindingMongo.ApiServer result.PlatForm = bindingMongo.PlatForm result.AutoBind = bindingMongo.AutoBind result.HiddenBundle = bindingMongo.HiddenBundle result.FromBindingID = bindingMongo.FromBindingID return result } func convertBindingToBindingMongo(binding *entity.Binding) BindingMongo { result := BindingMongo{} bundleInfos := make([]BundleInfoData, 0) for _, v := range binding.BundleInfos { bundleInfo := BundleInfoData{ BundleID: v.BundleID, Remark: v.Remark, SDKKey: v.SDKKey, SDKID: v.SDKID, IsFirstCreate: v.IsFirstCreate, CreatedAt: v.CreatedAt, CreatedAccount: v.CreatedAccount, CreatedBy: v.CreatedBy, IsForbidden: v.IsForbidden, IsReview: v.IsReview, } bundleInfos = append(bundleInfos, bundleInfo) } result.BindingID = binding.BindingID result.Name = binding.Name result.BundleInfos = bundleInfos result.CreatedInfoBy = binding.CreatedInfo.CreatedBy result.CreatedInfoAt = binding.CreatedInfo.CreatedAt result.CreatedInfoAccount = binding.CreatedInfo.CreatedAccount result.GroupID = binding.GroupID result.GroupName = binding.GroupName result.CooperateStatusValue = binding.CooperateStatus.Value result.CooperateStatusReason = binding.CooperateStatus.Reason result.CooperateStatusLastUpdated = binding.CooperateStatus.LastUpdated result.CooperateStatusModifiedBy = binding.CooperateStatus.ModifiedBy result.CooperateValidStatusReason = binding.CooperateValidStatus.Reason result.CooperateValidStatusLastUpdated = binding.CooperateValidStatus.LastUpdated result.CooperateValidStatusModifiedBy = binding.CooperateValidStatus.ModifiedBy result.CooperateInvalidStatusReason = binding.CooperateInvalidStatus.Reason result.CooperateInvalidStatusLastUpdated = binding.CooperateInvalidStatus.LastUpdated result.CooperateInvalidStatusModifiedBy = binding.CooperateInvalidStatus.ModifiedBy appInfos := make([]AppInfo, 0) for _, v := range binding.AppInfos { item := AppInfo{ AppID: v.AppID, AssociatedAt: v.AssociatedAt, AssociatedBy: v.AssociatedBy, } appInfos = append(appInfos, item) } //result.AppInfos = utility.InterfaceToJsonString(binding.AppInfos) result.AppInfos = appInfos result.Owner = binding.Owner result.Expire = binding.Expire result.ApiServer = binding.ApiServer result.PlatForm = binding.PlatForm result.AutoBind = binding.AutoBind result.HiddenBundle = binding.HiddenBundle result.FromBindingID = binding.FromBindingID return result }