Моята библиотека (Books)
Личен читателски дневник на Laravel: търсене в Google Books и Читанка едновременно, рафтове „Чета / Прочетени / За четене“ с рейтинг и бележки, вграден четец за безплатните български книги от Читанка и AI препоръки от Claude според прочетеното и оценките. Вход с имейл/парола или с Google.
README: Laravel 13, PHP 8.3, MySQL, Breeze (Blade) + Tailwind, Socialite (Google), Claude API през database queue; Google Books + Читанка търсене, рафтове, четец, препоръки; тестове с Http::fake() и in-memory SQLite.
- Problem / context
- Книгите, които чета, оценявам и искам да прочета, бяха разпилени между приложения и сайтове, а безплатните български книги от Читанка нямаха връзка с Google Books и с личен списък.
- My role
- Цялостно: Laravel 13 приложение с Breeze + Tailwind, клиенти за Google Books и Читанка (HTTP client + кеш), рафтове през pivot таблица със статус/рейтинг/бележки, страничен четец за текстове от Читанка, вход с Google (Socialite), queued job за препоръки през официалния Anthropic PHP SDK, rate limiting и feature тестове.
- Challenge
- Два външни източника с различни данни и лимити (Читанка ограничава клиентите), сдвояване на Google Books запис с издание в Читанка, и AI препоръки, които не блокират страницата и не предлагат вече прочетени книги.
- Approach / solution
- Отделни Service класове за GoogleBooks, Chitanka и Claude с 24-часов кеш — грешка в единия източник не чупи страницата. Пълните текстове от Читанка се теглят веднъж, пазят се на диска и се странират оттам. GenerateRecommendations job иска структуриран JSON от Claude, маха книгите от рафтовете и сменя старите препоръки в транзакция; таблото poll-ва, докато job-ът върви.