import type { AdminDiagnosticsDto, AuditEventDto } from "@mrp/shared"; import fs from "node:fs/promises"; import { env } from "../../config/env.js"; import { paths } from "../../config/paths.js"; import { prisma } from "../../lib/prisma.js"; function mapAuditEvent(record: { id: string; actorId: string | null; entityType: string; entityId: string | null; action: string; summary: string; metadataJson: string; createdAt: Date; actor: { firstName: string; lastName: string; } | null; }): AuditEventDto { return { id: record.id, actorId: record.actorId, actorName: record.actor ? `${record.actor.firstName} ${record.actor.lastName}`.trim() : null, entityType: record.entityType, entityId: record.entityId, action: record.action, summary: record.summary, metadataJson: record.metadataJson, createdAt: record.createdAt.toISOString(), }; } export async function getAdminDiagnostics(): Promise { const [ companyProfile, userCount, activeUserCount, roleCount, permissionCount, customerCount, vendorCount, inventoryItemCount, warehouseCount, workOrderCount, projectCount, purchaseOrderCount, salesQuoteCount, salesOrderCount, shipmentCount, attachmentCount, auditEventCount, recentAuditEvents, ] = await Promise.all([ prisma.companyProfile.findFirst({ where: { isActive: true }, select: { id: true } }), prisma.user.count(), prisma.user.count({ where: { isActive: true } }), prisma.role.count(), prisma.permission.count(), prisma.customer.count(), prisma.vendor.count(), prisma.inventoryItem.count(), prisma.warehouse.count(), prisma.workOrder.count(), prisma.project.count(), prisma.purchaseOrder.count(), prisma.salesQuote.count(), prisma.salesOrder.count(), prisma.shipment.count(), prisma.fileAttachment.count(), prisma.auditEvent.count(), prisma.auditEvent.findMany({ include: { actor: { select: { firstName: true, lastName: true, }, }, }, orderBy: [{ createdAt: "desc" }], take: 25, }), ]); await Promise.all([fs.access(paths.dataDir), fs.access(paths.uploadsDir)]); return { serverTime: new Date().toISOString(), nodeVersion: process.version, databaseUrl: env.DATABASE_URL, dataDir: paths.dataDir, uploadsDir: paths.uploadsDir, clientOrigin: env.CLIENT_ORIGIN, companyProfilePresent: Boolean(companyProfile), userCount, activeUserCount, roleCount, permissionCount, customerCount, vendorCount, inventoryItemCount, warehouseCount, workOrderCount, projectCount, purchaseOrderCount, salesDocumentCount: salesQuoteCount + salesOrderCount, shipmentCount, attachmentCount, auditEventCount, recentAuditEvents: recentAuditEvents.map(mapAuditEvent), }; }