Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

News CRUD API (FastAPI + SQLAlchemy + Alembic + Postgres)

TL;DR

CRUD API со следующими сущностями: User, News, Comment. Новости могут создавать только верифицированные пользователи. Есть миграции на создание таблиц и на загрузку мок-данных.

Быстрый старт

1) Запуск Postgres

docker compose up -d db

2) Создать и активировать venv, установить зависимости

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env  # при необходимости отредактируйте DATABASE_URL

3) Применить миграции

alembic upgrade head

4) Запустить приложение

uvicorn app.main:app --reload
# сервис слушает http://127.0.0.1:8000

Модели данных (ER-диаграмма простая)

  • User (1) ——< News (многие), каскадное удаление News при удалении автора
  • User (1) ——< Comment (многие)
  • News (1) ——< Comment (многие), каскадное удаление Comment при удалении News

Поля:

  • User: id, name, email (unique), registered_at, is_verified_author, avatar_url
  • News: id, title, content (JSON), published_at, author_id (FK users.id), cover_url
  • Comment: id, text, published_at, news_id (FK news.id), author_id (FK users.id)

Примеры cURL

Ping

curl -s http://127.0.0.1:8000/ping

Users

Создать пользователя:

curl -s -X POST http://127.0.0.1:8000/users/ -H "Content-Type: application/json" -d '{
  "name": "Alice",
  "email": "alice2@example.com",
  "is_verified_author": true,
  "avatar_url": null
}'

Список пользователей:

curl -s http://127.0.0.1:8000/users/

Обновить пользователя:

curl -s -X PATCH http://127.0.0.1:8000/users/1 -H "Content-Type: application/json" -d '{
  "name": "Alice Updated"
}'

Удалить пользователя:

curl -i -X DELETE http://127.0.0.1:8000/users/1

News

Создать новость (автор должен быть верифицирован):

curl -s -X POST http://127.0.0.1:8000/news/ -H "Content-Type: application/json" -d '{
  "title": "Breaking",
  "content": {"body":"JSON body"},
  "cover_url": null,
  "author_id": 1
}'

Список новостей:

curl -s http://127.0.0.1:8000/news/

Обновить новость:

curl -s -X PATCH http://127.0.0.1:8000/news/1 -H "Content-Type: application/json" -d '{
  "title": "Breaking Updated"
}'

Удалить новость (удалит и комментарии к ней):

curl -i -X DELETE http://127.0.0.1:8000/news/1

Comments

Создать комментарий:

curl -s -X POST http://127.0.0.1:8000/comments/ -H "Content-Type: application/json" -d '{
  "news_id": 1,
  "author_id": 2,
  "text": "Nice!"
}'

Список комментариев по новости:

curl -s "http://127.0.0.1:8000/comments/?news_id=1"

Обновить комментарий:

curl -s -X PATCH http://127.0.0.1:8000/comments/1 -H "Content-Type: application/json" -d '{
  "text": "Edited text"
}'

Удалить комментарий:

curl -i -X DELETE http://127.0.0.1:8000/comments/1

Архитектура

  • app/models.py — SQLAlchemy модели
  • app/schemas.py — Pydantic-схемы (DTO)
  • app/db.py — подключение к БД и зависимость get_db
  • app/routers/*.py — CRUD-ручки по сущностям
  • alembic/ — миграции (создание таблиц + мок-данные)

Проверка

  • Ручная проверка curl/Postman
  • В ответах API используются стандартные коды: 201 (создано), 404 (не найдено), 403 (запрещено), 400 (ошибка валидации и т.п.)

Заметки по требованиям

  • Python 3.10+
  • Библиотеки: FastAPI, SQLAlchemy, Alembic, psycopg
  • СУБД: Postgres
  • Контент новости хранится как JSONB
  • Каскадное удаление комментариев при удалении новости реализовано на уровне FK (ondelete='CASCADE') и relationship(cascade='all, delete-orphan')

Как создать приватный репозиторий в организации itmo-webdev

  1. Попросите владельца организации добавить вас в itmo-webdev (если ещё нет).
  2. Создайте приватный репозиторий по шаблону имени: lab1_Ivanov_A_A (замените на свою фамилию/инициалы).
  3. Добавьте коллабораторов-проверяющих при необходимости.
  4. Залейте код из этого проекта (git init, git remote add origin, git push -u origin main).

Генерация новой миграции при изменениях моделей

alembic revision --autogenerate -m "feat: change models"
alembic upgrade head

Опционально: абстракция репозитория/БД

Для расширения на MongoDB можно вынести слой репозиториев (интерфейсы + имплементации под SQLAlchemy/Mongo) и заворачивать их через FastAPI dependency.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages