Core
Info
Architectural truth for
Corein theProjectConfigfeature. This leaf module contains the domain logic, endpoints, and messaging contracts.
Architecture
FastEndpoints
GetProjectConfigUpdateProjectConfig
Wolverine Contracts & Handlers
GetProjectConfigHandler(Handler)UpdateProjectConfigHandler(Handler)UpdateProjectConfigCommand(Message)
Domain Models
GetProjectConfigQuery
Caching
GetProjectConfigHandler serves the config/preset DTO from HybridCache under the tenant-scoped key config:{tenantId}:{projectId} (5-minute TTL). The per-user access check runs before the cache and is never cached (authorization freshness). The null/no-access result is not cached either — GetOrCreateAsync treats it as a miss each time. The cached DTO only exposes presence booleans (HasApiKey, HasGitToken, …), never secrets.
UpdateProjectConfigHandler invalidates on write: after SaveChangesAsync it removes config:{tenantId}:{projectId}, repo:{tenantId}:{projectId} (the config write may change repos and, once the async clone completes, the file listing), and project-meta:{tenantId}:{projectId} (refreshes every user’s home-page project list). The config tag also evicts the raw encrypted-presets cache entry (presets:{tenantId}:{projectId}), which deliberately reuses it.