Appendix — Backend Middleware

Source: backend/middleware/ — Full index

CEO Summary

Middleware runs on every request before the route handler. Auth, tenant resolution, rate limiting, and validation are enforced here. Order matters: tenantResolver must run before auth; auth before feature gates.

Auth & Session

FilePurpose
sessionAuth.jsrequireSessionAuth — Requires req.session.user.id. Sets req.user. 401 if missing.
mysqlSessionAuth.jsMySQL-backed session auth variant
flexibleAuth.jsrequireFlexibleAuth — Accepts session OR API key OR other auth
auth.jsBase auth utilities
authRequired.jsLegacy auth required
requireAuth.jsGeneric require auth
apiAuth.jsAPI key authentication
deviceAuth.jsDevice key auth for kiosk/mobile

Tenant & Org

FilePurpose
tenantResolver.jsResolves req.tenant from session, headers, API key, subdomain
tenant.jsTenant utilities
orgResolver.jsOrg resolution
masterAdminTenantAccess.jsMaster admin tenant access control

Authorization & Permissions

FilePurpose
authorize.jsAuthorization checks
requireRoles.jsRole-based access
requirePerm.jsPermission-based access
requireScope.jsScope-based access
roles.jsRole definitions
staffPermissions.jsStaff permission checks
featureGate.jscheckFeatureAccess(module) — Plan/feature gates

Tickets

FilePurpose
requireTicketRole.jsTicket role requirement
attachTicketRole.jsAttach ticket role to request
ticketRateLimit.jsRate limit for ticket endpoints
ticketIPWhitelist.jsIP whitelist for tickets

Rate Limiting

FilePurpose
rateLimiter.jsGeneral rate limiter (used on /api)
rateLimiterAdv.jsAdvanced rate limiting
rateLimit.jsRate limit middleware
rateByKey.jsRate limit by key

Request & Error

FilePurpose
requestId.jsAdd req.id for tracing
requestLogger.jsRequest logging
errorHandler.jsError handling
globalErrorHandler.jsGlobal error handler
notFound.js404 handler

Other

FilePurpose
validate.jsRequest validation (Joi)
idempotency.jsPOS/sync idempotency: Idempotency-Key + optional X-PPO-* headers; sets req.ppoMutation; dedupes replayed offline/bridge requests
auditLogger.jsAudit logging
security.jsSecurity headers, etc.
safeQuery.jsSafe query execution
employeeResolver.jsResolve employee from request
autoCreateStaff.jsAuto-create staff when needed
apiCompatibility.jsAPI response compatibility layer

Middleware Order (server.js)

Global order: CORS → body parsers → session → requestId → requestLogger → rateLimiter (on /api) → route-specific (tenantResolver, requireSessionAuth, etc.)