finclip-app-manager/infrastructure/db/repo/mysql/binding.go

1688 lines
63 KiB
Go
Raw Normal View History

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