REST API for billiards league management
A fully documented REST API for managing a billiards league โ players, matches, standings, and win/loss records. Built to showcase C#/.NET backend engineering, REST API design, Entity Framework, PostgreSQL integration, and containerized deployment.
Most billiards league management is done in spreadsheets or basic apps that don't enforce the domain rules that make league play meaningful โ handicap races, active player management, computed standings.
A domain-driven REST API that validates billiards-specific business rules at the API level. Winner's score must equal their race. Loser's score must be below their race. Forfeits auto-set the winner's score. Standings are computed on the fly from match results โ never stored.

Full API surface documented via Swagger โ Matches, Players, and Standings controllers

Recording a match with domain validation โ winner score, race length, and game type enforced

Computed standings returned on the fly โ win percentage, streak, and rack efficiency
Primary language from 7+ years at Net Health
ORM for clean database interaction without raw SQL
Production-grade database in Docker container
Single command deployment with docker-compose up
Auto-generated API documentation
Standings computed on the fly rather than stored โ always accurate, better for testing
Soft delete for players (IsActive flag) because league players go inactive and return
Hard delete for matches โ an incorrectly recorded match should simply not exist
DeleteBehavior.Restrict on all three Player foreign keys to prevent cascade delete conflicts
Email normalized to lowercase on save โ consistent data storage over runtime comparisons
Related Project
break-and-verify