Files
geo/server/internal/tenant/app/media_supply_public.go
T
root 9d6181260a
Desktop Client Build / Resolve Build Metadata (push) Successful in 43s
Frontend CI / Frontend (push) Successful in 3m49s
Backend CI / Backend (push) Failing after 7m10s
Desktop Client Build / Build Desktop Client (push) Successful in 23m4s
Desktop Client Build / Publish Client Artifacts to NAS (push) Successful in 28s
feat(media-supply): add media resource supply marketplace
Introduce an end-to-end media-supply feature: tenant-side resource sync
service/worker backed by a Meijiequan supplier client, ops-side management
APIs, and admin/ops web views for resources, orders, favorites and
submission. Adds a shared digitocr helper, MediaSupply config blocks for
tenant and ops, shared types, and migrations for supplier media resources,
price overrides, customer visibility and order refunds.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 23:17:01 +08:00

99 lines
3.6 KiB
Go

package app
import (
"errors"
"strings"
)
const mediaSupplyPublicSupplierCode = "authority_news"
var errMediaSupplyAccountUserIDMissing = errors.New("media supply account user_id is not configured")
func publicMediaSupplySupplierCode(supplier string) string {
supplier = strings.TrimSpace(supplier)
if supplier == "" {
return ""
}
if strings.EqualFold(supplier, mediaSupplySupplierMeijiequan) {
return mediaSupplyPublicSupplierCode
}
return "media_supply"
}
func publicMediaSupplyArticleURL(value string) string {
value = strings.TrimSpace(value)
if value == "" {
return ""
}
if isLikelyPublishedArticleURL(value) {
return value
}
return ""
}
func mediaSupplyPublicErrorMessage(err error) string {
if err == nil {
return ""
}
switch {
case errors.Is(err, errMeijiequanCredentialsMissing):
return "媒体供应商账号未配置,请联系管理员处理"
case errors.Is(err, errMeijiequanSessionMissing), errors.Is(err, errMeijiequanSessionExpired), errors.Is(err, errMeijiequanAuthRequired):
return "媒体供应商登录状态已失效,请联系管理员处理"
case errors.Is(err, errMeijiequanChallengeRequired):
return "媒体供应商登录验证失败,请联系管理员处理"
case errors.Is(err, errMeijiequanOrderRejected):
return "媒体供应商拒绝投稿,请检查文章内容或联系管理员处理"
case errors.Is(err, errMediaSupplySelectedResourcesMissing):
return "媒体资源价格刷新失败,请稍后重试或重新选择媒体"
case errors.Is(err, errMediaSupplyLockedSellBelowCost):
return "媒体成本价已变化,当前锁定价格低于成本,请重新提交"
case errors.Is(err, errMediaSupplyAccountUserIDMissing):
return "媒体供应商账号信息不完整,请联系管理员处理"
default:
return mediaSupplyPublicGenericErrorMessage(err.Error())
}
}
func mediaSupplyPublicGenericErrorMessage(message string) string {
message = strings.TrimSpace(message)
if message == "" {
return "媒体投稿失败,请稍后重试或联系管理员"
}
lower := strings.ToLower(message)
switch {
case strings.Contains(lower, "failed to refresh supplier price"):
return "媒体资源价格刷新失败,请稍后重试或重新选择媒体"
case strings.Contains(lower, "supplier cost increased above locked sell price"):
return "媒体成本价已变化,当前锁定价格低于成本,请重新提交"
case strings.Contains(lower, "username") || strings.Contains(lower, "password") || strings.Contains(lower, "credentials"):
return "媒体供应商账号未配置,请联系管理员处理"
case strings.Contains(lower, "session") || strings.Contains(lower, "authentication") || strings.Contains(lower, "auth required"):
return "媒体供应商登录状态已失效,请联系管理员处理"
case strings.Contains(lower, "challenge") || strings.Contains(lower, "captcha"):
return "媒体供应商登录验证失败,请联系管理员处理"
case strings.Contains(lower, "user_id"):
return "媒体供应商账号信息不完整,请联系管理员处理"
case strings.Contains(lower, "meijiequan"):
return "媒体供应商请求失败,请稍后重试或联系管理员"
case strings.Contains(lower, "supplier"):
return "媒体投稿失败,请稍后重试或联系管理员"
case strings.Contains(lower, "failed to"):
return "媒体投稿失败,请稍后重试或联系管理员"
default:
if hasCJKText(message) {
return message
}
return "媒体投稿失败,请稍后重试或联系管理员"
}
}
func hasCJKText(message string) bool {
for _, r := range message {
if r >= '\u4e00' && r <= '\u9fff' {
return true
}
}
return false
}