0.2.2 onlyoffice修复

This commit is contained in:
liaibo
2026-01-17 12:38:04 +08:00
parent 19907bccdc
commit df2e9f5339
10 changed files with 349 additions and 893 deletions
@@ -81,51 +81,57 @@ export async function POST(request: Request) {
}
if (isConvexEnabled()) {
// 说明:Convex 模式下,保存写回 Convex Files,并更新 media_assets.storage_id/file_url。
const userId = String(process.env.DEV_USER_ID || "dev-user").trim() || "dev-user";
const client = getConvexHttpClient();
try {
// 说明:Convex 模式下,保存写回 Convex Files,并更新 media_assets.storage_id/file_url。
const userId = String(process.env.DEV_USER_ID || "dev-user").trim() || "dev-user";
const client = getConvexHttpClient();
const asset = await client.query(api.mediaAssets.getById, { userId, id: assetId });
if (!asset) {
const asset = await client.query(api.mediaAssets.getById, { userId, id: assetId });
if (!asset) {
return NextResponse.json({ error: 1 });
}
const downloadUrl = tryRewriteOnlyOfficeDownloadUrl(body.url);
const upstream = await fetch(downloadUrl, { method: "GET", redirect: "follow" });
if (!upstream.ok) {
return NextResponse.json({ error: 1 });
}
const buf = Buffer.from(await upstream.arrayBuffer());
const uploadUrl = await client.mutation(api.mediaAssets.generateUploadUrl, { userId });
if (!uploadUrl || typeof uploadUrl !== "string") {
return NextResponse.json({ error: 1 });
}
const uploadRes = await fetch(uploadUrl, {
method: "POST",
headers: { "Content-Type": asset.mime_type || "application/octet-stream" },
body: buf,
});
if (!uploadRes.ok) {
return NextResponse.json({ error: 1 });
}
const uploadJson = (await uploadRes.json().catch(() => null)) as { storageId?: string } | null;
const storageId = String(uploadJson?.storageId || "");
if (!storageId) {
return NextResponse.json({ error: 1 });
}
await client.mutation(api.mediaAssets.replaceStorageFromUpload, {
userId,
id: assetId,
storageId: storageId as any,
});
return NextResponse.json({ error: 0 });
} catch (error) {
// 说明:避免异常导致 ONLYOFFICE 重试/阻塞(例如 Convex 未部署新 mutation)。
console.error("[onlyoffice/callback] convex writeback failed:", error);
return NextResponse.json({ error: 1 });
}
const downloadUrl = tryRewriteOnlyOfficeDownloadUrl(body.url);
const upstream = await fetch(downloadUrl, { method: "GET", redirect: "follow" });
if (!upstream.ok) {
return NextResponse.json({ error: 1 });
}
const buf = Buffer.from(await upstream.arrayBuffer());
const uploadUrl = await client.mutation(api.mediaAssets.generateUploadUrl, { userId });
if (!uploadUrl || typeof uploadUrl !== "string") {
return NextResponse.json({ error: 1 });
}
const uploadRes = await fetch(uploadUrl, {
method: "POST",
headers: { "Content-Type": asset.mime_type || "application/octet-stream" },
body: buf,
});
if (!uploadRes.ok) {
return NextResponse.json({ error: 1 });
}
const uploadJson = (await uploadRes.json().catch(() => null)) as { storageId?: string } | null;
const storageId = String(uploadJson?.storageId || "");
if (!storageId) {
return NextResponse.json({ error: 1 });
}
await client.mutation(api.mediaAssets.replaceStorageFromUpload, {
userId,
id: assetId,
storageId: storageId as any,
});
return NextResponse.json({ error: 0 });
}
const { data: asset, error: assetError } = await supabaseAdmin