metis-desk/modules/assets/src/api/infrastructure/persistence/network-share-publication-read.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

51 lines
1.6 KiB
TypeScript

import type { Sequelize, Transaction } from "sequelize";
import { QueryTypes } from "sequelize";
import { NetworkSharePublicationSchema } from "../../../common/network-share-publications";
/** Proyección keyset compartida por consultas especializadas y proveedor tipado. */
export async function readPublicationPage(
database: Sequelize,
companyId: string,
selection: {
assetId?: string;
resourceId?: string;
includeEnded: boolean;
afterId?: string;
pageSize: number;
},
transaction?: Transaction
) {
const conditions = ["p.companyId=:companyId"];
if (selection.assetId) {
conditions.push("p.assetId=:assetId");
}
if (selection.resourceId) {
conditions.push("p.resourceId=:resourceId");
}
if (!selection.includeEnded) {
conditions.push("p.endedAt IS NULL");
}
if (selection.afterId) {
conditions.push("p.id>:afterId");
}
const rows = await database.query(
`SELECT p.id,p.companyId,p.assetId,p.resourceId,p.predecessorId,p.startedAt,p.startedBy,p.endedAt,p.endedBy FROM asset_network_share_publications p WHERE ${conditions.join(" AND ")} ORDER BY p.id ASC LIMIT :limit`,
{
replacements: {
companyId,
assetId: selection.assetId ?? null,
resourceId: selection.resourceId ?? null,
afterId: selection.afterId ?? null,
limit: selection.pageSize + 1,
},
type: QueryTypes.SELECT,
...(transaction ? { transaction } : {}),
}
);
const parsed = rows.map((row) => NetworkSharePublicationSchema.parse(row));
return { rows: parsed.slice(0, selection.pageSize), hasMore: parsed.length > selection.pageSize };
}