Routes Overview

164 route files in backend/src/routes/, organized by API path prefix. All routes use OpenAPIHono for automatic OpenAPI spec generation with Zod schema validation on inputs and outputs.

Route Organization

Path PrefixRoute File(s)Entity/Feature
/api/authauth.ts, entra-auth.tsAuthentication, Azure Entra
/api/usersusers.tsUsers
/api/buildingsbuildings/ (directory)Buildings, Building Components
/api/projectsprojects.tsProjects
/api/scenariosnested under projectsScenarios
/api/contactscontacts.tsContacts
/api/companiescompanies.tsCompanies
/api/leadsleads.tsLeads
/api/quotesquotes.tsQuotes
/api/invoicesinvoices.tsInvoices
/api/productsproducts.tsProducts
/api/funding-programsfunding-programs.tsFunding Programs
/api/funding-applicationsfunding-applications.tsFunding Applications
/api/document-obtainingdocument-obtaining/ (directory)Document Obtaining
/api/document-requestsdocument-requests.tsDocuments
/api/filesfiles/ (directory)Files
/api/workflowworkflow/ (directory)Workflows
/api/portalportal/ (directory)Portal
/api/adminadmin/ (directory)Admin Dashboard
/api/hubspothubspot/ (directory)HubSpot Integration
/api/formsforms.tsForms
/api/appointmentsappointments.tsAppointments
/api/departmentsdepartments.tsDepartments
/api/configconfig/ (directory)System configuration
/api/healthhealth.tsHealth checks
/api/feedbackfeedback.tsFeedback System
/api/audit-logaudit-log.tsAudit Logs
/api/pdfpdf/ (directory)PDF Templates
/api/notificationsnotifications.tsNotifications

Route Pattern

const route = createRoute({
  method: 'get',
  path: '/api/buildings/:id',
  request: { params: BuildingParamsSchema },
  responses: { 200: { content: { 'application/json': { schema: BuildingResponseSchema } } } },
});
 
app.openapi(route, async (c) => {
  const { buildings } = c.var.services;  // Destructure from DI
  const result = await buildings.getById(c.req.valid('param').id);
  return c.json(result);
});

Service Access Rule

Always destructure services from c.var.services — never alias:

// Correct
const { documentRequests, portal } = c.var.services;
 
// Wrong -- never alias
const requestService = c.var.services.documentRequests;

See Service Layer Pattern, Dependency Injection.