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 }; }