perf(api): eliminate N+1 queries, add query guards and missing indexes
- Notification fan-out: replace sequential for loops with Promise.all (allocation-effects, notification-broadcast, create-notification) - Public holiday batch: group resources by location combo, resolve holidays once per group, replace per-holiday delete/findFirst/create with 3 batched queries (~18K → ~5 queries) - Add take guards to unbounded findMany calls (resource-analytics: 5000, resource-marketplace: 2000, resource-capacity: 1000, chargeability-report: 2000) - auto-staffing: add select with only needed fields + take: 5000 - schema.prisma: add 5 missing indexes (ManagementLevel.groupId, Blueprint.isActive/target, Comment.parentId, Vacation.requestedById, Resource.managementLevelGroupId) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,7 @@ import {
|
||||
} from "@capakraken/engine";
|
||||
import type { PrismaClient } from "@capakraken/db";
|
||||
import type { WeekdayAvailability, PermissionKey } from "@capakraken/shared";
|
||||
import { PermissionKey as PermissionKeys } from "@capakraken/shared";
|
||||
import { PermissionKey as PermissionKeys, round1 } from "@capakraken/shared";
|
||||
import { isChargeabilityActualBooking, listAssignmentBookings } from "@capakraken/application";
|
||||
import { z } from "zod";
|
||||
import { anonymizeResources, getAnonymizationDirectory } from "../lib/anonymization.js";
|
||||
@@ -25,10 +25,6 @@ type ChargeabilityReportProcedureContext = Pick<TRPCContext, "db"> & {
|
||||
permissions?: Set<PermissionKey>;
|
||||
};
|
||||
|
||||
function round1(value: number): number {
|
||||
return Math.round(value * 10) / 10;
|
||||
}
|
||||
|
||||
function isIsoDateInMonth(isoDate: string, monthKey: string): boolean {
|
||||
return isoDate.startsWith(`${monthKey}-`);
|
||||
}
|
||||
@@ -265,6 +261,7 @@ async function queryChargeabilityReport(
|
||||
metroCity: { select: { id: true, name: true } },
|
||||
},
|
||||
orderBy: { displayName: "asc" },
|
||||
take: 2000,
|
||||
});
|
||||
|
||||
if (resources.length === 0) {
|
||||
|
||||
Reference in New Issue
Block a user