Files
probably-rendering-one-more…/apps/waterfall-wiki/src/lib/studio-design-documentation.ts
T

37 lines
4.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type {NextApiRequest,NextApiResponse} from 'next';
export const designDocs=`# Studio 页面与 Wiki post API
所有相对地址均位于当前站点。需要现有 PROMPT 登录 Cookie 或 Authorization: Bearer <JWT>;浏览器写请求必须携带同源 Origin。JWT 不能放 URL,也不能写入示例或公开日志。
## 发现与读取
GET /studio/api/layouts:27 套布局目录。
GET /studio/api/layouts/ref-01:元素 ID、类型、位置与参数契约(T 为文字、I 为图片、D 为装饰)。
GET /api/studio/designs?layoutId=ref-01&limit=20:列举保存页面,nextCursor 用 before 继续。
GET /api/studio/designs/{id}:读取 {design}。
design 含 id/layoutId/name/parameters/revision/url/schemaUrl/postId/postUrl/createdAt/updatedAt。
url 是确定的原生页面 /studio/layouts/{layoutId}?id={id};postUrl 是 Wiki 入口 /explore/{postId}。
不带 ID 的 /studio/layouts/ref-01 .. ref-27 展示原生默认排版;ID 不存在或与布局不匹配返回404。旧 /studio/designs/{id} 自动跳转。
## 创建与编辑(用户和 agent 操作同一条记录)
POST /api/studio/designs:{layoutId,name,parameters},201 {design}。
每次创建独立页面 ID,并在同一数据库事务内自动创建一篇 Wiki post;失败整体回滚,不产生孤立页面。
示例:{"layoutId":"ref-01","name":"第一版","parameters":{"texts":{"T01":{"value":"STUDY"}},"images":{"I01":{"color":"#788880"}},"decorations":{}}}
PATCH /api/studio/designs/{id}:{name,parameters,revision},200 {design}。
parameters 是整体替换,不是局部合并。agent 应先 GET,保留未修改的参数,再改目标字段后 PATCH。revision 必须为刚读到的版本;冲突409时重新读取合并,不能盲目重试旧版本。
更新同一页面复用原 Wiki post,不重复发帖;另存副本使用 POST 生成新页面和新 post。没有手动编辑过的 Wiki post 会跟随页面名称更新;手动编辑过的 Wiki 笔记保留正文、标题、标签和封面。
POST /api/studio/designs/{id}/post:为旧保存页面补建 Wiki 入口,201 {design,created:true};已有入口返回200 {design,created:false}。可重复调用,不改变页面 revision。GET 不产生写入。
## 图片与参数
通过 POST /api/upload(multipart/form-data,kind=image、assetOnly=true、files=文件)上传图片,取返回 assets[0] 作为 assetId。上传只建素材;保存页面时才创建 Wiki post。
参数形状:{texts:{T01:{value:"标题",color:"#26362f",scale:1,align:"start"}},images:{I01:{color:"#788880",assetId:"已上传图片UUID",fit:"cover"}},decorations:{D01:{color:"#53645b",hidden:false}},paper:"#f4f2eb"}。全部可省略,具体元素必须来自当前布局。
value 最多500字/8行;scale 0.25–2;align start/middle/end;fit cover/contain;颜色 #RRGGBB。最大请求64KB。不接受任意图片 URL 或注入的 HTML/SVG。
## agent 最短工作流
1. GET /api/studio/designs/{id},读取 design。
2. 修改 design.parameters.texts.T01.value(先用 schemaUrl 确认元素存在)。
3. PATCH /api/studio/designs/{id},body 只发 {name:design.name,parameters:design.parameters,revision:design.revision},不能把返回的整个 design 对象直接提交。
4. 读取返回的新 revision、url 和 postUrl;打开 url 检查实际页面。
兼容导出:renderUrl / legacySvgUrl 仍是旧的原图图层 SVG 导出,不是原生页面截图;不可把它当作原生页面的所见即所得证明。保存页面使用 POST/PATCH designs,无需先调用 SVG 渲染。
错误:400 参数、构件、图片 ID 不合法;401 未登录;404 页面不存在;409 修订冲突;413 请求过大。`;
export function studioDesignDocumentation(req:NextApiRequest,res:NextApiResponse){if(!['GET','HEAD'].includes(req.method||'')||String(req.query.agent_mode).toLowerCase()!=='true')return false;res.setHeader('Content-Type','text/plain; charset=utf-8');res.setHeader('Cache-Control','no-store');if(req.method==='HEAD')res.status(200).end();else res.status(200).send(designDocs);return true}