115 lines
2.9 KiB
TypeScript
115 lines
2.9 KiB
TypeScript
|
|
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<AdminDiagnosticsDto> {
|
||
|
|
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),
|
||
|
|
};
|
||
|
|
}
|