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