test(distribution): add e2e scenario 1 test and fix tx deadlock in MarkSettlementBatch
This commit is contained in:
@@ -69,14 +69,18 @@ func NewRepository(db *gorm.DB, redis ...*redis.Client) *Repository {
|
||||
}
|
||||
|
||||
func (r *Repository) hasGlobalDistributionAccess(ctx context.Context, adminID uint64) (bool, error) {
|
||||
return r.hasGlobalDistributionAccessWithDB(ctx, r.db, adminID)
|
||||
}
|
||||
|
||||
func (r *Repository) hasGlobalDistributionAccessWithDB(ctx context.Context, db *gorm.DB, adminID uint64) (bool, error) {
|
||||
if adminID == 0 {
|
||||
return true, nil
|
||||
}
|
||||
if r.db == nil {
|
||||
if db == nil {
|
||||
return false, nil
|
||||
}
|
||||
var n int64
|
||||
if err := r.db.WithContext(ctx).Table("roles").
|
||||
if err := db.WithContext(ctx).Table("roles").
|
||||
Joins("JOIN admin_user_roles aur ON aur.role_id = roles.id").
|
||||
Where("aur.admin_user_id = ? AND roles.code = ?", adminID, "super_admin").
|
||||
Count(&n).Error; err != nil {
|
||||
@@ -85,7 +89,7 @@ func (r *Repository) hasGlobalDistributionAccess(ctx context.Context, adminID ui
|
||||
if n > 0 {
|
||||
return true, nil
|
||||
}
|
||||
if err := r.db.WithContext(ctx).Table("permissions").
|
||||
if err := db.WithContext(ctx).Table("permissions").
|
||||
Joins("JOIN role_permissions rp ON rp.permission_id = permissions.id").
|
||||
Joins("JOIN admin_user_roles aur ON aur.role_id = rp.role_id").
|
||||
Where("aur.admin_user_id = ? AND permissions.code = ?", adminID, "distribution:all_view").
|
||||
@@ -142,10 +146,17 @@ func (r *Repository) ScopeSiteID(ctx context.Context, adminID, requested uint64)
|
||||
// ensureSiteAccess 校验管理员可访问指定站点。
|
||||
// 仅超级管理员或持有 distribution:all_view 的账号可跨站;无成员记录不再视为超管。
|
||||
func (r *Repository) ensureSiteAccess(ctx context.Context, adminID, siteID uint64) error {
|
||||
return r.ensureSiteAccessWithDB(ctx, r.db, adminID, siteID)
|
||||
}
|
||||
|
||||
func (r *Repository) ensureSiteAccessWithDB(ctx context.Context, db *gorm.DB, adminID, siteID uint64) error {
|
||||
if adminID == 0 {
|
||||
return nil
|
||||
}
|
||||
global, err := r.hasGlobalDistributionAccess(ctx, adminID)
|
||||
if db == nil {
|
||||
db = r.db
|
||||
}
|
||||
global, err := r.hasGlobalDistributionAccessWithDB(ctx, db, adminID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -156,7 +167,7 @@ func (r *Repository) ensureSiteAccess(ctx context.Context, adminID, siteID uint6
|
||||
return ErrSiteAccessDenied
|
||||
}
|
||||
var allowed int64
|
||||
if err := r.db.WithContext(ctx).Model(&model.DistributionSiteMember{}).
|
||||
if err := db.WithContext(ctx).Model(&model.DistributionSiteMember{}).
|
||||
Where("admin_user_id = ? AND site_id = ? AND status = 'active'", adminID, siteID).Count(&allowed).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -809,7 +820,7 @@ func (r *Repository) MarkSettlementBatch(ctx context.Context, adminID, id uint64
|
||||
}
|
||||
return err
|
||||
}
|
||||
if err := r.ensureSiteAccess(ctx, adminID, row.SiteID); err != nil {
|
||||
if err := r.ensureSiteAccessWithDB(ctx, tx, adminID, row.SiteID); err != nil {
|
||||
return err
|
||||
}
|
||||
if row.Status == "settled" {
|
||||
|
||||
Reference in New Issue
Block a user