feat: Implement SQLAlchemy database layer with comprehensive models
Implemented a complete database layer for persistent storage of anime series, episodes, download queue, and user sessions using SQLAlchemy ORM. Features: - 4 SQLAlchemy models: AnimeSeries, Episode, DownloadQueueItem, UserSession - Automatic timestamp tracking via TimestampMixin - Foreign key relationships with cascade deletes - Async and sync database session support - FastAPI dependency injection integration - SQLite optimizations (WAL mode, foreign keys) - Enum types for status and priority fields Models: - AnimeSeries: Series metadata with one-to-many relationships - Episode: Individual episodes linked to series - DownloadQueueItem: Queue persistence with progress tracking - UserSession: JWT session storage with expiry and revocation Database Management: - Async engine creation with aiosqlite - Session factory with proper lifecycle - Connection pooling configuration - Automatic table creation on initialization Testing: - 19 comprehensive unit tests (all passing) - In-memory SQLite for test isolation - Relationship and constraint validation - Query operation testing Documentation: - Comprehensive database section in infrastructure.md - Database package README with examples - Implementation summary document - Usage guides and troubleshooting Dependencies: - Added: sqlalchemy>=2.0.35 (Python 3.13 compatible) - Added: alembic==1.13.0 (for future migrations) - Added: aiosqlite>=0.19.0 (async SQLite driver) Files: - src/server/database/__init__.py (package exports) - src/server/database/base.py (base classes and mixins) - src/server/database/models.py (ORM models, ~435 lines) - src/server/database/connection.py (connection management) - src/server/database/migrations.py (migration placeholder) - src/server/database/README.md (package documentation) - tests/unit/test_database_models.py (19 test cases) - DATABASE_IMPLEMENTATION_SUMMARY.md (implementation summary) Closes #9 Database Layer implementation task
This commit is contained in:
42
src/server/database/__init__.py
Normal file
42
src/server/database/__init__.py
Normal file
@@ -0,0 +1,42 @@
|
||||
"""Database package for the Aniworld web application.
|
||||
|
||||
This package provides SQLAlchemy models, database connection management,
|
||||
and session handling for persistent storage.
|
||||
|
||||
Modules:
|
||||
- models: SQLAlchemy ORM models for anime series, episodes, download queue, and sessions
|
||||
- connection: Database engine and session factory configuration
|
||||
- base: Base class for all SQLAlchemy models
|
||||
|
||||
Usage:
|
||||
from src.server.database import get_db_session, init_db
|
||||
|
||||
# Initialize database on application startup
|
||||
init_db()
|
||||
|
||||
# Use in FastAPI endpoints
|
||||
@app.get("/anime")
|
||||
async def get_anime(db: AsyncSession = Depends(get_db_session)):
|
||||
result = await db.execute(select(AnimeSeries))
|
||||
return result.scalars().all()
|
||||
"""
|
||||
|
||||
from src.server.database.base import Base
|
||||
from src.server.database.connection import close_db, get_db_session, init_db
|
||||
from src.server.database.models import (
|
||||
AnimeSeries,
|
||||
DownloadQueueItem,
|
||||
Episode,
|
||||
UserSession,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
"Base",
|
||||
"get_db_session",
|
||||
"init_db",
|
||||
"close_db",
|
||||
"AnimeSeries",
|
||||
"Episode",
|
||||
"DownloadQueueItem",
|
||||
"UserSession",
|
||||
]
|
||||
Reference in New Issue
Block a user