Source: data_layer/README.md
Data Layer Architecture
Overview
This data layer provides a unified schema management system for AltSportsData, with version control and multi-format generation.
Structure
data_layer/
βββ output_styles/
β βββ schemas/
β βββ domains/
β βββ v1/ β Version 1 (Current)
β β βββ python/ β SOURCE OF TRUTH (Canonical)
β β β βββ base/ # Core models
β β β βββ sports/ # Sports domain
β β β βββ leagues/ # League domain
β β β βββ business/ # Business domain
β β β βββ api/ # API models
β β β βββ workflows/ # Workflows
β β β βββ ml/ # ML models
β β β βββ generators/ # Schema generators
β β β βββ tests/ # Tests
β β β
β β βββ typescript/ β GENERATED from python/
β β βββ json/ β Existing JSON schemas
β β βββ drizzle/ β Existing Drizzle ORM
β β βββ graphql/ β Can generate from python/
β β βββ neo4j/ β Existing Neo4j schemas
β β βββ converters/ β Schema converters
β β
β βββ v2/ β Version 2 (Future)
β βββ python/ # V2 models (when needed)
β βββ typescript/ # Generated TypeScript
β βββ ...Single Source of Truth
v1/python/ is the canonical schema source:
- All models defined in Python/Pydantic
- Other formats generated automatically
- Version controlled alongside code
Generation Workflow
1. Define Models (Python/Pydantic)
# v1/python/leagues/questionnaires.py
from pydantic import Field
from ..base import BaseModel
class LeagueQuestionnaire(BaseModel):
league_name: str = Field(..., description="League name")
# ... more fields2. Generate to Any Format
cd data_layer/output_styles/schemas/domains/v1/python
# Generate TypeScript to v1
python generate_schemas.py --format typescript --output ../typescript/
# Generate SQL to v1
python generate_schemas.py --format sql --output ../sql/
# Generate GraphQL to v1
python generate_schemas.py --format graphql --output ../graphql/
# Generate all formats
python generate_schemas.py --all3. Use Generated Schemas
Backend (Python):
from apps.backend.core.models import LeagueQuestionnaire
# Imports from v1/python automaticallyFrontend (TypeScript):
import { LeagueQuestionnaire } from '@/types/generated/leagues';
// Uses generated TypeScript from v1/typescript/Version Management
v1 (Current - Production)
- Stable API
- Used by all current applications
- Generate from
v1/python/
v2 (Future - Next Generation)
- Breaking changes
- New features
- Gradual migration path
Migration Path
v1/python/ v2/python/
β β
v1/typescript/ β β β v2/typescript/
β β
Frontend v1 Frontend v2Generator Outputs
From v1/python/, you can generate:
| Format | Output Location | Status |
|---|---|---|
| TypeScript + Zod | v1/typescript/ | β Working |
| JSON Schema | v1/json/ | Ready |
| SQL (PostgreSQL) | v1/sql/ | Stub |
| GraphQL | v1/graphql/ | Stub |
| Drizzle ORM | v1/drizzle/ | Can integrate |
| Prisma | v1/prisma/ | Future |
Integration Points
Backend Integration
# apps/backend/core/models/__init__.py
from data_layer.output_styles.schemas.domains.v1.python.base import BaseModelFrontend Integration
// tsconfig.json
{
"compilerOptions": {
"paths": {
"@/types/generated/*": ["./data_layer/output_styles/schemas/domains/v1/typescript/*"]
}
}
}Database Integration
// Use generated Drizzle schemas
import { leagueTable } from '@/data_layer/schemas/domains/v1/drizzle/leagues';Best Practices
1. Always Define in Python First
# β DO: Define in v1/python/
class NewModel(BaseModel):
field: str
# β DON'T: Manually create TypeScript
interface NewModel { ... } // Will be overwritten by generator2. Generate After Changes
# After modifying Python models
python generate_schemas.py --all3. Version Breaking Changes
# For breaking changes, use v2
cp -r v1/python/ v2/python/
# Make breaking changes in v2/python/
# Generate v2 schemas separately4. Test Generated Schemas
# Test Python models
pytest v1/python/tests/
# Test generated TypeScript
npm testQuick Commands
# Navigate to Python schemas
cd data_layer/output_styles/schemas/domains/v1/python
# Preview migration from old models
python migrate_models.py --dry-run
# Execute migration
python migrate_models.py
# Generate all schemas
python generate_schemas.py --all
# Test everything
python quick_test.py
# Generate specific format
python generate_schemas.py --format typescript
python generate_schemas.py --format sql
python generate_schemas.py --format graphqlBenefits
β Single Source of Truth - Define once in Python β Version Control - v1, v2, etc. for breaking changes β Auto-Generation - TypeScript, SQL, GraphQL from Python β Type Safety - Strong typing everywhere β No Drift - Frontend/backend always in sync β Easy Migration - Clear path from v1 to v2
Next Steps
-
Migrate existing models from
apps/backend/core/models_backup/:cd v1/python python migrate_models.py --dry-run # Preview python migrate_models.py # Execute -
Generate all formats:
python generate_schemas.py --all -
Update imports in backend/frontend to use generated schemas
-
Set up CI/CD to auto-generate schemas on commit