major-domo-database/CLAUDE.md
Cal Corum 99f501e748 Fix custom command creator POST validation (v2.3.1)
Changed CustomCommandCreatorModel.id from required `int` to `Optional[int] = None`
to allow POST requests to create new creators without specifying an ID (database
auto-generates it).

Bug: Users couldn't create custom commands with /new-cc - API returned 422 error
"Field required" for missing id field.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-13 16:31:47 -06:00

6.2 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

This is the Database API component of the Major Domo system - a FastAPI backend serving data for a Strat-o-Matic Baseball Association (SBA) fantasy league. It provides REST endpoints for Discord bots and web frontends to access league data.

Development Commands

Local Development

  • Dev server location: 10.10.0.42
  • Start all services: docker-compose up (PostgreSQL + API + Adminer)
  • Build and start: docker-compose up --build (rebuilds image with latest changes)
  • Sync from production: docker-compose --profile sync up sync-prod (one-time production data sync)
  • Database migrations: python migrations.py (uses files in root directory)
  • Database admin interface: Available at http://10.10.0.42:8080 (Adminer)

Docker Deployment

  • Production deployment: Uses same docker-compose up workflow
  • Production server access: ssh akamai then cd container-data/sba-database
  • Manual build: docker build -f Dockerfile -t major-domo-database .

Architecture

Application Structure

app/
├── main.py              # FastAPI application setup, router registration
├── db_engine.py         # Peewee ORM models, database configuration
├── dependencies.py      # Authentication, error handling decorators
└── routers_v3/         # API endpoints organized by domain
    ├── awards.py        # League awards and recognition endpoints
    ├── battingstats.py  # Batting statistics (seasonal and career)
    ├── current.py       # Current season/week status and configuration
    ├── custom_commands.py # Custom command creation and management
    ├── decisions.py     # Strat-o-Matic game decisions and choices
    ├── divisions.py     # League division information
    ├── draftdata.py     # Draft status and current pick tracking
    ├── draftlist.py     # Team draft priority lists and rankings
    ├── draftpicks.py    # Draft pick ownership and trading
    ├── fieldingstats.py # Fielding statistics (seasonal and career)
    ├── injuries.py      # Player injury tracking and management
    ├── keepers.py       # Keeper selection and management
    ├── managers.py      # Team manager information and profiles
    ├── pitchingstats.py # Pitching statistics (seasonal and career)
    ├── players.py       # Player information, rosters, and statistics
    ├── results.py       # Game results and outcomes
    ├── sbaplayers.py    # SBA player pool and eligibility
    ├── schedules.py     # Game scheduling and matchups
    ├── standings.py     # League standings and team records
    ├── stratgame.py     # Strat-o-Matic game data and simulation
    ├── stratplay.py     # Individual play-by-play data and analysis
    ├── teams.py         # Team data, rosters, and organization
    ├── transactions.py  # Player transactions (trades, waivers, etc.)
    └── views.py         # Database views and aggregated statistics

Database Configuration

  • Database: PostgreSQL via PooledPostgresqlDatabase (production and development)
  • ORM: Peewee with model-based schema definition
  • Migrations: SQL migration files in migrations/ directory
  • Table Naming: Peewee models must specify Meta.table_name to match PostgreSQL table names

Authentication & Error Handling

  • Authentication: OAuth2 bearer token validation via API_TOKEN environment variable
  • Error Handling: @handle_db_errors decorator provides comprehensive logging, rollback, and HTTP error responses
  • Logging: Rotating file handler (/tmp/sba-database.log, 8MB max, 5 backups)

API Design Patterns

  • Routers: Domain-based organization under /api/v3/ prefix
  • Models: Pydantic models for request/response validation
  • Database Access: Direct Peewee ORM queries with automatic connection pooling
  • Response Format: Consistent JSON with proper HTTP status codes
  • POST Requests: Pydantic models for POST (create) endpoints should use Optional[int] = None for id fields since the database auto-generates IDs

Environment Variables

Required:

  • API_TOKEN - Authentication token for API access

PostgreSQL Configuration (required):

  • POSTGRES_HOST - PostgreSQL server hostname (default: 10.10.0.42)
  • POSTGRES_DB - Database name (default: sba_master)
  • POSTGRES_USER - Database user (default: sba_admin)
  • POSTGRES_PASSWORD - Database password
  • POSTGRES_PORT - Database port (default: 5432)

Optional:

  • LOG_LEVEL - INFO or WARNING (defaults to WARNING)
  • PRIVATE_IN_SCHEMA - Include private endpoints in OpenAPI schema

Key Data Models

  • Current: Season/week status, trade deadlines, playoff schedule
  • Player/Team: Core entities with seasonal and career statistics
  • Statistics: Separate models for batting, pitching, fielding (seasonal + career)
  • Draft System: Draft picks, draft lists, keeper selections
  • Game Data: Schedules, results, Strat-o-Matic play-by-play data
  • League Management: Standings, transactions, injuries, decisions
  • Custom Commands: User-created Discord bot commands with creator tracking and usage statistics
  • Help Commands: Static help text for Discord bot commands

Testing & Quality

  • No formal test framework currently configured
  • API Documentation: Auto-generated OpenAPI/Swagger at /api/docs
  • Health Checks: Built into Docker configuration
  • Database Integrity: Transaction rollback on errors via decorator

Important Notes

  • All active development occurs in the /app directory
  • Root directory files (main.py, db_engine.py, etc.) are legacy and not in use
  • PostgreSQL migration completed: System now uses PostgreSQL exclusively (no SQLite fallback)
  • Database migrations are SQL files in migrations/ directory, applied manually via psql
  • Authentication is required for all endpoints except documentation and public read endpoints
  • Peewee Models: Always specify Meta.table_name to match PostgreSQL naming conventions
  • Custom Commands: Fully functional with creator tracking, usage statistics, and Discord bot integration