
Added due date field documentation to Todo model and included usage examples for creating todos with due dates and timezone handling.
167 lines
5.0 KiB
Markdown
167 lines
5.0 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)
|
|
- 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 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 filtering by category, priority, completion status, and search)
|
|
- `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
|
|
|
|
### 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
|
|
│ ├── 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)
|
|
- `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)
|
|
|
|
### 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"
|
|
```
|