diff --git a/apps/admin-web/src/i18n/messages/en-US.ts b/apps/admin-web/src/i18n/messages/en-US.ts index 0abc941..7bb74c1 100644 --- a/apps/admin-web/src/i18n/messages/en-US.ts +++ b/apps/admin-web/src/i18n/messages/en-US.ts @@ -1101,7 +1101,7 @@ const enUS = { previewHintLocked: "A selected platform requires a fixed cover ratio, so the cover will be exported using the current platform requirement.", previewHintFree: "There is no forced cover ratio right now. You can upload the original image directly or adjust framing before confirming.", requirementsTitle: "Platform requirements", - requirementsHint: "Requirements switch automatically based on the selected publish platforms. Baijiahao and Dongchedi require a cover image.", + requirementsHint: "Requirements switch automatically based on the selected publish platforms. WeChat Official Account, Baijiahao, and Dongchedi require a cover image.", recommendedRatio: "Recommended ratio", recommendedSize: "Recommended size", required: "Required", diff --git a/apps/admin-web/src/i18n/messages/zh-CN.ts b/apps/admin-web/src/i18n/messages/zh-CN.ts index 2ae0c8d..444e35a 100644 --- a/apps/admin-web/src/i18n/messages/zh-CN.ts +++ b/apps/admin-web/src/i18n/messages/zh-CN.ts @@ -1110,7 +1110,7 @@ const zhCN = { previewHintLocked: "已选择需要固定封面比例的平台,确认时会按当前平台要求输出封面。", previewHintFree: "当前不限制封面比例,可直接上传原图;如需调整也可拖拽缩放后再确认。", requirementsTitle: "平台封面要求", - requirementsHint: "会根据当前选中的发布平台自动切换要求,百家号和懂车帝为强制上传。", + requirementsHint: "会根据当前选中的发布平台自动切换要求,微信公众号、百家号和懂车帝为强制上传。", recommendedRatio: "推荐比例", recommendedSize: "推荐尺寸", required: "必传", diff --git a/apps/admin-web/src/lib/cover-requirements.ts b/apps/admin-web/src/lib/cover-requirements.ts index f8c74c5..36ff147 100644 --- a/apps/admin-web/src/lib/cover-requirements.ts +++ b/apps/admin-web/src/lib/cover-requirements.ts @@ -24,6 +24,15 @@ const defaultRequirement = { }; const requirementCatalog: Record> = { + weixin_gzh: { + required: true, + supportMode: "native", + aspectRatio: 2.35, + aspectLabel: "2.35:1", + outputWidth: 1200, + outputHeight: 511, + priority: 110, + }, baijiahao: { required: true, supportMode: "native", diff --git a/server/internal/tenant/app/media_service.go b/server/internal/tenant/app/media_service.go index b6b9ce6..1919e6e 100644 --- a/server/internal/tenant/app/media_service.go +++ b/server/internal/tenant/app/media_service.go @@ -4,6 +4,7 @@ import ( "context" "crypto/rand" "encoding/hex" + "strings" "time" "github.com/jackc/pgx/v5/pgxpool" @@ -136,13 +137,22 @@ func (s *MediaService) listArticlePublishRecords(ctx context.Context, tenantID, func publishBatchRequiresCover(accounts []platformAccountSeed) bool { for _, account := range accounts { - if account.PlatformID == "baijiahao" || account.PlatformID == "dongchedi" { + if publishPlatformRequiresCover(account.PlatformID) { return true } } return false } +func publishPlatformRequiresCover(platformID string) bool { + switch strings.TrimSpace(platformID) { + case "weixin_gzh", "baijiahao", "dongchedi": + return true + default: + return false + } +} + func pointerStringValue(value *string) string { if value == nil { return "" diff --git a/server/internal/tenant/app/publish_job_service.go b/server/internal/tenant/app/publish_job_service.go index 074b8ff..4e02584 100644 --- a/server/internal/tenant/app/publish_job_service.go +++ b/server/internal/tenant/app/publish_job_service.go @@ -162,7 +162,7 @@ func (s *PublishJobService) Create(ctx context.Context, actor auth.Actor, req Cr accountSeeds = append(accountSeeds, *target.accountSeed) } if publishBatchRequiresCover(accountSeeds) && strings.TrimSpace(pointerStringValue(articleMeta.CoverAssetURL)) == "" { - return nil, response.ErrBadRequest(40044, "publish_cover_required", "baijiahao publishing requires a cover image") + return nil, response.ErrBadRequest(40044, "publish_cover_required", "selected publishing platform requires a cover image") } publishBatchID, publishRecordIDs, err := createPublishBatchRecords( diff --git a/server/internal/tenant/app/publish_platforms_test.go b/server/internal/tenant/app/publish_platforms_test.go new file mode 100644 index 0000000..c6aa4f5 --- /dev/null +++ b/server/internal/tenant/app/publish_platforms_test.go @@ -0,0 +1,30 @@ +package app + +import "testing" + +func TestPublishPlatformRequiresCover(t *testing.T) { + t.Parallel() + + for _, platformID := range []string{"weixin_gzh", "baijiahao", "dongchedi"} { + if !publishPlatformRequiresCover(platformID) { + t.Fatalf("publishPlatformRequiresCover(%q) = false, want true", platformID) + } + } + + if publishPlatformRequiresCover("zhihu") { + t.Fatal("publishPlatformRequiresCover(\"zhihu\") = true, want false") + } +} + +func TestPublishCoverRequirementCallersIncludeWeixinGzh(t *testing.T) { + t.Parallel() + + accounts := []platformAccountSeed{{PlatformID: "weixin_gzh"}} + if !publishBatchRequiresCover(accounts) { + t.Fatal("publishBatchRequiresCover() = false for weixin_gzh, want true") + } + + if !schedulePublishPlatformsRequireCover([]string{"weixin_gzh"}) { + t.Fatal("schedulePublishPlatformsRequireCover() = false for weixin_gzh, want true") + } +} diff --git a/server/internal/tenant/app/schedule_task_service.go b/server/internal/tenant/app/schedule_task_service.go index 6c17058..3bcdce2 100644 --- a/server/internal/tenant/app/schedule_task_service.go +++ b/server/internal/tenant/app/schedule_task_service.go @@ -564,8 +564,7 @@ func (s *ScheduleTaskService) loadPublishAccountPlatformIDs(ctx context.Context, func schedulePublishPlatformsRequireCover(platformIDs []string) bool { for _, platformID := range platformIDs { - switch strings.TrimSpace(platformID) { - case "baijiahao", "dongchedi": + if publishPlatformRequiresCover(platformID) { return true } }