REST API для управління контактами, побудований з використанням FastAPI, SQLAlchemy та PostgreSQL.
- ✅ CRUD операції - повний набір операцій для управління контактами
- 🔍 Пошук контактів - за ім'ям, прізвищем або email
- 🎂 Дні народження - отримання контактів з ДН на найближчі 7 днів
- ✨ Валідація даних - використання Pydantic для перевірки вхідних даних
- 📚 Автодокументація - Swagger UI та ReDoc
- 🐳 Docker підтримка - повна контейнеризація з Docker Compose
- 🎭 Тестові дані - генерація реалістичних даних з Faker
- FastAPI - сучасний веб-фреймворк для Python
- SQLAlchemy - ORM для роботи з базою даних
- PostgreSQL - реляційна база даних
- Pydantic - валідація та серіалізація даних
- Poetry - управління залежностями
- Docker - контейнеризація
- Faker - генерація тестових даних
contacts-api/
├── app/
│ ├── __init__.py
│ ├── main.py # Основний файл додатку
│ ├── database.py # Налаштування БД
│ ├── models.py # SQLAlchemy моделі
│ ├── schemas.py # Pydantic схеми
│ ├── crud.py # CRUD операції
│ └── routers/
│ ├── __init__.py
│ └── contacts.py # API endpoints
├── scripts/
│ └── seed_data.py # Тестові дані
├── .env.example # Приклад змінних середовища
├── pyproject.toml # Poetry конфігурація
├── Dockerfile # Docker конфігурація
├── docker-compose.yml # Docker Compose
├── .gitignore # Git ignore
└── README.md # Документація
# 1. Клонувати репозиторій
git clone <repository-url>
cd contacts-api
# 2. Скопіювати змінні середовища
cp .env.example .env
# 3. Запустити всі сервіси
docker-compose up -d
# 4. Створити тестові дані
docker-compose exec web python scripts/seed_data.py
# 5. Відкрити API документацію
# http://localhost:8000/docs
# 1. Встановити Poetry
curl -sSL https://install.python-poetry.org | python3 -
# 2. Встановити залежності
poetry install
# 3. Скопіювати та налаштувати .env
cp .env.example .env
# 4. Запустити PostgreSQL
docker run --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres:15
# 5. Активувати віртуальне середовище
poetry shell
# 6. Створити тестові дані
python scripts/seed_data.py
# 7. Запустити додаток
uvicorn app.main:app --reload
Після запуску додатку документація буде доступна за адресами:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
- Основний endpoint: http://localhost:8000/api/v1/contacts/
Метод | Endpoint | Опис |
---|---|---|
POST |
/api/v1/contacts/ |
Створити новий контакт |
GET |
/api/v1/contacts/ |
Отримати список контактів |
GET |
/api/v1/contacts/{id} |
Отримати контакт за ID |
PUT |
/api/v1/contacts/{id} |
Оновити контакт |
DELETE |
/api/v1/contacts/{id} |
Видалити контакт |
GET |
/api/v1/contacts/birthdays |
Дні народження (7 днів) |
search
- пошук за ім'ям, прізвищем або emailskip
- кількість записів для пропуску (пагінація)limit
- максимальна кількість записів (макс. 1000)
curl -X POST "http://localhost:8000/api/v1/contacts/" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Іван",
"last_name": "Петренко",
"email": "ivan.petrenko@example.com",
"phone": "+380501234567",
"birthday": "1990-05-15",
"additional_info": "Друг з університету"
}'
curl "http://localhost:8000/api/v1/contacts/"
# Пошук за ім'ям
curl "http://localhost:8000/api/v1/contacts/?search=Іван"
# Пагінація
curl "http://localhost:8000/api/v1/contacts/?skip=10&limit=5"
curl "http://localhost:8000/api/v1/contacts/birthdays"
curl -X PUT "http://localhost:8000/api/v1/contacts/1" \
-H "Content-Type: application/json" \
-d '{
"phone": "+380507654321",
"additional_info": "Оновлена інформація"
}'
curl -X DELETE "http://localhost:8000/api/v1/contacts/1"
{
"id": 1,
"first_name": "Іван",
"last_name": "Петренко",
"email": "ivan.petrenko@example.com",
"phone": "+380501234567",
"birthday": "1990-05-15",
"additional_info": "Додаткова інформація"
}
first_name
: 1-50 символів, обов'язковеlast_name
: 1-50 символів, обов'язковеemail
: валідний email, унікальний, обов'язковийphone
: 10-20 символів, обов'язковийbirthday
: дата у форматі YYYY-MM-DD, обов'язковаadditional_info
: до 500 символів, опціональне
# База даних
DATABASE_URL=postgresql://postgres:password@localhost:5432/contacts_db
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_DB=contacts_db
# Додаток
DEBUG=True
HOST=0.0.0.0
PORT=8000
- web - FastAPI додаток (порт 8000)
- db - PostgreSQL база даних (порт 5432)
- adminer - веб-інтерфейс для управління БД (порт 8080)
# Переглянути логи
docker-compose logs -f web
# Перезапустити сервіс
docker-compose restart web
# Зупинити всі сервіси
docker-compose down
# Видалити дані БД
docker-compose down -v
# Встановити залежності для розробки
poetry install --with dev
# Запустити тести
pytest
# Тести з покриттям
pytest --cov=app
Додаток підтримує стандартне логування Python. Логи включають:
- HTTP запити та відповіді
- Помилки бази даних
- Валідаційні помилки
- Системні події
-
Безпека:
- Використовуйте HTTPS
- Налаштуйте CORS відповідно до ваших потреб
- Використовуйте сильні паролі для БД
-
База даних:
- Використовуйте connection pooling
- Налаштуйте backup'и
- Моніторинг продуктивності
-
Масштабування:
- Використовуйте reverse proxy (nginx)
- Налаштуйте load balancing
- Моніторинг ресурсів
# docker-compose.prod.yml
version: '3.8'
services:
web:
build: .
environment:
- DEBUG=False
restart: unless-stopped
db:
image: postgres:15
restart: unless-stopped
volumes:
- postgres_data:/var/lib/postgresql/data
- Форкніть репозиторій
- Створіть нову гілку (
git checkout -b feature/amazing-feature
) - Зробіть коміт (
git commit -m 'Add amazing feature'
) - Зпушьте гілку (
git push origin feature/amazing-feature
) - Відкрийте Pull Request
Цей проект поширюється під ліцензією MIT. Детальніше в файлі LICENSE
.
Якщо у вас виникли питання або проблеми:
- Перевірте Issues на GitHub
- Створіть новий Issue з детальним описом проблеми
- Надайте інформацію про версію Python, ОС та налаштування
- ✅ Базові CRUD операції
- ✅ Пошук та фільтрація
- ✅ Валідація даних
- ✅ Docker підтримка
- ✅ API документація
- ⏳ Автентифікація (планується)
- ⏳ Rate limiting (планується)
- ⏳ Тести покриття >90% (в розробці)