Skip to content

dgtrdev/fullstack-test-task

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Тестовое задание на позицию Fullstack разработчика (Python + React)

Вводные:

  1. Здесь представлен MVP проект файлообменника. Он позволяет загружать файлы, проверяет их на подозрительный контент и отправляет алерты;
  2. Репозиторий содержит в себе бэкенд и фронтенд части;
  3. В обоих частях присутствуют баги, неоптимизированный код, неудачные архитектурные решения.

Задачи:

  1. Проведите рефакторинг бэкенда, не ломая бизнес-логики: предложите свое видение архитектуры и реализуйте его;
  2. Пофиксите найденные баги и оптимизируйте код, напишите тесты;
  3. Сделайте рефакторинг фронтенда, разбейте логику на слои;
  4. Добавьте пагинацию (бэк + фронт) на эндпоинты GET /files и GET /alerts.

Запуск:

  1. docker compose -f docker-compose.dev.yml up
  2. docker 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.

Frontend

  • Убран хардкод 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-ошибок, отображения статусов проверки файла и пагинации таблиц.

Запуск тестов:

  1. Backend: docker exec -it backend pytest
  2. Frontend: cd frontend && npm test

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 53.1%
  • TypeScript 41.6%
  • Dockerfile 4.2%
  • Mako 1.1%