85 lines
2.2 KiB
TypeScript
85 lines
2.2 KiB
TypeScript
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);
|
|
}
|
|
});
|