Skip to content
Clean Web API
Lean Mean Clean Apps

Five templates, one search box. Everything in the docs is in here, including the bits we hoped you'd skim.

Try one of these

Results say which template they came from, so you won't end up reading about Lambda when you wanted GraphQL. Again.

Run it locally

There are two ready-made environments. local is for dotnet run: sample data on, logs to the console. docker is for Docker Compose: sample data on, logs to Seq, database on a volume. Both are for your machine. Neither is for production, which is why neither is the default.

Terminal window
dotnet run --project ./src/Presentation

launchSettings.json sets the environment to local and listens on http://localhost:8080 and https://localhost:8081.

Where What
/scalar The Scalar API reference, built from the OpenAPI document
/openapi/v1.json The OpenAPI document itself
/health/live Answers 200 while the process is up
/health/ready Answers 200 when the database can be reached
/api/version The version stamped into the build
http://localhost:5341 Seq, when running with Docker Compose

The health endpoints answer without a token even when authentication is on, so a load balancer never needs to log in.

The sample data uses a fixed seed, so these ids are the same on every machine. See the endpoint reference for every parameter and response.

Terminal window
# Search movies, two at a time
curl "http://localhost:8080/api/movies?query=global&limit=2"
# One movie, with its reviews
curl "http://localhost:8080/api/movies/e159975e-4e6a-1ffd-713e-1eb9d8d4a593"
# Write a review
curl -X POST "http://localhost:8080/api/reviews" -H "Content-Type: application/json" \
-d '{"authorId":"01fa8b58-05d2-abd4-e55c-2633222dd0a5","movieId":"e159975e-4e6a-1ffd-713e-1eb9d8d4a593","stars":5}'
Terminal window
dotnet test

Each test class builds its own in-memory SQLite database from the migrations and the same fixed seed. No test can change what another one sees, and nothing touches movie-reviews.db.

The Dockerfile has a stage for each job, so you can build only what you need.

Stage What it does
build Restores and builds the solution
test Runs every test with coverage
coverage Exports the coverage report to your machine
publish Publishes the Presentation project
run The image you deploy
Terminal window
docker build . --target coverage --output type=local,dest=out
Terminal window
docker build . --target run --tag acme-movies:latest \
--build-arg VERSION_PREFIX=1.2.3 --build-arg VERSION_SUFFIX=beta

GET /api/version then reports 1.2.3-beta and the commit it was built from.