dnd-character-deploy/server/characters.mjs

12 lines
1.1 KiB
JavaScript

import {z} from 'zod';
import {characterSchema} from './model.mjs';
const update=z.object({character:characterSchema.nullable(),revision:z.number().int().min(0),deleted:z.boolean().default(false)}).refine(x=>x.deleted?x.character===null:x.character!==null);
export function installCharacters(app,{storage,origin}){
app.use('/api/characters',(req,res,next)=>{if(!req.identity)return res.status(401).json({error:'Sign in required'});if(req.method!=='GET'&&req.get('origin')!==origin)return res.sendStatus(403);next()});
app.get('/api/characters',async(req,res)=>res.json({sheets:await storage.list(req.identity.sub)}));
app.put('/api/characters/:id',async(req,res)=>{
const p=update.safeParse(req.body);if(!p.success||(!p.data.deleted&&p.data.character.id!==req.params.id)||req.params.id.length>200)return res.status(400).json({error:'Invalid character update'});
try{res.json({sheet:await storage.put(req.identity.sub,req.params.id,p.data.character,p.data.revision,p.data.deleted)})}catch(e){if(e.status===409)return res.status(409).json({error:e.message});throw e}
});
}