Необходимо написать небольшое тестовое приложение на стеке 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 сервера проект полностью работал (не считая изменений параметрво окружения, естественно)