Add database models and SQLAlchemy setup for todo app

- Created app directory structure with db, models, and schemas modules
- Added SQLAlchemy Base class in app/db/base.py to prevent circular imports
- Implemented database session setup with SQLite configuration
- Created Todo model with id, title, description, completed, created_at, updated_at fields
- Added Pydantic schemas for TodoCreate, TodoUpdate, and TodoResponse
- Added requirements.txt with FastAPI, SQLAlchemy, and other dependencies
This commit is contained in:
Automated Action 2025-06-19 00:41:31 +00:00
parent 2296c92232
commit e35edd0f6a
11 changed files with 128 additions and 0 deletions

1
app/__init__.py Normal file
View File

@ -0,0 +1 @@
# App package

1
app/api/__init__.py Normal file
View File

@ -0,0 +1 @@
# API package

1
app/db/__init__.py Normal file
View File

@ -0,0 +1 @@
# Database package

3
app/db/base.py Normal file
View File

@ -0,0 +1,3 @@
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

30
app/db/session.py Normal file
View File

@ -0,0 +1,30 @@
from pathlib import Path
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from .base import Base
# Database setup with specified path format
DB_DIR = Path("/app") / "storage" / "db"
DB_DIR.mkdir(parents=True, exist_ok=True)
SQLALCHEMY_DATABASE_URL = f"sqlite:///{DB_DIR}/db.sqlite"
engine = create_engine(
SQLALCHEMY_DATABASE_URL,
connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# Create all tables
def create_tables():
Base.metadata.create_all(bind=engine)
# Dependency to get database session
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

1
app/models/__init__.py Normal file
View File

@ -0,0 +1 @@
# Models package

15
app/models/todo.py Normal file
View File

@ -0,0 +1,15 @@
from datetime import datetime
from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime
from app.db.base import Base
class Todo(Base):
__tablename__ = "todos"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
title = Column(String(200), nullable=False, index=True)
description = Column(Text, nullable=True)
completed = Column(Boolean, default=False, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

0
app/schemas/__init__.py Normal file
View File

28
app/schemas/todo.py Normal file
View File

@ -0,0 +1,28 @@
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
class TodoBase(BaseModel):
title: str
description: Optional[str] = None
class TodoCreate(TodoBase):
pass
class TodoUpdate(BaseModel):
title: Optional[str] = None
description: Optional[str] = None
completed: Optional[bool] = None
class TodoResponse(TodoBase):
id: int
completed: bool
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True

42
main.py Normal file
View File

@ -0,0 +1,42 @@
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
app = FastAPI(
title="Todo App API",
description="A simple todo application API",
version="1.0.0",
openapi_url="/openapi.json"
)
# Configure CORS to allow all origins
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def root():
"""Base URL endpoint returning project information"""
return {
"title": "Todo App API",
"documentation": "/docs",
"redoc": "/redoc",
"health": "/health",
"openapi": "/openapi.json"
}
@app.get("/health")
async def health_check():
"""Health check endpoint"""
return {"status": "healthy", "message": "Todo App API is running"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)

6
requirements.txt Normal file
View File

@ -0,0 +1,6 @@
fastapi==0.104.1
uvicorn[standard]==0.24.0
sqlalchemy==2.0.23
pydantic==2.5.0
python-multipart==0.0.6
ruff==0.1.6