feat: 完成短剧项目空间与结构化资产创作闭环 (#38)
* feat(canvas): 短剧项目空间 - 建立项目章节与画布关联 MVP * feat(canvas): 短剧项目空间 - 完善项目资产、镜头与流程闭环 Refs #30 * fix(deploy): 本地部署 - 修复前端构建并忽略本地 PostgreSQL 配置 * feat(*): 短剧项目空间 - 完成项目、章节、资产、角色与画布创作闭环 Refs #30 --------- Co-authored-by: ddCat <ddcat666@88.com>
This commit is contained in:
40
web/src/lib/canvas/canvas-drawing-reference.ts
Normal file
40
web/src/lib/canvas/canvas-drawing-reference.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { loadCanvasDrawingRender, saveCanvasDrawingRenderPublication } from "@/lib/canvas/canvas-drawing-storage";
|
||||
import { resourceFileUrl, resourceIdFromStorageKey, resourceStorageKey, uploadResourceFile } from "@/services/api/resources";
|
||||
import type { ReferenceImage } from "@/types/image";
|
||||
|
||||
export async function resolveCanvasDrawingReference(projectId: string, image: ReferenceImage): Promise<ReferenceImage> {
|
||||
const source = image.source;
|
||||
if (!source || source.kind !== "drawing") return image;
|
||||
if (!source.shapeCount) throw new Error(`绘图“${image.name}”为空,请先完成绘图再生成`);
|
||||
|
||||
const render = await loadCanvasDrawingRender(projectId, source.drawingId);
|
||||
if (!render || render.revision !== source.revision) {
|
||||
throw new Error(`绘图“${image.name}”缺少当前版本的生成图,请打开绘图并保存后重试`);
|
||||
}
|
||||
|
||||
if (resourceIdFromStorageKey(render.storageKey)) {
|
||||
return {
|
||||
...image,
|
||||
dataUrl: "",
|
||||
url: render.url,
|
||||
storageKey: render.storageKey,
|
||||
type: render.mimeType,
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const resource = await uploadResourceFile(render.blob, "image", {
|
||||
width: render.width,
|
||||
height: render.height,
|
||||
fileName: `drawing-${source.drawingId}-r${source.revision}.png`,
|
||||
});
|
||||
const storageKey = resourceStorageKey(resource.id);
|
||||
const url = resource.publicUrl || resourceFileUrl(resource.id);
|
||||
const saved = await saveCanvasDrawingRenderPublication(projectId, source.drawingId, source.revision, { storageKey, url });
|
||||
if (!saved) throw new Error("绘图在上传期间发生了修改,请重新生成");
|
||||
return { ...image, dataUrl: "", url, storageKey, type: resource.mimeType || render.mimeType };
|
||||
} catch (error) {
|
||||
if (error instanceof Error && error.message === "绘图在上传期间发生了修改,请重新生成") throw error;
|
||||
throw new Error(error instanceof Error ? `绘图参考图上传失败:${error.message}` : "绘图参考图上传失败");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user