perf(api): eliminate 3 N+1 query patterns

- timeline-holiday-load-support: deduplicate getResolvedCalendarHolidays
  by location key so resources sharing the same country/state/city resolve
  holidays once instead of per-resource
- rate-card-lookup: add lookupRatesBatch that loads rate card lines once
  and scores locally per demand line, replacing per-line DB round-trips
  in estimate-demand-lines autoFillDemandLineRates
- config-readmodels: include _count in utilization-category list query
  instead of calling getById per category for project counts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-11 22:59:45 +02:00
parent dd2c9c0f88
commit 5a4836d292
8 changed files with 727 additions and 571 deletions
@@ -14,9 +14,11 @@ import {
unsetDefaultUtilizationCategory,
} from "./utilization-category-support.js";
export const UtilizationCategoryListInputSchema = z.object({
isActive: z.boolean().optional(),
}).optional();
export const UtilizationCategoryListInputSchema = z
.object({
isActive: z.boolean().optional(),
})
.optional();
export const UtilizationCategoryByIdInputSchema = z.object({
id: z.string(),
@@ -38,6 +40,7 @@ export async function listUtilizationCategories(
return ctx.db.utilizationCategory.findMany({
where: buildUtilizationCategoryListWhere(input ?? {}),
orderBy: { sortOrder: "asc" },
include: { _count: { select: { projects: true } } },
});
}