Вводные:
- Здесь представлен MVP проект файлообменника. Он позволяет загружать файлы, проверяет их на подозрительный контент и отправляет алерты;
- Репозиторий содержит в себе бэкенд и фронтенд части;
- В обоих частях присутствуют баги, неоптимизированный код, неудачные архитектурные решения.
Задачи:
- Проведите рефакторинг бэкенда, не ломая бизнес-логики: предложите свое видение архитектуры и реализуйте его;
- Пофиксите найденные баги и оптимизируйте код, напишите тесты;
- Сделайте рефакторинг фронтенда, разбейте логику на слои;
- Добавьте пагинацию (бэк + фронт) на эндпоинты GET /files и GET /alerts.
Запуск:
docker compose -f docker-compose.dev.yml updocker exec -it backend alembic upgrade head
Открыть фронт: http://localhost:3000/test
Открыть бэк: http://localhost:8000/docs
- Разделены env-файлы backend и frontend: backend использует
backend/.env.dev, frontend используетfrontend/.env.dev. - В backend добавлен отдельный слой настроек на
pydantic-settings: переменные окружения, CORS origins, URL базы, Redis/Celery URL и путь хранения убраны изapp.py,service.pyиtasks.py. - Подключение к базе вынесено в отдельный модуль
backend/src/db.py; сервисы и Celery-задачи используют общий session maker. - Монолитный
backend/src/service.pyразделён на сервисы файлов и алертов, а работа с файловым хранилищем вынесена вbackend/src/infrastructure/storage.py. - Логика проверки безопасности файла, получения metadata и создания alert вынесена из Celery-задач в
backend/src/services/processing.py. - API-роуты вынесены из
backend/src/app.pyв отдельные модули вbackend/src/api/. - Добавлена валидация названия файла при загрузке и обновлении: пустые значения запрещены, пробелы по краям удаляются, длина ограничена 255 символами.
- Добавлена backend-пагинация для
GET /filesиGET /alertsчерез параметрыlimitиoffset. - Добавлено мягкое удаление файлов: файл удаляется с диска, но запись в БД и связанные алерты остаются для истории, при удалении создаётся информационный alert.
- Сохранение загружаемых файлов переведено на запись чанками, чтобы не читать весь файл целиком в память.
- Исправлена dev-сборка frontend:
docker-compose.dev.ymlтеперь использует отдельныйfrontend/Dockerfile.devи запускает Next.js черезnpm run dev. - Production-сборка frontend оставлена в
frontend/Dockerfile; для неёNEXT_PUBLIC_API_URLпередаётся через--build-arg. - Убран неиспользуемый
frontend/Dockerfile.bun, так как проект использует npm иpackage-lock.json. - Исправлен проброс порта PostgreSQL в docker-compose: с хоста база доступна на
5433, внутри docker-сети используется стандартный порт5432.
- Убран хардкод backend URL из страницы управления файлами.
- Добавлен общий frontend-конфиг
frontend/src/shared/config/api.tsдля построения API URL черезNEXT_PUBLIC_API_URL. - Упрощён root layout: убрана лишняя Bootstrap-обёртка, исправлен путь к favicon.
- Обновлена документация frontend: описаны env-переменные, dev-запуск и пример production-сборки.
- Добавлены frontend-слои
shared/apiиshared/types: запросы к backend вынесены изpage.tsx. - Добавлена пагинация на фронтенд: данные берутся из
items, счётчики показываютtotal. - В
shared/libвынесены хелперы для форматирования дат, размеров и статусов. - Таблица файлов, таблица алертов и модалка загрузки вынесены из
page.tsxв отдельные компоненты. - Загрузка и ошибки для таблиц файлов и алертов разделены, чтобы одна секция не блокировала другую.
- Улучшена обработка ошибок загрузки файла: frontend показывает не только общий текст ошибки, но и причину из ответа backend.
- В таблице файлов убран лишний текст для статусов проверки
pendingиclean; детали показываются только для проблемных проверок.
- Добавлены unit-тесты backend-логики для валидации названия файла и правил проверки безопасности файла.
- Добавлена pytest-конфигурация backend; тестовое окружение задаётся в
backend/tests/conftest.py. - Добавлены интеграционные тесты backend-сервисов для пагинации файлов, пагинации алертов и мягкого удаления файла.
- Добавлены frontend-тесты на Vitest и Testing Library для обработки API-ошибок, отображения статусов проверки файла и пагинации таблиц.
Запуск тестов:
- Backend:
docker exec -it backend pytest - Frontend:
cd frontend && npm test