import { Router } from 'express'; import { z } from 'zod'; import { addAppwriteProject, createTenant, listTenantProjects, listTenants, redactProject, removeTenantProject, updateTenantProject, } from './tenants.service.js'; const tenantSchema = z.object({ name: z.string().min(2), slug: z.string().optional(), }); const projectSchema = z.object({ name: z.string().min(2), endpoint: z.string().url(), projectId: z.string().optional(), apiKey: z.string().min(10), createProject: z.boolean().optional(), }); const projectUpdateSchema = projectSchema.partial(); export const tenantsRouter = Router(); tenantsRouter.post('/', async (request, response, next) => { try { const payload = tenantSchema.parse(request.body); const tenant = await createTenant(payload); response.status(201).json(tenant); } catch (error) { next(error); } }); tenantsRouter.get('/', async (_request, response, next) => { try { const tenants = await listTenants(); response.json(tenants); } catch (error) { next(error); } }); tenantsRouter.post('/:id/appwrite-project', async (request, response, next) => { try { const payload = projectSchema.parse(request.body); const project = await addAppwriteProject(request.params.id, payload); response.status(201).json(redactProject(project)); } catch (error) { next(error); } }); tenantsRouter.get('/:id/appwrite-projects', async (request, response, next) => { try { const projects = await listTenantProjects(request.params.id); response.json(projects); } catch (error) { next(error); } }); tenantsRouter.patch('/:id/appwrite-projects/:projectRef', async (request, response, next) => { try { const payload = projectUpdateSchema.parse(request.body); const project = await updateTenantProject(request.params.id, request.params.projectRef, payload); response.json(redactProject(project)); } catch (error) { next(error); } }); tenantsRouter.delete('/:id/appwrite-projects/:projectRef', async (request, response, next) => { try { await removeTenantProject(request.params.id, request.params.projectRef); response.status(204).send(); } catch (error) { next(error); } });