Разработайте сервис на FastAPI для хранения и отображения направленных ациклических графов (DAG) (далее - сервис) с хранением данных в PostgreSQL.
- Язык: Python 3.11
- Фреймворк: FastAPI
- База данных: PostgreSQL 13
- ORM: допускается использовать SQLAlchemy 2.0+, использование ORM не обязательно
- Контейнеризация: Docker + docker-compose
Исходный код проекта должен быть размещён в публичном репозитории на GitHub или GitLab, с предоставлением ссылки на него. В корневой директории репозитория должны находиться следующие файлы и папки:
- файл README.md
- описание общих принципов работы сервиса
- описание принятых решений, если они выходят за рамки требований
- описание как запустить сервис
- описание как запустить тесты
- Dockerfile, docker-compose.yaml
- исходный код сервиса
- тесты
Ниже перечислены требования к графу, соблюдение которых должен обеспечивать сервис. Несоблюдение требований при попытке создать или изменить граф по API должно приводить к клиентской ошибке. Коды и содержимое ошибок в ответе API должны соответствовать приложенной спецификации openapi.json.
- Граф должен
- быть ориентированным ациклическим
- содержать хотя бы одну вершину
- Имена вершин должны
- состоять из символов латинского алфавита
- иметь длину не более 255 символов
- быть уникальными в пределах графа, в двух разных графах допускаются вершины с одинаковым именем
- Между двумя вершинами может быть только одно ребро
- Сервис должен предоставлять HTTP API в соответствии с приложенной спецификацией openapi.json.
- Коды ответа и схемы запросов сервиса обязательно должны соответствовать указанным в спецификации.
- Сервис должен поддерживать единовременно
- не менее 1000 графов
- не менее 100 вершин в каждом графе
- не менее 1000 ребер в каждом графе
- Сервис должен корректно обрабатывать ошибки, например попытка нарушения ограничений целостности при запросе к БД
не должна приводить к ответу
500 Internal server error. Сообщения об ошибках должны быть информативными.
Список вершин и ребер
{
"nodes": [
{"name": "a"},
{"name": "b"},
{"name": "c"},
{"name": "d"}
],
"edges": [
{"source": "a", "target": "c"},
{"source": "b", "target": "c"},
{"source": "c", "target": "d"}
]
}Список смежности
{
"adjacency_list": {
"a": [
"c"
],
"c": [
"d"
],
"d": [],
"b": [
"c"
]
}
}Список смежности транспонированного графа
{
"adjacency_list": {
"a": [],
"c": [
"a",
"b"
],
"d": [
"c"
],
"b": []
}
}- Используйте docker для развертывания сервиса и БД
- Используйте docker compose для оркестрации контейнеров
- Используйте depends и health check для запуска контейнеров в корректном порядке
- Используйте перечисленные ниже базовые образы
- python:3.11-slim для сервиса
- postgres:13 для СУБД
- Сервис должен принимать запросы на порту 8080 после выполнения команды
docker-compose up -d --buildиз корня репозитория. - Пример URL для получения информации о графе:
http://localhost:8080/api/graph/1
Должно быть обеспечено тестовое покрытие не менее 80%, используйте для тестирования pytest и встроенный в FastApi TestClient.
- Запрещено использовать любые нейросетевые инструменты (ChatGPT, Copilot и аналоги) для решения задачи
- Запрещено копировать готовые решения с открытых источников за исключением подходящих примеров официальной документации.
- Решение должно быть выполнено самостоятельно, демонстрируя ваши реальные навыки