test-vovo

0

Описание

Тестовое задание для VOVO

Языки

  • Blade50,2%
  • PHP46,6%
  • Dockerfile2,4%
  • Shell0,3%
  • JavaScript0,3%
  • CSS0,2%
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
4 месяца назад
README.md

Тестовое задание для VOVO

Информация по решению

PHP 8.5, PostgreSQL, Laravel 12

Реализован API для поиска и фильтрации продуктов.

  • Включен строгий режим для моделей
  • Добавлены модели Product и Category с отношениями
  • Созданы миграции для таблиц categories и products с индексами
  • Для поля name таблицы products добавлен специальный GIN-индекс
  • Добавлены фабрики и сидеры для тестовых данных
  • Реализован API endpoint GET /api/products/search с поддержкой фильтрации:
  • Реализован регистронезависимый поиск по названию товара
  • Реализован enum ProductSort для типизации сортировки
  • Создан ProductSearchService для бизнес-логики поиска
  • Добавлены DTO для передачи параметров поиск в ProductSearchService с автоматизацией создания их Request
  • Добавлены Form Request для валидации передаваемых данных
  • Добавлены API Resources для структурирования возвращаемых данных
  • Из дефолтного ответа API Resources удален ключ meta.links
  • Написаны feature-тесты для проверки функциональности
  • Добавлен атрибут TestedBy для связи контроллера с тестами
  • Код отформатирован в соответствие с правилами стандарта PER2
  • Код проверен PHPStan level10

Задача

Реализовать поиск по товарам с фильтрами

Реализовать HTTP-endpoint (например, GET /api/products), который возвращает список товаров с возможностью фильтрации и сортировки.

У товара должны быть поля:

  • id
  • name (string, индекс по LIKE или FULLTEXT если захочешь)
  • price (decimal)
  • category_id (foreign key на таблицу categories)
  • in_stock (boolean)
  • rating (float, 0–5)
  • created_at
  • updated_at

Фильтры (через query-параметры):

  • q — поиск по подстроке в name
  • price_from, price_to
  • category_id
  • in_stock (true/false)
  • rating_from

Сортировка: параметр sort с допустимыми значениями: price_asc, price_desc, rating_desc, newest.

Обязательна пагинация.