feat: enhance schedule publish account handling and caching mechanisms
Frontend CI / Frontend (push) Successful in 3m1s
Backend CI / Backend (push) Failing after 6m51s

This commit is contained in:
2026-06-21 09:11:37 +08:00
parent c1b06dab18
commit 37d75597f9
6 changed files with 125 additions and 54 deletions
@@ -625,10 +625,15 @@ func (s *ScheduleTaskService) populateScheduleAutoPublishPlatforms(ctx context.C
if item == nil || !item.AutoPublish {
return nil
}
platformIDs, err := loadPublishAccountPlatformsByIDs(ctx, s.pool, tenantID, item.PublishAccountIDs)
workspaceID := int64(0)
if item.WorkspaceID != nil {
workspaceID = *item.WorkspaceID
}
accountIDs, platformIDs, err := loadExistingPublishAccountIDsAndPlatformsByIDs(ctx, s.pool, tenantID, workspaceID, item.PublishAccountIDs)
if err != nil {
return response.ErrInternal(50010, "query_failed", "failed to resolve schedule auto publish platforms")
}
item.PublishAccountIDs = emptyStringSliceIfNil(accountIDs)
item.AutoPublishPlatforms = platformIDs
return nil
}
@@ -656,7 +661,7 @@ func (s *ScheduleTaskService) populateScheduleAutoPublishPlatformsBatch(ctx cont
accountIDs = append(accountIDs, accountID)
}
rows, err := s.pool.Query(ctx, `
SELECT desktop_id::text, platform_id
SELECT DISTINCT desktop_id::text, platform_id
FROM platform_accounts
WHERE tenant_id = $1
AND desktop_id::text = ANY($2::text[])
@@ -684,14 +689,21 @@ func (s *ScheduleTaskService) populateScheduleAutoPublishPlatformsBatch(ctx cont
if !items[idx].AutoPublish {
continue
}
existingAccountIDs := make([]string, 0, len(items[idx].PublishAccountIDs))
platformIDs := make([]string, 0, len(items[idx].PublishAccountIDs))
for _, accountID := range items[idx].PublishAccountIDs {
normalized := normalizeSchedulePublishAccountIDs([]string{accountID})
if len(normalized) == 0 {
continue
}
platformIDs = append(platformIDs, platformsByAccount[normalized[0]]...)
accountPlatforms := platformsByAccount[normalized[0]]
if len(accountPlatforms) == 0 {
continue
}
existingAccountIDs = append(existingAccountIDs, normalized[0])
platformIDs = append(platformIDs, accountPlatforms...)
}
items[idx].PublishAccountIDs = emptyStringSliceIfNil(existingAccountIDs)
items[idx].AutoPublishPlatforms = emptyStringSliceIfNil(normalizePlatformIDs(platformIDs))
}
return nil
@@ -1135,6 +1147,18 @@ func (s *ScheduleTaskService) normalizeAutoPublishConfig(ctx context.Context, ac
if len(accountIDs) == 0 && len(enterpriseTargets) == 0 {
return config, response.ErrBadRequest(40024, "publish_targets_required", "开启自动发布后,请至少选择一个发布目标")
}
if len(accountIDs) > 0 {
existingAccountIDs, platformIDs, err := loadExistingPublishAccountIDsAndPlatformsByIDs(ctx, s.pool, actor.TenantID, actor.PrimaryWorkspaceID, accountIDs)
if err != nil {
return config, response.ErrInternal(50010, "publish_account_check_failed", "failed to validate publish accounts")
}
accountIDs = existingAccountIDs
config.AccountIDs = accountIDs
config.PlatformIDs = normalizePlatformIDs(platformIDs)
}
if len(accountIDs) == 0 && len(enterpriseTargets) == 0 {
return config, response.ErrBadRequest(40024, "publish_targets_required", "开启自动发布后,请至少选择一个发布目标")
}
if err := validateOptionalPositiveInt64(req.CoverImageAssetID, "cover_image_asset_id"); err != nil {
return config, err
}
@@ -1152,12 +1176,7 @@ func (s *ScheduleTaskService) normalizeAutoPublishConfig(ctx context.Context, ac
}
coverURL := strings.TrimSpace(stringPointerValue(req.CoverAssetURL))
if len(accountIDs) > 0 {
platformIDs, err := s.loadPublishAccountPlatformIDs(ctx, actor.TenantID, actor.PrimaryWorkspaceID, accountIDs)
if err != nil {
return config, err
}
config.PlatformIDs = normalizePlatformIDs(platformIDs)
if schedulePublishPlatformsRequireCover(platformIDs) && coverMode == ScheduleCoverModeSpecific && coverURL == "" {
if schedulePublishPlatformsRequireCover(config.PlatformIDs) && coverMode == ScheduleCoverModeSpecific && coverURL == "" {
return config, response.ErrBadRequest(40025, "cover_required", "已选媒体账号的平台要求封面图,请先设置封面")
}
}
@@ -1281,37 +1300,6 @@ func (s *ScheduleTaskService) validateScheduleEnterpriseSiteTargets(ctx context.
return nil
}
func (s *ScheduleTaskService) loadPublishAccountPlatformIDs(ctx context.Context, tenantID, workspaceID int64, accountIDs []string) ([]string, error) {
rows, err := s.pool.Query(ctx, `
SELECT platform_id
FROM platform_accounts
WHERE tenant_id = $1
AND workspace_id = $2
AND desktop_id::text = ANY($3::text[])
AND deleted_at IS NULL
`, tenantID, workspaceID, accountIDs)
if err != nil {
return nil, response.ErrInternal(50010, "publish_account_check_failed", "failed to validate publish accounts")
}
defer rows.Close()
platformIDs := make([]string, 0, len(accountIDs))
for rows.Next() {
var platformID string
if err := rows.Scan(&platformID); err != nil {
return nil, response.ErrInternal(50010, "publish_account_check_failed", "failed to parse publish accounts")
}
platformIDs = append(platformIDs, strings.TrimSpace(platformID))
}
if err := rows.Err(); err != nil {
return nil, response.ErrInternal(50010, "publish_account_check_failed", "failed to iterate publish accounts")
}
if len(platformIDs) != len(accountIDs) {
return nil, response.ErrBadRequest(40027, "invalid_publish_accounts", "one or more publish accounts do not exist")
}
return platformIDs, nil
}
func schedulePublishPlatformsRequireCover(platformIDs []string) bool {
for _, platformID := range platformIDs {
if publishPlatformRequiresCover(platformID) {