#Api библиотеки на базе Laravel + MySQL 8.
В библиотеке хранятся книги, у каждой книги может быть как один автор, так и несколько соавторов. Хранятся данные о выдаче книг на руки, записывается только факт выдачи.
Весь основной функционал уже присутствует, необходимо написать реализацию метода api /api/books/stat
получения статистики выдачи книг на руки за произвольный период. Кроме того мы хотим получить агрегированные данные по месяцам, годам и за все время работы библиотеки. Все данные мы хотим получать в одном ответе в следующем формате(предположим, что такой неудобный формат нам продиктован внешними факторами и не может быть изменен):
[
{
"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 // Общее значение за все время. Подсчет должен вестись с начала истории статистики вне зависимости от фильтра
},
]
Необходимо обратить внимание, что в ответе присутствуют все книги, даже те, которые не выдавались на руки, например, в феврале 2019 года на руки не выдавалась книга "Пикник у обочины", но в ответе она присутствует. Также необходимо предусмотреть ситуацию, когда на руки не выдана ни одна книга в течении месяца, например, март 2019 года.
Очень хочется увидеть хорошо структурированный код с максимальным использованием функционала Laravel, если для каких-то мест, функционал Laravel, по вашему мнению, не подходит, объяснить почему и сделать так, как считаете правильным. Также будет большим плюсом наличие тестов критичного, по вашему мнению, функционала.