Skip to content

Commit 49c7f0f

Browse files
committed
feat: add Zendesk client and update documentation
Integrate Zendesk API client into ES.FX, updating related documentation for new features. Includes client authentication details, configuration options, and integration notes.
1 parent 902df04 commit 49c7f0f

264 files changed

Lines changed: 8346 additions & 1378 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CLAUDE.md

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ Markdown. Use it as the source of truth for architecture and usage instead of du
1111
- **Patterns & contributor rules** (Result/Problem, primitives, hosting, conventions, testing, *creating a
1212
library*) → [`docs/development/`](docs/development/index.md)
1313
- **Additions** (one-per-dependency helpers) → [`docs/additions/`](docs/additions/index.md)
14-
- **Ignite & Sparks** (the bootstrap, per-Spark reference, *creating a Spark*) → [`docs/ignite/`](docs/ignite/index.md)
15-
- **Feature libraries** (Transactional Outbox, Migrations) → [`docs/libraries/`](docs/libraries/index.md)
14+
- **Ignite & Sparks** (the bootstrap, configuration model, per-Spark reference, *creating a Spark*) →
15+
[`docs/ignite/`](docs/ignite/index.md)
16+
- **Feature libraries** (Transactional Outbox, Migrations, Zendesk API client) → [`docs/libraries/`](docs/libraries/index.md)
1617

1718
> **Keep the docs in sync.** `docs/` is a first-class deliverable, not an afterthought. When you add,
1819
> change, or remove a public API, package, Spark, or convention, update the matching `docs/` page **in the
@@ -22,12 +23,13 @@ Markdown. Use it as the source of truth for architecture and usage instead of du
2223
## Project Overview
2324

2425
ES.FX (EmberStack Framework) is a collection of reusable .NET extensions and application frameworks published
25-
as NuGet packages under the `ES.FX.*` namespace. Every project in `src/` builds a package; `tests/` and
26-
`playground/` are not published. The flagship is **Ignite**, an opinionated, "just add water" application
27-
bootstrap (OpenTelemetry, health checks, resilience, service integrations).
26+
as NuGet packages under the `ES.FX.*` namespace. The flagship is **Ignite**, an opinionated, "just add water"
27+
application bootstrap (OpenTelemetry, health checks, resilience, service integrations).
2828

29-
All library projects target **.NET 10** (`net10.0`). Some stale `bin/obj` output may still reference
30-
`net9.0` — trust the `.csproj`, not build artifacts.
29+
All library projects target **.NET 10** (`net10.0`). Nearly every project in `src/` builds a NuGet package;
30+
the exception is `ES.FX.Zendesk.MCP.Host`, a deployable ASP.NET Core MCP-server host (Docker-targeted) that
31+
opts out with `GeneratePackageOnBuild=false` / `IsPackable=false`. `tests/` and `playground/` are never
32+
published.
3133

3234
## Commands
3335

@@ -70,23 +72,30 @@ Five independently consumable layers; dependencies point downward only:
7072
handling, and graceful shutdown. → [`docs/development/hosting.md`](docs/development/hosting.md)
7173
4. **ES.FX.Ignite** (+ `ES.FX.Ignite.Spark` base + the `ES.FX.Ignite.{Provider}` **Sparks**) — the
7274
opinionated bootstrap. → [`docs/ignite/`](docs/ignite/index.md)
73-
5. **Feature libraries** — Transactional Outbox and Migrations, usable without Ignite. →
74-
[`docs/libraries/`](docs/libraries/index.md)
75+
5. **Feature libraries** — Transactional Outbox, Migrations, and the Zendesk API client, usable without
76+
Ignite. → [`docs/libraries/`](docs/libraries/index.md)
7577

7678
Ignite activates in **two phases**: `builder.Ignite(...)` on `IHostApplicationBuilder` (pre-build), then
7779
`app.Ignite()` on `IHost` (post-build). A **Spark** plugs a service into Ignite (config binding, DI
7880
registration, health checks, OpenTelemetry) and follows a fixed shape — study
7981
`src/ES.FX.Ignite.StackExchange.Redis/` as the canonical example. Full model and per-Spark reference:
8082
[`docs/ignite/`](docs/ignite/index.md) and [`docs/ignite/creating-a-spark.md`](docs/ignite/creating-a-spark.md).
8183

84+
A newer Zendesk vertical spans the layers: `ES.FX.Zendesk` (typed Zendesk API client,
85+
[`docs/libraries/zendesk-client.md`](docs/libraries/zendesk-client.md)), `ES.FX.Ignite.Zendesk` (its Spark,
86+
[`docs/ignite/sparks/zendesk.md`](docs/ignite/sparks/zendesk.md)), and `ES.FX.Zendesk.MCP.Host` (the
87+
deployable MCP server app noted above; its MCP wiring is host-inline — there is no MCP Spark package).
88+
8289
## Conventions & Build Configuration
8390

8491
Global settings live in `Directory.Build.props` and apply to every project:
8592
- **Warnings are errors** (`TreatWarningsAsErrors=true`), nullable + implicit usings enabled, XML docs
8693
generated, debug symbols embedded.
8794
- `ES.FX.*` non-test projects **auto-pack on build** (`GeneratePackageOnBuild=true`) into `.artifacts/nuget`;
8895
they embed `README.md` and `package.icon.png`, MIT-licensed, `JetBrains.Annotations` referenced privately.
89-
- Test projects (`*.Tests`) are excluded from packing and from code coverage, and emit per-project TRX loggers.
96+
Host apps opt out by setting `GeneratePackageOnBuild=false` in their `.csproj`.
97+
- Test projects (name contains `.Tests`, including `.Tests.SUT`) are excluded from packing and from code
98+
coverage, and emit per-project TRX loggers.
9099
- **Central Package Management**: all versions are pinned in `Directory.Packages.props`
91100
(`ManagePackageVersionsCentrally=true`). Add/bump versions there, never inline in a `.csproj`.
92101

@@ -102,15 +111,22 @@ Naming:
102111

103112
- **xUnit v3** (`xunit.v3`), Moq, coverlet for coverage.
104113
- Functional tests use **Testcontainers** and require a running Docker engine: MsSql, Redis, PostgreSQL,
105-
MariaDB. Shared fixtures live in `tests/ES.FX.Shared.{Db}.Tests`.
114+
MariaDB. Shared fixtures live in `tests/ES.FX.Shared.{Service}.Tests`.
106115
- `.SUT` projects are real hosts (ASP.NET etc.) started via `Microsoft.AspNetCore.Mvc.Testing` for
107116
end-to-end coverage of a Spark. Details: [`docs/development/testing.md`](docs/development/testing.md).
108117

109118
## CI/CD
110119

111-
`.github/workflows/pipeline.yaml` (single pipeline, all branches):
112-
- Installs .NET `10.x` and **GitVersion 6.x**; `dorny/paths-filter` skips build when only non-source paths change.
113-
- Versioning via `GitVersion.yaml` (`ContinuousDelivery` mode, commit-message bumps like `+semver: minor`, tag prefix `v`).
114-
- `main` builds `Release` and **publishes to GitHub Packages + NuGet.org** and cuts a GitHub release; other
115-
branches build `Debug` and don't publish. Dependabot PRs don't push packages.
116-
- Dependency bumps are grouped via `.github/dependabot.auto.yaml`; stale issues handled by `stale.yaml`.
120+
`.github/workflows/pipeline.yaml` (single pipeline, all branches, per-branch concurrency cancel):
121+
- Installs .NET `10.x` and **GitVersion 6.x**; `dorny/paths-filter` skips the build when only non-source
122+
paths change (docs-only changes don't build).
123+
- Versioning via `GitVersion.yaml`: tag prefix `v`, commit-message bumps (`+semver: major|minor|patch`);
124+
`main` defaults to a **patch** increment per merge, other branches produce prerelease versions labeled by
125+
branch.
126+
- `main` builds `Release`; all other branches build `Debug`.
127+
- **Publishing**: any direct branch push (not PRs, not Dependabot) that touches source pushes the built
128+
packages to **GitHub Packages** — so pushing a feature branch publishes prerelease packages. `main`
129+
additionally publishes to **NuGet.org** and cuts a GitHub release (`v{semver}`).
130+
- Dependabot: `.github/dependabot.yaml` groups all NuGet + GitHub Actions bumps into one daily batch;
131+
`.github/workflows/dependabot.auto.yaml` auto-approves and squash-auto-merges Dependabot PRs once checks
132+
pass. Stale issues are handled by `stale.yaml`.

docs/ignite/sparks/index.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,19 @@ Every Spark, grouped by function.
9090
| [Azure Blob Storage](./azure-storage-blobs.md) | Registers a `BlobServiceClient` for Azure Blob Storage. |
9191
| [Azure Queue Storage](./azure-storage-queues.md) | Registers a `QueueServiceClient` for Azure Queue Storage. |
9292

93+
### External services
94+
95+
| Spark | Purpose |
96+
| --- | --- |
97+
| [Zendesk](./zendesk.md) | Registers the [ES.FX.Zendesk](../../libraries/zendesk-client.md) typed `IZendeskClient` (OAuth `client_credentials`) with a live health check and tracing. |
98+
9399
### API & documentation
94100

95101
| Spark | Purpose |
96102
| --- | --- |
97103
| [API versioning](./asp-versioning.md) | Wires `Asp.Versioning` into Ignite for versioned API endpoints. |
98104
| [NSwag](./nswag.md) | Generates OpenAPI documents and UI via NSwag (adds a post-build `app.IgniteNSwag()` step). |
99105
| [Swashbuckle](./swashbuckle.md) | Generates OpenAPI documents and Swagger UI via Swashbuckle. |
100-
| [Model Context Protocol](./model-context-protocol.md) | Hosts a Model Context Protocol (MCP) server, based on the `ModelContextProtocol.AspNetCore` SDK. |
101106

102107
### Observability
103108

0 commit comments

Comments
 (0)