Skip to content

Instantly share code, notes, and snippets.

@wbars
Last active August 26, 2016 23:14
Show Gist options
  • Save wbars/9bc790d3b5be4635b1c4 to your computer and use it in GitHub Desktop.
Save wbars/9bc790d3b5be4635b1c4 to your computer and use it in GitHub Desktop.
Тестовое задание

Тестовое задание (PHP5, Symfony2, Postgres)

Необходимо написать небольшое тестовое приложение на стеке Symfony2/Postgres - Каталог книг

В рамках приложения есть 3 сущности:

  • Книга (название, дата выпуска, дата занесения в каталог, рейтинг(float <= 10), Жанр, Автор
  • Жанр (название)
  • Автор (имя, дата рождения, пол)

Страницы сайта:

  • Главная
  • Создание/редактирование/удаление книги
  • Создание/редактирование/удаление жанра
  • Создание/редактирование/удаление автора
  • Регистрация/логин
  • Профиль пользователя
  • Страница жанра
  • Страница автора

На главной странице нужно показывать 10 последних книг, занесенных в каталог, а также всех авторов и все жанры с возможностью перехода на соответствующие им страницы. Для каждой сущности должна присутствовать форма создания/редактирования/удаления данной сущности. Автор и Жанр нельзя удалить, пока к ним привязан хотя бы 1 книга.

На странице Лента отображаются все книги каталога, отстортированные по новизне

На сайте должна быть возможность зарегистрироваться и авторизоваться через пару username/password. username - уникальная строка, содержащая только символы [a-zA-Z0-9].

На странице пользователя нужно просто показывать его имя и форму для ее изменения (имя - уникально)

На страницах Автор и Жанр выводятся книги, относящиеся к данным сущностям, отсортированные по новизне.

После реализации данной логики необходимо выполнить следующие таски:

  • BC-1: Добавить возможность пользователям добавлять книги в избранное. На странице пользователя должны отображаться избранные им книги
  • BC-2: Для пользователя и книг реалиозовать загрузку аватара (*.jpg|jpeg|png) (при отстутствии показывать заглушку)
  • BC-3: Добавить страницу Жанры на которой должен выводиться список всех жанров. Для каждого жанра необходимо показывать количество книг данного жанра и последнюю добавленную книгу
  • BC-4: Для книги и жанра реализовать механизм ЧПУ - URL показа соответствующей сущности не должен содержать в себе числовой идентификатор сущности, вместо этого - уникальное транслитирированное имя, вычисляемое автоматически при создании/редактировании сущности. Предусмотреть варианты сущностей с дублирующимся названием. Старые ссылки с айдишниками должны остаться валидными и редиректить на новые.
  • BC-5: На странице показа книги показывать 5 книг, "рекомендованных к прочтению". Они вычисляются как случайные книги того же жанра, что и просматриваемая книга, за исключением самой просматрвиаемой. Если в данном блоке не набирается 5 книг, дозаполнить его cлучайным книгами того же автора. Если же и при этом сценарии книг не набирается, дозаполнить любыми случайными книгами из каталога.
  • BC-6: Решено, при регистрации необходимо также собирать почтовый ящик пользователя. Реализовать данный функционал в условиях наличия в системе уже зарегестрированных пользователей. Почтовый ящик должен быть уникален. Если у зарегестрированного пользователя отсутствует почтовый ящик, то для него на каждой странице должна показываться надоедающая плашка, позволяющая установить почтовый ящик. Отныне пользователям без почтового ящика нельзя пользоваться функционалом избранных книг.
  • BC-7: Для всех списков книг (страница жанра, лента) на сайта добавить пагинацию. На странице ленты добавить фильтры для книг по автору, жанру и времени издания (диапазон дат). Добавить на сайте глобальный поиск по книгам - общий омнибокс на главной, который по 1 строке ищет книги, похожие названию или описанию, или если под данную строку подходит автор или жанр книги (например я могу написать "Фантастика" и мне покажутся в том числе все книги по фантастике, либо написать "Марсианин" и выведется книга, с названием похожим на марсианин (или описанием) ). Критерий "похожести" определить самому.
  • BC-8: Решено, что все аватары пользователей и книг должны быть квадратными, причем квадрат должен вырезаться по минимальной стороне изображения по центру. Реализовать с учетом уже существующих книг и пользователей с разными аватарами
  • BC-9: Реализовать простое JSON-api для сущностей книг (показ/создание/редактирование/удаление книги).

Таски реализуются с предположением, что уже имеется рабочий проект с данными и архитектурой, реализованной до тасков.

Предпологается, что во время работы сайта книги вносятся/изменяются/удаляются достаточно активно (активность на уровне просмотра книг).

По выполнению нужно написать шелл-скрипт. Нужно, чтобы проект можно было скачать на машину под Linux/MacOS, на котором установлен Postgres и PHP5 и после выполнения данного скрипта и запуска внутреннего symfony2 сервера проект полностью работал (не считая изменений параметрво окружения, естественно)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment