Query Modules

57 TanStack Query (React Query) modules in frontend/src/lib/queries/ (as of 2026-06, excluding tests and the barrel index.ts). Each module encapsulates query keys, query hooks, and mutation hooks for a specific domain entity.

Module Pattern

Every module follows the key factory + as const pattern:

export const buildingKeys = {
  all: ['buildings'] as const,
  lists: () => [...buildingKeys.all, 'list'] as const,
  list: (filters: Filters) => [...buildingKeys.lists(), filters] as const,
  details: () => [...buildingKeys.all, 'detail'] as const,
  detail: (id: string) => [...buildingKeys.details(), id] as const,
};

Central key registry: frontend/src/lib/queryKeys.ts.

Key Modules

ModuleFileEntity / Domain
buildingQueriesbuildingQueries.tsBuildings (plus buildingComponentQueries, buildingPhotosQueries, buildingRoleQueries, technologyQueries)
projectQueriesprojectQueries.tsProjects (plus scenarioQueries for Scenarios)
contactQueriescontactQueries.tsContacts (with HubSpot sync)
companyQueriescompanyQueries.tsCompanies (with HubSpot sync)
quoteQueriesquoteQueries.tsQuotes, allocations, links
invoiceQueriesinvoiceQueries.tsInvoices, line items
billing* (6 modules)billingQueries.ts, billingItemsQueries.ts, billingMailQueries.ts, billingServiceCatalogQueries.ts, billingStandaloneInvoiceQueries.ts, billingDocumentTemplates.tsBilling domain
workflowQueriesworkflowQueries.tsWorkflows (Workflow v4 board; plus scopeChangesQueries for quote-change badges/drawer)
contractor* (3 modules)contractorEngagementQueries.ts, contractorInquiriesQueries.ts, contractorTranchesQueries.tsContractor engagements, inquiries, tranches
siteProtocolQueriessiteProtocolQueries.tsSite protocols on the building dashboard (PR#1969)
fundingApplicationQueriesfundingApplicationQueries.tsFunding Applications (plus fundingProgramQueries)
documentObtainingQueriesdocumentObtainingQueries.tsDocument Obtaining (plus documentRequestQueries, documentTemplateQueries, documentTemplateLabelQueries, flowDefinitionQueries)
fileQueriesfileQueries.tsFiles (plus fileCollectionQueries)
portalQueriesportalQueries.tsPortal operations (plus portalAppointmentQueries)
authQueriesauthQueries.tsAuthentication (plus permissionQueries, roleQueries, profileQueries)
pdfQueriespdfQueries.tsPDF Templates
hubspot-querieshubspot-queries.tsHubSpot Integration (plus property-mapping and enum-mapping modules)
adminQueriesadminQueries.tsAdmin Dashboard, Users (plus entraGroupQueries, engagementTaskTemplatesAdminQueries)
dashboardQueriesdashboardQueries.tsBuilding dashboard (plus timelineQueries, revenueQueries, performanceQueries, activityQueries)
appointmentQueriesappointmentQueries.tsAppointments
sevdeskPaymentSyncQueriessevdeskPaymentSyncQueries.tssevDesk payment sync

Former leadQueries, productQueries, and formQueries modules no longer exist as standalone files; their domains are served by other modules.

Rules

  • Define in lib/queries/ — never inline useQuery/useMutation in components
  • ESLint enforced (frontend/eslint.config.js): importing useMutation from @tanstack/react-query in components//pages/ is an error (zero tolerance); inline useQuery and direct @/lib/api imports are warnings (gradual migration)
  • Key factories — all query keys built via factory functions with as const for consistent invalidation
  • Mutations invalidate related queries via onSuccess callbacks

API Client

Query hooks call the axios api instance (@/lib/api/core), which handles:

  • Base URL configuration
  • Auth via interceptors
  • Error response parsing

Direct fetch() calls are an ESLint error in components//pages/. See API Layer Pattern for the client structure.