
- Add enhanced due date filtering to get_todos function with support for "today", "this_week", "next_week" - Add overdue filtering parameter with timezone-aware comparisons - Add sorting by due_date with null values at end - Add get_overdue_todos function for retrieving overdue todos - Add get_todos_due_soon function for todos due within next N days (default 7) - Add get_todos_by_date_range function for custom date range filtering - Create comprehensive date utilities in app/utils/date_utils.py with timezone support - Add project_id and tag_ids support to TodoCreate and TodoUpdate schemas - Include efficient database indexing for due_date queries - Use SQLAlchemy timezone-aware datetime filtering throughout - Add proper overdue detection logic with timezone handling
Simple Todo API
A simple todo application built with FastAPI and SQLite.
Features
- Create, read, update, and delete todos
- Category management system for organizing todos
- Priority levels for todos (low, medium, high)
- Search and filtering by category, priority, and completion status
- SQLite database with SQLAlchemy ORM
- Database migrations with Alembic
- FastAPI with automatic OpenAPI documentation
- CORS enabled for all origins
- Health check endpoint
API Endpoints
General
GET /
- Root endpoint with basic informationGET /health
- Health check endpointGET /docs
- Interactive API documentation (Swagger UI)GET /redoc
- Alternative API documentation
Todos
GET /api/v1/todos
- Get all todos (with filtering by category, priority, completion status, and search)POST /api/v1/todos
- Create a new todoGET /api/v1/todos/{todo_id}
- Get a specific todoPUT /api/v1/todos/{todo_id}
- Update a specific todoDELETE /api/v1/todos/{todo_id}
- Delete a specific todo
Categories
GET /api/v1/categories
- Get all categoriesPOST /api/v1/categories
- Create a new categoryGET /api/v1/categories/{category_id}
- Get a specific categoryPUT /api/v1/categories/{category_id}
- Update a specific categoryDELETE /api/v1/categories/{category_id}
- Delete a specific category
Installation
- Install the dependencies:
pip install -r requirements.txt
- Run database migrations:
alembic upgrade head
- Start the application:
uvicorn main:app --reload
The API will be available at http://localhost:8000
Project Structure
├── app/
│ ├── api/
│ │ └── v1/
│ │ ├── __init__.py
│ │ ├── todos.py
│ │ └── categories.py
│ ├── crud/
│ │ ├── __init__.py
│ │ ├── todo.py
│ │ └── category.py
│ ├── db/
│ │ ├── __init__.py
│ │ ├── base.py
│ │ └── session.py
│ ├── models/
│ │ ├── __init__.py
│ │ ├── todo.py
│ │ └── category.py
│ ├── schemas/
│ │ ├── __init__.py
│ │ ├── todo.py
│ │ └── category.py
│ └── __init__.py
├── alembic/
│ ├── versions/
│ │ ├── 001_initial_todo_table.py
│ │ ├── 002_add_priority_field.py
│ │ └── 003_add_categories.py
│ ├── env.py
│ └── script.py.mako
├── alembic.ini
├── main.py
├── requirements.txt
└── README.md
Database
The application uses SQLite database stored at /app/storage/db/db.sqlite
. The database schema is managed using Alembic migrations.
Models
Todo Model
Each todo has the following fields:
id
: Unique identifier (auto-generated)title
: Todo title (required, max 200 characters)description
: Todo description (optional, max 500 characters)completed
: Completion status (boolean, default: false)priority
: Priority level (low, medium, high, default: medium)category_id
: Reference to category (optional)created_at
: Creation timestampupdated_at
: Last update timestamp
Category Model
Each category has the following fields:
id
: Unique identifier (auto-generated)name
: Category name (required, max 100 characters, unique)description
: Category description (optional, max 500 characters)color
: Color code in hex format (optional, e.g., #FF0000)created_at
: Creation timestampupdated_at
: Last update timestamp
Usage Examples
Creating a Category
curl -X POST "http://localhost:8000/api/v1/categories" \
-H "Content-Type: application/json" \
-d '{"name": "Work", "description": "Work related tasks", "color": "#FF6B6B"}'
Creating a Todo with a Category
curl -X POST "http://localhost:8000/api/v1/todos" \
-H "Content-Type: application/json" \
-d '{"title": "Review presentation", "description": "Review the quarterly presentation", "category_id": 1, "priority": "high"}'
Filtering Todos by Category
curl "http://localhost:8000/api/v1/todos?category_id=1"
Filtering Todos by Priority and Completion Status
curl "http://localhost:8000/api/v1/todos?priority=high&completed=false"
Search Todos
curl "http://localhost:8000/api/v1/todos?search=presentation"
Languages
Python
99.2%
Mako
0.8%