25 lines
1.4 KiB
TypeScript
25 lines
1.4 KiB
TypeScript
import type {IncomingMessage} from 'node:http';
|
|
import {series} from './series';
|
|
import {parameters,uuid} from './layout-parameters';
|
|
import fixedLayouts from '../content/templates/layouts.json';
|
|
import standardLayout from '../content/standard-layout.json';
|
|
const layouts=[...fixedLayouts,standardLayout];
|
|
import type {Design} from './native-layout';
|
|
|
|
/** Only forward the session to our fixed private Wiki service, never a request Host. */
|
|
export async function readDesign(id:unknown,req:IncomingMessage):Promise<Design|null>{
|
|
if(!uuid(id))return null;
|
|
const origin=process.env.STUDIO_WIKI_ORIGIN||'http://waterfall-wiki:3000';
|
|
const headers:Record<string,string>={};
|
|
if(req.headers.cookie)headers.cookie=req.headers.cookie;
|
|
if(req.headers.authorization)headers.authorization=req.headers.authorization;
|
|
const response=await fetch(`${origin}/api/studio/designs/${id}`,{headers,redirect:'error',cache:'no-store',signal:AbortSignal.timeout(8000)});
|
|
if(response.status===404||response.status===400)return null;
|
|
if(!response.ok)throw new Error('Saved layout service unavailable');
|
|
const {design}=await response.json() as {design:Design};
|
|
const layout=layouts.find(l=>l.id===design.layoutId);
|
|
if(!layout||design.id!==id)throw new Error('Invalid saved layout');
|
|
if((design as Design&{archived?:boolean}).archived)return null;
|
|
return {...design,...(design.document?{document:series(design.document,layouts)}:{}),parameters:parameters(layout,design.parameters)};
|
|
}
|