{"id":30211897,"url":"https://github.com/ol1mowski/mailer","last_synced_at":"2026-04-12T03:38:51.614Z","repository":{"id":306230556,"uuid":"1025451887","full_name":"ol1mowski/Mailer","owner":"ol1mowski","description":"A comprehensive email campaign management system built with modern web technologies. This application provides a robust platform for managing mailing lists, creating campaigns, and tracking email performance.","archived":false,"fork":false,"pushed_at":"2025-07-24T12:47:50.000Z","size":106,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-24T13:33:23.812Z","etag":null,"topics":["docker","githubactions-ci","java","junit","mockito","postgresql","react","spring-boot","tailwindcss","typescript","vitest"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ol1mowski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-24T09:19:07.000Z","updated_at":"2025-07-24T12:47:55.000Z","dependencies_parsed_at":"2025-07-24T13:50:58.479Z","dependency_job_id":null,"html_url":"https://github.com/ol1mowski/Mailer","commit_stats":null,"previous_names":["ol1mowski/mailer"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ol1mowski/Mailer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ol1mowski%2FMailer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ol1mowski%2FMailer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ol1mowski%2FMailer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ol1mowski%2FMailer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ol1mowski","download_url":"https://codeload.github.com/ol1mowski/Mailer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ol1mowski%2FMailer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270313506,"owners_count":24563367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-13T02:00:09.904Z","response_time":66,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","githubactions-ci","java","junit","mockito","postgresql","react","spring-boot","tailwindcss","typescript","vitest"],"created_at":"2025-08-13T21:09:39.400Z","updated_at":"2026-04-12T03:38:51.596Z","avatar_url":"https://github.com/ol1mowski.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mailer - System Zarządzania Emailami\n\nKompletny system zarządzania emailami z autentykacją JWT i HTTP-only cookies.\n\n## Dashboard\n\u003cimg width=\"1916\" height=\"942\" alt=\"1\" src=\"https://github.com/user-attachments/assets/690643fa-6039-47eb-b035-74e97dfb54ba\" /\u003e\n\n## System zarządzania kampaniami\n\u003cimg width=\"1901\" height=\"942\" alt=\"2\" src=\"https://github.com/user-attachments/assets/0faf3f67-80b8-48c0-9d83-e0a845fa0846\" /\u003e\n\n## System edycji maila\n\u003cimg width=\"1227\" height=\"874\" alt=\"3\" src=\"https://github.com/user-attachments/assets/d3eb9440-7408-44b6-9512-89b168a0add5\" /\u003e\n\n\n## 🚀 Funkcjonalności\n\n- **Autentykacja JWT** z HTTP-only cookies dla bezpieczeństwa\n- **Spring Boot Backend** z bazą H2\n- **React Frontend** z TypeScript i TailwindCSS\n- **React Query** do zarządzania stanem i cache'owaniem\n- **Walidacja** po stronie serwera i klienta\n- **Obsługa błędów** z powiadomieniami toast\n\n## 🛠️ Technologie\n\n### Backend\n- Spring Boot 3.5.3\n- Spring Security z JWT\n- Spring Data JPA\n- PostgreSQL Database\n- Maven\n- Springdoc OpenAPI (Swagger) - Dokumentacja API\n\n### Frontend\n- React 19.1\n- TypeScript\n- TailwindCSS\n- React Query (TanStack Query)\n- React Hot Toast\n- Lucide React (ikony)\n\n## 📋 Wymagania\n\n- Java 17+\n- Node.js 20+\n- npm lub yarn\n\n## 🚀 Uruchomienie\n\n### 1. Backend (Spring Boot)\n\n```bash\ncd server\n./mvnw spring-boot:run\n```\n\nBackend będzie dostępny pod adresem: `http://localhost:8080`\n\n### 2. Frontend (React)\n\n```bash\ncd client\nnpm install\nnpm run dev\n```\n\nFrontend będzie dostępny pod adresem: `http://localhost:5173` (lub 5174 jeśli 5173 jest zajęty)\n\n## 🔐 Dane testowe\n\nSystem automatycznie tworzy testowych użytkowników przy pierwszym uruchomieniu:\n\n- **Admin**: `admin@mailer.com` / `password123`\n- **User**: `user@mailer.com` / `password123`\n\n## 📚 Dokumentacja API (Swagger)\n\nSystem posiada kompletną dokumentację API wykorzystującą Swagger/OpenAPI 3.0. Dokumentacja umożliwia interaktywne testowanie wszystkich endpointów bezpośrednio z przeglądarki.\n\n### Dostęp do dokumentacji Swagger\n\nPo uruchomieniu serwera backend, dokumentacja jest dostępna pod adresami:\n\n- **Swagger UI**: `http://localhost:8080/api/swagger-ui.html`\n- **OpenAPI JSON**: `http://localhost:8080/api/docs`\n\n### Funkcjonalności dokumentacji\n\n- **Interaktywne testowanie** wszystkich endpointów\n- **Autoryzacja JWT** bezpośrednio z interfejsu\n- **Kompletne opisy** parametrów i odpowiedzi\n- **Grupowanie** endpointów według funkcjonalności\n- **Przykładowe wartości** dla wszystkich struktur danych\n\n### Jak korzystać ze Swagger UI\n\n1. Uruchom serwer backend (`./mvnw spring-boot:run`)\n2. Otwórz `http://localhost:8080/api/swagger-ui.html`\n3. Zarejestruj się lub zaloguj przez endpoint `/api/auth/register` lub `/api/auth/login`\n4. Skopiuj otrzymany JWT token\n5. Kliknij przycisk **\"Authorize\"** w górnej części strony\n6. Wprowadź token w formacie: `Bearer \u003cyour-jwt-token\u003e`\n7. Teraz możesz testować wszystkie chronione endpointy\n\n## 📡 API Endpoints\n\n### Autentykacja (`/api/auth`)\n- `POST /api/auth/register` - Rejestracja nowego użytkownika\n- `POST /api/auth/login` - Logowanie użytkownika\n- `POST /api/auth/logout` - Wylogowanie użytkownika\n- `GET /api/auth/me` - Pobieranie danych aktualnego użytkownika\n\n### Zarządzanie Kontaktami (`/api/contacts`)\n- `GET /api/contacts` - Lista wszystkich kontaktów\n- `POST /api/contacts` - Tworzenie nowego kontaktu\n- `PUT /api/contacts/{id}` - Aktualizacja kontaktu\n- `DELETE /api/contacts/{id}` - Usuwanie kontaktu\n- `GET /api/contacts/stats` - Statystyki kontaktów\n- `GET /api/contacts/tags` - Dostępne tagi\n- `POST /api/contacts/import` - Import wielu kontaktów\n\n### Kampanie Emailowe (`/api/campaigns`)\n- `GET /api/campaigns` - Lista kampanii\n- `POST /api/campaigns` - Tworzenie nowej kampanii\n- `PUT /api/campaigns/{id}` - Aktualizacja kampanii\n- `DELETE /api/campaigns/{id}` - Usuwanie kampanii\n- `POST /api/campaigns/{id}/start` - Uruchamianie kampanii\n- `POST /api/campaigns/{id}/pause` - Wstrzymywanie kampanii\n- `POST /api/campaigns/{id}/complete` - Kończenie kampanii\n\n### Szablony Email (`/api/email-templates`)\n- `GET /api/email-templates` - Lista szablonów\n- `POST /api/email-templates` - Tworzenie szablonu\n- `PUT /api/email-templates/{id}` - Aktualizacja szablonu\n- `DELETE /api/email-templates/{id}` - Usuwanie szablonu\n\n### Przykłady użycia\n\n#### Logowanie\n```bash\ncurl -X POST http://localhost:8080/api/auth/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"admin@mailer.com\",\"password\":\"password123\"}'\n```\n\n#### Sprawdzanie aktualnego użytkownika\n```bash\ncurl -X GET http://localhost:8080/api/auth/me \\\n  -H \"Cookie: auth-token=YOUR_JWT_TOKEN\"\n```\n\n## 🔧 Konfiguracja\n\n### Backend (application.properties)\n```properties\n# Database\nspring.datasource.url=jdbc:postgresql://localhost:5432/mailerdb\nspring.datasource.driver-class-name=org.postgresql.Driver\n\n# JWT\njwt.secret=your-super-secret-jwt-key\njwt.expiration=86400000\njwt.cookie-name=auth-token\n\n# Swagger/OpenAPI Configuration\nspringdoc.api-docs.path=/api/docs\nspringdoc.swagger-ui.path=/api/swagger-ui.html\nspringdoc.swagger-ui.operationsSorter=method\nspringdoc.swagger-ui.tagsSorter=alpha\nspringdoc.swagger-ui.tryItOutEnabled=true\n\n# CORS\nspring.web.cors.allowed-origins=http://localhost:5173\n```\n\n### Frontend (lib/api.ts)\n```typescript\nconst API_BASE_URL = 'http://localhost:8080/api';\n```\n\n## 🏗️ Architektura\n\n### Backend\n```\nsrc/main/java/maile/com/example/mailer/\n├── config/\n│   ├── SecurityConfig.java          # Konfiguracja Spring Security\n│   ├── OpenApiConfig.java           # Konfiguracja Swagger/OpenAPI\n│   └── DataInitializer.java         # Inicjalizacja danych testowych\n├── controller/\n│   └── AuthController.java          # Endpointy autentykacji\n├── dto/\n│   ├── LoginRequest.java            # DTO logowania\n│   ├── RegisterRequest.java         # DTO rejestracji\n│   └── AuthResponse.java            # DTO odpowiedzi\n├── entity/\n│   └── User.java                    # Encja użytkownika\n├── repository/\n│   └── UserRepository.java          # Repository użytkowników\n├── security/\n│   └── JwtAuthenticationFilter.java # Filtr JWT\n├── service/\n│   ├── AuthService.java             # Serwis autentykacji\n│   ├── JwtService.java              # Serwis JWT\n│   └── CustomUserDetailsService.java # Serwis użytkowników\n└── exception/\n    └── GlobalExceptionHandler.java  # Globalny handler błędów\n```\n\n### Frontend\n```\nsrc/\n├── components/\n│   ├── auth/\n│   │   ├── LoginPage.page.tsx       # Strona logowania\n│   │   └── components/\n│   │       └── LoginForm.component.tsx\n│   └── dashboard/\n│       └── Dashboard.page.tsx       # Panel główny\n├── hooks/\n│   └── useAuth.hook.ts              # Hook autentykacji\n├── lib/\n│   ├── api.ts                       # Klient API\n│   └── queryClient.ts               # Konfiguracja React Query\n├── providers/\n│   └── AuthProvider.tsx             # Provider autentykacji\n└── App.tsx                          # Główny komponent\n```\n\n## 🔒 Bezpieczeństwo\n\n- **JWT Tokens** - Bezpieczne tokeny z określonym czasem wygaśnięcia\n- **HTTP-only Cookies** - Tokeny przechowywane w bezpiecznych cookies\n- **CORS** - Skonfigurowany dla localhost\n- **Walidacja** - Walidacja danych wejściowych po stronie serwera\n- **BCrypt** - Hasła hashowane z solą\n\n## 🧪 Testowanie\n\n### Backend\n```bash\ncd server\n./mvnw test\n```\n\n### Frontend\n```bash\ncd client\nnpm test\n```\n\n## 📝 Logi\n\nBackend loguje:\n- Operacje autentykacji\n- Błędy walidacji\n- Informacje o użytkownikach\n\nFrontend wyświetla:\n- Powiadomienia o sukcesie/błędach\n- Stan ładowania\n- Informacje o użytkowniku\n\n## 🚀 Rozwój\n\n### Dodawanie nowych endpointów\n1. Utwórz DTO w `dto/`\n2. Dodaj metodę w serwisie\n3. Utwórz endpoint w kontrolerze\n4. Dodaj testy\n\n### Dodawanie nowych komponentów\n1. Utwórz komponent w `components/`\n2. Dodaj hook jeśli potrzebny\n3. Zintegruj z React Query\n4. Dodaj obsługę błędów\n\n## 📄 Licencja\n\nMIT License\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fol1mowski%2Fmailer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fol1mowski%2Fmailer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fol1mowski%2Fmailer/lists"}