metis-desk/modules/assets/src/api/infrastructure/http/network-share-publication.routes.ts
David fe6ec361b7 feat(companies): vincular identidades locales a activos y añadir cuenta de acceso a FolderMapping
- Asociar entornos locales con activos y conservar su trazabilidad.
- Registrar la cuenta de acceso del mapeo con historial de cambios.
- Calcular cobertura documental específica sin alterar la cobertura general.
- Añadir migraciones, validaciones, endpoints protegidos, pruebas y documentación.
2026-10-21 11:25:23 +02:00

79 lines
2.2 KiB
TypeScript

import type { Application, Request, RequestHandler, Response } from "express";
import { Router } from "express";
import { z } from "zod/v4";
import type { NetworkSharePublicationUseCases } from "../../application/network-share-publication.use-cases";
const ScopeSchema = z.strictObject({ companyId: z.uuid() });
function fail(response: Response, code: string) {
response
.status(code === "INVALID_REQUEST" ? 400 : code.endsWith("NOT_FOUND") ? 404 : 409)
.json({ code, requestId: response.getHeader("x-request-id") });
}
function scope(request: Request) {
return z.object({ companyId: z.uuid(), userId: z.uuid() }).safeParse({
...request.params,
userId: z
.object({ userId: z.uuid() })
.safeParse("session" in request ? request.session : undefined).data?.userId,
});
}
export function registerNetworkSharePublicationRoutes(
app: Application,
service: NetworkSharePublicationUseCases,
authenticate: RequestHandler
) {
const router = Router();
router.post("/:companyId", (request, response, next) => {
const context = scope(request);
if (
!(
context.success &&
ScopeSchema.safeParse(request.params).success &&
z.strictObject({}).safeParse(request.query).success
)
) {
fail(response, "INVALID_REQUEST");
return;
}
service
.execute(context.data.companyId, request.body, context.data.userId)
.then((result) => {
if (!result.isSuccess) {
fail(response, result.error.code);
return;
}
response.json({ publication: result.data.toPrimitive() });
})
.catch(next);
});
router.get("/:companyId", (request, response, next) => {
const context = scope(request);
if (!(context.success && ScopeSchema.safeParse(request.params).success)) {
fail(response, "INVALID_REQUEST");
return;
}
service
.list(context.data.companyId, request.query, context.data.userId)
.then((result) => {
if (!result.isSuccess) {
fail(response, result.error.code);
return;
}
response.json(result.data);
})
.catch(next);
});
app.use("/api/asset-network-share-publications", authenticate, router);
}