
Added detailed documentation for new due date functionality: - Updated features list to include due date capabilities - Added specialized due date endpoints documentation - Documented query parameters for filtering and sorting - Added usage examples for all due date operations - Updated project structure to reflect current state - Added timezone support documentation - Included complex filtering examples
238 lines
7.5 KiB
Markdown
238 lines
7.5 KiB
Markdown
# 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)
|
|
- Due date functionality with timezone support
|
|
- Comprehensive filtering by category, priority, completion status, due dates, and overdue status
|
|
- Search functionality across title and description
|
|
- Specialized endpoints for overdue, due soon, and due today todos
|
|
- Sorting by due date or creation date
|
|
- Subtask management with hierarchical organization
|
|
- 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 information
|
|
- `GET /health` - Health check endpoint
|
|
- `GET /docs` - Interactive API documentation (Swagger UI)
|
|
- `GET /redoc` - Alternative API documentation
|
|
|
|
### Todos
|
|
- `GET /api/v1/todos` - Get all todos (with comprehensive filtering and sorting)
|
|
- `POST /api/v1/todos` - Create a new todo
|
|
- `GET /api/v1/todos/{todo_id}` - Get a specific todo
|
|
- `PUT /api/v1/todos/{todo_id}` - Update a specific todo
|
|
- `DELETE /api/v1/todos/{todo_id}` - Delete a specific todo
|
|
|
|
### Due Date Endpoints
|
|
- `GET /api/v1/todos/overdue` - Get all overdue todos
|
|
- `GET /api/v1/todos/due-soon` - Get todos due within next N days (default 7)
|
|
- `GET /api/v1/todos/due-today` - Get todos due today
|
|
|
|
### Subtasks
|
|
- `POST /api/v1/todos/{todo_id}/subtasks` - Create a subtask for a specific todo
|
|
- `GET /api/v1/todos/{todo_id}/subtasks` - Get all subtasks for a specific todo
|
|
- `PUT /api/v1/todos/subtasks/{subtask_id}/move` - Move a subtask to different parent or make it a main todo
|
|
|
|
### Categories
|
|
- `GET /api/v1/categories` - Get all categories
|
|
- `POST /api/v1/categories` - Create a new category
|
|
- `GET /api/v1/categories/{category_id}` - Get a specific category
|
|
- `PUT /api/v1/categories/{category_id}` - Update a specific category
|
|
- `DELETE /api/v1/categories/{category_id}` - Delete a specific category
|
|
|
|
## Installation
|
|
|
|
1. Install the dependencies:
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
2. Run database migrations:
|
|
```bash
|
|
alembic upgrade head
|
|
```
|
|
|
|
3. Start the application:
|
|
```bash
|
|
uvicorn main:app --reload
|
|
```
|
|
|
|
The API will be available at `http://localhost:8000`
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
├── app/
|
|
│ ├── api/
|
|
│ │ └── v1/
|
|
│ │ ├── __init__.py
|
|
│ │ ├── todos.py
|
|
│ │ ├── categories.py
|
|
│ │ └── projects.py
|
|
│ ├── crud/
|
|
│ │ ├── __init__.py
|
|
│ │ ├── todo.py
|
|
│ │ ├── category.py
|
|
│ │ └── project.py
|
|
│ ├── db/
|
|
│ │ ├── __init__.py
|
|
│ │ ├── base.py
|
|
│ │ └── session.py
|
|
│ ├── models/
|
|
│ │ ├── __init__.py
|
|
│ │ ├── todo.py
|
|
│ │ ├── category.py
|
|
│ │ ├── project.py
|
|
│ │ └── tag.py
|
|
│ ├── schemas/
|
|
│ │ ├── __init__.py
|
|
│ │ ├── todo.py
|
|
│ │ ├── category.py
|
|
│ │ └── project.py
|
|
│ ├── utils/
|
|
│ │ ├── __init__.py
|
|
│ │ └── date_utils.py
|
|
│ └── __init__.py
|
|
├── alembic/
|
|
│ ├── versions/
|
|
│ │ ├── 001_initial_todo_table.py
|
|
│ │ ├── 002_add_priority_field.py
|
|
│ │ ├── 003_add_categories.py
|
|
│ │ ├── 004_add_projects.py
|
|
│ │ ├── 005_add_tags.py
|
|
│ │ ├── 006_add_subtasks.py
|
|
│ │ └── 007_add_due_date.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)
|
|
- `project_id`: Reference to project (optional)
|
|
- `due_date`: Due date and time with timezone (optional)
|
|
- `parent_id`: Reference to parent todo for subtasks (optional)
|
|
- `created_at`: Creation timestamp
|
|
- `updated_at`: Last update timestamp
|
|
|
|
#### Due Date Features
|
|
- `is_overdue`: Computed property indicating if todo is past due date
|
|
- `days_until_due`: Computed property showing days until due (negative if overdue)
|
|
- `is_due_soon`: Computed property indicating if todo is due within next 7 days
|
|
- `is_due_today`: Computed property indicating if todo is due today
|
|
|
|
#### Timezone Support
|
|
All due dates are stored with timezone information (UTC). The API accepts ISO 8601 formatted datetime strings and automatically handles timezone conversion.
|
|
|
|
### 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 timestamp
|
|
- `updated_at`: Last update timestamp
|
|
|
|
## Usage Examples
|
|
|
|
### Creating a Category
|
|
```bash
|
|
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
|
|
```bash
|
|
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"}'
|
|
```
|
|
|
|
### Creating a Todo with Due Date
|
|
```bash
|
|
curl -X POST "http://localhost:8000/api/v1/todos" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"title": "Submit report", "description": "Submit quarterly report", "due_date": "2024-12-31T23:59:59Z", "priority": "high"}'
|
|
```
|
|
|
|
### Filtering Todos by Category
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos?category_id=1"
|
|
```
|
|
|
|
### Filtering Todos by Priority and Completion Status
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos?priority=high&completed=false"
|
|
```
|
|
|
|
### Search Todos
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos?search=presentation"
|
|
```
|
|
|
|
## Due Date Features
|
|
|
|
### Query Parameters for /api/v1/todos
|
|
- `overdue`: Filter overdue todos (`true`/`false`)
|
|
- `due_soon`: Filter todos due within next 7 days (`true`/`false`)
|
|
- `due_date_from`: Filter todos due after this date (ISO format)
|
|
- `due_date_to`: Filter todos due before this date (ISO format)
|
|
- `sort_by`: Sort by `due_date` or `created_at`
|
|
|
|
### Get Overdue Todos
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos/overdue"
|
|
```
|
|
|
|
### Get Todos Due Soon (next 7 days)
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos/due-soon"
|
|
```
|
|
|
|
### Get Todos Due Today
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos/due-today"
|
|
```
|
|
|
|
### Filter by Date Range
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos?due_date_from=2024-01-01T00:00:00Z&due_date_to=2024-12-31T23:59:59Z"
|
|
```
|
|
|
|
### Sort by Due Date
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos?sort_by=due_date"
|
|
```
|
|
|
|
### Complex Filtering Example
|
|
```bash
|
|
curl "http://localhost:8000/api/v1/todos?priority=high&overdue=true&sort_by=due_date&page=1&per_page=20"
|
|
```
|