diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5db274a4..470ac343 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,7 +1,7 @@ { "name": "Java Backend", "dockerComposeFile": [ - "../../docker-compose.yml" + "../docker-compose.yml" ], "service": "backend", "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2b933729 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Runtime data (Docker volumes) +data/ +import-data/ + +# Secrets +.env + +# Dev scripts / DB dumps +scripts/large-data.sql diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..cd65a444 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,93 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +**Familienarchiv** is a family document archival system — a full-stack web app for digitizing, organizing, and searching family documents. Key features: file uploads (stored in MinIO/S3), metadata management, Excel batch import, full-text search, conversation threads between family members, and role-based access control. + +## Stack + +- **Backend**: Spring Boot 4.0 (Java 21, Maven, Jetty, JPA/Hibernate, Flyway, Spring Security, Spring Session JDBC) +- **Frontend**: SvelteKit 2 with Svelte 5, TypeScript, Tailwind CSS 4, Paraglide.js (i18n: de/en/es) +- **Database**: PostgreSQL 16 +- **Object Storage**: MinIO (S3-compatible) +- **Infrastructure**: Docker Compose + +## Common Commands + +### Running the Full Stack +```bash +# From repo root — starts PostgreSQL, MinIO, and Spring Boot backend +docker-compose up -d +``` + +### Backend (Spring Boot) +```bash +cd backend + +./mvnw spring-boot:run # Run locally +./mvnw clean package # Build JAR (with tests) +./mvnw clean package -DskipTests +./mvnw test # Run all tests +./mvnw test -Dtest=ClassName # Run a single test class +``` + +### Frontend (SvelteKit) +```bash +cd frontend + +npm install +npm run dev # Dev server (port 3000) +npm run build # Production build +npm run preview # Preview production build + +npm run lint # Prettier + ESLint check +npm run format # Auto-fix formatting +npm run check # svelte-check (type checking) +npm run test # Vitest unit tests +``` + +## Architecture + +### Backend (`backend/src/main/java/org/raddatz/familienarchiv/`) + +Layered architecture: + +- **`model/`** — JPA entities: `Document`, `Person`, `AppUser`, `UserGroup`, `Tag`, `DocumentStatus` (enum: PLACEHOLDER → UPLOADED → TRANSCRIBED → REVIEWED → ARCHIVED) +- **`repository/`** — Spring Data repositories + `DocumentSpecifications` for complex filtered queries +- **`service/`** — Core business logic: `DocumentService` (uploads, search, Excel import), `FileService` (MinIO/S3), `ExcelService`, `MassImportService`, `UserService` +- **`controller/`** — REST endpoints: `DocumentController`, `PersonController`, `UserController`, `AdminController`, `GroupController`, `TagController` +- **`security/`** — `SecurityConfig` (HTTP Basic + form login, CSRF disabled), `PermissionAspect` (AOP enforcement of `@RequirePermission`), `CustomUserDetailsService` +- **`config/`** — `MinioConfig` (creates S3Client, validates connectivity on startup), `AsyncConfig` + +Database migrations live in `src/main/resources/db/migration/` (Flyway). Configuration in `src/main/resources/application.properties` — most values injected from environment variables (DB credentials, MinIO endpoint/credentials/bucket, upload limits, Excel column mappings). + +### Frontend (`backend/workspaces/frontend/src/`) + +- **`hooks.server.ts`** — Central middleware: reads `auth_token` cookie, injects it into all API calls to the backend, loads current user context +- **`routes/`** — File-based routing. Main pages: `/` (search/home), `/documents/[id]`, `/documents/[id]/edit`, `/persons`, `/persons/[id]`, `/conversations`, `/admin`, `/login` +- **`routes/api/`** — SvelteKit API endpoints for typeahead (persons, tags) — these call the Spring Boot backend +- **`lib/components/`** — `PersonTypeahead.svelte`, `TagInput.svelte` +- **`messages/`** — Paraglide.js translation files (`de.json`, `en.json`, `es.json`) + +Authentication: form login → backend sets session → `auth_token` cookie → hooks.server.ts injects into all backend requests. + +### Key Design Patterns + +- **Search**: `DocumentSpecifications` (Spring Data JPA Specification pattern) enables composable, dynamic query building for the document search endpoint +- **Permissions**: `@RequirePermission` annotation processed by `PermissionAspect` (AOP) — checks user's `UserGroup` permissions at the method level +- **Excel Import**: Configurable column index mapping in `application.properties`; `ExcelService` parses → `MassImportService` upserts documents +- **File Storage**: `FileService` wraps AWS SDK v2 `S3Client` with path-style access for MinIO compatibility + +### Infrastructure + +The `docker-compose.yml` at the repo root orchestrates everything. A MinIO MC helper container runs at startup to create the `archive-documents` bucket and set permissions. The backend container depends on both `db` and `minio` being healthy before starting. + +## API Testing + +HTTP test files are in `backend/api_tests/` (`Document.http`, `User.http`) for use with the VS Code REST Client extension. + +## Dev Container + +A `.devcontainer/` config is available (Java 21 + Node 24, with ports 8080 and 3000 forwarded). Use VS Code's "Reopen in Container" to get a pre-configured environment with Spring Boot Tools, Lombok support, and database/MinIO services running. diff --git a/workspaces/backend/.gitignore b/backend/.gitignore similarity index 100% rename from workspaces/backend/.gitignore rename to backend/.gitignore diff --git a/workspaces/backend/Dockerfile b/backend/Dockerfile similarity index 100% rename from workspaces/backend/Dockerfile rename to backend/Dockerfile diff --git a/workspaces/backend/HELP.md b/backend/HELP.md similarity index 100% rename from workspaces/backend/HELP.md rename to backend/HELP.md diff --git a/workspaces/backend/api_tests/Admin-Auth.http b/backend/api_tests/Admin-Auth.http similarity index 100% rename from workspaces/backend/api_tests/Admin-Auth.http rename to backend/api_tests/Admin-Auth.http diff --git a/workspaces/backend/api_tests/Document.http b/backend/api_tests/Document.http similarity index 100% rename from workspaces/backend/api_tests/Document.http rename to backend/api_tests/Document.http diff --git a/workspaces/backend/api_tests/User.http b/backend/api_tests/User.http similarity index 100% rename from workspaces/backend/api_tests/User.http rename to backend/api_tests/User.http diff --git a/workspaces/backend/api_tests/demo.pdf b/backend/api_tests/demo.pdf similarity index 100% rename from workspaces/backend/api_tests/demo.pdf rename to backend/api_tests/demo.pdf diff --git a/workspaces/backend/api_tests/metadata.xlsx b/backend/api_tests/metadata.xlsx similarity index 100% rename from workspaces/backend/api_tests/metadata.xlsx rename to backend/api_tests/metadata.xlsx diff --git a/workspaces/backend/mvnw b/backend/mvnw similarity index 100% rename from workspaces/backend/mvnw rename to backend/mvnw diff --git a/workspaces/backend/mvnw.cmd b/backend/mvnw.cmd similarity index 100% rename from workspaces/backend/mvnw.cmd rename to backend/mvnw.cmd diff --git a/workspaces/backend/pom.xml b/backend/pom.xml similarity index 100% rename from workspaces/backend/pom.xml rename to backend/pom.xml diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/FamilienarchivApplication.java b/backend/src/main/java/org/raddatz/familienarchiv/FamilienarchivApplication.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/FamilienarchivApplication.java rename to backend/src/main/java/org/raddatz/familienarchiv/FamilienarchivApplication.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/config/AsyncConfig.java b/backend/src/main/java/org/raddatz/familienarchiv/config/AsyncConfig.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/config/AsyncConfig.java rename to backend/src/main/java/org/raddatz/familienarchiv/config/AsyncConfig.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/config/DataInitializer.java b/backend/src/main/java/org/raddatz/familienarchiv/config/DataInitializer.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/config/DataInitializer.java rename to backend/src/main/java/org/raddatz/familienarchiv/config/DataInitializer.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/config/MinioConfig.java b/backend/src/main/java/org/raddatz/familienarchiv/config/MinioConfig.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/config/MinioConfig.java rename to backend/src/main/java/org/raddatz/familienarchiv/config/MinioConfig.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/config/SecurityConfig.java b/backend/src/main/java/org/raddatz/familienarchiv/config/SecurityConfig.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/config/SecurityConfig.java rename to backend/src/main/java/org/raddatz/familienarchiv/config/SecurityConfig.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/AdminController.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/AdminController.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/AdminController.java rename to backend/src/main/java/org/raddatz/familienarchiv/controller/AdminController.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java rename to backend/src/main/java/org/raddatz/familienarchiv/controller/DocumentController.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/GlobalExceptionHandler.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/GlobalExceptionHandler.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/GlobalExceptionHandler.java rename to backend/src/main/java/org/raddatz/familienarchiv/controller/GlobalExceptionHandler.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/GroupController.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/GroupController.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/GroupController.java rename to backend/src/main/java/org/raddatz/familienarchiv/controller/GroupController.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/PersonController.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/PersonController.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/PersonController.java rename to backend/src/main/java/org/raddatz/familienarchiv/controller/PersonController.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/TagController.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/TagController.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/TagController.java rename to backend/src/main/java/org/raddatz/familienarchiv/controller/TagController.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/UserController.java b/backend/src/main/java/org/raddatz/familienarchiv/controller/UserController.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/controller/UserController.java rename to backend/src/main/java/org/raddatz/familienarchiv/controller/UserController.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/dto/CreateUserRequest.java b/backend/src/main/java/org/raddatz/familienarchiv/dto/CreateUserRequest.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/dto/CreateUserRequest.java rename to backend/src/main/java/org/raddatz/familienarchiv/dto/CreateUserRequest.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/dto/DocumentUpdateDTO.java b/backend/src/main/java/org/raddatz/familienarchiv/dto/DocumentUpdateDTO.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/dto/DocumentUpdateDTO.java rename to backend/src/main/java/org/raddatz/familienarchiv/dto/DocumentUpdateDTO.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/dto/GroupDTO.java b/backend/src/main/java/org/raddatz/familienarchiv/dto/GroupDTO.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/dto/GroupDTO.java rename to backend/src/main/java/org/raddatz/familienarchiv/dto/GroupDTO.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/AppUser.java b/backend/src/main/java/org/raddatz/familienarchiv/model/AppUser.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/AppUser.java rename to backend/src/main/java/org/raddatz/familienarchiv/model/AppUser.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/Document.java b/backend/src/main/java/org/raddatz/familienarchiv/model/Document.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/Document.java rename to backend/src/main/java/org/raddatz/familienarchiv/model/Document.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/DocumentStatus.java b/backend/src/main/java/org/raddatz/familienarchiv/model/DocumentStatus.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/DocumentStatus.java rename to backend/src/main/java/org/raddatz/familienarchiv/model/DocumentStatus.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/Person.java b/backend/src/main/java/org/raddatz/familienarchiv/model/Person.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/Person.java rename to backend/src/main/java/org/raddatz/familienarchiv/model/Person.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/Tag.java b/backend/src/main/java/org/raddatz/familienarchiv/model/Tag.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/Tag.java rename to backend/src/main/java/org/raddatz/familienarchiv/model/Tag.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/UserGroup.java b/backend/src/main/java/org/raddatz/familienarchiv/model/UserGroup.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/model/UserGroup.java rename to backend/src/main/java/org/raddatz/familienarchiv/model/UserGroup.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/AppUserRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/repository/AppUserRepository.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/AppUserRepository.java rename to backend/src/main/java/org/raddatz/familienarchiv/repository/AppUserRepository.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java rename to backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentRepository.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentSpecifications.java b/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentSpecifications.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentSpecifications.java rename to backend/src/main/java/org/raddatz/familienarchiv/repository/DocumentSpecifications.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/PersonRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/repository/PersonRepository.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/PersonRepository.java rename to backend/src/main/java/org/raddatz/familienarchiv/repository/PersonRepository.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/TagRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/repository/TagRepository.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/TagRepository.java rename to backend/src/main/java/org/raddatz/familienarchiv/repository/TagRepository.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/UserGroupRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/repository/UserGroupRepository.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/repository/UserGroupRepository.java rename to backend/src/main/java/org/raddatz/familienarchiv/repository/UserGroupRepository.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/security/Permission.java b/backend/src/main/java/org/raddatz/familienarchiv/security/Permission.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/security/Permission.java rename to backend/src/main/java/org/raddatz/familienarchiv/security/Permission.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/security/PermissionAspect.java b/backend/src/main/java/org/raddatz/familienarchiv/security/PermissionAspect.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/security/PermissionAspect.java rename to backend/src/main/java/org/raddatz/familienarchiv/security/PermissionAspect.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/security/RequirePermission.java b/backend/src/main/java/org/raddatz/familienarchiv/security/RequirePermission.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/security/RequirePermission.java rename to backend/src/main/java/org/raddatz/familienarchiv/security/RequirePermission.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/CustomUserDetailsService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/CustomUserDetailsService.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/CustomUserDetailsService.java rename to backend/src/main/java/org/raddatz/familienarchiv/service/CustomUserDetailsService.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java rename to backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/ExcelService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/ExcelService.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/ExcelService.java rename to backend/src/main/java/org/raddatz/familienarchiv/service/ExcelService.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/FileService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/FileService.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/FileService.java rename to backend/src/main/java/org/raddatz/familienarchiv/service/FileService.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/MassImportService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/MassImportService.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/MassImportService.java rename to backend/src/main/java/org/raddatz/familienarchiv/service/MassImportService.java diff --git a/workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/UserService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/UserService.java similarity index 100% rename from workspaces/backend/src/main/java/org/raddatz/familienarchiv/service/UserService.java rename to backend/src/main/java/org/raddatz/familienarchiv/service/UserService.java diff --git a/workspaces/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties similarity index 100% rename from workspaces/backend/src/main/resources/application.properties rename to backend/src/main/resources/application.properties diff --git a/workspaces/backend/src/main/resources/db/migration/V1__initial_schema.sql b/backend/src/main/resources/db/migration/V1__initial_schema.sql similarity index 100% rename from workspaces/backend/src/main/resources/db/migration/V1__initial_schema.sql rename to backend/src/main/resources/db/migration/V1__initial_schema.sql diff --git a/workspaces/backend/src/test/java/org/raddatz/familienarchiv/FamilienarchivApplicationTests.java b/backend/src/test/java/org/raddatz/familienarchiv/FamilienarchivApplicationTests.java similarity index 100% rename from workspaces/backend/src/test/java/org/raddatz/familienarchiv/FamilienarchivApplicationTests.java rename to backend/src/test/java/org/raddatz/familienarchiv/FamilienarchivApplicationTests.java diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..5ec3bf33 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,112 @@ +services: + # --- Datenbank: PostgreSQL --- + db: + image: postgres:16-alpine + container_name: archive-db + restart: unless-stopped + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - ./data/postgres:/var/lib/postgresql/data + ports: + - "${PORT_DB}:5432" + networks: + - archive-net + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 5s + timeout: 5s + retries: 5 + + # --- Object Storage: MinIO (S3 kompatibel) --- + minio: + image: minio/minio:latest + container_name: archive-minio + restart: unless-stopped + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${MINIO_ROOT_USER} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} + volumes: + - ./data/minio:/data + ports: + - "${PORT_MINIO_API}:9000" # API Port + - "${PORT_MINIO_CONSOLE}:9001" # Web-Oberfläche + networks: + - archive-net + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + interval: 30s + timeout: 20s + retries: 3 + + # --- Helper: Erstellt automatisch den Bucket --- + create-buckets: + image: minio/mc + depends_on: + minio: + condition: service_healthy + entrypoint: > + /bin/sh -c " + /usr/bin/mc alias set myminio http://minio:9000 ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}; + /usr/bin/mc mb myminio/${MINIO_DEFAULT_BUCKETS} --ignore-existing; + /usr/bin/mc anonymous set private myminio/${MINIO_DEFAULT_BUCKETS}; + exit 0; + " + networks: + - archive-net + + # --- Backend: Spring Boot --- + backend: + build: + context: ./backend + dockerfile: Dockerfile + container_name: archive-backend + command: sleep infinity + restart: unless-stopped + volumes: + - ./backend:/workspaces/backend:cached + - ./import-data:/import # Mappt den lokalen Ordner "import-data" auf "/import" im Container + depends_on: + db: + condition: service_healthy + minio: + condition: service_healthy + environment: + SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/${POSTGRES_DB} + SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER} + SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD} + # MinIO Konfiguration für Spring Boot (S3) + S3_ENDPOINT: http://minio:9000 + S3_ACCESS_KEY: ${MINIO_ROOT_USER} + S3_SECRET_KEY: ${MINIO_ROOT_PASSWORD} + S3_BUCKET_NAME: ${MINIO_DEFAULT_BUCKETS} + S3_REGION: us-east-1 # MinIO Standard + ports: + - "${PORT_BACKEND}:8080" + networks: + - archive-net + + # --- Frontend: SvelteKit --- + # Auch hier brauchen wir erst das Dockerfile im frontend Ordner. + # frontend: + # build: ./frontend + # container_name: archive-frontend + # restart: unless-stopped + # depends_on: + # - backend + # environment: + # # SvelteKit SSR braucht die interne Docker-URL zum Backend + # API_BASE_URL: http://backend:8080 + # # Der Browser braucht die öffentliche URL (falls Client-Side Fetching genutzt wird) + # PUBLIC_API_BASE_URL: http://localhost:${PORT_BACKEND} + # ports: + # - "${PORT_FRONTEND}:3000" + # networks: + # - archive-net + +networks: + archive-net: + driver: bridge diff --git a/workspaces/frontend/.gitignore b/frontend/.gitignore similarity index 100% rename from workspaces/frontend/.gitignore rename to frontend/.gitignore diff --git a/workspaces/frontend/.npmrc b/frontend/.npmrc similarity index 100% rename from workspaces/frontend/.npmrc rename to frontend/.npmrc diff --git a/workspaces/frontend/.prettierignore b/frontend/.prettierignore similarity index 100% rename from workspaces/frontend/.prettierignore rename to frontend/.prettierignore diff --git a/workspaces/frontend/.prettierrc b/frontend/.prettierrc similarity index 100% rename from workspaces/frontend/.prettierrc rename to frontend/.prettierrc diff --git a/workspaces/frontend/.vscode/settings.json b/frontend/.vscode/settings.json similarity index 100% rename from workspaces/frontend/.vscode/settings.json rename to frontend/.vscode/settings.json diff --git a/workspaces/frontend/README.md b/frontend/README.md similarity index 100% rename from workspaces/frontend/README.md rename to frontend/README.md diff --git a/workspaces/frontend/eslint.config.js b/frontend/eslint.config.js similarity index 100% rename from workspaces/frontend/eslint.config.js rename to frontend/eslint.config.js diff --git a/workspaces/frontend/messages/de.json b/frontend/messages/de.json similarity index 100% rename from workspaces/frontend/messages/de.json rename to frontend/messages/de.json diff --git a/workspaces/frontend/messages/en.json b/frontend/messages/en.json similarity index 100% rename from workspaces/frontend/messages/en.json rename to frontend/messages/en.json diff --git a/workspaces/frontend/messages/es.json b/frontend/messages/es.json similarity index 100% rename from workspaces/frontend/messages/es.json rename to frontend/messages/es.json diff --git a/workspaces/frontend/package-lock.json b/frontend/package-lock.json similarity index 100% rename from workspaces/frontend/package-lock.json rename to frontend/package-lock.json diff --git a/workspaces/frontend/package.json b/frontend/package.json similarity index 100% rename from workspaces/frontend/package.json rename to frontend/package.json diff --git a/workspaces/frontend/project.inlang/cache/plugins/2sy648wh9sugi b/frontend/project.inlang/cache/plugins/2sy648wh9sugi similarity index 100% rename from workspaces/frontend/project.inlang/cache/plugins/2sy648wh9sugi rename to frontend/project.inlang/cache/plugins/2sy648wh9sugi diff --git a/workspaces/frontend/project.inlang/cache/plugins/ygx0uiahq6uw b/frontend/project.inlang/cache/plugins/ygx0uiahq6uw similarity index 100% rename from workspaces/frontend/project.inlang/cache/plugins/ygx0uiahq6uw rename to frontend/project.inlang/cache/plugins/ygx0uiahq6uw diff --git a/workspaces/frontend/project.inlang/project_id b/frontend/project.inlang/project_id similarity index 100% rename from workspaces/frontend/project.inlang/project_id rename to frontend/project.inlang/project_id diff --git a/workspaces/frontend/project.inlang/settings.json b/frontend/project.inlang/settings.json similarity index 100% rename from workspaces/frontend/project.inlang/settings.json rename to frontend/project.inlang/settings.json diff --git a/workspaces/frontend/src/app.d.ts b/frontend/src/app.d.ts similarity index 100% rename from workspaces/frontend/src/app.d.ts rename to frontend/src/app.d.ts diff --git a/workspaces/frontend/src/app.html b/frontend/src/app.html similarity index 100% rename from workspaces/frontend/src/app.html rename to frontend/src/app.html diff --git a/workspaces/frontend/src/demo.spec.ts b/frontend/src/demo.spec.ts similarity index 100% rename from workspaces/frontend/src/demo.spec.ts rename to frontend/src/demo.spec.ts diff --git a/workspaces/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts similarity index 100% rename from workspaces/frontend/src/hooks.server.ts rename to frontend/src/hooks.server.ts diff --git a/workspaces/frontend/src/hooks.ts b/frontend/src/hooks.ts similarity index 100% rename from workspaces/frontend/src/hooks.ts rename to frontend/src/hooks.ts diff --git a/workspaces/frontend/src/lib/assets/favicon.svg b/frontend/src/lib/assets/favicon.svg similarity index 100% rename from workspaces/frontend/src/lib/assets/favicon.svg rename to frontend/src/lib/assets/favicon.svg diff --git a/workspaces/frontend/src/lib/components/PersonTypeahead.svelte b/frontend/src/lib/components/PersonTypeahead.svelte similarity index 100% rename from workspaces/frontend/src/lib/components/PersonTypeahead.svelte rename to frontend/src/lib/components/PersonTypeahead.svelte diff --git a/workspaces/frontend/src/lib/components/TagInput.svelte b/frontend/src/lib/components/TagInput.svelte similarity index 100% rename from workspaces/frontend/src/lib/components/TagInput.svelte rename to frontend/src/lib/components/TagInput.svelte diff --git a/workspaces/frontend/src/lib/index.ts b/frontend/src/lib/index.ts similarity index 100% rename from workspaces/frontend/src/lib/index.ts rename to frontend/src/lib/index.ts diff --git a/workspaces/frontend/src/routes/+layout.server.ts b/frontend/src/routes/+layout.server.ts similarity index 100% rename from workspaces/frontend/src/routes/+layout.server.ts rename to frontend/src/routes/+layout.server.ts diff --git a/workspaces/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte similarity index 100% rename from workspaces/frontend/src/routes/+layout.svelte rename to frontend/src/routes/+layout.svelte diff --git a/workspaces/frontend/src/routes/+page.server.ts b/frontend/src/routes/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/+page.server.ts rename to frontend/src/routes/+page.server.ts diff --git a/workspaces/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/+page.svelte rename to frontend/src/routes/+page.svelte diff --git a/workspaces/frontend/src/routes/admin/+page.server.ts b/frontend/src/routes/admin/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/admin/+page.server.ts rename to frontend/src/routes/admin/+page.server.ts diff --git a/workspaces/frontend/src/routes/admin/+page.svelte b/frontend/src/routes/admin/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/admin/+page.svelte rename to frontend/src/routes/admin/+page.svelte diff --git a/workspaces/frontend/src/routes/api/persons/+server.ts b/frontend/src/routes/api/persons/+server.ts similarity index 100% rename from workspaces/frontend/src/routes/api/persons/+server.ts rename to frontend/src/routes/api/persons/+server.ts diff --git a/workspaces/frontend/src/routes/api/tags/+server.ts b/frontend/src/routes/api/tags/+server.ts similarity index 100% rename from workspaces/frontend/src/routes/api/tags/+server.ts rename to frontend/src/routes/api/tags/+server.ts diff --git a/workspaces/frontend/src/routes/conversations/+page.server.ts b/frontend/src/routes/conversations/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/conversations/+page.server.ts rename to frontend/src/routes/conversations/+page.server.ts diff --git a/workspaces/frontend/src/routes/conversations/+page.svelte b/frontend/src/routes/conversations/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/conversations/+page.svelte rename to frontend/src/routes/conversations/+page.svelte diff --git a/workspaces/frontend/src/routes/demo/+page.svelte b/frontend/src/routes/demo/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/demo/+page.svelte rename to frontend/src/routes/demo/+page.svelte diff --git a/workspaces/frontend/src/routes/demo/paraglide/+page.svelte b/frontend/src/routes/demo/paraglide/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/demo/paraglide/+page.svelte rename to frontend/src/routes/demo/paraglide/+page.svelte diff --git a/workspaces/frontend/src/routes/documents/[id]/+page.server.ts b/frontend/src/routes/documents/[id]/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/documents/[id]/+page.server.ts rename to frontend/src/routes/documents/[id]/+page.server.ts diff --git a/workspaces/frontend/src/routes/documents/[id]/+page.svelte b/frontend/src/routes/documents/[id]/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/documents/[id]/+page.svelte rename to frontend/src/routes/documents/[id]/+page.svelte diff --git a/workspaces/frontend/src/routes/documents/[id]/edit/+page.server.ts b/frontend/src/routes/documents/[id]/edit/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/documents/[id]/edit/+page.server.ts rename to frontend/src/routes/documents/[id]/edit/+page.server.ts diff --git a/workspaces/frontend/src/routes/documents/[id]/edit/+page.svelte b/frontend/src/routes/documents/[id]/edit/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/documents/[id]/edit/+page.svelte rename to frontend/src/routes/documents/[id]/edit/+page.svelte diff --git a/workspaces/frontend/src/routes/layout.css b/frontend/src/routes/layout.css similarity index 100% rename from workspaces/frontend/src/routes/layout.css rename to frontend/src/routes/layout.css diff --git a/workspaces/frontend/src/routes/login/+page.server.ts b/frontend/src/routes/login/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/login/+page.server.ts rename to frontend/src/routes/login/+page.server.ts diff --git a/workspaces/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/login/+page.svelte rename to frontend/src/routes/login/+page.svelte diff --git a/workspaces/frontend/src/routes/logout/+page.server.ts b/frontend/src/routes/logout/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/logout/+page.server.ts rename to frontend/src/routes/logout/+page.server.ts diff --git a/workspaces/frontend/src/routes/page.svelte.spec.ts b/frontend/src/routes/page.svelte.spec.ts similarity index 100% rename from workspaces/frontend/src/routes/page.svelte.spec.ts rename to frontend/src/routes/page.svelte.spec.ts diff --git a/workspaces/frontend/src/routes/persons/+page.server.ts b/frontend/src/routes/persons/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/persons/+page.server.ts rename to frontend/src/routes/persons/+page.server.ts diff --git a/workspaces/frontend/src/routes/persons/+page.svelte b/frontend/src/routes/persons/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/persons/+page.svelte rename to frontend/src/routes/persons/+page.svelte diff --git a/workspaces/frontend/src/routes/persons/[id]/+page.server.ts b/frontend/src/routes/persons/[id]/+page.server.ts similarity index 100% rename from workspaces/frontend/src/routes/persons/[id]/+page.server.ts rename to frontend/src/routes/persons/[id]/+page.server.ts diff --git a/workspaces/frontend/src/routes/persons/[id]/+page.svelte b/frontend/src/routes/persons/[id]/+page.svelte similarity index 100% rename from workspaces/frontend/src/routes/persons/[id]/+page.svelte rename to frontend/src/routes/persons/[id]/+page.svelte diff --git a/workspaces/frontend/static/robots.txt b/frontend/static/robots.txt similarity index 100% rename from workspaces/frontend/static/robots.txt rename to frontend/static/robots.txt diff --git a/workspaces/frontend/svelte.config.js b/frontend/svelte.config.js similarity index 100% rename from workspaces/frontend/svelte.config.js rename to frontend/svelte.config.js diff --git a/workspaces/frontend/tailwind.config.js b/frontend/tailwind.config.js similarity index 100% rename from workspaces/frontend/tailwind.config.js rename to frontend/tailwind.config.js diff --git a/workspaces/frontend/tsconfig.json b/frontend/tsconfig.json similarity index 100% rename from workspaces/frontend/tsconfig.json rename to frontend/tsconfig.json diff --git a/workspaces/frontend/vite.config.ts b/frontend/vite.config.ts similarity index 100% rename from workspaces/frontend/vite.config.ts rename to frontend/vite.config.ts diff --git a/workspaces/frontend/yarn.lock b/frontend/yarn.lock similarity index 100% rename from workspaces/frontend/yarn.lock rename to frontend/yarn.lock diff --git a/scripts/generate_data.py b/scripts/generate_data.py new file mode 100644 index 00000000..6332bf37 --- /dev/null +++ b/scripts/generate_data.py @@ -0,0 +1,74 @@ +import uuid +import random +import datetime + +# --- Configuration --- +NUM_PERSONS = 50 +NUM_DOCUMENTS = 500 +OUTPUT_FILE = "large-data.sql" + +# --- Source Data --- +FIRST_NAMES = ["Hans", "Helga", "Thomas", "Maria", "Otto", "Frieda", "Heinrich", "Anna", "Wilhelm", "Elisabeth", "Paul", "Gertrud", "Karl", "Martha", "Fritz", "Erna"] +LAST_NAMES = ["Müller", "Schmidt", "Schneider", "Fischer", "Weber", "Meyer", "Wagner", "Becker", "Schulz", "Hoffmann", "Raddatz", "Koch", "Richter", "Klein"] +CITIES = ["Berlin", "München", "Hamburg", "Köln", "Frankfurt", "Leipzig", "Dresden", "Breslau", "Königsberg", "Wien", "Stuttgart"] +TITLES = ["Brief von", "Rechnung", "Postkarte aus", "Notiz an", "Dokument betreffend", "Urkunde für", "Foto von"] + +def random_date(start_year=1900, end_year=2000): + start = datetime.date(start_year, 1, 1) + end = datetime.date(end_year, 12, 31) + return start + datetime.timedelta(days=random.randint(0, (end - start).days)) + +# --- Generation --- +print(f"Generating {NUM_PERSONS} persons and {NUM_DOCUMENTS} documents...") + +persons = [] +sql_lines = [] + +# 1. Generate Persons +sql_lines.append("-- Persons") +for _ in range(NUM_PERSONS): + p_id = str(uuid.uuid4()) + fn = random.choice(FIRST_NAMES) + ln = random.choice(LAST_NAMES) + persons.append(p_id) + sql_lines.append(f"INSERT INTO persons (id, first_name, last_name, alias) VALUES ('{p_id}', '{fn}', '{ln}', NULL) ON CONFLICT DO NOTHING;") + +# 2. Generate Documents +sql_lines.append("\n-- Documents") +document_ids = [] + +for _ in range(NUM_DOCUMENTS): + doc_id = str(uuid.uuid4()) + document_ids.append(doc_id) + + sender_id = random.choice(persons) + title_start = random.choice(TITLES) + date = random_date() + year = date.year + city = random.choice(CITIES) + title = f"{title_start} {city} {year}" + + # Simple transcription text + transcription = f"Lieber Empfänger, dies ist ein Testdokument aus {city}, geschrieben am {date}. Das Wetter war schön." + + sql = ( + f"INSERT INTO documents (id, title, original_filename, file_path, status, meta_date, meta_location, transcription, sender_id, created_at, updated_at) " + f"VALUES ('{doc_id}', '{title}', 'scan_{year}_{random.randint(100,999)}.pdf', 'dummy/path.pdf', 'UPLOADED', '{date}', '{city}', '{transcription}', '{sender_id}', NOW(), NOW()) " + f"ON CONFLICT DO NOTHING;" + ) + sql_lines.append(sql) + +# 3. Generate Receivers (Many-to-Many) +sql_lines.append("\n-- Receivers") +for doc_id in document_ids: + # 0 to 3 receivers per document + num_receivers = random.randint(0, 3) + receivers = random.sample(persons, num_receivers) + for rec_id in receivers: + sql_lines.append(f"INSERT INTO document_receivers (document_id, person_id) VALUES ('{doc_id}', '{rec_id}') ON CONFLICT DO NOTHING;") + +# --- Write to File --- +with open(OUTPUT_FILE, "w", encoding="utf-8") as f: + f.write("\n".join(sql_lines)) + +print(f"Done! Created {OUTPUT_FILE}") \ No newline at end of file diff --git a/scripts/schema.sql b/scripts/schema.sql new file mode 100644 index 00000000..9d1a4c53 --- /dev/null +++ b/scripts/schema.sql @@ -0,0 +1,361 @@ +-- +-- PostgreSQL database dump +-- + +\restrict xsnAClkjR0sYU9NfWMMMcuVwnUJeM5WxcLUVbsVE4iEq7QvbciesNQCEaK5jPji + +-- Dumped from database version 16.11 +-- Dumped by pg_dump version 16.11 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: document_receivers; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.document_receivers ( + document_id uuid NOT NULL, + person_id uuid NOT NULL +); + + +-- +-- Name: document_tags; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.document_tags ( + document_id uuid NOT NULL, + tag_id uuid NOT NULL +); + + +-- +-- Name: documents; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.documents ( + meta_date date, + created_at timestamp(6) without time zone, + updated_at timestamp(6) without time zone, + id uuid NOT NULL, + sender_id uuid, + file_path character varying(255), + meta_document_location character varying(255), + meta_location character varying(255), + original_filename character varying(255) NOT NULL, + status character varying(255) NOT NULL, + summary text, + title character varying(255) NOT NULL, + transcription text, + CONSTRAINT documents_status_check CHECK (((status)::text = ANY ((ARRAY['PLACEHOLDER'::character varying, 'UPLOADED'::character varying, 'TRANSCRIBED'::character varying, 'REVIEWED'::character varying, 'ARCHIVED'::character varying])::text[]))) +); + + +-- +-- Name: group_permissions; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.group_permissions ( + group_id uuid NOT NULL, + permission character varying(255) +); + + +-- +-- Name: persons; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.persons ( + id uuid NOT NULL, + alias character varying(255), + first_name character varying(255) NOT NULL, + last_name character varying(255) NOT NULL +); + + +-- +-- Name: spring_session; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.spring_session ( + primary_id character(36) NOT NULL, + session_id character(36) NOT NULL, + creation_time bigint NOT NULL, + last_access_time bigint NOT NULL, + max_inactive_interval integer NOT NULL, + expiry_time bigint NOT NULL, + principal_name character varying(100) +); + + +-- +-- Name: spring_session_attributes; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.spring_session_attributes ( + session_primary_id character(36) NOT NULL, + attribute_name character varying(200) NOT NULL, + attribute_bytes bytea NOT NULL +); + + +-- +-- Name: tag; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.tag ( + id uuid NOT NULL, + name character varying(255) NOT NULL +); + + +-- +-- Name: user_groups; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.user_groups ( + id uuid NOT NULL, + name character varying(255) NOT NULL +); + + +-- +-- Name: users; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.users ( + enabled boolean NOT NULL, + created_at timestamp(6) without time zone, + id uuid NOT NULL, + email character varying(255), + password character varying(255) NOT NULL, + username character varying(255) NOT NULL +); + + +-- +-- Name: users_groups; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.users_groups ( + group_id uuid NOT NULL, + user_id uuid NOT NULL +); + + +-- +-- Name: document_receivers document_receivers_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_receivers + ADD CONSTRAINT document_receivers_pkey PRIMARY KEY (document_id, person_id); + + +-- +-- Name: document_tags document_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_tags + ADD CONSTRAINT document_tags_pkey PRIMARY KEY (document_id, tag_id); + + +-- +-- Name: documents documents_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.documents + ADD CONSTRAINT documents_pkey PRIMARY KEY (id); + + +-- +-- Name: persons persons_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.persons + ADD CONSTRAINT persons_pkey PRIMARY KEY (id); + + +-- +-- Name: spring_session_attributes spring_session_attributes_pk; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.spring_session_attributes + ADD CONSTRAINT spring_session_attributes_pk PRIMARY KEY (session_primary_id, attribute_name); + + +-- +-- Name: spring_session spring_session_pk; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.spring_session + ADD CONSTRAINT spring_session_pk PRIMARY KEY (primary_id); + + +-- +-- Name: tag tag_name_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.tag + ADD CONSTRAINT tag_name_key UNIQUE (name); + + +-- +-- Name: tag tag_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.tag + ADD CONSTRAINT tag_pkey PRIMARY KEY (id); + + +-- +-- Name: user_groups user_groups_name_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.user_groups + ADD CONSTRAINT user_groups_name_key UNIQUE (name); + + +-- +-- Name: user_groups user_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.user_groups + ADD CONSTRAINT user_groups_pkey PRIMARY KEY (id); + + +-- +-- Name: users_groups users_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.users_groups + ADD CONSTRAINT users_groups_pkey PRIMARY KEY (group_id, user_id); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: users users_username_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_username_key UNIQUE (username); + + +-- +-- Name: spring_session_ix1; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX spring_session_ix1 ON public.spring_session USING btree (session_id); + + +-- +-- Name: spring_session_ix2; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX spring_session_ix2 ON public.spring_session USING btree (expiry_time); + + +-- +-- Name: spring_session_ix3; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX spring_session_ix3 ON public.spring_session USING btree (principal_name); + + +-- +-- Name: users_groups fk1qwqr38oun4xcttk576wevhxn; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.users_groups + ADD CONSTRAINT fk1qwqr38oun4xcttk576wevhxn FOREIGN KEY (group_id) REFERENCES public.user_groups(id); + + +-- +-- Name: group_permissions fkaqmvqpbaqnfeg5ixk88k8u6i9; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.group_permissions + ADD CONSTRAINT fkaqmvqpbaqnfeg5ixk88k8u6i9 FOREIGN KEY (group_id) REFERENCES public.user_groups(id); + + +-- +-- Name: document_tags fkc99c5qjulwx9gru07yrhicgd2; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_tags + ADD CONSTRAINT fkc99c5qjulwx9gru07yrhicgd2 FOREIGN KEY (document_id) REFERENCES public.documents(id); + + +-- +-- Name: document_receivers fkcg7r68qvosqricx1betgrlt7s; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_receivers + ADD CONSTRAINT fkcg7r68qvosqricx1betgrlt7s FOREIGN KEY (person_id) REFERENCES public.persons(id); + + +-- +-- Name: users_groups fkg6fu0mfuj9eqfd9aro1nc40nn; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.users_groups + ADD CONSTRAINT fkg6fu0mfuj9eqfd9aro1nc40nn FOREIGN KEY (user_id) REFERENCES public.users(id); + + +-- +-- Name: documents fkl5xhww7es3b4um01vmly4y18m; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.documents + ADD CONSTRAINT fkl5xhww7es3b4um01vmly4y18m FOREIGN KEY (sender_id) REFERENCES public.persons(id); + + +-- +-- Name: document_tags fkl8pxq2mt0yxvg6ukrcx1aijsq; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_tags + ADD CONSTRAINT fkl8pxq2mt0yxvg6ukrcx1aijsq FOREIGN KEY (tag_id) REFERENCES public.tag(id); + + +-- +-- Name: document_receivers fks7t60twjgfmpeqcuc3g0fvjpm; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_receivers + ADD CONSTRAINT fks7t60twjgfmpeqcuc3g0fvjpm FOREIGN KEY (document_id) REFERENCES public.documents(id); + + +-- +-- Name: spring_session_attributes spring_session_attributes_fk; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.spring_session_attributes + ADD CONSTRAINT spring_session_attributes_fk FOREIGN KEY (session_primary_id) REFERENCES public.spring_session(primary_id) ON DELETE CASCADE; + + +-- +-- PostgreSQL database dump complete +-- + +\unrestrict xsnAClkjR0sYU9NfWMMMcuVwnUJeM5WxcLUVbsVE4iEq7QvbciesNQCEaK5jPji + diff --git a/workspaces/backend/target/classes/application.properties b/workspaces/backend/target/classes/application.properties deleted file mode 100644 index 75c2bf09..00000000 --- a/workspaces/backend/target/classes/application.properties +++ /dev/null @@ -1,28 +0,0 @@ -spring.application.name=Familienarchiv -# --- Datenbank Konfiguration --- -spring.datasource.url=${SPRING_DATASOURCE_URL} -spring.datasource.username=${SPRING_DATASOURCE_USERNAME} -spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} -spring.datasource.driver-class-name=org.postgresql.Driver - -# JPA / Hibernate -spring.jpa.hibernate.ddl-auto=create -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.jpa.show-sql=false -# --- MinIO (S3) Konfiguration --- -# Eigene Properties (werden wir in einer Config-Klasse auslesen) -app.s3.endpoint=${S3_ENDPOINT} -app.s3.access-key=${S3_ACCESS_KEY} -app.s3.secret-key=${S3_SECRET_KEY} -app.s3.bucket=${S3_BUCKET_NAME} -app.s3.region=${S3_REGION} - -# Upload Limits erhöhen (für große Scans) -spring.servlet.multipart.max-file-size=50MB -spring.servlet.multipart.max-request-size=50MB -# --- Excel Import Mapping --- -# Spaltenindex (0 = Spalte A, 1 = Spalte B, usw.) -app.import.excel.col.filename=0 -app.import.excel.col.date=1 -app.import.excel.col.location=2 -app.import.excel.col.transcription=3 \ No newline at end of file diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/FamilienarchivApplication.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/FamilienarchivApplication.class deleted file mode 100644 index 6257e0cc..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/FamilienarchivApplication.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/DataInitializer.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/DataInitializer.class deleted file mode 100644 index a03825f9..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/DataInitializer.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/MinioConfig.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/MinioConfig.class deleted file mode 100644 index 22e47c77..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/MinioConfig.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/SecurityConfig.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/SecurityConfig.class deleted file mode 100644 index bd87da2c..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/config/SecurityConfig.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/AdminController.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/AdminController.class deleted file mode 100644 index 91b8b916..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/AdminController.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/DocumentController.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/DocumentController.class deleted file mode 100644 index 0ed07fd9..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/DocumentController.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/GroupController.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/GroupController.class deleted file mode 100644 index a0e7ef1d..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/GroupController.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/PersonController.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/PersonController.class deleted file mode 100644 index 3ea4199d..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/PersonController.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/TagController.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/TagController.class deleted file mode 100644 index e3512e7e..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/TagController.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/UserController.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/UserController.class deleted file mode 100644 index 6a3a36a8..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/controller/UserController.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/CreateUserRequest.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/CreateUserRequest.class deleted file mode 100644 index 58b50af4..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/CreateUserRequest.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/DocumentUpdateDTO.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/DocumentUpdateDTO.class deleted file mode 100644 index dbdf5970..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/DocumentUpdateDTO.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/GroupDTO.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/GroupDTO.class deleted file mode 100644 index f6f48eca..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/dto/GroupDTO.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/AppUser$AppUserBuilder.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/AppUser$AppUserBuilder.class deleted file mode 100644 index 099fd84e..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/AppUser$AppUserBuilder.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/AppUser.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/AppUser.class deleted file mode 100644 index 733b298f..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/AppUser.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Document$DocumentBuilder.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Document$DocumentBuilder.class deleted file mode 100644 index da31390d..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Document$DocumentBuilder.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Document.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Document.class deleted file mode 100644 index ccdd7cf2..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Document.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/DocumentStatus.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/DocumentStatus.class deleted file mode 100644 index 16003a32..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/DocumentStatus.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Person$PersonBuilder.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Person$PersonBuilder.class deleted file mode 100644 index df69794b..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Person$PersonBuilder.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Person.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Person.class deleted file mode 100644 index 3e1b5e9a..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Person.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Tag$TagBuilder.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Tag$TagBuilder.class deleted file mode 100644 index 12f0ba5d..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Tag$TagBuilder.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Tag.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Tag.class deleted file mode 100644 index a3840cc2..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/Tag.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/UserGroup$UserGroupBuilder.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/UserGroup$UserGroupBuilder.class deleted file mode 100644 index 0135e2e3..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/UserGroup$UserGroupBuilder.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/UserGroup.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/UserGroup.class deleted file mode 100644 index d7ce8aec..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/model/UserGroup.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/AppUserRepository.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/AppUserRepository.class deleted file mode 100644 index b703ea42..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/AppUserRepository.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/DocumentRepository.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/DocumentRepository.class deleted file mode 100644 index f586a59c..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/DocumentRepository.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/DocumentSpecifications.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/DocumentSpecifications.class deleted file mode 100644 index 608f7dbb..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/DocumentSpecifications.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/PersonRepository.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/PersonRepository.class deleted file mode 100644 index bc511dc5..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/PersonRepository.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/TagRepository.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/TagRepository.class deleted file mode 100644 index 24b100ee..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/TagRepository.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/UserGroupRepository.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/UserGroupRepository.class deleted file mode 100644 index c1b459a3..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/repository/UserGroupRepository.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/Permission.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/Permission.class deleted file mode 100644 index 196e9be6..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/Permission.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/PermissionAspect.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/PermissionAspect.class deleted file mode 100644 index d3cef197..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/PermissionAspect.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/RequirePermission.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/RequirePermission.class deleted file mode 100644 index e8610bbf..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/security/RequirePermission.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/CustomUserDetailsService.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/CustomUserDetailsService.class deleted file mode 100644 index 01a67b60..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/CustomUserDetailsService.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/DocumentService.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/DocumentService.class deleted file mode 100644 index 3b8df985..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/DocumentService.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/ExcelService.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/ExcelService.class deleted file mode 100644 index 592e2d4d..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/ExcelService.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService$S3FileDownload.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService$S3FileDownload.class deleted file mode 100644 index 24ccece7..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService$S3FileDownload.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService$StorageFileNotFoundException.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService$StorageFileNotFoundException.class deleted file mode 100644 index 196ff4dc..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService$StorageFileNotFoundException.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService.class deleted file mode 100644 index 32c5b005..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/FileService.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/MassImportService.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/MassImportService.class deleted file mode 100644 index 2bc598a0..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/MassImportService.class and /dev/null differ diff --git a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/UserService.class b/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/UserService.class deleted file mode 100644 index ee56a0d1..00000000 Binary files a/workspaces/backend/target/classes/org/raddatz/familienarchiv/service/UserService.class and /dev/null differ diff --git a/workspaces/backend/target/test-classes/org/raddatz/familienarchiv/FamilienarchivApplicationTests.class b/workspaces/backend/target/test-classes/org/raddatz/familienarchiv/FamilienarchivApplicationTests.class deleted file mode 100644 index 55da04ef..00000000 Binary files a/workspaces/backend/target/test-classes/org/raddatz/familienarchiv/FamilienarchivApplicationTests.class and /dev/null differ