package mysql import ( "context" "errors" "finclip-app-manager/domain/entity" "finclip-app-manager/domain/entity/proto/apiproto" "finclip-app-manager/domain/repository" "finclip-app-manager/infrastructure/config" "finclip-app-manager/infrastructure/db/entity/sql" "finclip-app-manager/infrastructure/utility" "fmt" "time" "gorm.io/gorm" ) var _ repository.IBindingRepo = new(BindingByMysqlRepo) type BindingByMysqlRepo struct { } func NewBindingByMysqlRepo() *BindingByMysqlRepo { return &BindingByMysqlRepo{} } type Bundle struct { Id uint64 `json:"id" gorm:"primary_key;column:id;type:BIGINT(16) AUTO_INCREMENT;comment:'自增id'" sql:"auto_increment;primary_key"` BundleID string `json:"bundleId" gorm:"column:bundle_id;type:varchar(512);default:'';comment:bundleId"` Remark string `json:"remark" gorm:"column:remark;type:varchar(512);default:'';comment:类型"` SDKKey string `json:"SDKKey" gorm:"column:sdk_key;type:varchar(512);default:'';comment:sdkKey"` SDKID string `json:"SDKID" gorm:"column:sdk_id;type:varchar(64);default:'';comment:sdkid"` IsFirstCreate bool `json:"isFirstCreate" gorm:"column:is_first_create;type:bool;default:false;comment:是否第一次创建"` //是否第一次创建 CreatedAt int64 `json:"createdAt" gorm:"column:created_at;type:BIGINT(16);default:0;comment:创建时间"` CreatedAccount string `json:"createdAccount" bson:"created_account" gorm:"column:created_account;type:varchar(64);default:'';comment:创建账号"` CreatedBy string `json:"createdBy" bson:"created_by" gorm:"column:created_by;type:varchar(64);default:'';comment:创建人"` IsForbidden int `json:"isForbidden" bson:"is_forbidden" gorm:"column:is_forbidden;type:BIGINT(16);default:0;comment:是否禁用"` //是否禁用 0:可用 1:禁用 } func (Bundle) TableName() string { return "bundle" } type BundleInfo struct { Id uint64 `json:"id" gorm:"primary_key;column:id;type:BIGINT(16) AUTO_INCREMENT;comment:'自增id'" sql:"auto_increment;primary_key"` BindingId string `json:"bindingId" gorm:"column:binding_id;key;type:varchar(64);default:'';comment:应用Id"` GroupID string `json:"groupId" gorm:"column:group_id;key;type:varchar(64);default:'';comment:企业ID"` BundleID string `json:"bundleId" gorm:"column:bundle_id;type:varchar(512);default:'';comment:bundleId"` Remark string `json:"remark" gorm:"column:remark;type:varchar(512);default:'';comment:类型"` SDKKey string `json:"SDKKey" gorm:"column:sdk_key;type:varchar(512);default:'';comment:sdkKey"` SDKID string `json:"SDKID" gorm:"column:sdk_id;type:varchar(64);default:'';comment:sdkid"` IsFirstCreate bool `json:"isFirstCreate" gorm:"column:is_first_create;type:bool;default:false;comment:是否第一次创建"` //是否第一次创建 CreatedAt int64 `json:"createdAt" gorm:"column:created_at;type:BIGINT(16);default:0;comment:创建时间"` CreatedAccount string `json:"createdAccount" gorm:"column:created_account;type:varchar(64);default:'';comment:创建账号"` CreatedBy string `json:"createdBy" gorm:"column:created_by;type:varchar(64);default:'';comment:创建人"` IsForbidden int `json:"isForbidden" gorm:"column:is_forbidden;type:BIGINT(16);default:0;comment:是否禁用"` //是否禁用 0:未禁用 1:禁用 IsReview int `json:"isReview" gorm:"column:is_review;type:tinyint;default:0;comment:是否审核应用"` //是否禁用 0:未禁用 1:禁用 } func (BundleInfo) TableName() string { return "bundle_info" } type BindingMysql struct { Id uint64 `json:"id" gorm:"primary_key;column:id;type:BIGINT(16) AUTO_INCREMENT;comment:'自增id'" sql:"auto_increment;primary_key"` BindingID string `json:"bindingID" gorm:"column:binding_id;unique;type:varchar(64);comment:'应用的id'"` Name string `json:"name" gorm:"column:name;type:varchar(64);default:'';comment:'应用名称'"` //BundleInfos string `json:"bundleInfos" gorm:"column:bundle_infos;type:text;comment:'bundle ids'"` CreatedInfoBy string `json:"createdInfoBy" gorm:"column:created_info_by;type:varchar(64);default:'';comment:''"` CreatedInfoAt int64 `json:"createdInfoAt" gorm:"column:created_info_at;type:BIGINT(16);default:0;comment:''"` CreatedInfoAccount string `json:"createdInfoAccount" gorm:"column:created_info_account;type:varchar(64);default:'';comment:''"` GroupID string `json:"groupId" gorm:"column:group_id;type:varchar(64);default:'';comment:'企业ID'"` GroupName string `json:"groupName" gorm:"column:group_name;type:varchar(64);default:'';comment:'企业名称(为了查询)'"` CooperateStatusValue string `json:"cooperateStatusValue" gorm:"column:cooperate_status_value;type:varchar(256);default:'';comment:''"` CooperateStatusReason string `json:"cooperateStatusReason" gorm:"column:cooperate_status_reason;type:varchar(256);default:'';comment:''"` CooperateStatusLastUpdated int64 `json:"cooperateStatusLastUpdated" gorm:"column:cooperate_status_last_updated;type:BIGINT(16);default:0;comment:''"` CooperateStatusModifiedBy string `json:"cooperateStatusModifiedBy" gorm:"column:cooperate_status_modified_by;type:varchar(256);default:0;comment:''"` CooperateValidStatusReason string `json:"cooperateValidStatusReason" gorm:"column:cooperate_valid_status_reson;type:varchar(256);default:'';comment:''"` CooperateValidStatusLastUpdated int64 `json:"cooperateValidStatusLastUpdated" gorm:"column:cooperate_valid_status_last_updated;type:BIGINT(16);default:0;comment:''"` CooperateValidStatusModifiedBy string `json:"cooperateValidStatusModifiedBy" gorm:"column:cooperate_valid_status_modified_by;type:varchar(256);default:0;comment:''"` CooperateInvalidStatusReason string `json:"cooperateInvalidStatusReason" gorm:"column:cooperate_invalid_status_reson;type:varchar(256);default:'';comment:''"` CooperateInvalidStatusLastUpdated int64 `json:"cooperateInvalidStatusLastUpdated" gorm:"column:cooperate_invalid_status_last_updated;type:BIGINT(16);default:0;comment:''"` CooperateInvalidStatusModifiedBy string `json:"cooperateInvalidStatusModifiedBy" gorm:"column:cooperate_invalid_status_modified_by;type:varchar(256);default:0;comment:''"` BundleInfos []BundleInfo `json:"bundleInfos" gorm:"ForeignKey:binding_id;AssociationForeignKey:binding_id"` AppInfos []LinkAppInfo `json:"appInfos" gorm:"ForeignKey:binding_id;AssociationForeignKey:binding_id"` //sAppInfos string `json:"appInfos" gorm:"column:app_infos;type:text;comment:'appid 的信息'"` Owner string `json:"owner" gorm:"column:owner;type:varchar(64);default:'';comment:'所属企业'"` Expire int64 `json:"expire" gorm:"column:expire;type:BIGINT(16);default:0;comment:''"` ApiServer string `json:"apiServer" gorm:"column:api_server;type:varchar(256);default:'';comment:'子域名'"` PlatForm int `json:"platform" gorm:"column:platform;type:tinyint;comment:'来源平台'"` AutoBind int `json:"autoBind" gorm:"column:auto_bind;type:tinyint;comment:'自动绑定'"` HiddenBundle int `json:"hiddenBundle" gorm:"column:hidden_bundle;type:tinyint;comment:'隐藏bundle信息'"` FromBindingID string `json:"fromBindingId" gorm:"column:from_binding_id;type:varchar(64);default:'';comment:'来源bindingid'"` } type BindingMysqlV2 struct { Id uint64 `json:"id" gorm:"primary_key;column:id;type:BIGINT(16) AUTO_INCREMENT;comment:'自增id'" sql:"auto_increment;primary_key"` BindingID string `json:"bindingID" gorm:"column:binding_id;unique;type:varchar(64);comment:'应用的id'"` Name string `json:"name" gorm:"column:name;type:varchar(64);default:'';comment:'应用名称'"` CreatedInfoBy string `json:"createdInfoBy" gorm:"column:created_info_by;type:varchar(64);default:'';comment:''"` CreatedInfoAt int64 `json:"createdInfoAt" gorm:"column:created_info_at;type:BIGINT(16);default:0;comment:''"` CreatedInfoAccount string `json:"createdInfoAccount" gorm:"column:created_info_account;type:varchar(64);default:'';comment:''"` GroupID string `json:"groupId" gorm:"column:group_id;type:varchar(64);default:'';comment:'企业ID'"` GroupName string `json:"groupName" gorm:"column:group_name;type:varchar(64);default:'';comment:'企业名称(为了查询)'"` CooperateStatusValue string `json:"cooperateStatusValue" gorm:"column:cooperate_status_value;type:varchar(256);default:'';comment:''"` CooperateStatusReason string `json:"cooperateStatusReason" gorm:"column:cooperate_status_reason;type:varchar(256);default:'';comment:''"` CooperateStatusLastUpdated int64 `json:"cooperateStatusLastUpdated" gorm:"column:cooperate_status_last_updated;type:BIGINT(16);default:0;comment:''"` CooperateStatusModifiedBy string `json:"cooperateStatusModifiedBy" gorm:"column:cooperate_status_modified_by;type:varchar(256);default:0;comment:''"` CooperateValidStatusReason string `json:"cooperateValidStatusReason" gorm:"column:cooperate_valid_status_reson;type:varchar(256);default:'';comment:''"` CooperateValidStatusLastUpdated int64 `json:"cooperateValidStatusLastUpdated" gorm:"column:cooperate_valid_status_last_updated;type:BIGINT(16);default:0;comment:''"` CooperateValidStatusModifiedBy string `json:"cooperateValidStatusModifiedBy" gorm:"column:cooperate_valid_status_modified_by;type:varchar(256);default:0;comment:''"` CooperateInvalidStatusReason string `json:"cooperateInvalidStatusReason" gorm:"column:cooperate_invalid_status_reson;type:varchar(256);default:'';comment:''"` CooperateInvalidStatusLastUpdated int64 `json:"cooperateInvalidStatusLastUpdated" gorm:"column:cooperate_invalid_status_last_updated;type:BIGINT(16);default:0;comment:''"` CooperateInvalidStatusModifiedBy string `json:"cooperateInvalidStatusModifiedBy" gorm:"column:cooperate_invalid_status_modified_by;type:varchar(256);default:0;comment:''"` Owner string `json:"owner" gorm:"column:owner;type:varchar(64);default:'';comment:'所属企业'"` Expire int64 `json:"expire" gorm:"column:expire;type:BIGINT(16);default:0;comment:''"` ApiServer string `json:"apiServer" gorm:"column:api_server;type:varchar(256);default:'';comment:'子域名'"` PlatForm int `json:"platform" gorm:"column:platform;type:tinyint;comment:'来源平台'"` AutoBind int `json:"autoBind" gorm:"column:auto_bind;type:tinyint;comment:'自动绑定'"` HiddenBundle int `json:"hiddenBundle" gorm:"column:hidden_bundle;type:tinyint;comment:'隐藏bundle信息'"` FromBindingID string `json:"fromBindingId" gorm:"column:from_binding_id;type:varchar(64);default:'';comment:'来源bindingid'"` } type LinkAppInfo struct { Id uint64 `gorm:"primary_key;column:id;type:BIGINT(16) AUTO_INCREMENT;comment:'自增id'" sql:"auto_increment;primary_key"` BindingId string `gorm:"column:binding_id;key;type:varchar(64);comment:'关联应用的id'"` AppId string `gorm:"column:app_id;key;type:varchar(64);comment:'小程序id'"` AssociatedAt int64 `gorm:"column:associated_at;type:BIGINT(16);default:0;comment:'关联时间'"` AssociatedBy string `gorm:"column:associated_by;type:varchar(64);default:'';comment:'关联人'"` } func (LinkAppInfo) TableName() string { return "link_app_infos" } func (BindingMysql) TableName() string { return "binding" } func (BindingMysqlV2) TableName() string { return "binding" } func (b BindingByMysqlRepo) GetInfo(ctx context.Context, bindingId string) (*entity.Binding, error) { info := BindingMysql{} err := DB.Model(&BindingMysql{}).WithContext(ctx). Where("binding_id=?", bindingId). //Preload("BundleInfos"). //Preload("AppInfos"). First(&info).Error bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, info.BindingID) if len(linkAppInfos) > 0 { info.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { info.BundleInfos = bundleInfos } result := convertBindingMysqlToBinding(info) return &result, err } func (b BindingByMysqlRepo) GetByGroupIdAndName(ctx context.Context, groupId string, name string, isAdmin bool) (*entity.Binding, error) { query := "group_id = ? and name = ? " args := []interface{}{groupId, name} if isAdmin { query += "and platform = ? " args = append(args, entity.BINGING_PLATFORM_OPER) } else { query += "and platform = ? " args = append(args, entity.BINGING_PLATFORM_ORGAN) } bindingMysql := BindingMysql{} err := DB.Model(&BindingMysql{}).Where(query, args...). //Preload("BundleInfos").Preload("AppInfos"). First(&bindingMysql).Error if err != nil { return nil, err } bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, bindingMysql.BindingID) if len(linkAppInfos) > 0 { bindingMysql.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { bindingMysql.BundleInfos = bundleInfos } result := convertBindingMysqlToBinding(bindingMysql) return &result, err } func (b BindingByMysqlRepo) GetByApiServer(ctx context.Context, apiServer string) (entity.Binding, error) { query := "api_server = ?" args := []interface{}{apiServer} res := entity.Binding{} bindingMysql := BindingMysql{} err := DB.Model(&BindingMysql{}).Where(query, args...).First(&bindingMysql).Error if err != nil { return res, err } query = "binding_id = ?" args = []interface{}{bindingMysql.BindingID} bundleInfoMysqls := make([]BundleInfo, 0) err = DB.Model(&BindingMysql{}).Where(query, args...).Find(&bundleInfoMysqls).Error if err != nil { return res, err } bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, bindingMysql.BindingID) if len(linkAppInfos) > 0 { bindingMysql.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { bindingMysql.BundleInfos = bundleInfos } result := convertBindingMysqlToBinding(bindingMysql) return result, err } func (b BindingByMysqlRepo) GetInfoByParams(ctx context.Context, sdkKey, organId, appId string) (*entity.Binding, error) { db := DB.Model(&BindingMysql{}) //db = db.Preload("BundleInfos").Preload("AppInfos") db.Where("bundle_info.sdk_key like ?", sdkKey) if appId != "" { db.Where("link_app_infos.app_id like ?", appId) } if organId != "" { db.Where("binding.group_id = ?", organId) } bindingMysql := BindingMysql{} err := db. Select("DISTINCT(binding.id), binding.*"). Joins("left join bundle_info on binding.binding_id = bundle_info.binding_id"). Joins("left join link_app_infos on binding.binding_id = link_app_infos.binding_id"). First(&bindingMysql).Error bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, bindingMysql.BindingID) if len(linkAppInfos) > 0 { bindingMysql.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { bindingMysql.BundleInfos = bundleInfos } binding := convertBindingMysqlToBinding(bindingMysql) return &binding, err } func (b BindingByMysqlRepo) GetInfoBySdkKeyOrganId(ctx context.Context, organId, sdkKey string) (*entity.Binding, error) { query := "group_id = ? and sdk_key = ?" args := []interface{}{organId, sdkKey} bundleInfoMysql := BundleInfo{} err := DB.Model(&BundleInfo{}).Where(query, args...).First(&bundleInfoMysql).Error if err != nil { return nil, err } return b.GetInfo(ctx, bundleInfoMysql.BindingId) } func (b BindingByMysqlRepo) GetAllSdkKey(ctx context.Context, organId string) ([]string, error) { query := "group_id = ?" args := []interface{}{organId} bundleInfoMysqls := make([]BundleInfo, 0) err := DB.Model(&BundleInfo{}).Where(query, args...).Find(&bundleInfoMysqls).Error if err != nil { return nil, err } result := make([]string, 0) for _, v := range bundleInfoMysqls { result = append(result, v.SDKKey) } return result, err } func (b BindingByMysqlRepo) GetBindListBySdkKey(ctx context.Context, sdkKey string) ([]entity.Binding, error) { query := "sdk_key = ?" args := []interface{}{sdkKey} bundleInfoMysqls := make([]BundleInfo, 0) err := DB.Model(&BundleInfo{}).Where(query, args...).Order("created_at").Find(&bundleInfoMysqls).Error if err != nil { return nil, err } bindings := make([]entity.Binding, 0) for _, bundleInfoMysql := range bundleInfoMysqls { binding, _ := b.GetInfo(ctx, bundleInfoMysql.BindingId) bindings = append(bindings, *binding) } return bindings, err } func (b BindingByMysqlRepo) SdkKeyExi(ctx context.Context, sdkKey string) (bool, error) { if _, ok := entity.SdkExiCache.Get(sdkKey); ok { return true, nil } var count int64 err := DB.Model(&BundleInfo{}). Where("sdk_key=?", sdkKey). Count(&count).Error if err != nil { return false, err } if count > 0 { entity.SdkExiCache.Set(sdkKey, true, -1) return true, err } return false, err } func (b BindingByMysqlRepo) Insert(ctx context.Context, bind *entity.Binding) error { info := convertBindingToBindingMysql(bind) infoV2 := convertBindingMysqlToBindingMysqlV2(&info) err := DB.WithContext(ctx).Model(&BindingMysqlV2{}).Create(&infoV2).Error if err != nil { return err } if len(info.BundleInfos) > 0 { for _, v := range info.BundleInfos { DB.Model(&BundleInfo{}).Create(&v) } } if len(info.AppInfos) > 0 { for _, v := range info.AppInfos { DB.Model(&LinkAppInfo{}).Create(&v) } } return nil } func (b BindingByMysqlRepo) Count(ctx context.Context) (int, error) { query := "" args := []interface{}{} var count int64 err := DB.Model(&BindingMysql{}).Where(query, args...).Count(&count).Error return int(count), err } func (b BindingByMysqlRepo) GetCountByStatus(ctx context.Context, status string, platform int) (int, error) { query := "cooperate_status_value = ?" args := []interface{}{"Valid"} /*switch platform { case entity.BINGING_PLATFORM_OPER: query += " and platform = ? and from_binding_id = ?" args = append(args, platform) args = append(args, "") case entity.BINGING_PLATFORM_ORGAN: query += " and platform = ?" args = append(args, platform) default: query += " and ( ( platform = ? and from_binding_id = ? ) or ( platform = ? ) )" args = append(args, entity.BINGING_PLATFORM_OPER) args = append(args, "") args = append(args, entity.BINGING_PLATFORM_ORGAN) }*/ query += " and ( ( platform = ? and group_id = ? ) or ( platform = ? ) )" args = append(args, entity.BINGING_PLATFORM_OPER) args = append(args, "") args = append(args, entity.BINGING_PLATFORM_ORGAN) var count int64 err := DB.Model(&BindingMysql{}).Where(query, args...).Count(&count).Error return int(count), err } func (b BindingByMysqlRepo) GetBundleIdNum(ctx context.Context) (int, error) { query := "is_forbidden = ?" args := []interface{}{0} var count int64 err := DB.Model(&BundleInfo{}).Where(query, args...).Count(&count).Error return int(count), err } func (b BindingByMysqlRepo) GetBundleIdLimitHand(ctx context.Context, groupId string) (int, error) { var total int64 err := DB.Model(&BundleInfo{}). Select("select * from bundle_info").Joins("left join binding on binding.binding_id = bundle_info.binding_id"). Where("binding.group_id = ? and bundle_info.is_forbidden = ?", groupId, 0). Count(&total).Error return int(total), err } func (b BindingByMysqlRepo) GetBundleLimit(ctx context.Context) (int, error) { /*query := "" args := []interface{}{}*/ query := "is_forbidden = ?" args := []interface{}{0} var count int64 err := DB.Model(&Bundle{}).Where(query, args...).Count(&count).Error return int(count), err } func (b BindingByMysqlRepo) GetBindingByBindingId(ctx context.Context, bindingId string) (*entity.Binding, error) { bindingMysql := BindingMysql{} err := DB.Model(&BindingMysql{}). Where("binding_id = ?", bindingId). //Preload("BundleInfos").Preload("AppInfos"). First(&bindingMysql).Error if err != nil { return nil, err } bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, bindingMysql.BindingID) if len(linkAppInfos) > 0 { bindingMysql.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { bindingMysql.BundleInfos = bundleInfos } result := convertBindingMysqlToBinding(bindingMysql) return &result, err } func (b BindingByMysqlRepo) GetBindingByGroupIdAndBindingId(ctx context.Context, groupId string, bindingId string) (*entity.Binding, error) { info := BindingMysql{} err := DB.Model(&BindingMysql{}).WithContext(ctx). Where("group_id = ? and binding_id = ?", []interface{}{groupId}, []interface{}{bindingId}). //Preload("BundleInfos"). //Preload("AppInfos"). First(&info).Error bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, info.BindingID) if len(linkAppInfos) > 0 { info.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { info.BundleInfos = bundleInfos } result := convertBindingMysqlToBinding(info) return &result, err } func (b BindingByMysqlRepo) GetBindingByGroupIdAndSdkKey(ctx context.Context, groupId string, sdkKey string) (*entity.Binding, error) { query := "group_id = ? and sdk_key = ?" args := []interface{}{groupId, sdkKey} bundleInfoMysql := BundleInfo{} err := DB.Model(&BundleInfo{}).Where(query, args...).First(&bundleInfoMysql).Error if err != nil { return nil, err } return b.GetInfo(ctx, bundleInfoMysql.BindingId) } func (b BindingByMysqlRepo) UpdateBundleInfosByGroupIdAndBindId(ctx context.Context, groupId string, bindingId string, infos []entity.BundleInfo) error { return DB.Transaction(func(tx *gorm.DB) error { var err error for _, v := range infos { query := "group_id = ? and binding_id = ?" args := []interface{}{groupId, bindingId} err = tx.Model(&BundleInfo{}). Where(query, args...). Updates(convertBundleInfoToBundleInfoMysql(bindingId, groupId, v)).Error } return err }) } func (b BindingByMysqlRepo) AppendBundles(ctx context.Context, bindingId, groupId string, bundles []entity.BundleInfo) error { return DB.Transaction(func(tx *gorm.DB) error { var err error for _, v := range bundles { item := convertBundleInfoToBundleInfoMysql(bindingId, groupId, v) if config.Cfg.PublishEnv == entity.ENV_PRIVATE { //私有化环境中,如果要变为启用状态,要先判断该bundleId运营端是否已启用 if v.IsForbidden == 0 { info := BundleMysql{} err := DB.Debug().Model(&BundleMysql{}).Where("binary bundle_id=?", v.BundleID).First(&info).Error if err != nil { return err } if info.IsForbidden == 1 { return errors.New(utility.FS_BIND_IS_FORBIDDEN) } } } if err = tx.Model(&BundleInfo{}).Create(&item).Error; err != nil { return err } } return nil }) } func (b BindingByMysqlRepo) UpdateBundleIsView(ctx context.Context, reviews []apiproto.BundleReviewItem, isReview int) error { return DB.Transaction(func(tx *gorm.DB) error { var err error for _, review := range reviews { query := "binding_id = ? and binary bundle_id= ?" args := []interface{}{review.BindingId, review.BundleId} params := map[string]interface{}{ "is_review": isReview, } err = tx.Model(&BundleInfo{}).Debug(). Where(query, args...). Updates(params).Error } return err }) } func (b BindingByMysqlRepo) ListReviewBundle(ctx context.Context, pageSize int, pageNo int, searchText string, isReview int) (int64, []entity.ReviewBundleInfo, error) { query := "binding.platform = ? AND binding.from_binding_id = ? AND bundle_info.is_review = ?" args := []interface{}{entity.BINGING_PLATFORM_OPER, "", isReview} if searchText != "" { query += " AND (binding.name LIKE ? OR bundle_info.bundle_id LIKE ?) " args = append(args, genLike(searchText)) args = append(args, genLike(searchText)) } list := []entity.ReviewBundleInfo{} var total int64 var err error DB.Debug().Model(&BindingMysql{}). Joins("LEFT JOIN bundle_info ON binding.binding_id = bundle_info.binding_id"). Where(query, args...). Count(&total) if pageSize == 0 && pageNo == 0 { err = DB.Debug().Model(&BindingMysql{}). Select("binding.binding_id as binding_id, binding.created_info_at as created_info_at, binding.name as name, binding.cooperate_status_value as status, bundle_info.bundle_id as bundle_id, bundle_info.remark as remark, bundle_info.sdk_key as sdk_key, bundle_info.sdk_id as sdk_id, bundle_info.is_forbidden as is_forbidden, bundle_info.is_review as is_review"). Joins("LEFT JOIN bundle_info ON binding.binding_id = bundle_info.binding_id"). Order("binding.created_info_at desc"). Where(query, args...). Scan(&list).Error } else { err = DB.Debug().Model(&BindingMysql{}). Select("binding.binding_id as binding_id, binding.created_info_at as created_info_at, binding.name as name, binding.cooperate_status_value as status, bundle_info.bundle_id as bundle_id, bundle_info.remark as remark, bundle_info.sdk_key as sdk_key, bundle_info.sdk_id as sdk_id, bundle_info.is_forbidden as is_forbidden, bundle_info.is_review as is_review"). Joins("LEFT JOIN bundle_info ON binding.binding_id = bundle_info.binding_id"). Order("binding.created_info_at desc"). Where(query, args...). Offset((pageNo - 1) * pageSize). Limit(pageSize). Scan(&list).Error } return total, list, err } func (b BindingByMysqlRepo) CheckReviewBySdkKey(ctx context.Context, sdkKey string) bool { query := "binding.platform = ? AND binding.from_binding_id = ? AND binding.cooperate_status_value = ? AND bundle_info.is_review = ? and bundle_info.sdk_key = ? AND bundle_info.is_forbidden = ?" args := []interface{}{entity.BINGING_PLATFORM_OPER, "", entity.StBindValid, 1, sdkKey, 0} var total int64 DB.Debug().Model(&BindingMysql{}). Joins("LEFT JOIN bundle_info ON binding.binding_id = bundle_info.binding_id"). Where(query, args...). Count(&total) return total > 0 } func (b BindingByMysqlRepo) GetReviewBindBySdkKey(ctx context.Context, sdkKey string) (*entity.ReviewBundleInfo, error) { query := "binding.platform = ? AND binding.from_binding_id = ? AND bundle_info.sdk_key = ?" args := []interface{}{entity.BINGING_PLATFORM_OPER, "", sdkKey} list := []entity.ReviewBundleInfo{} err := DB.Debug().Model(&BindingMysql{}). Select("binding.binding_id as binding_id, binding.created_info_at as created_info_at, binding.name as name, binding.cooperate_status_value as status, bundle_info.bundle_id as bundle_id, bundle_info.remark as remark, bundle_info.sdk_key as sdk_key, bundle_info.sdk_id as sdk_id, bundle_info.is_forbidden as is_forbidden, bundle_info.is_review as is_review"). Joins("LEFT JOIN bundle_info ON binding.binding_id = bundle_info.binding_id"). Order("binding.created_info_at desc"). Where(query, args...). Scan(&list).Error if err != nil { return nil, err } if len(list) > 0 { return &list[0], nil } else { return nil, nil } } func (b BindingByMysqlRepo) UpdateBundles(ctx context.Context, bindingId, groupId string, bundles []entity.BundleInfo) error { return DB.Transaction(func(tx *gorm.DB) error { var err error for _, v := range bundles { if config.Cfg.PublishEnv == entity.ENV_PRIVATE { //私有化环境中,如果要变为启用状态,要先判断该bundleId运营端是否已启用 if v.IsForbidden == 0 { info := BundleMysql{} err := DB.Debug().Model(&BundleMysql{}).Where("binary bundle_id=?", v.BundleID).First(&info).Error if err != nil { return err } if info.IsForbidden == 1 { return errors.New(utility.FS_BIND_IS_FORBIDDEN) } } } query := "binding_id = ? and binary bundle_id= ?" args := []interface{}{bindingId, v.BundleID} params := map[string]interface{}{ "is_forbidden": v.IsForbidden, "remark": v.Remark, } err = tx.Model(&BundleInfo{}).Debug(). Where(query, args...). Updates(params).Error } return err }) } func (b BindingByMysqlRepo) GetByBindIdList(ctx context.Context, ids []string) ([]entity.Binding, error) { query := "binding_id in ?" args := []interface{}{ids} bindingMysqls := make([]BindingMysql, 0) err := DB.Model(&BindingMysql{}).Where(query, args...).Find(&bindingMysqls).Error if err != nil { return nil, err } bindings := make([]entity.Binding, 0) for _, bindingMysql := range bindingMysqls { query = "binding_id = ?" args = []interface{}{bindingMysql.BindingID} bundleInfoMysqls := make([]BundleInfo, 0) err = DB.Model(&BundleInfo{}).Where(query, args...).Find(&bundleInfoMysqls).Error if err != nil { return nil, err } bindingMysql.BundleInfos = bundleInfoMysqls bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, bindingMysql.BindingID) if len(linkAppInfos) > 0 { bindingMysql.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { bindingMysql.BundleInfos = bundleInfos } bindings = append(bindings, convertBindingMysqlToBinding(bindingMysql)) } return bindings, err } func (b BindingByMysqlRepo) GetBindListByGroupId(ctx context.Context, groupId string, pageSize int, pageNo int) ([]entity.Binding, int, error) { bindingMysqls := make([]BindingMysql, 0) var total int64 err := DB.Model(&BindingMysql{}).WithContext(ctx). Where("group_id = ? and platform = 0", groupId). //Preload("BundleInfos"). //Preload("AppInfos"). Order("created_info_at desc"). Offset((pageNo - 1) * pageSize). Limit(pageSize). Find(&bindingMysqls).Error DB.Model(&BindingMysql{}).WithContext(ctx). Where("group_id = ? and platform = 0", groupId).Count(&total) bindings := make([]entity.Binding, 0) for _, bindingMysql := range bindingMysqls { bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, bindingMysql.BindingID) if len(linkAppInfos) > 0 { bindingMysql.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { bindingMysql.BundleInfos = bundleInfos } bindings = append(bindings, convertBindingMysqlToBinding(bindingMysql)) } return bindings, int(total), err } func (b BindingByMysqlRepo) AppendApps(ctx context.Context, bindingId string, apps []entity.AppInfo) error { for _, app := range apps { linkApp := LinkAppInfo{ BindingId: bindingId, AppId: app.AppID, AssociatedAt: app.AssociatedAt, AssociatedBy: app.AssociatedBy, } DB.Model(&LinkAppInfo{}).Create(&linkApp) } return nil } func (b BindingByMysqlRepo) RemoveApps(ctx context.Context, bindingId string, appIds []string) error { err := DB.Where("binding_id = ? AND app_id IN ?", bindingId, appIds).Delete(&LinkAppInfo{}).Error if err != nil { log.Errorf("RemoveApps delete binding:%s LinkAppInfo err:%s", bindingId, err.Error()) } else { log.Infof("RemoveApps delete binding:%s LinkAppInfo succ", bindingId) } return err } func (b BindingByMysqlRepo) UpdateByBindId(ctx context.Context, bindingId string, bind *entity.Binding) error { info := convertBindingToBindingMysql(bind) data := make(map[string]interface{}) data["name"] = info.Name data["cooperate_status_value"] = info.CooperateStatusValue data["cooperate_status_reason"] = info.CooperateStatusReason data["cooperate_status_last_updated"] = info.CooperateStatusLastUpdated data["cooperate_status_modified_by"] = info.CooperateStatusModifiedBy data["cooperate_valid_status_reson"] = info.CooperateValidStatusReason data["cooperate_valid_status_last_updated"] = info.CooperateValidStatusLastUpdated data["cooperate_valid_status_modified_by"] = info.CooperateValidStatusModifiedBy data["cooperate_invalid_status_reson"] = info.CooperateInvalidStatusReason data["cooperate_invalid_status_last_updated"] = info.CooperateInvalidStatusLastUpdated data["cooperate_invalid_status_modified_by"] = info.CooperateInvalidStatusModifiedBy data["owner"] = info.Owner data["expire"] = info.Expire data["api_server"] = info.ApiServer //DB.Delete(&BundleInfo{}, "binding_id=?", bindingId) //DB.Delete(&LinkAppInfo{}, "binding_id=?", bindingId) err := DB.Where("binding_id=?", bindingId).Delete(&BundleInfo{}).Error if err != nil { log.Errorf("UpdateByBindId delete binding:%s BundleInfo err:%s", bindingId, err.Error()) } else { log.Infof("UpdateByBindId delete binding:%s BundleInfo succ", bindingId) } err = DB.Where("binding_id=?", bindingId).Delete(&LinkAppInfo{}).Error if err != nil { log.Errorf("UpdateByBindId delete binding:%s LinkAppInfo err:%s", bindingId, err.Error()) } else { log.Infof("UpdateByBindId delete binding:%s LinkAppInfo succ", bindingId) } for _, v := range info.AppInfos { DB.Model(&LinkAppInfo{}).Create(&v) } for _, v := range info.BundleInfos { DB.Model(&BundleInfo{}).Create(&v) } return DB.Model(&BindingMysql{}).Where("binding_id=?", bindingId).Updates(data).Error } func (b BindingByMysqlRepo) UpdateExpire(ctx context.Context, bindingId string, expire int64) error { return DB.WithContext(ctx).Model(&sql.AppVersion{}).Where("binding_id=? ", bindingId).Update("expire", expire).Error } func (b BindingByMysqlRepo) UpdateBindingInfo(ctx context.Context, bindingId string, info map[string]interface{}, platform int) error { if platform == entity.BINGING_PLATFORM_OPER { query := "binding_id = ? " args := []interface{}{bindingId} err := DB.Model(&BindingMysqlV2{}).Debug(). Where(query, args...). Updates(info).Error if err != nil { return err } query = "from_binding_id = ? " args = []interface{}{bindingId} return DB.Model(&BindingMysqlV2{}).Debug(). Where(query, args...). Updates(info).Error } else { query := "binding_id = ? " args := []interface{}{bindingId} return DB.Model(&BindingMysqlV2{}).Debug(). Where(query, args...). Updates(info).Error } } func (b BindingByMysqlRepo) UpdateBindingGroupName(ctx context.Context, groupId, groupName string) error { info := make(map[string]interface{}) info["group_name"] = groupName query := "group_id = ? " args := []interface{}{groupId} return DB.Model(&BindingMysqlV2{}).Debug(). Where(query, args...). Updates(info).Error } func (b BindingByMysqlRepo) BundleIdCount(ctx context.Context, groupId string) (int, error) { if groupId == "" { query := "is_forbidden = 0" args := make([]interface{}, 0) var count int64 err := DB.Model(&BundleInfo{}).Where(query, args...).Count(&count).Error return int(count), err } else { query := "group_id = ? and is_forbidden = 0" args := []interface{}{groupId} var count int64 err := DB.Model(&BundleInfo{}).Where(query, args...).Count(&count).Error return int(count), err } } func (b BindingByMysqlRepo) GetBundleByGroupIdAndBundleId(ctx context.Context, groupId string, bundleId string) (*entity.Binding, error) { bindingMysql := BindingMysql{} err := DB.Model(&BindingMysql{}). Select("binding.*").Joins("left join bundle_info on binding.binding_id = bundle_info.binding_id"). Where("binding.group_id = ? and binary bundle_info.bundle_id = ?", []interface{}{groupId}, []interface{}{bundleId}). First(&bindingMysql).Error bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, bindingMysql.BindingID) if len(linkAppInfos) > 0 { bindingMysql.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { bindingMysql.BundleInfos = bundleInfos } binding := convertBindingMysqlToBinding(bindingMysql) return &binding, err //query := "group_id = ? and bundle_id = ?" //args := []interface{}{groupId, bundleId} // //bundleInfoMysql := BundleInfo{} //err := DB.Model(&BundleInfo{}).Where(query, args...).First(&bundleInfoMysql).Error //if err != nil { // return nil, err //} // //return b.GetInfo(ctx, bundleInfoMysql.BindingId) } func (b BindingByMysqlRepo) GetbundlesByBundleId(ctx context.Context, bundleId string) (*entity.Binding, error) { query := "binary bundle_id = ?" args := []interface{}{bundleId} bundleInfoMysql := BundleInfo{} err := DB.Model(&BundleInfo{}).Where(query, args...).First(&bundleInfoMysql).Error if err != nil { return nil, err } return b.GetInfo(ctx, bundleInfoMysql.BindingId) } type BindingsResult struct { BindingId string `json:"bindingId" gorm:"column:binding_id"` } func (b BindingByMysqlRepo) GetBindingsBySearch(ctx context.Context, pageSize int, pageNo int, sort string, searchText string, searchFields string, cooperateStatus string, platform int) ([]entity.Binding, int, error) { log.Infof("ListBindings req,groupId:[%s],searchText:[%s],pageNo:[%d],pageSize:[%d]", searchText, pageNo, pageSize) var sortColumn string switch sort { case "-created": sortColumn = "binding.created_info_at DESC" //按创建时间排序 case "-expire": sortColumn = "binding.expire DESC" //按过期时间倒序排序 case "expire": sortColumn = "binding.expire ASC" //按过期时间正序排序 default: sortColumn = "binding.created_info_at DESC" //按创建时间倒序排序 } list := make([]BindingMysql, 0) var total int64 if searchText == "" { if cooperateStatus != "all" { query := "cooperate_status_value = ?" queryList := []interface{}{cooperateStatus} switch platform { case entity.BINGING_PLATFORM_OPER: query += " AND platform = ? and group_id = ?" queryList = append(queryList, platform) queryList = append(queryList, "") case entity.BINGING_PLATFORM_ORGAN: query += " AND platform = ?" queryList = append(queryList, platform) default: query += " AND ( ( platform = ? AND group_id = ? ) OR ( platform = ? ) )" queryList = append(queryList, entity.BINGING_PLATFORM_OPER) queryList = append(queryList, "") queryList = append(queryList, entity.BINGING_PLATFORM_ORGAN) } err := DB. Where(query, queryList...). //Preload("BundleInfos"). Order(sortColumn). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Find(&list).Error if err != nil { return nil, 0, err } err = DB.Model(&BindingMysql{}). Where(query, queryList...). Count(&total).Error if err != nil { return nil, 0, err } } else { query := "" queryList := []interface{}{} switch platform { case entity.BINGING_PLATFORM_OPER: query += "platform = ? and group_id = ?" queryList = append(queryList, platform) queryList = append(queryList, "") case entity.BINGING_PLATFORM_ORGAN: query += "platform = ?" queryList = append(queryList, platform) default: query += "( platform = ? AND group_id = ? ) OR ( platform = ? )" queryList = append(queryList, entity.BINGING_PLATFORM_OPER) queryList = append(queryList, "") queryList = append(queryList, entity.BINGING_PLATFORM_ORGAN) } err := DB. Where(query, queryList...). //Preload("BundleInfos"). Order(sortColumn). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Find(&list).Error if err != nil { return nil, 0, err } err = DB.Model(&BindingMysql{}). Where(query, queryList...). Count(&total).Error if err != nil { return nil, 0, err } } } else { query := "" queryList := []interface{}{} if cooperateStatus != "all" { query = "(binding.name LIKE ? OR binding.group_name LIKE ? OR bundle_info.bundle_id LIKE ?) AND binding.cooperate_status_value = ? " s := genLike(searchText) queryList = []interface{}{s, s, s, cooperateStatus} switch platform { case entity.BINGING_PLATFORM_OPER: query += " AND binding.platform = ? and binding.group_id = ?" queryList = append(queryList, platform) queryList = append(queryList, "") case entity.BINGING_PLATFORM_ORGAN: query += " AND binding.platform = ?" queryList = append(queryList, platform) default: query += " AND ( ( binding.platform = ? AND binding.group_id = ? ) OR ( binding.platform = ? ) )" queryList = append(queryList, entity.BINGING_PLATFORM_OPER) queryList = append(queryList, "") queryList = append(queryList, entity.BINGING_PLATFORM_ORGAN) } } else { query = "(binding.name LIKE ? OR binding.group_name LIKE ? OR bundle_info.bundle_id LIKE ?) " s := genLike(searchText) queryList = []interface{}{s, s, s} switch platform { case entity.BINGING_PLATFORM_OPER: query += " AND binding.platform = ? and binding.group_id = ?" queryList = append(queryList, platform) queryList = append(queryList, "") case entity.BINGING_PLATFORM_ORGAN: query += " AND binding.platform = ?" queryList = append(queryList, platform) default: query += " AND ( ( binding.platform = ? AND binding.group_id = ? ) OR ( binding.platform = ? ) )" queryList = append(queryList, entity.BINGING_PLATFORM_OPER) queryList = append(queryList, "") queryList = append(queryList, entity.BINGING_PLATFORM_ORGAN) } } resultArr := []BindingsResult{} /*err := mysql.MysqlDB.Table(dao.SDK_DATA_OPEN_INFO_C_NAME).Debug().Select("sum(app_open_count) as app_open_count, sum(total_app_stay_time) as total_app_stay_time, sum(app_close_count) as app_close_count, day_time"). Where(query, args...).Group("day_time").Order("day_time"). Scan(&resultArr).Error*/ err := DB.Debug().Model(&BindingMysql{}). Joins("LEFT JOIN `bundle_info` ON `binding`.`binding_id` = `bundle_info`.`binding_id` "). Select("binding.binding_id"). Where(query, queryList...). Group("binding.binding_id"). Scan(&resultArr).Error /*err := DB.Debug().Model(&BindingMysql{}).Preload("BundleInfos"). Joins("LEFT JOIN `bundle_info` `BundleInfos` ON `binding`.`binding_id` = `BundleInfos`.`binding_id` "). Select("binding.*,GROUP_CONCAT(BundleInfos.bundle_id) AS `bundle_ids`"). Group("binding.binding_id"). Having(query, queryList...). Order(sortColumn). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Find(&list).Error*/ if err != nil { return nil, 0, err } fmt.Printf("resultArr = %s\n", utility.InterfaceToJsonString(resultArr)) /*t := DB.Model(&BindingMysql{}).Joins("LEFT JOIN `bundle_info` `BundleInfos` ON `binding`.`binding_id` = `BundleInfos`.`binding_id`"). Select("binding.*,GROUP_CONCAT(BundleInfos.bundle_id) AS `bundle_ids`"). Group("binding.binding_id"). Having(query, queryList...) err = DB.Debug().Table("(?) t", t).Count(&total).Error*/ t := DB.Model(&BindingMysql{}).Joins("LEFT JOIN `bundle_info` ON `binding`.`binding_id` = `bundle_info`.`binding_id`"). Select("binding.binding_id"). Where(query, queryList...). Group("binding.binding_id") err = DB.Debug().Table("(?) t", t).Count(&total).Error if err != nil { return nil, 0, err } bindingIds := []string{} for _, id := range resultArr { bindingIds = append(bindingIds, id.BindingId) } query = "binding_id in (?)" queryList = []interface{}{bindingIds} err = DB.Model(&BindingMysql{}). //Preload("BundleInfos"). Where(query, queryList...). Order(sortColumn). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Find(&list).Error if err != nil { return nil, 0, err } } bindings := make([]entity.Binding, 0) for _, v := range list { bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, v.BindingID) if len(linkAppInfos) > 0 { v.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { v.BundleInfos = bundleInfos } bindings = append(bindings, convertBindingMysqlToBinding(v)) } return bindings, int(total), nil } func (b BindingByMysqlRepo) GetBindingsByAppId(ctx context.Context, pageSize int, pageNo int, appId string) ([]entity.Binding, int, error) { list := make([]BindingMysql, 0) var total int64 err := DB.Debug().Model(&BindingMysql{}). //Preload("BundleInfos").Preload("AppInfos"). Where("link_app_infos.app_id = ?", appId). Select("DISTINCT(binding.id), binding.*"). Joins("left join bundle_info on binding.binding_id = bundle_info.binding_id"). Joins("left join link_app_infos on binding.binding_id = link_app_infos.binding_id"). Order("binding.created_info_at DESC"). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Find(&list).Error if err != nil { return nil, 0, err } err = DB.Debug().Model(&BindingMysql{}). //Preload("BundleInfos").Preload("AppInfos"). Where("link_app_infos.app_id = ?", appId). Select("DISTINCT(binding.id), binding.*"). Joins("left join bundle_info on binding.binding_id = bundle_info.binding_id"). Joins("left join link_app_infos on binding.binding_id = link_app_infos.binding_id"). Order("binding.created_info_at DESC"). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Count(&total).Error if err != nil { return nil, 0, err } bindings := make([]entity.Binding, 0) for _, v := range list { bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, v.BindingID) if len(linkAppInfos) > 0 { v.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { v.BundleInfos = bundleInfos } bindings = append(bindings, convertBindingMysqlToBinding(v)) } return bindings, int(total), nil } func (b BindingByMysqlRepo) GetDevListBinding(ctx context.Context, pageSize int, pageNo int, sort string, searchText string, pullType string, groupId string, bindStatus string, platform int) ([]entity.Binding, int, error) { bindingMysqls := make([]BindingMysql, 0) var sortColumn string switch sort { case "-created": sortColumn = "created_info_at DESC" //按创建时间排序 case "-expire": sortColumn = "expire DESC" //按过期时间倒序排序 case "expire": sortColumn = "expire ASC" //按过期时间正序排序 default: sortColumn = "created_info_at DESC" //按创建时间倒序排序 } query := "group_id = ? " args := []interface{}{groupId} switch pullType { case "recently-expire": beginData := time.Now().UnixNano() / 1e6 endData := time.Now().AddDate(0, 0, 30).UnixNano() / 1e6 query = query + "AND expire > ? and expire < ? " args = append(args, beginData, endData) } switch bindStatus { case "Valid": query = query + "AND cooperate_status_value = ? " args = append(args, entity.StBindValid) case "Invalid": query = query + "AND cooperate_status_value = ? " args = append(args, entity.StBindInvalid) } if searchText != "" { query += "AND name LIKE ? " args = append(args, "%"+searchText+"%") } switch platform { case entity.BINGING_PLATFORM_OPER: query += "AND platform = ? " args = append(args, platform) case entity.BINGING_PLATFORM_ORGAN: query += "AND platform = ? " args = append(args, platform) default: query += "AND ( ( platform = ? ) OR ( platform = ? ) ) " args = append(args, entity.BINGING_PLATFORM_OPER) args = append(args, entity.BINGING_PLATFORM_ORGAN) } var total int64 err := DB.Model(&BindingMysql{}). Where(query, args...). //Preload("BundleInfos"). //Preload("AppInfos"). Count(&total). Order(sortColumn). Offset((pageNo - 1) * pageSize).Limit(pageSize). Find(&bindingMysqls).Error if err != nil { return nil, 0, err } bindings := make([]entity.Binding, 0) for _, bindingMysql := range bindingMysqls { bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, bindingMysql.BindingID) if len(linkAppInfos) > 0 { bindingMysql.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { bindingMysql.BundleInfos = bundleInfos } bindings = append(bindings, convertBindingMysqlToBinding(bindingMysql)) } return bindings, int(total), err } func (b BindingByMysqlRepo) GetBundleInfoAndLinkAppInfo(ctx context.Context, bindingId string) ([]BundleInfo, []LinkAppInfo, error) { tmpQuery := "binding_id = ?" tmpArgs := []interface{}{bindingId} var bundleInfos []BundleInfo err := DB.Model(&BundleInfo{}).Where(tmpQuery, tmpArgs...).Find(&bundleInfos).Error var linkAppInfos []LinkAppInfo err = DB.Model(&LinkAppInfo{}).Where(tmpQuery, tmpArgs...).Find(&linkAppInfos).Error return bundleInfos, linkAppInfos, err } func (b BindingByMysqlRepo) GetBindingBySdkKey(ctx context.Context, sdkKey string) (*entity.Binding, error) { query := "sdk_key = ?" args := []interface{}{sdkKey} bundleInfoMysql := BundleInfo{} err := DB.Model(&BundleInfo{}).Where(query, args...).First(&bundleInfoMysql).Error if err != nil { return nil, err } return b.GetInfo(ctx, bundleInfoMysql.BindingId) } func (b BindingByMysqlRepo) ListAutoBindAppBinding(ctx context.Context, groupId string) ([]string, error) { query := "auto_bind = ? and platform = ? and group_id = ?" args := []interface{}{1, entity.BINGING_PLATFORM_OPER, groupId} bindingMysqls := make([]BindingMysql, 0) err := DB.Model(&BindingMysql{}).Where(query, args...).Find(&bindingMysqls).Error if err != nil { return nil, err } result := []string{} for _, binding := range bindingMysqls { result = append(result, binding.BindingID) } return result, nil } func (b BindingByMysqlRepo) ListCopyOperBinding(ctx context.Context, bindingId string) ([]string, []entity.Binding, error) { query := "platform = ? and from_binding_id = ?" args := []interface{}{entity.BINGING_PLATFORM_OPER, bindingId} bindingMysqls := make([]BindingMysql, 0) err := DB.Model(&BindingMysql{}).Where(query, args...).Find(&bindingMysqls).Error if err != nil { return nil, nil, err } bindings := make([]entity.Binding, 0) result := []string{} for _, binding := range bindingMysqls { result = append(result, binding.BindingID) bindings = append(bindings, convertBindingMysqlToBinding(binding)) } return result, bindings, nil } func (b BindingByMysqlRepo) ListBindings(ctx context.Context, groupId string, searchText string, pageNo int, pageSize int) ([]entity.Binding, int, error) { log.Infof("ListBindings req,groupId:[%s],searchText:[%s],pageNo:[%d],pageSize:[%d]", searchText, groupId, pageNo, pageSize) var ( sortColumn = "binding.created_info_at DESC" list = make([]BindingMysql, 0) total int64 ) if searchText == "" { if groupId != "" { err := DB.Debug(). Where("binding.group_id=?", groupId). Order(sortColumn). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Find(&list).Error if err != nil { return nil, 0, err } err = DB.Model(&BindingMysql{}). Where("binding.group_id=?", groupId). Count(&total).Error if err != nil { return nil, 0, err } } else { err := DB.Debug(). Where("binding.group_id <> ?", ""). //Preload("BundleInfos"). Order(sortColumn). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Find(&list).Error if err != nil { return nil, 0, err } err = DB.Model(&BindingMysql{}). Where("binding.group_id <> ?", ""). Count(&total).Error if err != nil { return nil, 0, err } } } else { query := "(binding.name LIKE ? OR binding.group_name LIKE ? OR bundle_ids LIKE ?) " s := genLike(searchText) queryList := []interface{}{s, s, s} if groupId != "" { query += " AND binding.group_id=? " queryList = append(queryList, groupId) } else { query += " AND binding.group_id <> ? " queryList = append(queryList, "") } err := DB.Debug().Model(&BindingMysql{}). //Select("select * from binding"). //Preload("BundleInfos"). Joins("LEFT JOIN `bundle_info` ON `binding`.`binding_id` = `bundle_info`.`binding_id` "). Where("binding.name LIKE ? OR binding.group_name LIKE ? OR bundle_info.bundle_id LIKE ?", s, s, s). //Select("binding.*,GROUP_CONCAT(bundle_id.bundle_id) AS `bundle_ids`"). Group("binding.id"). //Having(query, queryList...). Order(sortColumn). Offset(genOffset(pageNo, pageSize)).Limit(pageSize). Find(&list).Error if err != nil { return nil, 0, err } t := DB.Model(&BindingMysql{}). Joins("LEFT JOIN `bundle_info` ON `binding`.`binding_id` = `bundle_info`.`binding_id`"). //Select("binding.*,GROUP_CONCAT(bundle_info.bundle_id) AS `bundle_ids`"). Group("binding.id"). Where("binding.name LIKE ? OR binding.group_name LIKE ? OR bundle_info.bundle_id LIKE ?", s, s, s) //Having(query, queryList...) err = DB.Debug().Table("(?) t", t).Count(&total).Error if err != nil { return nil, 0, err } } bindings := make([]entity.Binding, 0) for _, v := range list { bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, v.BindingID) if len(linkAppInfos) > 0 { v.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { v.BundleInfos = bundleInfos } bindings = append(bindings, convertBindingMysqlToBinding(v)) } return bindings, int(total), nil // //db := DB.Model(&BindingMysql{}) //if groupId != "" { // db = db.Where("binding.group_id = ?", groupId) //} // //if searchText != "" { // db = db.Where("binding.name LIKE ?", searchText). // Or("binding.group_name LIKE ?", searchText). // Or("bundle_info.bundle_id LIKE ?", searchText) //} // //var total int //bindingMysqls := make([]BindingMysql, 0) //db = db. // Select("DISTINCT(binding.id), binding.*"). // Joins("LEFT JOIN bundle_info on binding.binding_id = bundle_info.binding_id"). // Joins("LEFT JOIN link_app_infos on binding.binding_id = link_app_infos.binding_id"). // Find(&bindingMysqls) //total = len(bindingMysqls) // //err := db.Order("created_info_at desc").Offset((pageNo - 1) * pageSize).Limit(pageSize).Find(&bindingMysqls).Error //if err != nil { // return nil, 0, err //} //bindings := make([]entity.Binding, 0) //for _, bindingMysql := range bindingMysqls { // bindings = append(bindings, convertBindingMysqlToBinding(bindingMysql)) //} //return bindings, int(total), nil } func (b BindingByMysqlRepo) GetAllAssBinds(ctx context.Context, appId string) ([]entity.Binding, error) { //bindings := make([]BindingMongo, 0) //err := bindingTable.OnlyGetAll(ctx, bson.M{"app_infos.app_id": 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 list := make([]BindingMysql, 0) err := DB.Debug().Model(&BindingMysql{}). //Preload("BundleInfos").Preload("AppInfos"). Where("link_app_infos.app_id = ?", appId). Select("DISTINCT(binding.id), binding.*"). Joins("left join bundle_info on binding.binding_id = bundle_info.binding_id"). Joins("left join link_app_infos on binding.binding_id = link_app_infos.binding_id"). Find(&list).Error if err != nil { return nil, err } bindings := make([]entity.Binding, 0) for _, v := range list { bundleInfos, linkAppInfos, _ := b.GetBundleInfoAndLinkAppInfo(ctx, v.BindingID) if len(linkAppInfos) > 0 { v.AppInfos = linkAppInfos } if len(bundleInfos) > 0 { v.BundleInfos = bundleInfos } bindings = append(bindings, convertBindingMysqlToBinding(v)) } return bindings, nil } func (b BindingByMysqlRepo) UpdateRelatedBindingCooperate(ctx context.Context, bindingId string, status entity.Status, specificStatus entity.SpecificStatus, cooperate bool) error { query := "from_binding_id = ? and platform = ?" args := []interface{}{bindingId, entity.BINGING_PLATFORM_OPER} params := map[string]interface{}{} if cooperate { params = map[string]interface{}{ "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 { params = map[string]interface{}{ "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, } } err := DB.Model(&BindingMysqlV2{}).Debug(). Where(query, args...). Updates(params).Error if err != nil { return err } return nil } func (b BindingByMysqlRepo) UpdateBundleIdIsForbidden(ctx context.Context, bundleId string) error { query := "binary bundle_id= ?" args := []interface{}{bundleId} params := map[string]interface{}{ "is_forbidden": 1, } err := DB.Model(&BundleInfo{}).Debug(). Where(query, args...). Updates(params).Error if err != nil { return err } return nil } func (b BindingByMysqlRepo) UpdateBundleIdPlatform(ctx context.Context, bundleId, platform string) error { query := "binary bundle_id= ?" args := []interface{}{bundleId} params := map[string]interface{}{ "remark": platform, } err := DB.Model(&BundleInfo{}).Debug(). Where(query, args...). Updates(params).Error if err != nil { return err } return nil } func (b BindingByMysqlRepo) NotFound(err error) bool { return err == gorm.ErrRecordNotFound || errors.Is(err, gorm.ErrRecordNotFound) } func (b BindingByMysqlRepo) UpdateBundleBindingId(ctx context.Context, bundleId, bindingId, toBindingId string) error { query := "binding_id = ? and bundle_id= ?" args := []interface{}{bindingId, bundleId} params := map[string]interface{}{ "binding_id": toBindingId, } err := DB.Model(&BundleInfo{}).Debug(). Where(query, args...). Updates(params).Error if err != nil { return err } return nil } func convertBindingMysqlToBinding(info BindingMysql) entity.Binding { result := entity.Binding{} bundleInfos := make([]entity.BundleInfo, 0) for _, v := range info.BundleInfos { item := entity.BundleInfo{ //Id: v.Id, 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, item) } createInfo := entity.CreatedInfo{ CreatedBy: info.CreatedInfoBy, CreatedAt: info.CreatedInfoAt, CreatedAccount: info.CreatedInfoAccount, } cooperateStatus := entity.Status{ Value: info.CooperateStatusValue, Reason: info.CooperateStatusReason, LastUpdated: info.CooperateStatusLastUpdated, ModifiedBy: info.CooperateStatusModifiedBy, } cooperateValidStatus := entity.SpecificStatus{ Reason: info.CooperateValidStatusReason, LastUpdated: info.CooperateValidStatusLastUpdated, ModifiedBy: info.CooperateValidStatusModifiedBy, } cooperateInvalidStatus := entity.SpecificStatus{ Reason: info.CooperateInvalidStatusReason, LastUpdated: info.CooperateInvalidStatusLastUpdated, ModifiedBy: info.CooperateInvalidStatusModifiedBy, } //var appInfos []entity.AppInfo //json.Unmarshal([]byte(bindingMysql.AppInfos), &appInfos) result.BindingID = info.BindingID result.Name = info.Name result.BundleInfos = bundleInfos result.CreatedInfo = createInfo result.GroupID = info.GroupID result.GroupName = info.GroupName result.CooperateStatus = cooperateStatus result.CooperateValidStatus = cooperateValidStatus result.CooperateInvalidStatus = cooperateInvalidStatus //result.AppInfos = appInfos result.Owner = info.Owner result.Expire = info.Expire result.ApiServer = info.ApiServer result.AppInfos = make([]entity.AppInfo, 0) for _, v := range info.AppInfos { item := entity.AppInfo{ //Id: v.Id, AppID: v.AppId, AssociatedAt: v.AssociatedAt, AssociatedBy: v.AssociatedBy, } result.AppInfos = append(result.AppInfos, item) } result.GroupID = info.GroupID result.PlatForm = info.PlatForm result.AutoBind = info.AutoBind result.HiddenBundle = info.HiddenBundle result.FromBindingID = info.FromBindingID return result } func convertBindingToBindingMysql(binding *entity.Binding) BindingMysql { result := BindingMysql{} result.BindingID = binding.BindingID result.Name = binding.Name 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 result.AppInfos = make([]LinkAppInfo, 0) for _, v := range binding.AppInfos { item := LinkAppInfo{ //Id: v.Id, BindingId: binding.BindingID, AppId: v.AppID, AssociatedAt: v.AssociatedAt, AssociatedBy: v.AssociatedBy, } result.AppInfos = append(result.AppInfos, item) } result.BundleInfos = make([]BundleInfo, 0) for _, v := range binding.BundleInfos { item := BundleInfo{ //Id: v.Id, BindingId: binding.BindingID, GroupID: binding.GroupID, 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, } result.BundleInfos = append(result.BundleInfos, item) } result.Owner = binding.Owner result.Expire = binding.Expire result.ApiServer = binding.ApiServer result.GroupID = binding.GroupID result.PlatForm = binding.PlatForm result.AutoBind = binding.AutoBind result.HiddenBundle = binding.HiddenBundle result.FromBindingID = binding.FromBindingID return result } func convertBindingMysqlToBindingMysqlV2(binding *BindingMysql) BindingMysqlV2 { result := BindingMysqlV2{} result.BindingID = binding.BindingID result.Name = binding.Name result.CreatedInfoBy = binding.CreatedInfoBy result.CreatedInfoAt = binding.CreatedInfoAt result.CreatedInfoAccount = binding.CreatedInfoAccount result.GroupID = binding.GroupID result.GroupName = binding.GroupName result.CooperateStatusValue = binding.CooperateStatusValue result.CooperateStatusReason = binding.CooperateStatusReason result.CooperateStatusLastUpdated = binding.CooperateStatusLastUpdated result.CooperateStatusModifiedBy = binding.CooperateStatusModifiedBy result.CooperateValidStatusReason = binding.CooperateValidStatusReason result.CooperateValidStatusLastUpdated = binding.CooperateValidStatusLastUpdated result.CooperateValidStatusModifiedBy = binding.CooperateValidStatusModifiedBy result.CooperateInvalidStatusReason = binding.CooperateInvalidStatusReason result.CooperateInvalidStatusLastUpdated = binding.CooperateInvalidStatusLastUpdated result.CooperateInvalidStatusModifiedBy = binding.CooperateInvalidStatusModifiedBy result.Owner = binding.Owner result.Expire = binding.Expire result.ApiServer = binding.ApiServer result.GroupID = binding.GroupID result.PlatForm = binding.PlatForm result.AutoBind = binding.AutoBind result.HiddenBundle = binding.HiddenBundle result.FromBindingID = binding.FromBindingID return result } func convertBundleInfoToBundleInfoMysql(bindId, groupId string, bundleInfo entity.BundleInfo) BundleInfo { result := BundleInfo{} result.BindingId = bindId result.GroupID = groupId result.BundleID = bundleInfo.BundleID result.Remark = bundleInfo.Remark result.SDKKey = bundleInfo.SDKKey result.SDKID = bundleInfo.SDKID result.IsFirstCreate = bundleInfo.IsFirstCreate result.CreatedAt = bundleInfo.CreatedAt result.CreatedAccount = bundleInfo.CreatedAccount result.CreatedBy = bundleInfo.CreatedBy result.IsForbidden = bundleInfo.IsForbidden return result } func convertBundleInfoMysqlToBundleInfo(bundleInfoMysql BundleInfo) entity.BundleInfo { result := entity.BundleInfo{} result.BundleID = bundleInfoMysql.BundleID result.Remark = bundleInfoMysql.Remark result.SDKKey = bundleInfoMysql.SDKKey result.SDKID = bundleInfoMysql.SDKID result.IsFirstCreate = bundleInfoMysql.IsFirstCreate result.CreatedAt = bundleInfoMysql.CreatedAt result.CreatedAccount = bundleInfoMysql.CreatedAccount result.CreatedBy = bundleInfoMysql.CreatedBy return result }