Piattaforma fantasy basketball (NBA + WNBA) con salary cap, contratti pluriennali, dead cap, aste live, draft e scoring head-to-head settimanale.
| Componente | Stack | Dove |
|---|---|---|
| Backend API + realtime | ASP.NET Core 8, EF Core 8 (PostgreSQL), SignalR (Redis backplane), MediatR | root del repo |
| Frontend web | React 19, Vite, TanStack Query, Tailwind | client/ |
| Mobile (Android) | Expo + WebView wrapper del sito | mobile/ |
| Proxy NBA stats | Cloudflare Worker | cloudflare-worker/ |
| Infra produzione | docker-compose + Caddy + Loki/Grafana/Promtail | deploy/ |
| Test backend | xUnit + Testcontainers (Postgres 16 + Redis) | FantasyBasket.API.Tests/ |
| Load test | bot SignalR + REST | loadtest/ |
Prerequisiti: .NET 8 SDK, Node 20+, Docker Desktop (per i test di integrazione),
un'istanza Postgres e una Redis (vanno bene quelle del compose in deploy/).
# Backend (porta 5249)
dotnet user-secrets set "Jwt:Key" "<openssl rand -base64 48>"
# ...vedi appsettings.template.json per la lista completa delle chiavi richieste
dotnet run --project FantasyBasket.API.csproj
# Frontend (porta 5173)
cd client && npm install && npm run dev
# Test (richiede Docker per i Testcontainers)
dotnet test
# solo unit (senza Docker):
dotnet test --filter "FullyQualifiedName~Unit"La configurazione segue appsettings.template.json: i segreti vivono in
user-secrets (dev) o env var (prod, Section__Key). appsettings.json e
appsettings.Development.json sono gitignored.
Le convenzioni operative complete sono in CLAUDE.md (vale per umani e AI assistant). Le tre più violate dai nuovi arrivati:
- Errori: mai stringhe raw — sempre costanti da
Common/ErrorCodes.cs, con traduzione inclient/src/locales/{en,it}.tssottoapi_errors(gate CIcheck-i18nstrict). - Eventi SignalR: nomi camelCase, un solo listener per evento lato client.
- Migrazioni EF: generate e applicate manualmente dall'operatore
(
dotnet ef migrations add ...), mai automatiche in deploy salvoEF_AUTO_MIGRATE=trueesplicito sul deploy che le contiene.
develop = staging, master = produzione (backend su VM Oracle via
deploy/docker-compose.yml, frontend su Cloudflare Pages). Release = merge
develop → master (merge commit, non squash). La pipeline è in
.github/workflows/ci.yml; il deploy sul VM è health-gated.
Backup DB: deploy/backup.sh (cron sulla VM) + restore documentato in
deploy/restore.sh.