Architecture: Contracts
Overview
Digital contract signing system for Westside parents. Two repos, one shared database.
Components
| Component |
Repo |
Role |
| westside-contracts |
forgejo_admin/westside-contracts |
SvelteKit signing app (adapter-node). Renders contract, captures signature, writes to DB + MinIO. |
| basketball-api |
forgejo_admin/basketball-api |
Data owner. Player/team/parent models, email sending (Gmail SDK), outbox worker for post-sign welcome email. |
| MinIO |
cluster service |
Signature PNG storage. Key format: westside/signatures/{playerId}_{timestamp}.png |
Data Model
Token Flow
Config Merge Logic
Contract Variants
| Variant |
Teams |
Content |
| boys-travel |
17U Elite Kings, 17U Select Kings, 16U Elite Kings |
Power 32 circuit, 3 trips (Seal Beach, Vegas+Championship), recruiting, live periods |
| girls-travel |
17U Elite Queens, 16U Elite Queens |
Prep Hoops Girls, 5 events (Utah, Denver, Mesa, Mighty Five, Nike EYBL), roster flexibility, age reassignment |
| local |
17U Local Kings, 16U Local Kings |
No travel, tournaments discussed with group, simpler schedule |
Custom Deals (player overrides)
Players with non-standard terms get contract_overrides JSONB. Examples:
- Local-only on travel team: variant override to "local", or tournaments filter to local-only events
- Reduced tournament commitment: tournaments filter (e.g. ["mesa-az", "nike-vegas"])
- Custom practice schedule: practices override replaces team default
- Age/eligibility notes: note field displays as Additional Terms
Email Templates
| Template |
When |
Placeholders |
| action.html |
Contract offer (sent to parent) |
headline, body, cta_text, cta_url, footer_note |
| (inline HTML) |
Post-sign welcome (outbox worker) |
parent_name, player_name, team_name, groupme_share_url |
Deploy
arch-domain-westside-basketball — full domain model
arch-deployment-westside-basketball — deployment topology
project-westside-basketball — project page