Book Notes — osobisty katalog przeczytanych książek
Projekt Node.js · Express · EJS · PostgreSQL

Book Notes — osobisty katalog przeczytanych książek

Prosta aplikacja webowa do prowadzenia własnego katalogu lektur. Okładki pobierane automatycznie z Open Library API przez ISBN, notatki i opisy edytowane bezpośrednio na stronie bez przeładowania, sortowanie po tytule, dacie lub ocenie — wszystko w klasycznym server-side rendering: Express + EJS + PostgreSQL.

Node.js Express.js EJS PostgreSQL Open Library API SSR

01Wygląd aplikacji

Celowo minimalistyczna estetyka — biała strona, Georgia serif, maksymalna szerokość 40em. Wygląd klasycznego bloga książkowego: zero kolorowych elementów, zero ikon, tylko tekst i okładki. Aplikacja ma dwa widoki: listę wszystkich książek i stronę szczegółów pojedynczej książki.

Widok listy — strona główna

localhost:3000
Szymon Maciejewski
Books I’ve read
Tiny summary but detailed notes for each. Use the ISBN number to find it from your local library or anywhere else. This page will constantly update as I read more, so bookmark it if you want to check back in a few months.
Sorted with my top recommendations up top. Sort by: title newest best

Open Library
cover
ISBN
Thinking, Fast and Slow
Date read: 2024-09-12. How strongly I recommend it: 9/10
Kahneman’s masterpiece on the two systems driving our thinking. Essential for anyone who wants to understand how biases shape every decision we make.
Read my notes, or go to the Amazon page for details and reviews.
Open Library
cover
ISBN
The Pragmatic Programmer
Date read: 2024-07-03. How strongly I recommend it: 10/10
A timeless guide to software craftsmanship. The tips inside are as relevant today as they were when first published — every developer should have a copy.
Read my notes, or go to the Amazon page for details and reviews.
Open Library
cover
ISBN
Atomic Habits
Date read: 2024-04-20. How strongly I recommend it: 8/10
Clear’s framework for building and breaking habits is practical and backed by evidence. The 1% improvement concept alone makes this worth reading.
Read my notes, or go to the Amazon page for details and reviews.

strona główna — lista książek posortowana według oceny rekomendacji

Strona szczegółów — tryb czytania

localhost:3000 → /edit (POST)
Open Library
cover by
ISBN
Thinking, Fast and Slow
ISBN: 978-0374533557
Date read: 2024-09-12
How strongly I recommend it: 9/10
Go back to the main page.
Edit book details.
Delete book.
Kahneman’s masterpiece on the two systems driving our thinking. System 1 is fast, intuitive and emotional; System 2 is slower, more deliberative, and more logical. Essential for anyone who wants to understand how biases shape every decision we make in everyday life.
Chapter 3 on anchoring was particularly eye-opening. The loss aversion experiments (people feel losses ~2× more than equivalent gains) changed how I think about pricing and negotiations. Key takeaway: slow down and question your first instinct — it is almost always System 1 taking shortcuts.

strona szczegółów — widok notatek w trybie czytania

Strona szczegółów — tryb edycji

Kliknięcie przycisku Edit book details ukrywa paragrafy i odkrywa <textarea> z aktualną treścią — bez przeładowania strony, czystym JavaScriptem DOM API. Zapis przez standardowy formularz POST.

localhost:3000 → /edit (po kliknięciu Edit)
Open Library
cover by
ISBN
Thinking, Fast and Slow
ISBN: 978-0374533557
Date read: 2024-09-12
How strongly I recommend it: 9/10
Go back to the main page.
Edit book details.
Delete book.

tryb edycji — teksty zamieniają się w textarea, przycisk ✓ zapisuje zmiany

02Jak działa aplikacja

Aplikacja używa wzorca POST → redirect → GET do wszystkich operacji. Kliknięcie tytułu lub “Read my notes” wysyła ukryty formularz POST z bookId, serwer pobiera dane z PostgreSQL i renderuje stronę szczegółów przez EJS. Sortowanie to osobny formularz POST do /sort z ukrytym polem sortType.

  • Okładki przez Open Library — URL covers.openlibrary.org/b/isbn/{isbn}-M.jpg wstawiany przez EJS w atrybut src obrazu. Przeglądarka sama pobiera okładkę bezpośrednio — żadnych requestów z Node.js.
  • Trzy tryby sortowania — jeden endpoint POST /sort, trzy zapytania SQL z różnym ORDER BY: tytuł ASC, data DESC, ocena DESC.
  • Inline edit bez przeładowania — kliknięcie “Edit” wywołuje handler(), który ukrywa paragrafy i pokazuje textarea przez setAttribute/removeAttribute("hidden").
  • Potwierdzenie usunięciaconfirmDelete() wywołuje przeglądarkowy confirm() przed wysłaniem formularza DELETE.
-- Trzy warianty sortowania — jeden endpoint, różne ORDER BY
SELECT * FROM books ORDER BY title ASC;           -- "title"
SELECT * FROM books ORDER BY readdate DESC;        -- "newest"
SELECT * FROM books ORDER BY recomendationratio DESC; -- "best"

-- Edycja — parametry pozycyjne chronią przed SQL injection
UPDATE books SET description = $1, notes = $2 WHERE id = $3;

03Routing

GET
/
Lista wszystkich książek — SELECT * FROM books, formatowanie dat, render index.ejs
POST
/sort
Sortowanie — body sortType (title/newest/best) → SELECT z ORDER BY → render index.ejs
POST
/edit
Widok szczegółów — body bookId → SELECT WHERE id → render edit.ejs
POST
/editDetails
Zapis edycji — UPDATE description i notes → redirect do /
POST
/delete
Usunięcie — DELETE WHERE id → redirect do /

04Stack technologiczny

Express.js
Framework HTTP — routing, middleware, serwowanie plików statycznych (express.static), obsługa żądań i odpowiedzi
EJS
Silnik szablonów SSR — serwer generuje HTML z danymi z bazy przed wysłaniem do przeglądarki. Pętle i warunki w szablonie
pg (node-postgres)
Klient PostgreSQL — surowe zapytania SQL z parametrami pozycyjnymi ($1, $2). Bez ORM
PostgreSQL
Baza danych — tabela books: id, title, isbn, description, notes, recomendationratio, readdate
Open Library API
Okładki przez ISBN — statyczny URL wstawiany przez EJS w src obrazu. Przeglądarka pobiera bezpośrednio
Vanilla JS
Inline edithandler() i confirmDelete(). Zero frameworków, czysty DOM API

05Czego dowodzi ten projekt

SSR vs SPA

Rozumienie różnicy między server-side rendering a client-side SPA — i kiedy prostsze rozwiązanie jest lepsze.

Surowy SQL

Ręczne zapytania z parametrami pozycyjnymi — świadomy wybór bez ORM, pełne rozumienie co trafia do bazy.

POST/redirect/GET

Klasyczny wzorzec webowy przed fetch() i JSON API — fundamenty protokołu HTTP.

Integracja API

Open Library przez ISBN — integracja zewnętrznego źródła bez żadnego kodu backendowego.

DOM bez frameworków

Inline edit przez setAttribute/removeAttribute — JavaScript w najprostszej formie.

Punkt startowy

Ten projekt poprzedza całe portfolio webowe — od 117 linii SSR do FastAPI, pgvector i OpenAI Agents.

Zobacz kod na GitHubie

117 linii backendu, dwa szablony EJS i jeden plik CSS — cały projekt w zasięgu wzroku.

Zobacz kod na GitHub
· · ·
Udostępnij jeśli spodobał Ci się mój projekt