#Api библиотеки на базе Laravel + MySQL 8.
В библиотеке хранятся книги, у каждой книги может быть как один автор, так и несколько соавторов. Хранятся данные о выдаче книг на руки, записывается только факт выдачи.
Весь основной функционал уже присутствует, необходимо написать реализацию метода api /api/books/stat получения статистики выдачи книг на руки за произвольный период. Кроме того мы хотим получить агрегированные данные по месяцам, годам и за все время работы библиотеки. Все данные мы хотим получать в одном ответе в следующем формате(предположим, что такой неудобный формат нам продиктован внешними факторами и не может быть изменен):
Необходимо обратить внимание, что в ответе присутствуют все книги, даже те, которые не выдавались на руки, например, в феврале 2019 года на руки не выдавалась книга "Пикник у обочины", но в ответе она присутствует. Также необходимо предусмотреть ситуацию, когда на руки не выдана ни одна книга в течении месяца, например, март 2019 года.
Очень хочется увидеть хорошо структурированный код с максимальным использованием функционала Laravel, если для каких-то мест, функционал Laravel, по вашему мнению, не подходит, объяснить почему и сделать так, как считаете правильным. Также будет большим плюсом наличие тестов критичного, по вашему мнению, функционала.
[ { "date": "2019-01", "title": "Война и мир", "value": 13 }, { "date": "2019-01", "title": "Пикник у обочины", "value": 23 }, { "date": "2019-01", "title": "Капитал", "value": 11 }, { "date": "2019-01", "value": 47 // Общее значение за месяц }, { "date": "2019-02", "title": "Война и мир", "value": 64 }, { "date": "2019-02", "title": "Пикник у обочины", "value": 0 }, { "date": "2019-02", "title": "Капитал", "value": 4 }, { "date": "2019-02", "value": 68 // Общее значение за месяц }, { "date": "2019-03", "title": "Война и мир", "value": 0 }, { "date": "2019-03", "title": "Пикник у обочины", "value": 0 }, { "date": "2019-03", "title": "Капитал", "value": 0 }, { "date": "2019-03", "value": 0 // Общее значение за месяц, может быть нулевым }, { "date": "2019", "value": 1235 // Общее значение за год. Подсчет должен вестись с начала года вне зависимости от фильтра }, { "value": 10600 // Общее значение за все время. Подсчет должен вестись с начала истории статистики вне зависимости от фильтра }, ]