CRUD API на основе FastAPI для управления пользователями, новостями и комментариями.
Возможности:
- Управление пользователями с проверкой email
- Создание новостей только проверенными авторами
- Система комментариев к новостям
- База данных PostgreSQL
- Миграции Alembic
УСТАНОВКА И НАСТРОЙКА
Клонируйте репозиторий: git clone https://github.com/itmo-webdev/Edemskij_news_api.git cd Edemskij_news_api
Создайте виртуальное окружение: python -m venv venv, source venv/bin/activate # На Windows: venv\Scripts\activate
Установите зависимости: pip install -r requirements.txt
Настройте базу данных PostgreSQL и обновите строку подключения в app/database/session.py: SQLALCHEMY_DATABASE_URL = "postgresql://username:password@localhost/dbname"
Применение ВСЕХ миграций: alembic upgrade head
001_create_tables.py - создание таблиц 002_add_mock_data.py - добавление тестовых данных
Миграция для создания таблиц: alembic revision -m "Create tables" Миграция с тестовыми данными: alembic revision -m "Add mock data"
Запустите сервер: uvicorn app.main:app --reload
API Эндпоинты:
Пользователи POST /users/ - Создать пользователя GET /users/ - Получить всех пользователей GET /users/{id} - Получить пользователя по ID PUT /users/{id} - Обновить пользователя DELETE /users/{id} - Удалить пользователя
Новости POST /news/ - Создать новость (только для проверенных авторов) GET /news/ - Получить все новости GET /news/{id} - Получить новость по ID PUT /news/{id} - Обновить новость DELETE /news/{id} - Удалить новость (вместе с комментариями)
Комментарии POST /comments/ - Создать комментарий GET /comments/ - Получить все комментарии GET /comments/{id} - Получить комментарий по ID PUT /comments/{id} - Обновить комментарий DELETE /comments/{id} - Удалить комментарий
Примеры использования Создание пользователя
curl -X POST "http://localhost:8000/users/"
-H "Content-Type: application/json"
-d '{
"name": "Иван Иванов",
"email": "ivan@example.com",
"is_verified_author": true,
"avatar": "https://example.com/avatar.jpg"
}'
Создание новости (проверенный автор)
curl -X POST "http://localhost:8000/news/?author_id=1"
-H "Content-Type: application/json"
-d '{
"title": "Важная новость",
"content": {"text": "Содержание новости", "images": []},
"cover_image": "https://example.com/cover.jpg"
}'
Создание комментария
curl -X POST "http://localhost:8000/comments/"
-H "Content-Type: application/json"
-d '{
"text": "Отличная новость!",
"news_id": 1,
"author_id": 2
}'
СЦЕНАРИЙ ИСПОЛЬЗОВАНИЯ
Запустите сервис локально: uvicorn app.main:app --reload
Создайте пользователей:
curl -X POST "http://localhost:8000/users/"
-H "Content-Type: application/json"
-d '{"name": "Автор Новостей", "email": "author@example.com", "is_verified_author": true}'
curl -X POST "http://localhost:8000/users/"
-H "Content-Type: application/json"
-d '{"name": "Читатель", "email": "reader@example.com", "is_verified_author": false}'
Создайте новость от имени автора
curl -X POST "http://localhost:8000/news/?author_id=1"
-H "Content-Type: application/json"
-d '{
"title": "Моя первая новость",
"content": {"text": "Это содержание моей первой новости", "format": "markdown"},
"cover_image": "https://example.com/cover.jpg"
}'
Создайте комментарий от другого пользователя
curl -X POST "http://localhost:8000/comments/"
-H "Content-Type: application/json"
-d '{
"text": "Интересная новость, спасибо!",
"news_id": 1,
"author_id": 2
}'
Измените новость
curl -X PUT "http://localhost:8000/news/1"
-H "Content-Type: application/json"
-d '{
"title": "Обновленная новость",
"content": {"text": "Обновленное содержание новости", "format": "markdown"}
}'
Измените комментарий
curl -X PUT "http://localhost:8000/comments/1"
-H "Content-Type: application/json"
-d '{
"text": "Обновленный комментарий: Очень интересная новость!"
}'
Удалите новость вместе с комментариями curl -X DELETE "http://localhost:8000/news/1"
СХЕМА БД:
-Пользователи (Users): ---id - идентификатор ---name - имя ---email - email (уникальный) ---registration_date - дата регистрации ---is_verified_author - верифицирован ли как автор ---avatar - аватарка
-Новости (News) ---id - идентификатор ---title - заголовок ---content - содержание (в формате JSON) ---publication_date - дата публикации ---author_id - ID автора (внешний ключ) ---cover_image - обложка
-Комментарии (Comments) ---id - идентификатор ---text - текст комментария ---publication_date - дата публикации ---news_id - ID новости (внешний ключ) ---author_id - ID автора комментария (внешний ключ)
-Архитектура ---MVC паттерн с использованием FastAPI ---SQLAlchemy ORM для операций с базой данных ---Pydantic для валидации данных ---Внедрение зависимостей для сессий базы данных ---Alembic для управления миграциями
ОСОБЕННОСТИ РЕАЛИЗАЦИИ
1.Проверка авторов Только пользователи с is_verified_author = true могут создавать новости. Это проверяется через dependency get_verified_author.
2.Каскадное удаление При удалении новости автоматически удаляются все связанные комментарии благодаря настройкам каскадного удаления в SQLAlchemy.
3.Поддержка JSON Поле content в новостях поддерживает JSON формат, что позволяет хранить структурированные данные.
4.Миграции Проект включает миграции Alembic для: -создания таблиц пользователей, новостей и комментариев -добавления моковых данных для тестирования -управления изменениями схемы базы данных
Для создания новой миграции: alembic revision --autogenerate -m "Описание изменений"
Для применения миграций: alembic upgrade head
Тестирование API можно тестировать с помощью:
curl (примеры выше)
Postman
Swagger UI (доступно по адресу http://localhost:8000/docs)
Redoc (доступно по адресу http://localhost:8000/redoc)