REST API: Express, Sequelize i MySQL
Serwis REST dla użytkowników, klientów i samochodów. Aplikacja Node.js korzysta z istniejących tabel users, customers i cars; aplikacja nie tworzy ani nie synchronizuje ich automatycznie przy uruchomieniu.
Wymagania i uruchomienie
- Node.js 20 lub nowszy
- MySQL z tabelami używanymi przez dotychczasową aplikację
npm install
cp .env.example .env
Ustaw w .env połączenie do tej samej bazy MySQL co dotychczasowa aplikacja. Następnie wykonaj migrację dodającą unikalne pole login do tabeli users (dotychczasowym użytkownikom ustawi login = email):
npm run db:migrate
npm start
API działa domyślnie na http://localhost:8765, dokumentacja Swagger UI na http://localhost:8765/docs, a specyfikacja OpenAPI na http://localhost:8765/openapi.yaml. Port można zmienić przez PORT.
Migrację można cofnąć przez npx sequelize-cli db:migrate:undo. Start serwera nigdy nie uruchamia migracji ani sequelize.sync().
Uwierzytelnianie i uprawnienia
API używa HTTP Basic Auth: podaj login i hasło w nagłówku Authorization: Basic ... albo skorzystaj z przycisku Authorize w Swagger UI. Loginem jest pole users.login; użytkownicy istniejący przed migracją zachowają dotychczasowe dane logowania, bo ich login zostanie ustawiony na adres e-mail.
HTTP Basic przesyła hasło w każdym żądaniu; w środowisku produkcyjnym wystawiaj API wyłącznie przez HTTPS.
Konta dodawane przez dotychczasowy seeder, o ile istnieją w bazie:
| Rola | Login po migracji | Hasło |
|---|---|---|
| admin | admin@example.com |
Admin123! |
| user | user@example.com |
User1234! |
Hasła nadal są przechowywane jako bcrypt. Nieaktywne konta nie mogą się uwierzytelniać. Dostęp do /api/users wymaga roli admin; klienci i samochody są dostępne dla każdego uwierzytelnionego użytkownika.
curl -u 'admin@example.com:Admin123!' http://localhost:8765/api/auth/me
curl -u 'user@example.com:User1234!' 'http://localhost:8765/api/customers?q=nowak&with_cars=1'
Endpointy
| Metody | Ścieżka | Opis |
|---|---|---|
| POST | /api/auth/login |
Potwierdzenie logowania Basic Auth i aktualizacja last_login |
| GET / PUT / PATCH | /api/auth/me |
Odczyt i edycja własnego profilu |
| GET / POST | /api/users |
Lista i dodawanie użytkowników (admin) |
| GET / PUT / PATCH / DELETE | /api/users/{id} |
Odczyt, edycja i usuwanie użytkownika (admin) |
| GET / POST | /api/customers |
Lista klientów i dodawanie |
| GET / PUT / PATCH / DELETE | /api/customers/{id} |
Szczegóły klienta z samochodami, edycja i usuwanie |
| GET / POST | /api/customers/{customer_id}/cars |
Samochody klienta i dodawanie samochodu |
| GET / POST | /api/cars |
Lista samochodów i dodawanie |
| GET / PUT / PATCH / DELETE | /api/cars/{id} |
Szczegóły samochodu z właścicielem, edycja i usuwanie |
Listy obsługują page, limit (domyślnie 20, maksymalnie 100), sort i direction (asc/desc). Endpointy obsługują wyszukiwanie i filtry opisane w Swagger UI; liczba wyników jest zwracana w X-Total-Count.
Format odpowiedzi
- Sukces:
{"success": true, "data": ...}; odpowiedź z listą zawiera takżemeta. - Błąd walidacji:
{"success": false, "error": {"code": 422, "message": "Validation failed.", "fields": {...}}}. - Usunięcie:
204 No Content.
Migracja nie modyfikuje plików PHP; można je usunąć osobno po przełączeniu i sprawdzeniu wdrożenia Node.js.