random-joke

Данное приложение является реализацией задачи:

Условия задачи:

На страницу вывести форму с полями input:email, select:категория из http://www.icndb.com/api/ При заполнении формы на емейл нужно отправить письмо с темой "Случайная шутка из %имя категории%"
В теле письма должна быть случайная шутка из этой категории Эту же шутку нужно записать в файл на диске

Требования:

Работу с апи нужно реализовать самому с использованием http://docs.guzzlephp.org/en/stable/

Требования

  • PHP ^7.1.3+
  • Symfony 4.2+
  • SQLite3

Установка проекта

# Установка зависимостей
composer install
# Создание БД и создание схем
./bin/console doctrine:database:create
./bin/console doctrine:schema:create
# Скачивание категорий
./bin/console app:download-categories
# Запуск локального сервера
./bin/console server:run

После создания "Заявки на шутку" через интерфейс, запустить через консоль команду ./bin/console app:request:workflow-process

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

./bin/phpunit

Архитектура проекта

Приложение основано на Symfony 4.2. В качестве БД используется sqlite, как файловое хранилище, но с преимуществом работы через Doctrine.

Для отправки почты используется symfony/swiftmailer-bundle. Данные для подключения smtp сервара, в файле .env.

Аннотация к проекту

Перед использованием приложения необходимо запустить команду app:download-categories скачивается категории для отображения пользователю.

Каждая отправка от пользователя представлена в качестве "Заявки на шутку" \App\Entity\JokeRequest

Для данной сущности реализован workflow. STATUS_NEW->JOKE_CHOOSEN->EMAIL_SENDED.

Работу предлагается реализовать через cron, путем добавления расписания команды app:request:workflow-process. Данная команда работает через стратегии, обрабатывает заявку по необходимому workflow, в зависимости от статуса.

Отправку почты можно проверить через функциональный тест \App\Tests\Command\RequestWorkflowProcessCommand\RequestJokeChoosenStrategyTest::testHandle

В качестве оптимизации приложения:

  1. Вместо workflow и БД, использовать RabbitMQ и Consumers, для моментальной отправки почты
  2. В тестах добавить бандл для работы с файловыми фикстурами, типа alice fixtures. Но т.к фикстур мало, то создавал сущности через entityManager