import { Router } from 'express'; import { z } from 'zod'; import * as repo from '../../db/repos/links.js'; import { validate } from '../validate.js'; import { requireWrite } from '../cap.js'; import { asyncWrap } from '../errors.js'; const ENTITY_TYPES = ['space','project','task','page','ref','resource','source_doc','conversation']; const createSchema = z.object({ from_type: z.enum(ENTITY_TYPES), from_id: z.string().uuid(), to_type: z.enum(ENTITY_TYPES), to_id: z.string().uuid(), relation: z.string().min(1).max(64).optional() }); const endpointParams = z.object({ type: z.enum(ENTITY_TYPES), id: z.string().uuid() }); const idParams = z.object({ id: z.string().uuid() }); export const router = Router(); router.post('/', requireWrite('link'), validate({ body: createSchema }), asyncWrap(async (req, res) => { const { from_type, from_id, to_type, to_id, relation } = req.body; const row = await repo.create(from_type, from_id, to_type, to_id, relation); res.status(201).json(row); }) ); router.get('/from/:type/:id', validate({ params: endpointParams }), asyncWrap(async (req, res) => { res.json(await repo.listFrom(req.params.type, req.params.id)); }) ); router.get('/to/:type/:id', validate({ params: endpointParams }), asyncWrap(async (req, res) => { res.json(await repo.listTo(req.params.type, req.params.id)); }) ); router.delete('/:id', requireWrite('link'), validate({ params: idParams }), asyncWrap(async (req, res) => { await repo.remove(req.params.id); res.status(204).end(); }) );