fix(apps): 修复云超服市场单段 slug 商品下载链路

- 前端 buildMarketDownloadUrl:id 拆分不到 owner/name 两段时,
  不再产生 owner/undefined,统一按 pineagents/<id> 处理
- 后端 _fetch_market_bundle_bytes:owner/name 精确匹配失败后,
  回退按 name 单段精确匹配,兼容历史未补 owner 前缀的商品
  (如 creator、公众号爆款封面生成)

配套:server-core 侧已把存量单段 slug 数据规范化为 pineagents/<slug>
This commit is contained in:
Pine
2026-09-03 20:28:09 +08:00
parent 158582bc1a
commit 3be0c2f16c
2 changed files with 21 additions and 1 deletions
+4 -1
View File
@@ -94,7 +94,10 @@ export function buildMarketDownloadUrl(
source?: string,
): string {
const id = entry.id.startsWith("@") ? entry.id.slice(1) : entry.id;
const [owner, name] = id.split("/");
const parts = id.split("/");
// 单段 id(历史数据未补 owner 前缀):统一按 pineagents/<id> 处理,避免 owner/undefined
const owner = parts[0] || "pineagents";
const name = parts[1] || parts[0];
// 云超服市场源:下载指向本端代理(带登录态转发到 server-core bundle)。
if (source === "pineagents") {
return getApiUrl(`/plugins/market/download/${owner}/${name}`);
+17
View File
@@ -1232,6 +1232,23 @@ async def _fetch_market_bundle_bytes(
(it["id"] for it in items2 if it.get("slug") == slug),
None,
)
if item_id is None:
# 兼容历史单段 slug(未补 owner 前缀,如 "creator"、"公众号爆款封面生成"):
# 按 name 单独精确匹配,覆盖 owner/name 与 name 两种存储形态。
for it_type in ("plugin", "app"):
find3 = await client.get(
"/market/items",
params={"q": name, "item_type": it_type, "page_size": 20},
headers=headers,
)
find3.raise_for_status()
items3 = (find3.json().get("items") or [])
item_id = next(
(it["id"] for it in items3 if it.get("slug") in (name, f"{owner}/{name}")),
None,
)
if item_id is not None:
break
if item_id is None:
raise HTTPException(status_code=404, detail=f"云超服市场未找到商品 {slug}")