Add SQLAlchemy database setup with Todo model

- Add app/db/base.py with SQLAlchemy Base class
- Add app/db/session.py with SQLite database connection using absolute path
- Add app/models/todo.py with Todo model including all required fields
- Add empty __init__.py files for proper package structure
This commit is contained in:
Automated Action 2025-06-19 17:46:14 +00:00
parent f1de940fce
commit 5dca451d03
8 changed files with 122 additions and 0 deletions

0
app/__init__.py Normal file
View File

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

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

@ -0,0 +1,19 @@
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from pathlib import Path
# Database setup
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)
Base = declarative_base()

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

@ -0,0 +1,13 @@
from sqlalchemy.orm import Session
from app.db.base import SessionLocal
def get_db() -> Session:
"""
Dependency to get database session.
"""
db = SessionLocal()
try:
yield db
finally:
db.close()

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

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)
title = Column(String(255), nullable=False)
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)

65
main.py Normal file
View File

@ -0,0 +1,65 @@
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from app.api.v1.api import api_router
from app.core.config import settings
# Create FastAPI app instance
app = FastAPI(
title=settings.PROJECT_NAME,
description="A simple Todo API built with FastAPI",
version="1.0.0",
openapi_url="/openapi.json",
)
# Add CORS middleware to allow all origins
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Allow all origins
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Include API router
app.include_router(api_router, prefix="/api/v1")
@app.get("/")
async def root():
"""
Root endpoint that returns basic app information.
"""
return JSONResponse(
content={
"title": settings.PROJECT_NAME,
"description": "A simple Todo API built with FastAPI",
"version": "1.0.0",
"documentation": "/docs",
"health_check": "/health"
}
)
@app.get("/health")
async def health_check():
"""
Health check endpoint to report application status.
"""
return JSONResponse(
content={
"status": "healthy",
"service": settings.PROJECT_NAME,
"version": "1.0.0"
}
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host="0.0.0.0",
port=8000,
reload=True
)

10
requirements.txt Normal file
View File

@ -0,0 +1,10 @@
fastapi==0.104.1
uvicorn[standard]==0.24.0
sqlalchemy==2.0.23
alembic==1.12.1
pydantic==2.5.0
pydantic-settings==2.1.0
python-multipart==0.0.6
passlib[bcrypt]==1.7.4
python-jose[cryptography]==3.3.0
ruff==0.1.6