Kompletny system zarządzania emailami z autentykacją JWT i HTTP-only cookies.
- Autentykacja JWT z HTTP-only cookies dla bezpieczeństwa
- Spring Boot Backend z bazą H2
- React Frontend z TypeScript i TailwindCSS
- React Query do zarządzania stanem i cache'owaniem
- Walidacja po stronie serwera i klienta
- Obsługa błędów z powiadomieniami toast
- Spring Boot 3.5.3
- Spring Security z JWT
- Spring Data JPA
- PostgreSQL Database
- Maven
- Springdoc OpenAPI (Swagger) - Dokumentacja API
- React 19.1
- TypeScript
- TailwindCSS
- React Query (TanStack Query)
- React Hot Toast
- Lucide React (ikony)
- Java 17+
- Node.js 20+
- npm lub yarn
cd server
./mvnw spring-boot:runBackend będzie dostępny pod adresem: http://localhost:8080
cd client
npm install
npm run devFrontend będzie dostępny pod adresem: http://localhost:5173 (lub 5174 jeśli 5173 jest zajęty)
System automatycznie tworzy testowych użytkowników przy pierwszym uruchomieniu:
- Admin:
admin@mailer.com/password123 - User:
user@mailer.com/password123
System posiada kompletną dokumentację API wykorzystującą Swagger/OpenAPI 3.0. Dokumentacja umożliwia interaktywne testowanie wszystkich endpointów bezpośrednio z przeglądarki.
Po uruchomieniu serwera backend, dokumentacja jest dostępna pod adresami:
- Swagger UI:
http://localhost:8080/api/swagger-ui.html - OpenAPI JSON:
http://localhost:8080/api/docs
- Interaktywne testowanie wszystkich endpointów
- Autoryzacja JWT bezpośrednio z interfejsu
- Kompletne opisy parametrów i odpowiedzi
- Grupowanie endpointów według funkcjonalności
- Przykładowe wartości dla wszystkich struktur danych
- Uruchom serwer backend (
./mvnw spring-boot:run) - Otwórz
http://localhost:8080/api/swagger-ui.html - Zarejestruj się lub zaloguj przez endpoint
/api/auth/registerlub/api/auth/login - Skopiuj otrzymany JWT token
- Kliknij przycisk "Authorize" w górnej części strony
- Wprowadź token w formacie:
Bearer <your-jwt-token> - Teraz możesz testować wszystkie chronione endpointy
POST /api/auth/register- Rejestracja nowego użytkownikaPOST /api/auth/login- Logowanie użytkownikaPOST /api/auth/logout- Wylogowanie użytkownikaGET /api/auth/me- Pobieranie danych aktualnego użytkownika
GET /api/contacts- Lista wszystkich kontaktówPOST /api/contacts- Tworzenie nowego kontaktuPUT /api/contacts/{id}- Aktualizacja kontaktuDELETE /api/contacts/{id}- Usuwanie kontaktuGET /api/contacts/stats- Statystyki kontaktówGET /api/contacts/tags- Dostępne tagiPOST /api/contacts/import- Import wielu kontaktów
GET /api/campaigns- Lista kampaniiPOST /api/campaigns- Tworzenie nowej kampaniiPUT /api/campaigns/{id}- Aktualizacja kampaniiDELETE /api/campaigns/{id}- Usuwanie kampaniiPOST /api/campaigns/{id}/start- Uruchamianie kampaniiPOST /api/campaigns/{id}/pause- Wstrzymywanie kampaniiPOST /api/campaigns/{id}/complete- Kończenie kampanii
GET /api/email-templates- Lista szablonówPOST /api/email-templates- Tworzenie szablonuPUT /api/email-templates/{id}- Aktualizacja szablonuDELETE /api/email-templates/{id}- Usuwanie szablonu
curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@mailer.com","password":"password123"}'curl -X GET http://localhost:8080/api/auth/me \
-H "Cookie: auth-token=YOUR_JWT_TOKEN"# Database
spring.datasource.url=jdbc:postgresql://localhost:5432/mailerdb
spring.datasource.driver-class-name=org.postgresql.Driver
# JWT
jwt.secret=your-super-secret-jwt-key
jwt.expiration=86400000
jwt.cookie-name=auth-token
# Swagger/OpenAPI Configuration
springdoc.api-docs.path=/api/docs
springdoc.swagger-ui.path=/api/swagger-ui.html
springdoc.swagger-ui.operationsSorter=method
springdoc.swagger-ui.tagsSorter=alpha
springdoc.swagger-ui.tryItOutEnabled=true
# CORS
spring.web.cors.allowed-origins=http://localhost:5173const API_BASE_URL = 'http://localhost:8080/api';src/main/java/maile/com/example/mailer/
├── config/
│ ├── SecurityConfig.java # Konfiguracja Spring Security
│ ├── OpenApiConfig.java # Konfiguracja Swagger/OpenAPI
│ └── DataInitializer.java # Inicjalizacja danych testowych
├── controller/
│ └── AuthController.java # Endpointy autentykacji
├── dto/
│ ├── LoginRequest.java # DTO logowania
│ ├── RegisterRequest.java # DTO rejestracji
│ └── AuthResponse.java # DTO odpowiedzi
├── entity/
│ └── User.java # Encja użytkownika
├── repository/
│ └── UserRepository.java # Repository użytkowników
├── security/
│ └── JwtAuthenticationFilter.java # Filtr JWT
├── service/
│ ├── AuthService.java # Serwis autentykacji
│ ├── JwtService.java # Serwis JWT
│ └── CustomUserDetailsService.java # Serwis użytkowników
└── exception/
└── GlobalExceptionHandler.java # Globalny handler błędów
src/
├── components/
│ ├── auth/
│ │ ├── LoginPage.page.tsx # Strona logowania
│ │ └── components/
│ │ └── LoginForm.component.tsx
│ └── dashboard/
│ └── Dashboard.page.tsx # Panel główny
├── hooks/
│ └── useAuth.hook.ts # Hook autentykacji
├── lib/
│ ├── api.ts # Klient API
│ └── queryClient.ts # Konfiguracja React Query
├── providers/
│ └── AuthProvider.tsx # Provider autentykacji
└── App.tsx # Główny komponent
- JWT Tokens - Bezpieczne tokeny z określonym czasem wygaśnięcia
- HTTP-only Cookies - Tokeny przechowywane w bezpiecznych cookies
- CORS - Skonfigurowany dla localhost
- Walidacja - Walidacja danych wejściowych po stronie serwera
- BCrypt - Hasła hashowane z solą
cd server
./mvnw testcd client
npm testBackend loguje:
- Operacje autentykacji
- Błędy walidacji
- Informacje o użytkownikach
Frontend wyświetla:
- Powiadomienia o sukcesie/błędach
- Stan ładowania
- Informacje o użytkowniku
- Utwórz DTO w
dto/ - Dodaj metodę w serwisie
- Utwórz endpoint w kontrolerze
- Dodaj testy
- Utwórz komponent w
components/ - Dodaj hook jeśli potrzebny
- Zintegruj z React Query
- Dodaj obsługę błędów
MIT License