From d85406f0c737fa7ff510ad45d040825c2936b142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Murat=20O=CC=88zkorkmaz?= Date: Tue, 4 Nov 2025 12:29:32 +0100 Subject: [PATCH] Implemented bulk import of persons --- DEPLOYMENT.md | 292 ++++++++++++++++++ DEPLOYMENT_SECRETS.md | 181 +++++++++++ .../Authenticate/{Auth.bru => Auth App.bru} | 4 +- bruno/propify/DataImport/Auth Bruno.bru | 47 +++ bruno/propify/DataImport/Upload files.bru | 39 +++ bruno/propify/DataImport/folder.bru | 8 + bruno/propify/environments/local.bru | 6 +- init_data/people-17911945-22.xlsx | Bin 0 -> 148664 bytes pom.xml | 7 + .../controller/DataImportController.java | 42 +++ .../propify_api/dto/PersonImportDTO.java | 117 +++++++ .../de/iwomm/propify_api/entity/Industry.java | 31 ++ .../propify_api/entity/Organization.java | 60 ++++ .../iwomm/propify_api/entity/PersonLabel.java | 31 ++ .../repository/IndustryRepository.java | 11 + .../repository/OrganizationRepository.java | 11 + .../repository/PersonLabelRepository.java | 11 + .../repository/PersonRepository.java | 11 + .../service/PersonImportService.java | 229 ++++++++++++++ 19 files changed, 1134 insertions(+), 4 deletions(-) create mode 100644 DEPLOYMENT.md create mode 100644 DEPLOYMENT_SECRETS.md rename bruno/propify/Authenticate/{Auth.bru => Auth App.bru} (97%) create mode 100644 bruno/propify/DataImport/Auth Bruno.bru create mode 100644 bruno/propify/DataImport/Upload files.bru create mode 100644 bruno/propify/DataImport/folder.bru create mode 100644 init_data/people-17911945-22.xlsx create mode 100644 src/main/java/de/iwomm/propify_api/controller/DataImportController.java create mode 100644 src/main/java/de/iwomm/propify_api/dto/PersonImportDTO.java create mode 100644 src/main/java/de/iwomm/propify_api/entity/Industry.java create mode 100644 src/main/java/de/iwomm/propify_api/entity/Organization.java create mode 100644 src/main/java/de/iwomm/propify_api/entity/PersonLabel.java create mode 100644 src/main/java/de/iwomm/propify_api/repository/IndustryRepository.java create mode 100644 src/main/java/de/iwomm/propify_api/repository/OrganizationRepository.java create mode 100644 src/main/java/de/iwomm/propify_api/repository/PersonLabelRepository.java create mode 100644 src/main/java/de/iwomm/propify_api/repository/PersonRepository.java create mode 100644 src/main/java/de/iwomm/propify_api/service/PersonImportService.java diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..7cd9fb6 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,292 @@ +# Deployment Setup für SKAMP API + +Diese Anleitung beschreibt das vollständige Setup für das automatische Deployment der Spring Boot Applikation auf einen Remote Server. + +## Übersicht + +Bei einem Push auf den `main` Branch wird automatisch: +1. Die Spring Boot Applikation gebaut +2. Ein Docker Image erstellt +3. Das Image in die Gitea Container Registry gepusht +4. Das Image auf dem Remote Server deployed + +## Voraussetzungen + +### Auf dem Deployment-Server + +1. **Docker installiert** (Version 20.10+) + ```bash + curl -fsSL https://get.docker.com | sh + ``` + +2. **Keine weiteren Dateien notwendig** + - Der Workflow deployed direkt via `docker run` + - Keine compose.yml oder .env Dateien auf dem Server erforderlich + - Alle Konfiguration erfolgt über Gitea Secrets + +## Gitea Configuration + +Im Gitea Repository müssen folgende Variables und Secrets angelegt werden: + +### Repository Settings > Actions > Variables + +| Variable Name | Beschreibung | Beispiel | +|--------------|--------------|----------| +| `REGISTRY_URL` | Gitea Container Registry URL | `gitea.moz-tech.de` | +| `NAMESPACE` | Organisation/Benutzer | `murat` | +| `REPO_NAME` | Repository Name | `skamp` | + +### Repository Settings > Actions > Secrets + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `CI_GITEA_USER` | Gitea Benutzername | `murat` | +| `CI_GITEA_TOKEN` | Gitea Access Token | `ghp_xxxxxxxxxxxx` | +| `SSH_HOST` | Server IP/Hostname | `123.456.789.0` | +| `SSH_USERNAME` | SSH Benutzername | `deploy` | +| `SSH_PRIVATE_KEY` | SSH Private Key | `-----BEGIN RSA PRIVATE KEY-----...` | +| `SSH_PORT` | SSH Port | `22` | +| `APP_PORT` | Anwendungs-Port | `8080` | +| `SPRING_PROFILES_ACTIVE` | Spring Profil | `prod` | +| `POSTGRES_HOST` | PostgreSQL Host | `db.example.com` | +| `POSTGRES_PORT` | PostgreSQL Port | `5432` | +| `POSTGRES_DB` | Datenbank Name | `skamp` | +| `POSTGRES_USER` | Datenbank User | `skamp` | +| `POSTGRES_PASSWORD` | Datenbank Passwort | `IhrSicheresPasswort123!` | +| `HIBERNATE_DDL_AUTO` | Hibernate DDL | `update` | +| `KEYCLOAK_ISSUER_URI` | Keycloak Issuer URI | `https://keycloak.example.com/realms/skamp` | +| `CORS_ALLOWED_ORIGINS` | Erlaubte CORS Origins | `https://frontend.example.com` | +| `MINIO_ENDPOINT` | MinIO/S3 Endpoint | `https://s3.example.com` | +| `MINIO_ACCESS_KEY` | MinIO Access Key | `your_access_key` | +| `MINIO_SECRET_KEY` | MinIO Secret Key | `your_secret_key` | +| `JAVA_OPTS` | Java Optionen | `-Xmx1024m -Xms512m` | + +### Gitea Token erstellen + +1. Gitea → Einstellungen → Anwendungen → Access Tokens +2. Token Name: `deployment-token` +3. Berechtigungen: `read:packages`, `write:packages` +4. Token generieren und als `CI_GITEA_TOKEN` Secret speichern + +### SSH Key erstellen + +```bash +# Auf deinem lokalen Rechner +ssh-keygen -t ed25519 -C "deployment-key" -f ~/.ssh/skamp_deploy + +# Public Key auf den Server kopieren +ssh-copy-id -i ~/.ssh/skamp_deploy.pub user@server + +# Private Key als Secret speichern +cat ~/.ssh/skamp_deploy +``` + +## Erstes Deployment + +Das erste Deployment erfolgt automatisch beim Push auf `main`. Der Workflow: + +1. Baut die Spring Boot 3 Applikation mit Maven +2. Erstellt ein Docker Image +3. Pusht das Image zur Gitea Registry +4. Loggt sich per SSH auf dem Server ein +5. Pulled das Image +6. Startet den Container mit allen Environment-Variablen + +Alternativ kannst du das erste Deployment manuell testen: + +```bash +# Auf dem Server +# Login zur Container Registry +docker login gitea.moz-tech.de -u murat + +# Pull Image (ersetze IMAGE_TAG mit einem Commit-SHA oder 'latest') +docker pull gitea.moz-tech.de/murat/skamp:latest + +# Starte Container +docker run -d \ + --name skamp-app \ + --restart unless-stopped \ + -p 8080:8080 \ + -e SPRING_PROFILES_ACTIVE=prod \ + -e SPRING_DATASOURCE_URL=jdbc:postgresql://db.example.com:5432/skamp \ + -e SPRING_DATASOURCE_USERNAME=skamp \ + -e SPRING_DATASOURCE_PASSWORD=IhrPasswort \ + -e SPRING_JPA_HIBERNATE_DDL_AUTO=update \ + -e KEYCLOAK_ISSUER_URI=https://keycloak.example.com/realms/skamp \ + -e CORS_ALLOWED_ORIGINS=https://frontend.example.com \ + -e S3_ACCESS_KEY=your_access_key \ + -e S3_SECRET_KEY=your_secret_key \ + -e S3_ENDPOINT=https://s3.example.com \ + -e JAVA_OPTS="-Xmx1024m -Xms512m" \ + gitea.moz-tech.de/murat/skamp:latest + +# Prüfe Status +docker ps --filter name=skamp-app +docker logs -f skamp-app +``` + +## Workflow Trigger + +Das Deployment wird automatisch ausgelöst durch: + +```bash +git add . +git commit -m "Deploy: Update application" +git push origin main +``` + +## Monitoring + +### Logs anzeigen + +```bash +# Auf dem Server + +# Container Logs live anzeigen +docker logs -f skamp-app + +# Letzte 100 Zeilen +docker logs --tail 100 skamp-app + +# Mit Timestamps +docker logs -f --timestamps skamp-app +``` + +### Container Status + +```bash +# Status prüfen +docker ps --filter name=skamp-app + +# Detaillierte Informationen +docker inspect skamp-app + +# Resource-Nutzung +docker stats skamp-app +``` + +### Health Check + +```bash +# HTTP Health Check +curl http://localhost:8080/actuator/health + +# Container Health Status +docker inspect --format='{{.State.Health.Status}}' skamp-app +``` + +## Troubleshooting + +### Workflow schlägt fehl + +1. **Build Error**: Prüfe die Java Version und Maven Dependencies in `pom.xml` +2. **Registry Login Error**: Prüfe `CI_GITEA_TOKEN` Secret +3. **SSH Error**: Prüfe SSH Secrets (`SSH_HOST`, `SSH_USERNAME`, `SSH_PRIVATE_KEY`, `SSH_PORT`) +4. **Deployment Error**: Prüfe Server-Logs mit `docker logs skamp-app` + +### Container startet nicht + +```bash +# Prüfe Logs +docker logs skamp-app + +# Prüfe Container-Details +docker inspect skamp-app + +# Container neu starten +docker restart skamp-app + +# Container mit neuen Einstellungen starten +docker stop skamp-app +docker rm skamp-app +# Dann docker run erneut ausführen (siehe Deployment-Sektion) +``` + +### Datenbank-Verbindungsfehler + +```bash +# 1. Prüfe ob PostgreSQL erreichbar ist +docker exec skamp-app ping -c 3 $POSTGRES_HOST + +# 2. Prüfe Verbindung zur Datenbank +docker exec -it skamp-app sh -c "apt update && apt install -y postgresql-client" +docker exec -it skamp-app psql -h $POSTGRES_HOST -U $POSTGRES_USER -d $POSTGRES_DB + +# 3. Prüfe Environment-Variablen im Container +docker exec skamp-app env | grep SPRING_DATASOURCE +``` + +### Port-Konflikte + +```bash +# Prüfe ob Port bereits belegt ist +sudo netstat -tlnp | grep :8080 +# oder +sudo lsof -i :8080 + +# Anderen Port verwenden (z.B. 8081) +docker stop skamp-app +docker rm skamp-app +# Dann docker run mit -p 8081:8080 statt -p 8080:8080 +``` + +## Updates + +### Automatisches Update + +Jeder Push auf `main` löst ein automatisches Update aus. + +### Manuelles Update auf spezifische Version + +```bash +# Auf dem Server + +# Stoppe aktuellen Container +docker stop skamp-app +docker rm skamp-app + +# Pull spezifische Version (ersetze COMMIT_SHA) +docker pull gitea.moz-tech.de/murat/skamp:COMMIT_SHA + +# Starte Container mit neuer Version +docker run -d \ + --name skamp-app \ + --restart unless-stopped \ + -p 8080:8080 \ + -e ... (alle Environment-Variablen) \ + gitea.moz-tech.de/murat/skamp:COMMIT_SHA +``` + +### Rollback zu vorheriger Version + +```bash +# Prüfe verfügbare Images +docker images | grep skamp + +# Stoppe aktuellen Container +docker stop skamp-app +docker rm skamp-app + +# Starte mit älterer Version +docker run -d \ + --name skamp-app \ + --restart unless-stopped \ + -p 8080:8080 \ + -e ... (alle Environment-Variablen) \ + gitea.moz-tech.de/murat/skamp:OLD_COMMIT_SHA +``` + +## Security Best Practices + +1. **Secrets niemals committen** - Nutze `.gitignore` für `.env` +2. **Starke Passwörter** - Generiere sichere Passwörter für DB und S3 +3. **SSH Key Rotation** - Rotiere SSH Keys regelmäßig +4. **Firewall** - Beschränke Zugriff auf notwendige Ports +5. **Updates** - Halte Docker und Images aktuell +6. **Monitoring** - Implementiere Monitoring und Alerting + +## Weitere Informationen + +- Gitea Actions: https://docs.gitea.com/usage/actions/overview +- Docker Compose: https://docs.docker.com/compose/ +- Spring Boot: https://spring.io/projects/spring-boot diff --git a/DEPLOYMENT_SECRETS.md b/DEPLOYMENT_SECRETS.md new file mode 100644 index 0000000..1000d1c --- /dev/null +++ b/DEPLOYMENT_SECRETS.md @@ -0,0 +1,181 @@ +# Deployment Secrets Configuration + +Diese Dokumentation beschreibt die erforderlichen Secrets für den automatischen Deployment-Workflow in Gitea. + +## Erforderliche Secrets und Variablen in Gitea + +### Gitea Variables (nicht-sensitive Daten) + +Navigiere zu: **Repository Settings → Variables → Actions** + +Diese Werte sind nicht sensitiv und können als Variables gespeichert werden: + +| Variable Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `REGISTRY_URL` | URL der Container Registry | `gitea.moz-tech.de` | +| `NAMESPACE` | Namespace/Organisation in der Registry | `murat` | +| `REPO_NAME` | Repository Name für Docker Image | `skamp` | + +### Gitea Secrets (sensitive Daten) + +Navigiere zu: **Repository Settings → Secrets → Actions** + +Diese Werte sind sensitiv und müssen als Secrets gespeichert werden: + +#### Container Registry Secrets + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `CI_GITEA_USER` | Gitea Benutzername für Registry Login | `murat` | +| `CI_GITEA_TOKEN` | Gitea Access Token mit Registry-Rechten | `74a7738116bfb99497a7781291efc5766901f497` | + +#### SSH Server Secrets + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `SSH_HOST` | Hostname oder IP des Deployment-Servers | `server.example.com` | +| `SSH_USERNAME` | SSH Benutzername | `deploy` | +| `SSH_PRIVATE_KEY` | SSH Private Key (kompletter Inhalt) | `-----BEGIN OPENSSH PRIVATE KEY-----...` | +| `SSH_PORT` | SSH Port (optional, Standard: 22) | `22` | +| `DEPLOY_PATH` | Pfad zum Deployment-Verzeichnis auf dem Server | `/opt/skamp/docker` | + +### Application Secrets + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `APP_PORT` | Port für die Anwendung | `8082` | +| `SPRING_PROFILES_ACTIVE` | Spring Boot Profil | `prod` | +| `APPLICATION_NAME` | Name der Anwendung | `skamp-api` | +| `CORS_ALLOWED_ORIGINS` | Erlaubte CORS Origins | `https://app.example.com` | + +### PostgreSQL Secrets + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `POSTGRES_HOST` | PostgreSQL Hostname | `postgres` oder `db.example.com` | +| `POSTGRES_PORT` | PostgreSQL Port | `5432` | +| `POSTGRES_DB` | Datenbank Name | `skamp` | +| `POSTGRES_USER` | Datenbank Benutzername | `skamp_user` | +| `POSTGRES_PASSWORD` | Datenbank Passwort | `secure_password_here` | +| `HIBERNATE_DDL_AUTO` | Hibernate DDL Modus | `update` oder `validate` | + +### Keycloak Secrets + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `KEYCLOAK_URL` | Keycloak Server URL | `https://auth.moz-tech.de/` | +| `KEYCLOAK_REALM` | Keycloak Realm | `enerport` | +| `KEYCLOAK_ISSUER_URI` | Keycloak Issuer URI | `https://auth.moz-tech.de/realms/enerport` | + +### MinIO (S3) Secrets + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `MINIO_ENDPOINT` | MinIO Endpoint URL | `http://minio:9000` | +| `MINIO_ACCESS_KEY` | MinIO Access Key | `minioadmin` | +| `MINIO_SECRET_KEY` | MinIO Secret Key | `minioadmin123` | + +### AWS S3 Secrets (Optional) + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `AWS_ACCESS_KEY_ID` | AWS Access Key ID | `AKIAIOSFODNN7EXAMPLE` | +| `AWS_SECRET_ACCESS_KEY` | AWS Secret Access Key | `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` | +| `AWS_S3_BUCKET_NAME` | AWS S3 Bucket Name | `my-bucket` | +| `AWS_S3_REGION` | AWS S3 Region | `eu-central-1` | +| `AWS_S3_ENDPOINT` | AWS S3 Endpoint (optional) | `https://s3.eu-central-1.amazonaws.com` | + +### Additional Configuration Secrets + +| Secret Name | Beschreibung | Beispiel | +|------------|--------------|----------| +| `JAVA_OPTS` | Java JVM Optionen | `-Xmx512m -Xms256m` | + +## Workflow Ablauf + +Der Workflow wird bei jedem Push auf den `main` Branch ausgelöst: + +1. **Checkout Code** - Lädt den Repository-Code +2. **Login to Container Registry** - Authentifiziert sich bei der Gitea Registry +3. **Extract metadata** - Erstellt Image-Tags (commit SHA + latest) +4. **Build and Push Docker Image** - Baut das Docker Image mit Multi-Stage Build (Maven Build + Runtime Image) und pusht es zur Registry +5. **Deploy to Remote Server** - Verbindet per SSH zum Server, erstellt .env Datei aus Secrets und deployed die Anwendung + +**Hinweis:** Der Maven Build erfolgt im Docker Multi-Stage Build (siehe Dockerfile), daher ist kein separater Maven-Build-Step im Workflow erforderlich. + +## Server-Vorbereitung + +Auf dem Deployment-Server müssen folgende Voraussetzungen erfüllt sein: + +1. **Docker und Docker Compose installiert** + ```bash + docker --version + docker compose version + ``` + +2. **Deployment-Verzeichnis eingerichtet** + ```bash + mkdir -p /opt/skamp/docker + cd /opt/skamp/docker + ``` + +3. **Docker Compose Konfiguration** + - `compose.yml` - Die Docker Compose Konfiguration + - `.env` - Umgebungsvariablen für das Deployment + +4. **SSH-Zugriff konfiguriert** + - SSH Public Key des CI/CD Servers muss auf dem Deployment-Server hinterlegt sein + - SSH Private Key muss als Secret `SSH_PRIVATE_KEY` in Gitea hinterlegt sein + +## Image Tagging + +Der Workflow erstellt zwei Image-Tags: + +- `${REGISTRY_URL}/${NAMESPACE}/${REPO_NAME}:${COMMIT_SHA}` - Spezifischer Commit +- `${REGISTRY_URL}/${NAMESPACE}/${REPO_NAME}:latest` - Immer die neueste Version + +## Deployment auf dem Server + +Das Deployment-Script auf dem Server: + +1. Navigiert zum Deployment-Verzeichnis +2. Authentifiziert sich bei der Container Registry +3. Setzt die IMAGE_TAG Umgebungsvariable auf den Commit SHA +4. Pullt das neueste Image +5. Startet die Services neu mit `docker compose up -d` +6. Räumt alte Images auf (älter als 7 Tage) +7. Zeigt laufende Container an + +## Troubleshooting + +### Problem: Login zur Registry schlägt fehl +- Überprüfe CI_GITEA_TOKEN hat die richtigen Berechtigungen +- Stelle sicher, dass REGISTRY_URL korrekt ist (ohne `https://`) + +### Problem: SSH-Verbindung schlägt fehl +- Überprüfe SSH_HOST, SSH_USERNAME und SSH_PORT +- Stelle sicher, dass SSH_PRIVATE_KEY korrekt formatiert ist (mit Zeilenumbrüchen) +- Prüfe, ob der Public Key auf dem Server hinterlegt ist + +### Problem: Docker Compose startet nicht +- Überprüfe, ob die .env Datei auf dem Server existiert und korrekt ist +- Stelle sicher, dass compose.yml im DEPLOY_PATH vorhanden ist +- Prüfe die Logs mit `docker compose logs` + +## Manuelles Deployment + +Falls ein manuelles Deployment erforderlich ist: + +```bash +# Auf dem Server +cd /opt/skamp/docker + +# Login zur Registry +echo "YOUR_TOKEN" | docker login gitea.moz-tech.de -u murat --password-stdin + +# Image pullen und starten +docker compose pull +docker compose up -d + +# Logs prüfen +docker compose logs -f app diff --git a/bruno/propify/Authenticate/Auth.bru b/bruno/propify/Authenticate/Auth App.bru similarity index 97% rename from bruno/propify/Authenticate/Auth.bru rename to bruno/propify/Authenticate/Auth App.bru index c223dd4..3fa271b 100644 --- a/bruno/propify/Authenticate/Auth.bru +++ b/bruno/propify/Authenticate/Auth App.bru @@ -1,7 +1,7 @@ meta { - name: Auth + name: Auth App type: http - seq: 2 + seq: 1 } post { diff --git a/bruno/propify/DataImport/Auth Bruno.bru b/bruno/propify/DataImport/Auth Bruno.bru new file mode 100644 index 0000000..aec34d0 --- /dev/null +++ b/bruno/propify/DataImport/Auth Bruno.bru @@ -0,0 +1,47 @@ +meta { + name: Auth Bruno + type: http + seq: 2 +} + +post { + url: {{KEYCLOAK_BASE_URL}}/realms/{{KEYCLOAK_REALM}}/protocol/openid-connect/token + body: formUrlEncoded + auth: inherit +} + +headers { + Content-Type: application/x-www-form-urlencoded +} + +body:form-urlencoded { + grant_type: client_credentials + client_id: {{KEYCLOAK_BRUNO_CLIENT_ID}} + client_secret: {{KEYCLOAK_BRUNO_CLIENT_SECRET}} +} + +script:post-response { + // Parse die JSON-Antwort + const jsonResponse = res.body; + + + if (jsonResponse.access_token) { + // Schreibe den access_token in eine Umgebungsvariable + // oder in eine collection-Variable + + // Option 1: In eine Umgebungsvariable schreiben + // (z.B. für eine bestimmte Umgebung wie "Development") + bru.setEnvVar("BEARER_TOKEN", jsonResponse.access_token); + + // Option 2: In eine Collection-Variable schreiben + // (Diese Variable ist global für alle Anfragen in deiner Collection) + // bru.setVar("bearerToken", "Bearer " + jsonResponse.access_token); + } else { + // optional: Error Handling, falls der Token nicht in der Antwort ist + console.log("Error: access_token not found in the response."); + } +} + +settings { + encodeUrl: false +} diff --git a/bruno/propify/DataImport/Upload files.bru b/bruno/propify/DataImport/Upload files.bru new file mode 100644 index 0000000..92023f3 --- /dev/null +++ b/bruno/propify/DataImport/Upload files.bru @@ -0,0 +1,39 @@ +meta { + name: Upload files + type: http + seq: 1 +} + +post { + url: {{API_BASE_URL}}/api/{{API_VERSION}}/data-import/persons + body: multipartForm + auth: bearer +} + +auth:bearer { + token: {{BEARER_TOKEN}} +} + +body:json { + { + "name": "Bungalow", + "street": "Hebbelstraße", + "houseNumber": "30", + "zipCode": "55127", + "city": "Mainz", + "country": "DE", + "notes": "Lorem ipsum" + } +} + +body:multipart-form { + file: @file(/Users/muratoezkorkmaz/projects/misc/skamp/init_data/people-17911945-22.xlsx) +} + +body:file { + file: @file(/Users/murat/Pictures/IMG_0229.jpeg) @contentType(image/jpeg) +} + +settings { + encodeUrl: true +} diff --git a/bruno/propify/DataImport/folder.bru b/bruno/propify/DataImport/folder.bru new file mode 100644 index 0000000..3053f79 --- /dev/null +++ b/bruno/propify/DataImport/folder.bru @@ -0,0 +1,8 @@ +meta { + name: DataImport + seq: 6 +} + +auth { + mode: inherit +} diff --git a/bruno/propify/environments/local.bru b/bruno/propify/environments/local.bru index 917650f..1da1817 100644 --- a/bruno/propify/environments/local.bru +++ b/bruno/propify/environments/local.bru @@ -1,13 +1,15 @@ vars { - API_BASE_URL: http://localhost:8080 + API_BASE_URL: http://localhost:8180 API_VERSION: v1 - KEYCLOAK_BASE_URL: http://localhost:8280 + KEYCLOAK_BASE_URL: https://kc.dev.localhost DEV_USERNAME: dev@example.com DEV_PASSWORD: dev ADMIN_USERNAME: admin@example.com ADMIN_PASSWORD: admin KEYCLOAK_CLIENT_ID: skamp-app KEYCLOAK_REALM: skamp + KEYCLOAK_BRUNO_CLIENT_ID: skamp-bruno + KEYCLOAK_BRUNO_CLIENT_SECRET: sNQpCVyVckGo5AZw7FqeW0POtgWuXzJt } vars:secret [ BEARER_TOKEN diff --git a/init_data/people-17911945-22.xlsx b/init_data/people-17911945-22.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bf0c25436864b49291747896a1177d2b916b6d25 GIT binary patch literal 148664 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 z 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

f`r0XnNKKO%BzOsT!X8zOWZ;3) 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 + + + com.alibaba + easyexcel + 3.3.4 + + diff --git a/src/main/java/de/iwomm/propify_api/controller/DataImportController.java b/src/main/java/de/iwomm/propify_api/controller/DataImportController.java new file mode 100644 index 0000000..612d340 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/controller/DataImportController.java @@ -0,0 +1,42 @@ +package de.iwomm.propify_api.controller; + +import de.iwomm.propify_api.service.PersonImportService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@RestController +@RequestMapping("/api/v1/data-import") +public class DataImportController { + + private final PersonImportService personImportService; + + public DataImportController(PersonImportService personImportService) { + this.personImportService = personImportService; + } + + @PostMapping("/persons") + public ResponseEntity importPersons(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + return ResponseEntity.badRequest().body("Please upload a file"); + } + + if (!file.getOriginalFilename().endsWith(".xlsx")) { + return ResponseEntity.badRequest().body("Only .xlsx files are supported"); + } + + try { + PersonImportService.ImportResult result = personImportService.importPersonsFromExcel(file); + return ResponseEntity.ok(result); + } catch (IOException e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Error processing file: " + e.getMessage()); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Unexpected error: " + e.getMessage()); + } + } +} diff --git a/src/main/java/de/iwomm/propify_api/dto/PersonImportDTO.java b/src/main/java/de/iwomm/propify_api/dto/PersonImportDTO.java new file mode 100644 index 0000000..9d74239 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/dto/PersonImportDTO.java @@ -0,0 +1,117 @@ +package de.iwomm.propify_api.dto; + +import com.alibaba.excel.annotation.ExcelProperty; + +public class PersonImportDTO { + + @ExcelProperty(index = 0, value = "Person - Name") + private String name; + + @ExcelProperty(index = 1, value = "Person - Label") + private String labels; + + @ExcelProperty(index = 2, value = "Person - Organisation") + private String organization; + + @ExcelProperty(index = 3, value = "Person - E-Mail-Adresse - Büro") + private String emailOffice; + + @ExcelProperty(index = 4, value = "Person - E-Mail-Adresse - Privat") + private String emailPrivate; + + @ExcelProperty(index = 5, value = "Person - E-Mail-Adresse - Sonstiger") + private String emailOther; + + @ExcelProperty(index = 6, value = "Person - Telefon - Büro") + private String phoneOffice; + + @ExcelProperty(index = 7, value = "Person - Telefon - Privat") + private String phonePrivate; + + @ExcelProperty(index = 8, value = "Person - Telefon - Mobil") + private String phoneMobile; + + @ExcelProperty(index = 9, value = "Person - Telefon - Sonstiger") + private String phoneOther; + + // Getters and Setters + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLabels() { + return labels; + } + + public void setLabels(String labels) { + this.labels = labels; + } + + public String getOrganization() { + return organization; + } + + public void setOrganization(String organization) { + this.organization = organization; + } + + public String getEmailOffice() { + return emailOffice; + } + + public void setEmailOffice(String emailOffice) { + this.emailOffice = emailOffice; + } + + public String getEmailPrivate() { + return emailPrivate; + } + + public void setEmailPrivate(String emailPrivate) { + this.emailPrivate = emailPrivate; + } + + public String getEmailOther() { + return emailOther; + } + + public void setEmailOther(String emailOther) { + this.emailOther = emailOther; + } + + public String getPhoneOffice() { + return phoneOffice; + } + + public void setPhoneOffice(String phoneOffice) { + this.phoneOffice = phoneOffice; + } + + public String getPhonePrivate() { + return phonePrivate; + } + + public void setPhonePrivate(String phonePrivate) { + this.phonePrivate = phonePrivate; + } + + public String getPhoneMobile() { + return phoneMobile; + } + + public void setPhoneMobile(String phoneMobile) { + this.phoneMobile = phoneMobile; + } + + public String getPhoneOther() { + return phoneOther; + } + + public void setPhoneOther(String phoneOther) { + this.phoneOther = phoneOther; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/Industry.java b/src/main/java/de/iwomm/propify_api/entity/Industry.java new file mode 100644 index 0000000..951e549 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/Industry.java @@ -0,0 +1,31 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; +import java.util.UUID; + +@Entity +public class Industry { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + @Column(nullable = false) + private String name; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/Organization.java b/src/main/java/de/iwomm/propify_api/entity/Organization.java new file mode 100644 index 0000000..4162215 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/Organization.java @@ -0,0 +1,60 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +public class Organization { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + @Column(nullable = false) + private String name; + + @ManyToOne() + @JoinColumn(name = "industry_id") + private Industry industry; + + @Column(nullable = false) + private LocalDateTime createdAt; + + @PrePersist + protected void onCreate() { + this.createdAt = LocalDateTime.now(); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Industry getIndustry() { + return industry; + } + + public void setIndustry(Industry industry) { + this.industry = industry; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/PersonLabel.java b/src/main/java/de/iwomm/propify_api/entity/PersonLabel.java new file mode 100644 index 0000000..db396d3 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/PersonLabel.java @@ -0,0 +1,31 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; +import java.util.UUID; + +@Entity +public class PersonLabel { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + @Column(nullable = false) + private String name; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/de/iwomm/propify_api/repository/IndustryRepository.java b/src/main/java/de/iwomm/propify_api/repository/IndustryRepository.java new file mode 100644 index 0000000..9078b22 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/IndustryRepository.java @@ -0,0 +1,11 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.Industry; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface IndustryRepository extends JpaRepository { + Optional findByName(String name); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/OrganizationRepository.java b/src/main/java/de/iwomm/propify_api/repository/OrganizationRepository.java new file mode 100644 index 0000000..5f8e155 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/OrganizationRepository.java @@ -0,0 +1,11 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.Organization; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface OrganizationRepository extends JpaRepository { + Optional findByName(String name); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/PersonLabelRepository.java b/src/main/java/de/iwomm/propify_api/repository/PersonLabelRepository.java new file mode 100644 index 0000000..5bf9163 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/PersonLabelRepository.java @@ -0,0 +1,11 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.PersonLabel; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface PersonLabelRepository extends JpaRepository { + Optional findByName(String name); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/PersonRepository.java b/src/main/java/de/iwomm/propify_api/repository/PersonRepository.java new file mode 100644 index 0000000..2df3f39 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/PersonRepository.java @@ -0,0 +1,11 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.Person; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface PersonRepository extends JpaRepository { + Optional findByKeycloakId(String keycloakId); +} diff --git a/src/main/java/de/iwomm/propify_api/service/PersonImportService.java b/src/main/java/de/iwomm/propify_api/service/PersonImportService.java new file mode 100644 index 0000000..4702ac6 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/service/PersonImportService.java @@ -0,0 +1,229 @@ +package de.iwomm.propify_api.service; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +import de.iwomm.propify_api.dto.PersonImportDTO; +import de.iwomm.propify_api.entity.Person; +import de.iwomm.propify_api.entity.PersonLabel; +import de.iwomm.propify_api.repository.OrganizationRepository; +import de.iwomm.propify_api.repository.PersonLabelRepository; +import de.iwomm.propify_api.repository.PersonRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Service +public class PersonImportService { + + private final PersonRepository personRepository; + private final PersonLabelRepository personLabelRepository; + private final OrganizationRepository organizationRepository; + + public PersonImportService(PersonRepository personRepository, + PersonLabelRepository personLabelRepository, + OrganizationRepository organizationRepository) { + this.personRepository = personRepository; + this.personLabelRepository = personLabelRepository; + this.organizationRepository = organizationRepository; + } + + @Transactional + public ImportResult importPersonsFromExcel(MultipartFile file) throws IOException { + ImportResult result = new ImportResult(); + + EasyExcel.read(file.getInputStream(), PersonImportDTO.class, new ReadListener() { + private int currentRow = 1; // Start at 1 to account for header + + @Override + public void invoke(PersonImportDTO data, AnalysisContext context) { + currentRow++; + try { + Person person = convertToPerson(data); + personRepository.save(person); + result.incrementSuccess(); + } catch (Exception e) { + result.addError(currentRow, e.getMessage()); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // Called after all data has been analyzed + } + }).sheet().doRead(); + + return result; + } + + private Person convertToPerson(PersonImportDTO dto) { + Person person = new Person(); + + // Parse name (format: "firstName lastName") + if (dto.getName() != null && !dto.getName().trim().isEmpty()) { + String[] nameParts = dto.getName().trim().split("\\s+", 2); + person.setFirstName(nameParts[0]); + person.setLastName(nameParts.length > 1 ? nameParts[1] : null); + } else { + person.setFirstName(null); + person.setLastName(null); + } + + // Parse labels (comma-separated) + if (dto.getLabels() != null && !dto.getLabels().trim().isEmpty()) { + Set labels = new HashSet<>(); + String[] labelNames = dto.getLabels().split(","); + for (String labelName : labelNames) { + String trimmedName = labelName.trim(); + if (!trimmedName.isEmpty()) { + PersonLabel label = personLabelRepository.findByName(trimmedName) + .orElseGet(() -> { + PersonLabel newLabel = new PersonLabel(); + newLabel.setName(trimmedName); + return personLabelRepository.save(newLabel); + }); + labels.add(label); + } + } + person.setLabels(labels); + } + + // Organization (not yet linked in Person entity) + // String organization = dto.getOrganization(); + + // Email addresses + person.setEmailOffice(trimOrNull(dto.getEmailOffice())); + person.setEmailPrivate(trimOrNull(dto.getEmailPrivate())); + person.setEmailOther(trimOrNull(dto.getEmailOther())); + + // Office phone + if (dto.getPhoneOffice() != null && !dto.getPhoneOffice().trim().isEmpty()) { + PhoneNumber parsed = parsePhoneNumber(dto.getPhoneOffice()); + person.setPhoneOfficeCountryCode(parsed.countryCode); + person.setPhoneOfficeAreaCode(parsed.areaCode); + person.setPhoneOfficeNumber(parsed.number); + } + + // Private phone + if (dto.getPhonePrivate() != null && !dto.getPhonePrivate().trim().isEmpty()) { + PhoneNumber parsed = parsePhoneNumber(dto.getPhonePrivate()); + person.setPhonePrivateCountryCode(parsed.countryCode); + person.setPhonePrivateAreaCode(parsed.areaCode); + person.setPhonePrivateNumber(parsed.number); + } + + // Mobile phone (prefer phoneMobile, fallback to phoneOther) + String mobile = dto.getPhoneMobile(); + String other = dto.getPhoneOther(); + + if (mobile != null && !mobile.trim().isEmpty()) { + person.setPhoneMobile(mobile.trim()); + } else if (other != null && !other.trim().isEmpty()) { + person.setPhoneMobile(other.trim()); + } + + return person; + } + + private String trimOrNull(String value) { + if (value == null || value.trim().isEmpty()) { + return null; + } + return value.trim(); + } + + private PhoneNumber parsePhoneNumber(String phone) { + PhoneNumber result = new PhoneNumber(); + + // Remove all whitespace and special characters except + and digits + String cleaned = phone.replaceAll("[^+\\d]", ""); + + // Pattern to match: +CountryCode AreaCode Number + // Examples: +493012345678, +4930123456 + Pattern pattern = Pattern.compile("^(\\+\\d{1,3})(\\d{2,5})(\\d+)$"); + Matcher matcher = pattern.matcher(cleaned); + + if (matcher.matches()) { + result.countryCode = matcher.group(1); + result.areaCode = matcher.group(2); + result.number = matcher.group(3); + } else { + // If pattern doesn't match, try simpler parsing + if (cleaned.startsWith("+")) { + // Assume format: +CC followed by rest + int ccEnd = Math.min(4, cleaned.length()); // Max 3 digits + '+' + result.countryCode = cleaned.substring(0, ccEnd); + + String rest = cleaned.substring(ccEnd); + if (rest.length() > 4) { + // Split remaining into area code (2-3 digits) and number + result.areaCode = rest.substring(0, Math.min(3, rest.length() - 4)); + result.number = rest.substring(Math.min(3, rest.length() - 4)); + } else { + result.number = rest; + } + } else { + // No country code, store as-is in number field + result.number = cleaned; + } + } + + return result; + } + + private static class PhoneNumber { + String countryCode; + String areaCode; + String number; + } + + public static class ImportResult { + private int successCount = 0; + private int errorCount = 0; + private List errors = new ArrayList<>(); + + public void incrementSuccess() { + successCount++; + } + + public void addError(int row, String message) { + errorCount++; + errors.add(new ImportError(row, message)); + } + + public int getSuccessCount() { + return successCount; + } + + public int getErrorCount() { + return errorCount; + } + + public List getErrors() { + return errors; + } + } + + public static class ImportError { + private int row; + private String message; + + public ImportError(int row, String message) { + this.row = row; + this.message = message; + } + + public int getRow() { + return row; + } + + public String getMessage() { + return message; + } + } +}