Skip to content

Build from source

src/
├── ExchangeApi.Web/ ASP.NET Core entry point - ~52 OData controllers,
│ middleware (security headers · auth · rate limit · errors),
│ hosted services, Explorer assets, Auth/ (30 narrow policies),
│ Hosting/ (filter pushdown, rate limiter, drift probe, manifests)
├── ExchangeApi.Metadata/ Entity POCOs + EntityCatalog (the canonical inventory) +
│ reflection-driven EDM model (incl. alternate keys)
├── ExchangeApi.PowerShell/ Dual runspace pools + ICmdletExecutor + PSObjectMapper +
│ the cmdlet allowlist (the cardinal security gate)
├── ExchangeApi.Explorer/ Static SPA (the Graph-Explorer-style UI)
└── ExchangeApi.Operations/ Async job model (placeholder, see Status)
tools/
├── MetadataGen/ Cmdlet-doc parser + POCO fidelity audit/curation
├── ApiReferenceGen/ Regenerates the Markdown API catalog from the live manifests
├── LicenseSigner/ Vendor-side offline ES256 license key signer (keygen / issue / inspect)
└── WikiFreshnessRefresh/ Refreshes the Wiki freshness snapshot on a submodule bump
tests/ExchangeApi.Tests/ ~5,700 tests - WebApplicationFactory + unit + CSDL round-trip
+ Wiki-drift + param-completeness + example-coverage + concurrency
Wiki/office-docs-powershell/ Git submodule: Microsoft's own cmdlet docs (the ground truth)
Terminal window
dotnet restore ExchangeApi.slnx
dotnet build ExchangeApi.slnx
dotnet test ExchangeApi.slnx # → ~5,700 green

The test suite is the contract. It enforces that we never send a parameter the docs don’t define, never silently drop a flag, keep the CSDL valid, keep every write body grounded in the cmdlet’s real syntax, that new routes ship an example (a ratchet), and that the runspace-pool concurrency is race-free. About 91% of the count is example-file lint; about 500 tests are behavioural.