Compare commits

..

17 Commits

Author SHA1 Message Date
afec157b35 major: Rename legalconsenthub to gremiumhub
All checks were successful
CI/CD Pipeline / frontend (push) Successful in 5m52s
CI/CD Pipeline / backend (push) Successful in 7m58s
CI/CD Pipeline / deploy (push) Successful in 1s
2026-03-16 10:28:32 +01:00
52fe6b6392 feat: Update .gitignore 2026-03-16 08:37:34 +01:00
ea41b1edec feat: Update CLAUDE.md files, add coolify skill
Some checks failed
CI/CD Pipeline / backend (push) Failing after 2m19s
CI/CD Pipeline / frontend (push) Successful in 5m29s
CI/CD Pipeline / deploy (push) Has been skipped
2026-03-16 08:35:53 +01:00
37a907e087 fix(frontend,backend): Remove hardcoded legalconsenthub keycloak client ID
Some checks failed
CI/CD Pipeline / backend (push) Has been cancelled
CI/CD Pipeline / deploy (push) Has been cancelled
CI/CD Pipeline / frontend (push) Has been cancelled
2026-03-16 08:29:54 +01:00
d4c6def398 fix(pipeline): Remove testcontainers override
All checks were successful
CI/CD Pipeline / frontend (push) Successful in 5m6s
CI/CD Pipeline / backend (push) Successful in 7m17s
CI/CD Pipeline / deploy (push) Successful in 1s
2026-03-13 19:16:13 +01:00
097631adc1 fix(pipeline): Disable Ryuk to pass backend tests
Some checks failed
CI/CD Pipeline / backend (push) Failing after 2m15s
CI/CD Pipeline / deploy (push) Has been cancelled
CI/CD Pipeline / frontend (push) Has been cancelled
2026-03-10 19:25:20 +01:00
5cc0635630 feat(pipeline): Add Gitea pipeline back
Some checks failed
CI/CD Pipeline / frontend (push) Successful in 9m48s
CI/CD Pipeline / backend (push) Failing after 2m36s
CI/CD Pipeline / deploy (push) Has been skipped
2026-03-10 19:03:21 +01:00
a51875c3f1 feat(frontend): Add useSectionSpawning test 2026-03-02 15:13:11 +01:00
e56feac831 feat(frontend): Add useFormStepper test 2026-03-02 14:37:06 +01:00
46eb0f5a60 feat(frontend): Add useFormElementValueClearing test 2026-03-02 12:29:58 +01:00
803316c4cc feat(frontend): Add useFormElementDuplication test 2026-03-02 10:46:26 +01:00
7d18824c32 feat(frontend): Add formSnapshotComparison test, add test setup 2026-03-02 08:49:12 +01:00
fea2ca8a3b feat(fullstack): Add per-row visibility, add read-only cells, update seeds 2026-03-01 09:00:07 +01:00
f72923f945 feat: Add visibilityConditions for checkboxes and radio gorups, update seeds 2026-02-28 10:02:39 +01:00
dbb23cc7be feat: Update seeds 2026-02-28 09:02:21 +01:00
b3f4647867 feat: Update seeds 2026-02-28 08:26:52 +01:00
150c542a3a feat: Simplify seeds 2026-02-23 19:18:49 +01:00
331 changed files with 3365 additions and 1998 deletions

View File

@@ -1,12 +1,12 @@
--- ---
name: feature-implementer name: feature-implementer
description: "Use this agent when the user requests implementation of a new feature, enhancement, or functionality for the Legal Consent Hub platform. This includes adding new form elements, creating new API endpoints, implementing UI components, or extending existing capabilities." description: "Use this agent when the user requests implementation of a new feature, enhancement, or functionality for the GremiumHub platform. This includes adding new form elements, creating new API endpoints, implementing UI components, or extending existing capabilities."
model: sonnet model: sonnet
color: green color: green
tools: Read, Write, Edit, Bash, Glob, Grep tools: Read, Write, Edit, Bash, Glob, Grep
--- ---
You are an elite full-stack feature architect for the Legal Consent Hub platform, specializing in implementing cohesive features across the entire technology stack. You have deep expertise in the platform's architecture, conventions, and design patterns. You are an elite full-stack feature architect for the GremiumHub platform, specializing in implementing cohesive features across the entire technology stack. You have deep expertise in the platform's architecture, conventions, and design patterns.
## Your Core Responsibilities ## Your Core Responsibilities
@@ -83,17 +83,17 @@ When implementing a feature:
## Key Files Reference ## Key Files Reference
- `api/legalconsenthub.yml` - OpenAPI specification - `api/gremiumhub.yml` - OpenAPI specification
- `legalconsenthub-backend/src/main/resources/templates/application_form_latex_template.tex` - PDF template - `gremiumhub-backend/src/main/resources/templates/application_form_latex_template.tex` - PDF template
- `legalconsenthub-backend/src/main/resources/seed/*.yaml` - Seed data - `gremiumhub-backend/src/main/resources/seed/*.yaml` - Seed data
- `legalconsenthub-backend/src/main/resources/db/changelog/` - Database migrations - `gremiumhub-backend/src/main/resources/db/changelog/` - Database migrations
- `.github/workflows/pipeline.yaml` - CI/CD configuration - `.github/workflows/pipeline.yaml` - CI/CD configuration
## Composables to Leverage ## Composables to Leverage
- `useFormElementVisibility` - Visibility condition evaluation - `useFormElementVisibility` - Visibility condition evaluation
- `useSectionSpawning` - Template section spawning - `useSectionSpawning` - Template section spawning
- `useClonableElements` - Element cloning logic - `useFormElementDuplication` - Element cloning logic
- `useFormElementValueClearing` - Clear hidden element values - `useFormElementValueClearing` - Clear hidden element values
- `useTableCrossReferences` - Table column/row references - `useTableCrossReferences` - Table column/row references
- `useApplicationFormValidator` - Form validation - `useApplicationFormValidator` - Form validation

View File

@@ -0,0 +1,62 @@
---
name: coolify
description: Use when user asks you to use this skill to debug Coolify issues or to investigate something related to Coolify.
---
# Coolify
## Overview
Opens Playwright MCP, lets the user log in to Coolify, and then takes a snapshot for further investigation.
## Coolify Instance
- **Primary URL:** `https://coolify.gremiumhub.de/`
## Process
1. Open the browser
2. If you know the URL related to the current request, navigate to that URL or ask the user to do so. Otherwise, assume
the user needs to log in first and navigate to log in if the user does not provide a URL
(`mcp__playwright__browser_navigate → https://coolify.gremiumhub.de/login`)
3. (If not logged in) Stop and wait for user to log in.
4. (When logged in) Navigate to the page that might be related to the current request if the user has not done so. Ask
for the content of the page if this might be easier for you to understand the issue.
## Additional Notes
- If you need to do something in the terminal, write down all commands first that you want to execute and ask the user
to execute them. Do not execute any command directly.
- Write down in a summary what you have changed in the Coolify instance.
- If you encounter an error while opening the browser (e.g., "browserType.launchPersistentContext: Failed to launch the
browser process"), ask the user to restart the browser and stop until the user confirms that the browser is restarted
or that you can try to open the browser again.
- Always rely on the docker-compose files and configured environment variables in the Coolify instance to understand how
the instance is set up and how it works. Do not assume anything that is not explicitly stated in the docker-compose
files or environment variables. If you are not sure about something, ask the user to check the docker-compose files
and environment variables instead of making assumptions.
- Ignore the local deployment files. Only rely on settings and configurations that are actually used in the running instance. If you are not sure which files are relevant, ask the user to check which files are actually used in the running instance instead of making assumptions.
## Efficient Data Extraction
**Env vars — use Developer view:** Click it via JS (button refs are unreliable in Livewire apps), then read the textarea:
```js
// Click Developer view
Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim().includes('Developer view'))?.click()
// Read all vars at once
document.querySelector('textarea')?.value
```
**Compose file — Coolify uses Monaco editor:**
```js
window.monaco?.editor?.getModels()?.[0]?.getValue()
```
Prefer JS extraction over screenshots/scrolling for any text data.
## Key Behavioral Notes
- **`$SERVICE_*` magic variables are only substituted in the compose file**, not in manually-added panel env vars. Panel vars with `$SERVICE_URL_*` values are passed as literal strings to containers — this causes `NOT_SET` errors in Nuxt OAuth when `NUXT_OAUTH_KEYCLOAK_SERVER_URL=$SERVICE_URL_KEYCLOAK` is set via the panel instead of the compose.
- **Panel vars are driven by the compose file.** Coolify syncs env vars from the compose into the panel — they are not independent. You cannot delete a variable from the panel without first removing it from the compose file. To fix a value, edit the compose file; the panel updates automatically.
- **`$SERVICE_URL_*`** includes `https://`; **`$SERVICE_FQDN_*`** is hostname only (no protocol). Mixing them breaks JWT issuer validation.
- The "Hardcoded variables are not shown here" warning refers to vars with fully hardcoded literal values in the compose. Vars referencing `$SERVICE_*` or `${VAR}` do appear in the panel.

View File

@@ -7,7 +7,7 @@ description: Use when modifying seed files in template/ or demo/ directories - e
## Overview ## Overview
The Legal Consent Hub has two interdependent seed file directories that must stay synchronized: GremiumHub has two interdependent seed file directories that must stay synchronized:
1. **Template** (`seed/template/`) - `isTemplate: true` - defines the form structure, element types, options, visibility conditions, section spawn triggers, and template sections. 1. **Template** (`seed/template/`) - `isTemplate: true` - defines the form structure, element types, options, visibility conditions, section spawn triggers, and template sections.
2. **Demo form** (`seed/demo/`) - `isTemplate: false` - a realistic SAP S/4HANA application form with pre-filled values derived from the template. Used for development testing and UI validation. 2. **Demo form** (`seed/demo/`) - `isTemplate: false` - a realistic SAP S/4HANA application form with pre-filled values derived from the template. Used for development testing and UI validation.
@@ -17,7 +17,7 @@ Changes to either directory can break the other. This skill ensures consistency.
## File Structure ## File Structure
``` ```
legalconsenthub-backend/src/main/resources/seed/ gremiumhub-backend/src/main/resources/seed/
├── template/ # Template (source of truth for structure) ├── template/ # Template (source of truth for structure)
│ ├── _main.yaml # Main file: isTemplate, name, !include directives │ ├── _main.yaml # Main file: isTemplate, name, !include directives
│ ├── section_01_angaben_zum_itsystem.yaml │ ├── section_01_angaben_zum_itsystem.yaml
@@ -158,6 +158,13 @@ When adding a new section file:
2. Add the `!include` directive to the corresponding `_main.yaml` 2. Add the `!include` directive to the corresponding `_main.yaml`
3. Maintain logical section ordering 3. Maintain logical section ordering
### Rule 9: Change process must start with template, then sync demo
Any change request that affects form structure, visibility conditions, or section spawn triggers must follow this process:
1. **Modify the template**: Make all necessary changes to the template files first, ensuring structural integrity and logical consistency
2. **Sync the demo form**: After the template is updated, modify the demo form to mirror the structural changes and add contextually appropriate test data
3. **Verify both**: Ensure that the template remains the source of truth and that the demo form accurately reflects the template's structure and visibility logic
## Checklist for Template Changes ## Checklist for Template Changes
When you modify files in the **template/ directory**, verify each item: When you modify files in the **template/ directory**, verify each item:
@@ -179,4 +186,4 @@ When you modify files in the **demo/ directory**, verify:
- [ ] **Value consistency**: New values are consistent with the SAP S/4HANA "Einfuehrung" context - [ ] **Value consistency**: New values are consistent with the SAP S/4HANA "Einfuehrung" context
- [ ] **Table data alignment**: Table JSON arrays all have the same length within a single table element - [ ] **Table data alignment**: Table JSON arrays all have the same length within a single table element
- [ ] **Cross-reference integrity**: Table values that reference other tables use valid IDs from those tables - [ ] **Cross-reference integrity**: Table values that reference other tables use valid IDs from those tables
- [ ] **_main.yaml update**: If you added/removed a section file, update `demo/_main.yaml` - [ ] **_main.yaml update**: If you added/removed a section file, update `demo/_main.yaml`

View File

@@ -1,221 +1,225 @@
#name: CI/CD Pipeline name: CI/CD Pipeline
#run-name: ${{ github.actor }} triggered pipeline on ${{ github.ref_name }} run-name: ${{ github.actor }} triggered pipeline on ${{ github.ref_name }}
#
#on: on:
# pull_request: pull_request:
# paths: paths:
# - 'legalconsenthub/**' - 'gremiumhub/**'
# - 'legalconsenthub-backend/**' - 'gremiumhub-backend/**'
# - 'api/**' - 'api/**'
# - '.github/workflows/pipeline.yaml' - '.github/workflows/pipeline.yaml'
# push: push:
# branches: branches:
# - main - main
# paths: paths:
# - 'legalconsenthub/**' - 'gremiumhub/**'
# - 'legalconsenthub-backend/**' - 'gremiumhub-backend/**'
# - 'api/**' - 'api/**'
# - '.github/workflows/pipeline.yaml' - '.github/workflows/pipeline.yaml'
#
#concurrency: concurrency:
# group: ci-${{ github.ref }} group: ci-${{ github.ref }}
# cancel-in-progress: true cancel-in-progress: true
#
#jobs: jobs:
# frontend: frontend:
# runs-on: ubuntu-latest runs-on: ubuntu-latest
# defaults: defaults:
# run: run:
# working-directory: ./legalconsenthub working-directory: ./gremiumhub
#
# steps: steps:
# - name: Checkout code - name: Checkout code
# uses: actions/checkout@v4 uses: actions/checkout@v4
#
# - name: Setup Node.js - name: Setup Node.js
# uses: actions/setup-node@v4 uses: actions/setup-node@v4
# with: with:
# node-version: '22.16.0' node-version: '22.16.0'
#
# - name: Setup Java - name: Setup Java
# uses: actions/setup-java@v4 uses: actions/setup-java@v4
# with: with:
# distribution: 'temurin' distribution: 'temurin'
# java-version: '21' java-version: '21'
#
# - name: Setup pnpm - name: Setup pnpm
# uses: pnpm/action-setup@v4 uses: pnpm/action-setup@v4
# with: with:
# version: 10.13.1 version: 10.13.1
# run_install: false run_install: false
#
# - name: Get pnpm store directory - name: Get pnpm store directory
# id: pnpm-cache id: pnpm-cache
# run: | run: |
# echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
#
# - name: Setup pnpm cache - name: Setup pnpm cache
# uses: actions/cache@v4 uses: actions/cache@v4
# with: with:
# path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
# key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
# restore-keys: | restore-keys: |
# ${{ runner.os }}-pnpm-store- ${{ runner.os }}-pnpm-store-
#
# - name: Install dependencies - name: Install dependencies
# run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
#
# - name: Build application - name: Build application
# run: pnpm build run: pnpm build
#
# - name: Run linting - name: Run linting
# run: pnpm lint run: pnpm lint
#
# - name: Run type checking - name: Run type checking
# run: pnpm type-check run: pnpm type-check
#
# - name: Set up Docker Buildx - name: Set up Docker Buildx
# uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
#
# - name: Log in to Gitea Container Registry - name: Log in to Gitea Container Registry
# if: github.event_name == 'push' && github.ref == 'refs/heads/main' if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# uses: docker/login-action@v3 uses: docker/login-action@v3
# with: with:
# registry: gitea.lugnas.de registry: git.gremiumhub.de
# username: ${{ github.actor }} username: ${{ github.actor }}
# password: ${{ secrets.DOCKER_PUSH_TOKEN }} password: ${{ secrets.DOCKER_PUSH_TOKEN }}
#
# - name: Extract metadata for Docker - name: Extract metadata for Docker
# id: meta id: meta
# uses: docker/metadata-action@v5 uses: docker/metadata-action@v5
# with: with:
# images: gitea.lugnas.de/${{ github.repository_owner }}/legalconsenthub images: git.gremiumhub.de/${{ github.repository_owner }}/gremiumhub
# tags: | tags: |
# type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
# type=sha,prefix=,format=long type=sha,prefix=,format=long
#
# - name: Build and push Docker image - name: Build and push Docker image
# uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
# with: with:
# context: . context: .
# file: ./legalconsenthub/Dockerfile file: ./gremiumhub/Dockerfile
# push: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} push: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
# platforms: linux/amd64 platforms: linux/amd64
# tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
# labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
# cache-from: type=local,src=/tmp/.buildx-cache cache-from: type=local,src=/tmp/.buildx-cache-frontend
# cache-to: type=local,dest=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-frontend,mode=max
#
# - name: Image built successfully - name: Image built successfully
# if: github.event_name == 'push' && github.ref == 'refs/heads/main' if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# run: | run: |
# echo "✅ Docker image built and pushed successfully" echo "✅ Docker image built and pushed successfully"
# echo "📦 Image: gitea.lugnas.de/${{ github.repository_owner }}/legalconsenthub:latest" echo "📦 Image: git.gremiumhub.de/${{ github.repository_owner }}/gremiumhub:latest"
# echo "📦 Image: gitea.lugnas.de/${{ github.repository_owner }}/legalconsenthub:${{ github.sha }}" echo "📦 Image: git.gremiumhub.de/${{ github.repository_owner }}/gremiumhub:${{ github.sha }}"
#
# - name: Dry-run completed - name: Dry-run completed
# if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
# run: | run: |
# echo "✅ Dry-run build completed successfully (image not pushed)" echo "✅ Dry-run build completed successfully (image not pushed)"
#
# backend: backend:
# runs-on: ubuntu-latest runs-on: ubuntu-latest
#
# defaults: defaults:
# run: run:
# working-directory: ./legalconsenthub-backend working-directory: ./gremiumhub-backend
#
# steps: steps:
# - name: Checkout code - name: Checkout code
# uses: actions/checkout@v4 uses: actions/checkout@v4
#
# - name: Setup Java - name: Setup Java
# uses: actions/setup-java@v4 uses: actions/setup-java@v4
# with: with:
# distribution: 'temurin' distribution: 'temurin'
# java-version: '21' java-version: '21'
#
# - name: Setup Gradle cache - name: Setup Gradle cache
# uses: actions/cache@v4 uses: actions/cache@v4
# with: with:
# path: | path: |
# ~/.gradle/caches ~/.gradle/caches
# ~/.gradle/wrapper ~/.gradle/wrapper
# legalconsenthub-backend/.gradle gremiumhub-backend/.gradle
# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
# restore-keys: | restore-keys: |
# ${{ runner.os }}-gradle- ${{ runner.os }}-gradle-
#
# - name: Build application - name: Build application
# run: ./gradlew build -x test run: ./gradlew build -x test
#
# - name: Run ktlint check - name: Run ktlint check
# run: ./gradlew ktlintCheck run: ./gradlew ktlintCheck
#
# - name: Run tests - name: Run tests
# run: ./gradlew test run: ./gradlew test
# env: env:
# # Fixes Ryuk testcontainers error during test (https://github.com/testcontainers/testcontainers-java/issues/7036) TESTCONTAINERS_RYUK_DISABLED: "true"
# TESTCONTAINERS_HOST_OVERRIDE: host.docker.internal
# - name: Set up Docker Buildx
# - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3
# uses: docker/setup-buildx-action@v3
# - name: Log in to Gitea Container Registry
# - name: Log in to Gitea Container Registry if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# if: github.event_name == 'push' && github.ref == 'refs/heads/main' uses: docker/login-action@v3
# uses: docker/login-action@v3 with:
# with: registry: git.gremiumhub.de
# registry: gitea.lugnas.de username: ${{ github.actor }}
# username: ${{ github.actor }} password: ${{ secrets.DOCKER_PUSH_TOKEN }}
# password: ${{ secrets.DOCKER_PUSH_TOKEN }}
# - name: Extract metadata for Docker
# - name: Extract metadata for Docker id: meta
# id: meta uses: docker/metadata-action@v5
# uses: docker/metadata-action@v5 with:
# with: images: git.gremiumhub.de/${{ github.repository_owner }}/gremiumhub-backend
# images: gitea.lugnas.de/${{ github.repository_owner }}/legalconsenthub-backend tags: |
# tags: | type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
# type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} type=sha,prefix=,format=long
# type=sha,prefix=,format=long
# - name: Build and push Docker image
# - name: Build and push Docker image uses: docker/build-push-action@v5
# uses: docker/build-push-action@v5 with:
# with: context: .
# context: . file: ./gremiumhub-backend/Dockerfile
# file: ./legalconsenthub-backend/Dockerfile push: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
# push: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} platforms: linux/amd64
# platforms: linux/amd64 tags: ${{ steps.meta.outputs.tags }}
# tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
# labels: ${{ steps.meta.outputs.labels }} cache-from: type=local,src=/tmp/.buildx-cache-backend
# cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-backend,mode=max
# cache-to: type=local,dest=/tmp/.buildx-cache
# - name: Image built successfully
# - name: Image built successfully if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# if: github.event_name == 'push' && github.ref == 'refs/heads/main' run: |
# run: | echo "✅ Docker image built and pushed successfully"
# echo "✅ Docker image built and pushed successfully" echo "📦 Image: git.gremiumhub.de/${{ github.repository_owner }}/gremiumhub-backend:latest"
# echo "📦 Image: gitea.lugnas.de/${{ github.repository_owner }}/legalconsenthub-backend:latest" echo "📦 Image: git.gremiumhub.de/${{ github.repository_owner }}/gremiumhub-backend:${{ github.sha }}"
# echo "📦 Image: gitea.lugnas.de/${{ github.repository_owner }}/legalconsenthub-backend:${{ github.sha }}"
# - name: Dry-run completed
# - name: Dry-run completed if: github.event_name == 'pull_request'
# if: github.event_name == 'pull_request' run: |
# run: | echo "✅ Dry-run build completed successfully (image not pushed)"
# echo "✅ Dry-run build completed successfully (image not pushed)"
# deploy:
# deploy: runs-on: ubuntu-latest
# runs-on: ubuntu-latest needs: [frontend, backend]
# needs: [frontend, backend] if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
# steps:
# steps: - name: Trigger Coolify redeploy (frontend)
# - name: Checkout code run: |
# uses: actions/checkout@v4 curl -s -X POST \
# -H "Authorization: Bearer ${{ secrets.COOLIFY_DEPLOY_TOKEN }}" \
# - name: Deploy to server "https://coolify.gremiumhub.de/api/v1/deploy?uuid=${{ secrets.COOLIFY_FRONTEND_UUID }}&force=false"
# run: |
# ssh -i ~/.ssh/id_rsa -p 32766 -o StrictHostKeyChecking=accept-new deploy@ds218 "sudo /usr/local/bin/deployLegalconsenthub.sh" - name: Trigger Coolify redeploy (backend)
# run: |
# - name: Deployment successful curl -s -X POST \
# run: | -H "Authorization: Bearer ${{ secrets.COOLIFY_DEPLOY_TOKEN }}" \
# echo "✅ Deployment triggered successfully" "https://coolify.gremiumhub.de/api/v1/deploy?uuid=${{ secrets.COOLIFY_BACKEND_UUID }}&force=false"
# echo "🚀 Application is being deployed to production"
- name: Deployment triggered
run: |
echo "✅ Coolify redeployment triggered successfully"
echo "🚀 Frontend and backend are being redeployed"

11
.gitignore vendored
View File

@@ -58,16 +58,19 @@ bin/
.kotlin .kotlin
### OpenAPI ### ### OpenAPI ###
legalconsenthub/.api-client gremiumhub/.api-client
legalconsenthub/.api-client-middleware gremiumhub/.api-client-middleware
### TestContainers persistent data ### ### TestContainers persistent data ###
legalconsenthub-backend/postgres-data/ gremiumhub-backend/postgres-data/
### Docker BuildKit cache ### ### Docker BuildKit cache ###
.buildx-cache/ .buildx-cache/
### Version PDF cache (dev) ### ### Version PDF cache (dev) ###
legalconsenthub-backend/.pdf-store/* gremiumhub-backend/.pdf-store/*
data data
.playwright-*
coverage
.worktrees/

View File

@@ -3,8 +3,8 @@
<option name="ACTIVE_PROFILES" value="h2" /> <option name="ACTIVE_PROFILES" value="h2" />
<option name="ALTERNATIVE_JRE_PATH" value="ms-21" /> <option name="ALTERNATIVE_JRE_PATH" value="ms-21" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<module name="com.betriebsratkanzlei.legalconsenthub.main" /> <module name="gremiumhub.main" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.betriebsratkanzlei.legalconsenthub.LegalconsenthubApplication" /> <option name="SPRING_BOOT_MAIN_CLASS" value="com.betriebsratkanzlei.gremiumhub.GremiumhubApplication" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

View File

@@ -3,9 +3,9 @@
<option name="ACTIVE_PROFILES" value="testcontainers" /> <option name="ACTIVE_PROFILES" value="testcontainers" />
<option name="ALTERNATIVE_JRE_PATH" value="ms-21" /> <option name="ALTERNATIVE_JRE_PATH" value="ms-21" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<module name="com.betriebsratkanzlei.legalconsenthub.main" /> <module name="com.betriebsratkanzlei.gremiumhub.main" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.betriebsratkanzlei.legalconsenthub.LegalconsenthubApplication" /> <option name="SPRING_BOOT_MAIN_CLASS" value="com.betriebsratkanzlei.gremiumhub.GremiumhubApplication" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/legalconsenthub-backend" /> <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/gremiumhub-backend" />
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

View File

@@ -1,5 +1,5 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="server: nuxt" type="NodeJSConfigurationType" application-parameters="dev --port 3001 --host" path-to-js-file="node_modules/nuxt/bin/nuxt.mjs" working-dir="$PROJECT_DIR$/legalconsenthub"> <configuration default="false" name="server: nuxt" type="NodeJSConfigurationType" application-parameters="dev --port 3001 --host" path-to-js-file="node_modules/nuxt/bin/nuxt.mjs" working-dir="$PROJECT_DIR$/gremiumhub">
<method v="2" /> <method v="2" />
</configuration> </configuration>
</component> </component>

4
.vscode/launch.json vendored
View File

@@ -8,13 +8,13 @@
"request": "launch", "request": "launch",
"name": "client: chrome", "name": "client: chrome",
"url": "http://192.168.178.114:3001", "url": "http://192.168.178.114:3001",
"webRoot": "${workspaceFolder}/legalconsenthub" "webRoot": "${workspaceFolder}/gremiumhub"
}, },
{ {
"request": "launch", "request": "launch",
"name": "server: nuxt", "name": "server: nuxt",
"outputCapture": "std", "outputCapture": "std",
"cwd": "${workspaceFolder}/legalconsenthub", "cwd": "${workspaceFolder}/gremiumhub",
"type": "node-terminal", "type": "node-terminal",
"command": "pnpm run dev" "command": "pnpm run dev"
} }

View File

@@ -1,4 +1,4 @@
# Legal Consent Hub - AI Context # GremiumHub - AI Context
## Overview ## Overview
@@ -73,9 +73,9 @@ ApplicationForm
## Project Structure ## Project Structure
``` ```
legalconsenthub/ # Frontend (Nuxt 4, Vue 3) - see legalconsenthub/CLAUDE.md gremiumhub/ # Frontend (Nuxt 4, Vue 3) - see gremiumhub/CLAUDE.md
api/ # OpenAPI spec - see api/CLAUDE.md api/ # OpenAPI spec - see api/CLAUDE.md
legalconsenthub-backend/ # Backend (Spring Boot, Kotlin) - see legalconsenthub-backend/CLAUDE.md gremiumhub-backend/ # Backend (Spring Boot, Kotlin) - see gremiumhub-backend/CLAUDE.md
``` ```
--- ---
@@ -84,20 +84,20 @@ legalconsenthub-backend/ # Backend (Spring Boot, Kotlin) - see legalconsen
```bash ```bash
# Frontend (port 3001) # Frontend (port 3001)
cd legalconsenthub && pnpm install && pnpm run dev cd gremiumhub && pnpm install && pnpm run dev
# Backend (port 8080) # Backend (port 8080)
cd legalconsenthub-backend && ./gradlew bootRun cd gremiumhub-backend && ./gradlew bootRun
# Generate API clients (REQUIRED after modifying api/legalconsenthub.yml) # Generate API clients (REQUIRED after modifying api/gremiumhub.yml)
cd legalconsenthub && pnpm run api:generate # Frontend TypeScript client cd gremiumhub && pnpm run api:generate # Frontend TypeScript client
cd legalconsenthub-backend && ./gradlew generate_legalconsenthub_server # Backend Kotlin server stubs cd gremiumhub-backend && ./gradlew generate_gremiumhub_server # Backend Kotlin server stubs
``` ```
**⚠️ CRITICAL: API Client Regeneration** **⚠️ CRITICAL: API Client Regeneration**
After ANY change to `api/legalconsenthub.yml`, you MUST regenerate BOTH clients: After ANY change to `api/gremiumhub.yml`, you MUST regenerate BOTH clients:
1. Frontend: `pnpm run api:generate` (TypeScript client) 1. Frontend: `pnpm run api:generate` (TypeScript client)
2. Backend: `./gradlew generate_legalconsenthub_server` (Kotlin server stubs) 2. Backend: `./gradlew generate_gremiumhub_server` (Kotlin server stubs)
Compilation/runtime will fail if clients are out of sync with the OpenAPI spec. Compilation/runtime will fail if clients are out of sync with the OpenAPI spec.
@@ -107,7 +107,7 @@ Compilation/runtime will fail if clients are out of sync with the OpenAPI spec.
| File | Purpose | | File | Purpose |
|------|---------| |------|---------|
| `api/legalconsenthub.yml` | OpenAPI spec (source of truth) | | `api/gremiumhub.yml` | OpenAPI spec (source of truth) |
| `.github/workflows/pipeline.yaml` | CI/CD workflow | | `.github/workflows/pipeline.yaml` | CI/CD workflow |
See subproject CLAUDE.md files for component-specific key files. See subproject CLAUDE.md files for component-specific key files.
@@ -117,15 +117,17 @@ See subproject CLAUDE.md files for component-specific key files.
## Rules for AI ## Rules for AI
1. **API-first workflow** - ALWAYS follow this sequence when modifying APIs: 1. **API-first workflow** - ALWAYS follow this sequence when modifying APIs:
a. Modify `api/legalconsenthub.yml` OpenAPI spec first a. Modify `api/gremiumhub.yml` OpenAPI spec first
b. Regenerate frontend client: `cd legalconsenthub && pnpm run api:generate` b. Regenerate frontend client: `cd gremiumhub && pnpm run api:generate`
c. Regenerate backend stubs: `cd legalconsenthub-backend && ./gradlew generate_legalconsenthub_server` c. Regenerate backend stubs: `cd gremiumhub-backend && ./gradlew generate_gremiumhub_server`
d. Implement backend controller methods (they implement generated interfaces) d. **Update backend entity class AND mapper class** for every new DTO field — fields missing from the entity silently return `null` from the API. If the new field requires database storage, note that a SQL migration is needed (the user handles migrations).
e. Use generated client in frontend (never write manual API calls) e. Implement backend controller methods (they implement generated interfaces)
f. Use generated client in frontend (never write manual API calls)
2. **Organization context** - Always consider `organizationId` for multi-tenancy. Forms with empty/null organizationId are "global" forms visible to all organizations 2. **Organization context** - Always consider `organizationId` for multi-tenancy. Forms with empty/null organizationId are "global" forms visible to all organizations
3. **Form structure is 3-level** - Section → SubSection → Element 3. **Form structure is 3-level** - Section → SubSection → Element
4. **Roles managed in Keycloak** - Not in application database 4. **Roles managed in Keycloak** - Not in application database
5. **Subproject-specific rules** - See `CLAUDE.md` files in each subproject directory 5. **Subproject-specific rules** - See `CLAUDE.md` files in each subproject directory
6. **Don't create worktrees, don't commit** - Directly modify the main branch. The user will handle branching and PRs.
### Code Style ### Code Style
- Order functions top-down by abstraction (public API first, helpers below) - Order functions top-down by abstraction (public API first, helpers below)

View File

@@ -1,4 +1,4 @@
# Legal Consent Hub # GremiumHub
A comprehensive platform for digital applications, approvals, and discussions, designed for organizational workflows involving employee data processing and consent management. A comprehensive platform for digital applications, approvals, and discussions, designed for organizational workflows involving employee data processing and consent management.

View File

@@ -43,13 +43,13 @@ DELETE /notifications/clear-all
| File | Purpose | | File | Purpose |
|------|---------| |------|---------|
| `legalconsenthub.yml` | OpenAPI 3.0.3 specification (source of truth) | | `gremiumhub.yml` | OpenAPI 3.0.3 specification (source of truth) |
--- ---
## API-First Workflow ## API-First Workflow
1. **Modify OpenAPI spec** (`api/legalconsenthub.yml`) 1. **Modify OpenAPI spec** (`api/gremiumhub.yml`)
- Add/update endpoints, request/response schemas - Add/update endpoints, request/response schemas
- Follow OpenAPI 3.0.3 standards - Follow OpenAPI 3.0.3 standards
- Document all parameters and responses - Document all parameters and responses
@@ -57,10 +57,10 @@ DELETE /notifications/clear-all
2. **Generate clients** 2. **Generate clients**
```bash ```bash
# Frontend TypeScript client # Frontend TypeScript client
cd legalconsenthub && pnpm run api:generate cd gremiumhub && pnpm run api:generate
# Backend Kotlin server stubs # Backend Kotlin server stubs
cd legalconsenthub-backend && ./gradlew generate_legalconsenthub_server cd gremiumhub-backend && ./gradlew generate_gremiumhub_server
``` ```
3. **Implement backend logic** 3. **Implement backend logic**

View File

@@ -1,6 +1,6 @@
openapi: "3.0.3" openapi: "3.0.3"
info: info:
title: legalconsenthub title: gremiumhub
version: 0.1.0 version: 0.1.0
description: A platform for digital applications, approvals and discussions. description: A platform for digital applications, approvals and discussions.
contact: contact:
@@ -1681,6 +1681,30 @@ components:
type: boolean type: boolean
default: false default: false
description: If true, renders a checkbox instead of text input description: If true, renders a checkbox instead of text input
readOnlyConditions:
$ref: "#/components/schemas/VisibilityConditionGroup"
description: If set, the column is read-only when conditions evaluate to true.
readOnlyDefaultValue:
type: string
description: Value to write into each cell when the column transitions to read-only via readOnlyConditions.
rowVisibilityCondition:
$ref: "#/components/schemas/TableRowVisibilityConditionDto"
description: If set, individual cells are hidden/shown based on the row's value in the specified column
TableRowVisibilityConditionDto:
type: object
description: Per-row cell visibility condition referencing another column in the same table
properties:
sourceColumnIndex:
type: integer
description: Index of the column in the same table to evaluate (0-based)
expectedValues:
type: array
items:
type: string
description: Cell is visible if the source column's value matches any of these with the given operator
operator:
$ref: "#/components/schemas/VisibilityConditionOperator"
TableRowConstraintDto: TableRowConstraintDto:
type: object type: object

View File

@@ -1,9 +1,9 @@
# Same file as .env in Synology docker directory # Same file as .env in Synology docker directory
# Database Configuration # Database Configuration
LEGALCONSENTHUB_POSTGRES_USER=legalconsenthub GREMIUMHUB_POSTGRES_USER=gremiumhub
LEGALCONSENTHUB_POSTGRES_PASSWORD=legalconsenthub GREMIUMHUB_POSTGRES_PASSWORD=gremiumhub
LEGALCONSENTHUB_POSTGRES_DB=legalconsenthub GREMIUMHUB_POSTGRES_DB=gremiumhub
KEYCLOAK_POSTGRES_USER=keycloak KEYCLOAK_POSTGRES_USER=keycloak
KEYCLOAK_POSTGRES_PASSWORD=keycloak KEYCLOAK_POSTGRES_PASSWORD=keycloak
@@ -16,17 +16,17 @@ MAIL_HOST=maildev
KEYCLOAK_ADMIN=admin KEYCLOAK_ADMIN=admin
KEYCLOAK_ADMIN_PASSWORD= KEYCLOAK_ADMIN_PASSWORD=
KEYCLOAK_HOSTNAME=keycloak.lugnas.de KEYCLOAK_HOSTNAME=keycloak.lugnas.de
KEYCLOAK_REALM=legalconsenthub KEYCLOAK_REALM=gremiumhub
# Frontend Configuration (Nuxt) # Frontend Configuration (Nuxt)
NUXT_PUBLIC_CLIENT_PROXY_BASE_PATH=/api NUXT_PUBLIC_CLIENT_PROXY_BASE_PATH=/api
NUXT_PUBLIC_SERVER_API_BASE_URL=http://backend:8080 NUXT_PUBLIC_SERVER_API_BASE_URL=http://backend:8080
NUXT_PUBLIC_SERVER_API_BASE_PATH=/ NUXT_PUBLIC_SERVER_API_BASE_PATH=/
NUXT_PUBLIC_KEYCLOAK_TOKEN_URL=http://keycloak.lugnas.de/realms/legalconsenthub/protocol/openid-connect/token NUXT_PUBLIC_KEYCLOAK_TOKEN_URL=http://keycloak.lugnas.de/realms/gremiumhub/protocol/openid-connect/token
NUXT_OAUTH_KEYCLOAK_CLIENT_ID=legalconsenthub NUXT_OAUTH_KEYCLOAK_CLIENT_ID=gremiumhub
NUXT_OAUTH_KEYCLOAK_CLIENT_SECRET= NUXT_OAUTH_KEYCLOAK_CLIENT_SECRET=
NUXT_OAUTH_KEYCLOAK_REALM=legalconsenthub NUXT_OAUTH_KEYCLOAK_REALM=gremiumhub
NUXT_OAUTH_KEYCLOAK_SERVER_URL=http://keycloak.lugnas.de NUXT_OAUTH_KEYCLOAK_SERVER_URL=http://keycloak.lugnas.de
NUXT_OAUTH_KEYCLOAK_SERVER_URL_INTERNAL=http://keycloak.lugnas.de NUXT_OAUTH_KEYCLOAK_SERVER_URL_INTERNAL=http://keycloak.lugnas.de
# Make sure to add the host to (1) Keycloak valid redirect URIs and (2) web origins! # Make sure to add the host to (1) Keycloak valid redirect URIs and (2) web origins!

View File

@@ -1,18 +1,18 @@
name: legalconsenthub-dev name: gremiumhub-dev
networks: networks:
legalconsenthub-net: gremiumhub-net:
driver: bridge driver: bridge
volumes: volumes:
legalconsenthub_postgres_data: gremiumhub_postgres_data:
legalconsenthub_pdf_cache: gremiumhub_pdf_cache:
keycloak_postgres_data: keycloak_postgres_data:
services: services:
keycloak: keycloak:
image: quay.io/keycloak/keycloak:26.4.0 image: quay.io/keycloak/keycloak:26.4.0
container_name: legalconsenthub-keycloak container_name: gremiumhub-keycloak
command: start-dev command: start-dev
environment: environment:
KC_DB: postgres KC_DB: postgres
@@ -37,7 +37,7 @@ services:
keycloak-db: keycloak-db:
condition: service_healthy condition: service_healthy
networks: networks:
- legalconsenthub-net - gremiumhub-net
healthcheck: healthcheck:
test: ["CMD-SHELL", "curl --head -fsS http://localhost:9000/health/ready | echo $?"] test: ["CMD-SHELL", "curl --head -fsS http://localhost:9000/health/ready | echo $?"]
interval: 30s interval: 30s
@@ -47,7 +47,7 @@ services:
keycloak-db: keycloak-db:
image: postgres:latest image: postgres:latest
container_name: legalconsenthub-keycloak-postgres container_name: gremiumhub-keycloak-postgres
environment: environment:
POSTGRES_USER: ${KEYCLOAK_POSTGRES_USER} POSTGRES_USER: ${KEYCLOAK_POSTGRES_USER}
POSTGRES_PASSWORD: ${KEYCLOAK_POSTGRES_PASSWORD} POSTGRES_PASSWORD: ${KEYCLOAK_POSTGRES_PASSWORD}
@@ -57,7 +57,7 @@ services:
ports: ports:
- "5532:5432" - "5532:5432"
networks: networks:
- legalconsenthub-net - gremiumhub-net
volumes: volumes:
- keycloak_postgres_data:/var/lib/postgresql - keycloak_postgres_data:/var/lib/postgresql
healthcheck: healthcheck:
@@ -69,63 +69,63 @@ services:
maildev: maildev:
image: maildev/maildev:2.2.1 image: maildev/maildev:2.2.1
container_name: legalconsenthub-maildev container_name: gremiumhub-maildev
ports: ports:
- "1080:1080" - "1080:1080"
- "1025:1025" - "1025:1025"
networks: networks:
- legalconsenthub-net - gremiumhub-net
############################################### ###############################################
# #
# backend: # backend:
# image: gitea.lugnas.de/denis/legalconsenthub-backend:latest # image: gitea.lugnas.de/denis/gremiumhub-backend:latest
# container_name: legalconsenthub-backend-local # container_name: gremiumhub-backend-local
# restart: on-failure:2 # restart: on-failure:2
# environment: # environment:
# LOGGING_LEVEL_ROOT: ${LOGGING_LEVEL_ROOT:-DEBUG} # LOGGING_LEVEL_ROOT: ${LOGGING_LEVEL_ROOT:-DEBUG}
# LOGGING_LEVEL_APP: ${LOGGING_LEVEL_APP:-DEBUG} # LOGGING_LEVEL_APP: ${LOGGING_LEVEL_APP:-DEBUG}
# LEGALCONSENTHUB_DB_URL: jdbc:postgresql://legalconsenthub-db:5432/${LEGALCONSENTHUB_POSTGRES_DB} # GREMIUMHUB_DB_URL: jdbc:postgresql://gremiumhub-db:5432/${GREMIUMHUB_POSTGRES_DB}
# LEGALCONSENTHUB_DB_APP_USER: ${LEGALCONSENTHUB_POSTGRES_USER} # GREMIUMHUB_DB_APP_USER: ${GREMIUMHUB_POSTGRES_USER}
# LEGALCONSENTHUB_DB_PASSWORD: ${LEGALCONSENTHUB_POSTGRES_PASSWORD} # GREMIUMHUB_DB_PASSWORD: ${GREMIUMHUB_POSTGRES_PASSWORD}
# SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: ${KEYCLOAK_ISSUER_URL}/realms/${KEYCLOAK_REALM} # SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: ${KEYCLOAK_ISSUER_URL}/realms/${KEYCLOAK_REALM}
# SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI: http://keycloak:8080/realms/${KEYCLOAK_REALM}/protocol/openid-connect/certs # SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI: http://keycloak:8080/realms/${KEYCLOAK_REALM}/protocol/openid-connect/certs
# SERVER_PORT: 8080 # SERVER_PORT: 8080
# LEGALCONSENTHUB_PDF_STORAGE_FILESYSTEM_BASE_DIR: /var/lib/legalconsenthub/pdfs # GREMIUMHUB_PDF_STORAGE_FILESYSTEM_BASE_DIR: /var/lib/gremiumhub/pdfs
# ports: # ports:
# - "8081:8080" # - "8081:8080"
# volumes: # volumes:
# - legalconsenthub_pdf_cache:/var/lib/legalconsenthub/pdfs # - gremiumhub_pdf_cache:/var/lib/gremiumhub/pdfs
# depends_on: # depends_on:
# legalconsenthub-db: # gremiumhub-db:
# condition: service_started # condition: service_started
# networks: # networks:
# - legalconsenthub-net # - gremiumhub-net
# env_file: # env_file:
# - .env.dev # - .env.dev
# #
# frontend: # frontend:
# image: gitea.lugnas.de/denis/legalconsenthub:latest # image: gitea.lugnas.de/denis/gremiumhub:latest
# container_name: legalconsenthub-frontend-local # container_name: gremiumhub-frontend-local
# ports: # ports:
# - "3211:3000" # - "3211:3000"
# networks: # networks:
# - legalconsenthub-net # - gremiumhub-net
# env_file: # env_file:
# - .env.dev # - .env.dev
# #
# legalconsenthub-db: # gremiumhub-db:
# image: postgres:latest # image: postgres:latest
# container_name: legalconsenthub-postgres-local # container_name: gremiumhub-postgres-local
# environment: # environment:
# POSTGRES_USER: ${LEGALCONSENTHUB_POSTGRES_USER} # POSTGRES_USER: ${GREMIUMHUB_POSTGRES_USER}
# POSTGRES_PASSWORD: ${LEGALCONSENTHUB_POSTGRES_PASSWORD} # POSTGRES_PASSWORD: ${GREMIUMHUB_POSTGRES_PASSWORD}
# POSTGRES_DB: ${LEGALCONSENTHUB_POSTGRES_DB} # POSTGRES_DB: ${GREMIUMHUB_POSTGRES_DB}
# ports: # ports:
# - "5446:5432" # - "5446:5432"
# networks: # networks:
# - legalconsenthub-net # - gremiumhub-net
# volumes: # volumes:
# - legalconsenthub_postgres_data:/var/lib/postgresql # - gremiumhub_postgres_data:/var/lib/postgresql
# env_file: # env_file:
# - .env.dev # - .env.dev

View File

@@ -1,66 +1,66 @@
networks: networks:
legalconsenthub-net: gremiumhub-net:
driver: bridge driver: bridge
volumes: volumes:
legalconsenthub_postgres_data: gremiumhub_postgres_data:
keycloak_postgres_data: keycloak_postgres_data:
legalconsenthub_pdf_cache: gremiumhub_pdf_cache:
services: services:
backend: backend:
image: gitea.lugnas.de/denis/legalconsenthub-backend:latest image: gitea.lugnas.de/denis/gremiumhub-backend:latest
container_name: legalconsenthub-backend container_name: gremiumhub-backend
restart: on-failure:2 restart: on-failure:2
environment: environment:
LOGGING_LEVEL_ROOT: ${LOGGING_LEVEL_ROOT:-WARN} LOGGING_LEVEL_ROOT: ${LOGGING_LEVEL_ROOT:-WARN}
LOGGING_LEVEL_APP: ${LOGGING_LEVEL_APP:-WARN} LOGGING_LEVEL_APP: ${LOGGING_LEVEL_APP:-WARN}
LEGALCONSENTHUB_DB_URL: jdbc:postgresql://legalconsenthub-db:5432/${LEGALCONSENTHUB_POSTGRES_DB} GREMIUMHUB_DB_URL: jdbc:postgresql://gremiumhub-db:5432/${GREMIUMHUB_POSTGRES_DB}
LEGALCONSENTHUB_DB_APP_USER: ${LEGALCONSENTHUB_POSTGRES_USER} GREMIUMHUB_DB_APP_USER: ${GREMIUMHUB_POSTGRES_USER}
LEGALCONSENTHUB_DB_PASSWORD: ${LEGALCONSENTHUB_POSTGRES_PASSWORD} GREMIUMHUB_DB_PASSWORD: ${GREMIUMHUB_POSTGRES_PASSWORD}
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: ${KEYCLOAK_ISSUER_URL}/realms/${KEYCLOAK_REALM} SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: ${KEYCLOAK_ISSUER_URL}/realms/${KEYCLOAK_REALM}
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI: ${KEYCLOAK_ISSUER_URL}/realms/${KEYCLOAK_REALM}/protocol/openid-connect/certs SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI: ${KEYCLOAK_ISSUER_URL}/realms/${KEYCLOAK_REALM}/protocol/openid-connect/certs
SERVER_PORT: 8080 SERVER_PORT: 8080
LEGALCONSENTHUB_PDF_STORAGE_FILESYSTEM_BASE_DIR: /var/lib/legalconsenthub/pdfs GREMIUMHUB_PDF_STORAGE_FILESYSTEM_BASE_DIR: /var/lib/gremiumhub/pdfs
ports: ports:
- "8080:8080" - "8080:8080"
volumes: volumes:
- legalconsenthub_pdf_cache:/var/lib/legalconsenthub/pdfs - gremiumhub_pdf_cache:/var/lib/gremiumhub/pdfs
- ./keycloak-theme:/opt/keycloak/themes - ./keycloak-theme:/opt/keycloak/themes
depends_on: depends_on:
legalconsenthub-db: gremiumhub-db:
condition: service_started condition: service_started
keycloak: keycloak:
condition: service_started condition: service_started
networks: networks:
- legalconsenthub-net - gremiumhub-net
env_file: env_file:
- .env.prod - .env.prod
frontend: frontend:
image: gitea.lugnas.de/denis/legalconsenthub:latest image: gitea.lugnas.de/denis/gremiumhub:latest
container_name: legalconsenthub-frontend container_name: gremiumhub-frontend
ports: ports:
- "3210:3000" - "3210:3000"
depends_on: depends_on:
keycloak: keycloak:
condition: service_started condition: service_started
networks: networks:
- legalconsenthub-net - gremiumhub-net
env_file: env_file:
- .env.prod - .env.prod
landing: landing:
image: gitea.lugnas.de/denis/legalconsenthub-landing:latest image: gitea.lugnas.de/denis/gremiumhub-landing:latest
container_name: legalconsenthub-landing container_name: gremiumhub-landing
ports: ports:
- "3211:3000" - "3211:3000"
networks: networks:
- legalconsenthub-net - gremiumhub-net
keycloak: keycloak:
image: quay.io/keycloak/keycloak:26.4.0 image: quay.io/keycloak/keycloak:26.4.0
container_name: legalconsenthub-keycloak container_name: gremiumhub-keycloak
command: start-dev command: start-dev
environment: environment:
KC_DB: postgres KC_DB: postgres
@@ -82,13 +82,13 @@ services:
keycloak-db: keycloak-db:
condition: service_started condition: service_started
networks: networks:
- legalconsenthub-net - gremiumhub-net
env_file: env_file:
- .env.prod - .env.prod
keycloak-db: keycloak-db:
image: postgres:latest image: postgres:latest
container_name: legalconsenthub-keycloak-postgres container_name: gremiumhub-keycloak-postgres
environment: environment:
POSTGRES_USER: ${KEYCLOAK_POSTGRES_USER} POSTGRES_USER: ${KEYCLOAK_POSTGRES_USER}
POSTGRES_PASSWORD: ${KEYCLOAK_POSTGRES_PASSWORD} POSTGRES_PASSWORD: ${KEYCLOAK_POSTGRES_PASSWORD}
@@ -96,33 +96,33 @@ services:
ports: ports:
- "5445:5432" - "5445:5432"
networks: networks:
- legalconsenthub-net - gremiumhub-net
volumes: volumes:
- keycloak_postgres_data:/var/lib/postgresql - keycloak_postgres_data:/var/lib/postgresql
env_file: env_file:
- .env.prod - .env.prod
legalconsenthub-db: gremiumhub-db:
image: postgres:latest image: postgres:latest
container_name: legalconsenthub-postgres container_name: gremiumhub-postgres
environment: environment:
POSTGRES_USER: ${LEGALCONSENTHUB_POSTGRES_USER} POSTGRES_USER: ${GREMIUMHUB_POSTGRES_USER}
POSTGRES_PASSWORD: ${LEGALCONSENTHUB_POSTGRES_PASSWORD} POSTGRES_PASSWORD: ${GREMIUMHUB_POSTGRES_PASSWORD}
POSTGRES_DB: ${LEGALCONSENTHUB_POSTGRES_DB} POSTGRES_DB: ${GREMIUMHUB_POSTGRES_DB}
ports: ports:
- "5444:5432" - "5444:5432"
networks: networks:
- legalconsenthub-net - gremiumhub-net
volumes: volumes:
- legalconsenthub_postgres_data:/var/lib/postgresql - gremiumhub_postgres_data:/var/lib/postgresql
env_file: env_file:
- .env.prod - .env.prod
maildev: maildev:
image: maildev/maildev:2.2.1 image: maildev/maildev:2.2.1
container_name: legalconsenthub-maildev container_name: gremiumhub-maildev
ports: ports:
- "1080:1080" - "1080:1080"
- "1026:1025" - "1026:1025"
networks: networks:
- legalconsenthub-net - gremiumhub-net

View File

@@ -1,4 +1,4 @@
# LegalConsentHub Keycloak Theme - German translations # GremiumHub Keycloak Theme - German translations
# Override default Keycloak messages here # Override default Keycloak messages here
# Login page # Login page

View File

@@ -1,4 +1,4 @@
# LegalConsentHub Keycloak Theme - English translations # GremiumHub Keycloak Theme - English translations
# Override default Keycloak messages here # Override default Keycloak messages here
# Login page # Login page

View File

@@ -1,4 +1,4 @@
/* LegalConsentHub Keycloak Theme - Matching Nuxt UI 4 Styling */ /* GremiumHub Keycloak Theme - Matching Nuxt UI 4 Styling */
/* Compatible with Keycloak 26+ PatternFly-based themes */ /* Compatible with Keycloak 26+ PatternFly-based themes */
/* CSS Variables matching Nuxt UI teal/cyan/violet theme */ /* CSS Variables matching Nuxt UI teal/cyan/violet theme */

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -8,7 +8,7 @@
## Context ## Context
The Legal Consent Hub requires real-time notification delivery to users. When events occur (e.g., form submissions, approvals, comments), affected users should receive notifications immediately without refreshing the page. The GremiumHub requires real-time notification delivery to users. When events occur (e.g., form submissions, approvals, comments), affected users should receive notifications immediately without refreshing the page.
### Constraint: Stateless Backend ### Constraint: Stateless Backend
@@ -18,7 +18,7 @@ The backend **must be stateless** for horizontal scaling. Multiple backend insta
## Current Implementation ## Current Implementation
**Location:** `src/main/kotlin/com/betriebsratkanzlei/legalconsenthub/notification/` **Location:** `src/main/kotlin/com/betriebsratkanzlei/gremiumhub/notification/`
### Files ### Files

View File

@@ -21,7 +21,7 @@
./gradlew build ./gradlew build
# Generate server stubs (after OpenAPI spec changes) # Generate server stubs (after OpenAPI spec changes)
./gradlew generate_legalconsenthub_server ./gradlew generate_gremiumhub_server
# Database migrations # Database migrations
# Never create Liquibase changesets in src/main/resources/db/changelog/ # Never create Liquibase changesets in src/main/resources/db/changelog/
@@ -88,7 +88,7 @@ formElementSections:
| `src/main/resources/seed/demo/` | Demo form sections (11 files) | | `src/main/resources/seed/demo/` | Demo form sections (11 files) |
| `src/main/kotlin/.../seed/SplitYamlLoader.kt` | YAML merger for !include directives | | `src/main/kotlin/.../seed/SplitYamlLoader.kt` | YAML merger for !include directives |
| `src/main/resources/db/changelog/` | Liquibase migrations | | `src/main/resources/db/changelog/` | Liquibase migrations |
| `src/main/kotlin/com/legalconsenthub/service/ApplicationFormFormatService.kt` | HTML/PDF export logic | | `src/main/kotlin/com/betriebsratkanzlei/gremiumhub/application_form_version/ApplicationFormFormatService.kt` | HTML/PDF export logic |
| `docs/form-flow-diagram.md` | Visual form flow diagram (update after template changes) | | `docs/form-flow-diagram.md` | Visual form flow diagram (update after template changes) |
--- ---
@@ -97,6 +97,8 @@ formElementSections:
1. **Never add SQL migrations** - They will be handled by the user 1. **Never add SQL migrations** - They will be handled by the user
2. **Use mapper classes** - All DTO ↔ Entity conversions must happen in dedicated mapper classes (never in services/controllers) 2. **Use mapper classes** - All DTO ↔ Entity conversions must happen in dedicated mapper classes (never in services/controllers)
- **CRITICAL: Entity + Mapper must be updated together** — When a new field is added to an OpenAPI DTO, you MUST update BOTH the entity class AND the mapper. A field present in the DTO but absent from the entity will silently return `null` from the API with no compile error. New entity fields that are persisted require a SQL migration (the user handles this).
- For JSON-typed fields (e.g. `GroupCondition`), use `@JdbcTypeCode(SqlTypes.JSON)` + `@Column(columnDefinition = "jsonb")`, same as `FormElement.visibilityConditions`.
3. **PDF Export Validation** - After changes to form elements, visibility, or spawning: 3. **PDF Export Validation** - After changes to form elements, visibility, or spawning:
- Test both HTML and PDF export for real form instances - Test both HTML and PDF export for real form instances
- Verify all element types render correctly - Verify all element types render correctly

View File

@@ -4,18 +4,18 @@ WORKDIR /workspace/app
RUN mkdir -p ../api RUN mkdir -p ../api
COPY api/legalconsenthub.yml ../api/ COPY api/gremiumhub.yml ../api/
COPY legalconsenthub-backend/gradlew . COPY gremiumhub-backend/gradlew .
COPY legalconsenthub-backend/gradle gradle COPY gremiumhub-backend/gradle gradle
COPY legalconsenthub-backend/build.gradle . COPY gremiumhub-backend/build.gradle .
COPY legalconsenthub-backend/settings.gradle . COPY gremiumhub-backend/settings.gradle .
RUN chmod +x ./gradlew RUN chmod +x ./gradlew
RUN ./gradlew dependencies --no-daemon RUN ./gradlew dependencies --no-daemon
COPY legalconsenthub-backend/src src COPY gremiumhub-backend/src src
RUN ./gradlew bootJar -x test --no-daemon RUN ./gradlew bootJar -x test --no-daemon
@@ -35,14 +35,14 @@ RUN apk add --no-cache \
RUN addgroup -S spring && adduser -S spring -G spring RUN addgroup -S spring && adduser -S spring -G spring
# PDF cache directory must be writable by the non-root user (and ideally mounted as a volume in production) # PDF cache directory must be writable by the non-root user (and ideally mounted as a volume in production)
RUN mkdir -p /var/lib/legalconsenthub/pdfs && chown -R spring:spring /var/lib/legalconsenthub RUN mkdir -p /var/lib/gremiumhub/pdfs && chown -R spring:spring /var/lib/gremiumhub
USER spring:spring USER spring:spring
COPY --from=builder /workspace/app/build/libs/*.jar app.jar COPY --from=builder /workspace/app/build/libs/*.jar app.jar
ENV SPRING_PROFILES_ACTIVE=prod ENV SPRING_PROFILES_ACTIVE=prod
ENV JAVA_OPTS="-Xms256m -Xmx512m" ENV JAVA_OPTS="-Xms256m -Xmx512m"
ENV LEGALCONSENTHUB_PDF_STORAGE_FILESYSTEM_BASE_DIR=/var/lib/legalconsenthub/pdfs ENV GREMIUMHUB_PDF_STORAGE_FILESYSTEM_BASE_DIR=/var/lib/gremiumhub/pdfs
EXPOSE 8080 EXPOSE 8080

View File

@@ -1,4 +1,4 @@
# Legal Consent Hub Backend # GremiumHub Backend
## Pipeline Triggering ## Pipeline Triggering

View File

@@ -68,11 +68,11 @@ ktlint {
} }
} }
def generatedSourcesServerLegalconsenthubDir = "$buildDir/generated/server".toString() def generatedSourcesServerGremiumhubDir = "$buildDir/generated/server".toString()
sourceSets { sourceSets {
main { main {
kotlin.srcDirs += generatedSourcesServerLegalconsenthubDir + '/src/main/kotlin' kotlin.srcDirs += generatedSourcesServerGremiumhubDir + '/src/main/kotlin'
} }
} }
@@ -80,14 +80,14 @@ tasks.named('test') {
useJUnitPlatform() useJUnitPlatform()
} }
task generate_legalconsenthub_server(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask) { task generate_gremiumhub_server(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask) {
generatorName = 'kotlin-spring' generatorName = 'kotlin-spring'
inputSpec = "$rootDir/../api/legalconsenthub.yml".toString() inputSpec = "$rootDir/../api/gremiumhub.yml".toString()
outputDir = generatedSourcesServerLegalconsenthubDir outputDir = generatedSourcesServerGremiumhubDir
apiPackage = 'com.betriebsratkanzlei.legalconsenthub_api.api' apiPackage = 'com.betriebsratkanzlei.gremiumhub_api.api'
modelPackage = 'com.betriebsratkanzlei.legalconsenthub_api.model' modelPackage = 'com.betriebsratkanzlei.gremiumhub_api.model'
groupId = 'com.betriebsratkanzlei' groupId = 'com.betriebsratkanzlei'
id = 'legalconsenthub_api' id = 'gremiumhub_api'
configOptions = [useTags : 'true', configOptions = [useTags : 'true',
enumPropertyNaming: 'original', enumPropertyNaming: 'original',
interfaceOnly : 'true', interfaceOnly : 'true',
@@ -96,5 +96,5 @@ task generate_legalconsenthub_server(type: org.openapitools.generator.gradle.plu
importMappings = [Instant: "java.time.Instant"] importMappings = [Instant: "java.time.Instant"]
} }
compileKotlin.dependsOn(tasks.generate_legalconsenthub_server) compileKotlin.dependsOn(tasks.generate_gremiumhub_server)
runKtlintCheckOverMainSourceSet.dependsOn(generate_legalconsenthub_server) runKtlintCheckOverMainSourceSet.dependsOn(generate_gremiumhub_server)

View File

@@ -0,0 +1 @@
rootProject.name = 'gremiumhub'

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub package com.betriebsratkanzlei.gremiumhub
import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication import org.springframework.boot.runApplication
@@ -10,8 +10,8 @@ import org.springframework.scheduling.annotation.EnableScheduling
@EnableJpaAuditing @EnableJpaAuditing
@EnableAsync @EnableAsync
@EnableScheduling @EnableScheduling
class LegalconsenthubApplication class GremiumhubApplication
fun main(args: Array<String>) { fun main(args: Array<String>) {
runApplication<LegalconsenthubApplication>(*args) runApplication<GremiumhubApplication>(*args)
} }

View File

@@ -1,9 +1,9 @@
package com.betriebsratkanzlei.legalconsenthub.application_form package com.betriebsratkanzlei.gremiumhub.application_form
import com.betriebsratkanzlei.legalconsenthub.application_form_version.ApplicationFormVersion import com.betriebsratkanzlei.gremiumhub.application_form_version.ApplicationFormVersion
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementSection import com.betriebsratkanzlei.gremiumhub.form_element.FormElementSection
import com.betriebsratkanzlei.legalconsenthub.user.User import com.betriebsratkanzlei.gremiumhub.user.User
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormStatus import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormStatus
import jakarta.persistence.CascadeType import jakarta.persistence.CascadeType
import jakarta.persistence.Column import jakarta.persistence.Column
import jakarta.persistence.Entity import jakarta.persistence.Entity

View File

@@ -1,9 +1,9 @@
package com.betriebsratkanzlei.legalconsenthub.application_form package com.betriebsratkanzlei.gremiumhub.application_form
import com.betriebsratkanzlei.legalconsenthub_api.api.ApplicationFormApi import com.betriebsratkanzlei.gremiumhub_api.api.ApplicationFormApi
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormDto
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementDto import com.betriebsratkanzlei.gremiumhub_api.model.FormElementDto
import com.betriebsratkanzlei.legalconsenthub_api.model.PagedApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.PagedApplicationFormDto
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController

View File

@@ -1,16 +1,16 @@
package com.betriebsratkanzlei.legalconsenthub.application_form package com.betriebsratkanzlei.gremiumhub.application_form
import com.betriebsratkanzlei.legalconsenthub.application_form.export.latex.LatexEscaper import com.betriebsratkanzlei.gremiumhub.application_form.export.latex.LatexEscaper
import com.betriebsratkanzlei.legalconsenthub.application_form.export.latex.LatexExportModel import com.betriebsratkanzlei.gremiumhub.application_form.export.latex.LatexExportModel
import com.betriebsratkanzlei.legalconsenthub.application_form.export.latex.LatexFormElement import com.betriebsratkanzlei.gremiumhub.application_form.export.latex.LatexFormElement
import com.betriebsratkanzlei.legalconsenthub.application_form.export.latex.LatexPdfRenderer import com.betriebsratkanzlei.gremiumhub.application_form.export.latex.LatexPdfRenderer
import com.betriebsratkanzlei.legalconsenthub.application_form.export.latex.LatexSection import com.betriebsratkanzlei.gremiumhub.application_form.export.latex.LatexSection
import com.betriebsratkanzlei.legalconsenthub.application_form.export.latex.LatexSubSection import com.betriebsratkanzlei.gremiumhub.application_form.export.latex.LatexSubSection
import com.betriebsratkanzlei.legalconsenthub.application_form.export.latex.RichTextToLatexConverter import com.betriebsratkanzlei.gremiumhub.application_form.export.latex.RichTextToLatexConverter
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormSnapshotDto
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementSectionSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.FormElementSectionSnapshotDto
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.FormElementSnapshotDto
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementSubSectionSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.FormElementSubSectionSnapshotDto
import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.core.type.TypeReference
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@@ -20,10 +20,10 @@ import java.time.Instant
import java.time.LocalDate import java.time.LocalDate
import java.time.ZoneId import java.time.ZoneId
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
import com.betriebsratkanzlei.legalconsenthub_api.model.VisibilityConditionGroup as VisibilityConditionGroupDto import com.betriebsratkanzlei.gremiumhub_api.model.VisibilityConditionGroup as VisibilityConditionGroupDto
import com.betriebsratkanzlei.legalconsenthub_api.model.VisibilityConditionNode as VisibilityConditionNodeDto import com.betriebsratkanzlei.gremiumhub_api.model.VisibilityConditionNode as VisibilityConditionNodeDto
import com.betriebsratkanzlei.legalconsenthub_api.model.VisibilityConditionOperator as VisibilityConditionOperatorDto import com.betriebsratkanzlei.gremiumhub_api.model.VisibilityConditionOperator as VisibilityConditionOperatorDto
import com.betriebsratkanzlei.legalconsenthub_api.model.VisibilityConditionType as VisibilityConditionTypeDto import com.betriebsratkanzlei.gremiumhub_api.model.VisibilityConditionType as VisibilityConditionTypeDto
@Service @Service
class ApplicationFormFormatService( class ApplicationFormFormatService(

View File

@@ -1,10 +1,10 @@
package com.betriebsratkanzlei.legalconsenthub.application_form package com.betriebsratkanzlei.gremiumhub.application_form
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementSectionMapper import com.betriebsratkanzlei.gremiumhub.form_element.FormElementSectionMapper
import com.betriebsratkanzlei.legalconsenthub.user.User import com.betriebsratkanzlei.gremiumhub.user.User
import com.betriebsratkanzlei.legalconsenthub.user.UserMapper import com.betriebsratkanzlei.gremiumhub.user.UserMapper
import com.betriebsratkanzlei.legalconsenthub.user.UserService import com.betriebsratkanzlei.gremiumhub.user.UserService
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormDto
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.Instant import java.time.Instant
import java.util.UUID import java.util.UUID
@@ -60,7 +60,7 @@ class ApplicationFormMapper(
organizationId = applicationFormDto.organizationId ?: "", organizationId = applicationFormDto.organizationId ?: "",
status = status =
applicationFormDto.status applicationFormDto.status
?: com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormStatus.DRAFT, ?: com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormStatus.DRAFT,
createdBy = user, createdBy = user,
lastModifiedBy = user, lastModifiedBy = user,
) )

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form package com.betriebsratkanzlei.gremiumhub.application_form
import org.springframework.data.domain.Page import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable import org.springframework.data.domain.Pageable

View File

@@ -1,24 +1,24 @@
package com.betriebsratkanzlei.legalconsenthub.application_form package com.betriebsratkanzlei.gremiumhub.application_form
import com.betriebsratkanzlei.legalconsenthub.application_form_version.ApplicationFormVersionService import com.betriebsratkanzlei.gremiumhub.application_form_version.ApplicationFormVersionService
import com.betriebsratkanzlei.legalconsenthub.comment.CommentRepository import com.betriebsratkanzlei.gremiumhub.comment.CommentRepository
import com.betriebsratkanzlei.legalconsenthub.email.ApplicationFormCreatedEvent import com.betriebsratkanzlei.gremiumhub.email.ApplicationFormCreatedEvent
import com.betriebsratkanzlei.legalconsenthub.email.ApplicationFormSubmittedEvent import com.betriebsratkanzlei.gremiumhub.email.ApplicationFormSubmittedEvent
import com.betriebsratkanzlei.legalconsenthub.email.ApplicationFormUpdatedEvent import com.betriebsratkanzlei.gremiumhub.email.ApplicationFormUpdatedEvent
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormInvalidStateException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormInvalidStateException
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotCreatedException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotCreatedException
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotDeletedException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotDeletedException
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotFoundException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotFoundException
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotUpdatedException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotUpdatedException
import com.betriebsratkanzlei.legalconsenthub.file.FileService import com.betriebsratkanzlei.gremiumhub.file.FileService
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementMapper import com.betriebsratkanzlei.gremiumhub.form_element.FormElementMapper
import com.betriebsratkanzlei.legalconsenthub.notification.NotificationService import com.betriebsratkanzlei.gremiumhub.notification.NotificationService
import com.betriebsratkanzlei.legalconsenthub.user.UserService import com.betriebsratkanzlei.gremiumhub.user.UserService
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormDto
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormStatus import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormStatus
import com.betriebsratkanzlei.legalconsenthub_api.model.CreateNotificationDto import com.betriebsratkanzlei.gremiumhub_api.model.CreateNotificationDto
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementDto import com.betriebsratkanzlei.gremiumhub_api.model.FormElementDto
import com.betriebsratkanzlei.legalconsenthub_api.model.NotificationType import com.betriebsratkanzlei.gremiumhub_api.model.NotificationType
import org.springframework.context.ApplicationEventPublisher import org.springframework.context.ApplicationEventPublisher
import org.springframework.data.domain.Page import org.springframework.data.domain.Page
import org.springframework.data.domain.PageRequest import org.springframework.data.domain.PageRequest

View File

@@ -1,6 +1,6 @@
package com.betriebsratkanzlei.legalconsenthub.application_form package com.betriebsratkanzlei.gremiumhub.application_form
import com.betriebsratkanzlei.legalconsenthub_api.model.PagedApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.PagedApplicationFormDto
import org.springframework.data.domain.Page import org.springframework.data.domain.Page
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form.export.latex package com.betriebsratkanzlei.gremiumhub.application_form.export.latex
object LatexEscaper { object LatexEscaper {
fun escape(text: String?): String { fun escape(text: String?): String {

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form.export.latex package com.betriebsratkanzlei.gremiumhub.application_form.export.latex
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form.export.latex package com.betriebsratkanzlei.gremiumhub.application_form.export.latex
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service import org.springframework.stereotype.Service

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form.export.latex package com.betriebsratkanzlei.gremiumhub.application_form.export.latex
import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper

View File

@@ -1,10 +1,10 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_template package com.betriebsratkanzlei.gremiumhub.application_form_template
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormMapper import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationFormMapper
import com.betriebsratkanzlei.legalconsenthub.application_form.PagedApplicationFormMapper import com.betriebsratkanzlei.gremiumhub.application_form.PagedApplicationFormMapper
import com.betriebsratkanzlei.legalconsenthub_api.api.ApplicationFormTemplateApi import com.betriebsratkanzlei.gremiumhub_api.api.ApplicationFormTemplateApi
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormDto
import com.betriebsratkanzlei.legalconsenthub_api.model.PagedApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.PagedApplicationFormDto
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController

View File

@@ -1,13 +1,13 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_template package com.betriebsratkanzlei.gremiumhub.application_form_template
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationForm import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationForm
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormMapper import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationFormMapper
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormRepository import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationFormRepository
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotCreatedException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotCreatedException
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotDeletedException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotDeletedException
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotFoundException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotFoundException
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotUpdatedException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotUpdatedException
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormDto
import org.springframework.data.domain.Page import org.springframework.data.domain.Page
import org.springframework.data.domain.PageRequest import org.springframework.data.domain.PageRequest
import org.springframework.stereotype.Service import org.springframework.stereotype.Service

View File

@@ -1,8 +1,8 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version package com.betriebsratkanzlei.gremiumhub.application_form_version
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationForm import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationForm
import com.betriebsratkanzlei.legalconsenthub.user.User import com.betriebsratkanzlei.gremiumhub.user.User
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormStatus import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormStatus
import jakarta.persistence.Column import jakarta.persistence.Column
import jakarta.persistence.Entity import jakarta.persistence.Entity
import jakarta.persistence.EntityListeners import jakarta.persistence.EntityListeners

View File

@@ -1,12 +1,12 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version package com.betriebsratkanzlei.gremiumhub.application_form_version
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormMapper import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationFormMapper
import com.betriebsratkanzlei.legalconsenthub.application_form_version.pdf.ApplicationFormVersionPdfService import com.betriebsratkanzlei.gremiumhub.application_form_version.pdf.ApplicationFormVersionPdfService
import com.betriebsratkanzlei.legalconsenthub.user.UserService import com.betriebsratkanzlei.gremiumhub.user.UserService
import com.betriebsratkanzlei.legalconsenthub_api.api.ApplicationFormVersionApi import com.betriebsratkanzlei.gremiumhub_api.api.ApplicationFormVersionApi
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormDto
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormVersionDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormVersionDto
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormVersionListItemDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormVersionListItemDto
import org.springframework.core.io.ByteArrayResource import org.springframework.core.io.ByteArrayResource
import org.springframework.core.io.Resource import org.springframework.core.io.Resource
import org.springframework.http.HttpHeaders import org.springframework.http.HttpHeaders

View File

@@ -1,9 +1,9 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version package com.betriebsratkanzlei.gremiumhub.application_form_version
import com.betriebsratkanzlei.legalconsenthub.user.UserMapper import com.betriebsratkanzlei.gremiumhub.user.UserMapper
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormSnapshotDto
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormVersionDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormVersionDto
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormVersionListItemDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormVersionListItemDto
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.stereotype.Component import org.springframework.stereotype.Component

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version package com.betriebsratkanzlei.gremiumhub.application_form_version
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository

View File

@@ -1,21 +1,21 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version package com.betriebsratkanzlei.gremiumhub.application_form_version
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationForm import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationForm
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormRepository import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationFormRepository
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotFoundException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotFoundException
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormVersionNotFoundException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormVersionNotFoundException
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElement import com.betriebsratkanzlei.gremiumhub.form_element.FormElement
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementSection import com.betriebsratkanzlei.gremiumhub.form_element.FormElementSection
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementSubSection import com.betriebsratkanzlei.gremiumhub.form_element.FormElementSubSection
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementVisibilityConditionMapper import com.betriebsratkanzlei.gremiumhub.form_element.FormElementVisibilityConditionMapper
import com.betriebsratkanzlei.legalconsenthub.form_element.FormOptionMapper import com.betriebsratkanzlei.gremiumhub.form_element.FormOptionMapper
import com.betriebsratkanzlei.legalconsenthub.form_element.SectionSpawnTriggerMapper import com.betriebsratkanzlei.gremiumhub.form_element.SectionSpawnTriggerMapper
import com.betriebsratkanzlei.legalconsenthub.form_element.TableRowPresetMapper import com.betriebsratkanzlei.gremiumhub.form_element.TableRowPresetMapper
import com.betriebsratkanzlei.legalconsenthub.user.User import com.betriebsratkanzlei.gremiumhub.user.User
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormSnapshotDto
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementSectionSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.FormElementSectionSnapshotDto
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.FormElementSnapshotDto
import com.betriebsratkanzlei.legalconsenthub_api.model.FormElementSubSectionSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.FormElementSubSectionSnapshotDto
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional import org.springframework.transaction.annotation.Transactional

View File

@@ -1,8 +1,8 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version.pdf package com.betriebsratkanzlei.gremiumhub.application_form_version.pdf
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormFormatService import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationFormFormatService
import com.betriebsratkanzlei.legalconsenthub.application_form_version.ApplicationFormVersionService import com.betriebsratkanzlei.gremiumhub.application_form_version.ApplicationFormVersionService
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormSnapshotDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormSnapshotDto
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service import org.springframework.stereotype.Service

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version.pdf package com.betriebsratkanzlei.gremiumhub.application_form_version.pdf
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component import org.springframework.stereotype.Component

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version.pdf package com.betriebsratkanzlei.gremiumhub.application_form_version.pdf
interface PdfStorage { interface PdfStorage {
fun get(key: PdfStorageKey): ByteArray? fun get(key: PdfStorageKey): ByteArray?

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version.pdf package com.betriebsratkanzlei.gremiumhub.application_form_version.pdf
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.application_form_version.pdf package com.betriebsratkanzlei.gremiumhub.application_form_version.pdf
import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.context.properties.EnableConfigurationProperties
@@ -9,7 +9,7 @@ import org.springframework.context.annotation.Configuration
@EnableConfigurationProperties(PdfStorageProperties::class) @EnableConfigurationProperties(PdfStorageProperties::class)
class PdfStorageConfiguration class PdfStorageConfiguration
@ConfigurationProperties(prefix = "legalconsenthub.pdf.storage") @ConfigurationProperties(prefix = "gremiumhub.pdf.storage")
data class PdfStorageProperties( data class PdfStorageProperties(
@NestedConfigurationProperty @NestedConfigurationProperty
val filesystem: FileSystemProperties = FileSystemProperties(), val filesystem: FileSystemProperties = FileSystemProperties(),
@@ -19,14 +19,14 @@ data class PdfStorageProperties(
* Base directory for stored PDFs. In development this defaults to a folder next to the backend code. * Base directory for stored PDFs. In development this defaults to a folder next to the backend code.
* *
* Configure either via application.yaml: * Configure either via application.yaml:
* legalconsenthub: * gremiumhub:
* pdf: * pdf:
* storage: * storage:
* filesystem: * filesystem:
* base-dir: /var/lib/legalconsenthub/pdfs * base-dir: /var/lib/gremiumhub/pdfs
* *
* or via environment variable: * or via environment variable:
* LEGALCONSENTHUB_PDF_STORAGE_FILESYSTEM_BASE_DIR=/var/lib/legalconsenthub/pdfs * GREMIUMHUB_PDF_STORAGE_FILESYSTEM_BASE_DIR=/var/lib/gremiumhub/pdfs
*/ */
val baseDir: String = ".pdf-store", val baseDir: String = ".pdf-store",
) )

View File

@@ -1,8 +1,8 @@
package com.betriebsratkanzlei.legalconsenthub.comment package com.betriebsratkanzlei.gremiumhub.comment
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationForm import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationForm
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElement import com.betriebsratkanzlei.gremiumhub.form_element.FormElement
import com.betriebsratkanzlei.legalconsenthub.user.User import com.betriebsratkanzlei.gremiumhub.user.User
import jakarta.persistence.Column import jakarta.persistence.Column
import jakarta.persistence.Entity import jakarta.persistence.Entity
import jakarta.persistence.EntityListeners import jakarta.persistence.EntityListeners

View File

@@ -1,10 +1,10 @@
package com.betriebsratkanzlei.legalconsenthub.comment package com.betriebsratkanzlei.gremiumhub.comment
import com.betriebsratkanzlei.legalconsenthub_api.api.CommentApi import com.betriebsratkanzlei.gremiumhub_api.api.CommentApi
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormCommentCountsDto import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormCommentCountsDto
import com.betriebsratkanzlei.legalconsenthub_api.model.CommentDto import com.betriebsratkanzlei.gremiumhub_api.model.CommentDto
import com.betriebsratkanzlei.legalconsenthub_api.model.CreateCommentDto import com.betriebsratkanzlei.gremiumhub_api.model.CreateCommentDto
import com.betriebsratkanzlei.legalconsenthub_api.model.CursorPagedCommentDto import com.betriebsratkanzlei.gremiumhub_api.model.CursorPagedCommentDto
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController

View File

@@ -1,13 +1,13 @@
package com.betriebsratkanzlei.legalconsenthub.comment package com.betriebsratkanzlei.gremiumhub.comment
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormRepository import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationFormRepository
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotFoundException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotFoundException
import com.betriebsratkanzlei.legalconsenthub.error.FormElementNotFoundException import com.betriebsratkanzlei.gremiumhub.error.FormElementNotFoundException
import com.betriebsratkanzlei.legalconsenthub.form_element.FormElementRepository import com.betriebsratkanzlei.gremiumhub.form_element.FormElementRepository
import com.betriebsratkanzlei.legalconsenthub.user.UserMapper import com.betriebsratkanzlei.gremiumhub.user.UserMapper
import com.betriebsratkanzlei.legalconsenthub.user.UserService import com.betriebsratkanzlei.gremiumhub.user.UserService
import com.betriebsratkanzlei.legalconsenthub_api.model.CommentDto import com.betriebsratkanzlei.gremiumhub_api.model.CommentDto
import com.betriebsratkanzlei.legalconsenthub_api.model.CreateCommentDto import com.betriebsratkanzlei.gremiumhub_api.model.CreateCommentDto
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.Instant import java.time.Instant
import java.util.UUID import java.util.UUID

View File

@@ -1,6 +1,6 @@
package com.betriebsratkanzlei.legalconsenthub.comment package com.betriebsratkanzlei.gremiumhub.comment
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationForm import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationForm
import org.springframework.data.domain.Page import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository

View File

@@ -1,17 +1,17 @@
package com.betriebsratkanzlei.legalconsenthub.comment package com.betriebsratkanzlei.gremiumhub.comment
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormRepository import com.betriebsratkanzlei.gremiumhub.application_form.ApplicationFormRepository
import com.betriebsratkanzlei.legalconsenthub.email.CommentAddedEvent import com.betriebsratkanzlei.gremiumhub.email.CommentAddedEvent
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotFoundException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotFoundException
import com.betriebsratkanzlei.legalconsenthub.error.CommentNotCreatedException import com.betriebsratkanzlei.gremiumhub.error.CommentNotCreatedException
import com.betriebsratkanzlei.legalconsenthub.error.CommentNotDeletedException import com.betriebsratkanzlei.gremiumhub.error.CommentNotDeletedException
import com.betriebsratkanzlei.legalconsenthub.error.CommentNotFoundException import com.betriebsratkanzlei.gremiumhub.error.CommentNotFoundException
import com.betriebsratkanzlei.legalconsenthub.error.CommentNotUpdatedException import com.betriebsratkanzlei.gremiumhub.error.CommentNotUpdatedException
import com.betriebsratkanzlei.legalconsenthub.notification.NotificationService import com.betriebsratkanzlei.gremiumhub.notification.NotificationService
import com.betriebsratkanzlei.legalconsenthub_api.model.CommentDto import com.betriebsratkanzlei.gremiumhub_api.model.CommentDto
import com.betriebsratkanzlei.legalconsenthub_api.model.CreateCommentDto import com.betriebsratkanzlei.gremiumhub_api.model.CreateCommentDto
import com.betriebsratkanzlei.legalconsenthub_api.model.CreateNotificationDto import com.betriebsratkanzlei.gremiumhub_api.model.CreateNotificationDto
import com.betriebsratkanzlei.legalconsenthub_api.model.NotificationType import com.betriebsratkanzlei.gremiumhub_api.model.NotificationType
import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.context.ApplicationEventPublisher import org.springframework.context.ApplicationEventPublisher

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.config package com.betriebsratkanzlei.gremiumhub.config
import com.fasterxml.jackson.databind.Module import com.fasterxml.jackson.databind.Module
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.config package com.betriebsratkanzlei.gremiumhub.config
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration

View File

@@ -1,6 +1,6 @@
package com.betriebsratkanzlei.legalconsenthub.config package com.betriebsratkanzlei.gremiumhub.config
import com.betriebsratkanzlei.legalconsenthub.security.CustomJwtAuthenticationConverter import com.betriebsratkanzlei.gremiumhub.security.CustomJwtAuthenticationConverter
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.core.annotation.Order import org.springframework.core.annotation.Order

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.config package com.betriebsratkanzlei.gremiumhub.config
import org.springframework.boot.testcontainers.service.connection.ServiceConnection import org.springframework.boot.testcontainers.service.connection.ServiceConnection
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
@@ -14,11 +14,11 @@ class TestContainersConfig {
@ServiceConnection @ServiceConnection
fun postgresContainer(): PostgreSQLContainer<*> = fun postgresContainer(): PostgreSQLContainer<*> =
PostgreSQLContainer(DockerImageName.parse("postgres:17-alpine")) PostgreSQLContainer(DockerImageName.parse("postgres:17-alpine"))
.withDatabaseName("legalconsenthub") .withDatabaseName("gremiumhub")
.withUsername("legalconsenthub") .withUsername("gremiumhub")
.withPassword("legalconsenthub") .withPassword("gremiumhub")
.withCreateContainerCmdModifier { cmd -> .withCreateContainerCmdModifier { cmd ->
cmd.withName("legalconsenthub-test-${System.currentTimeMillis()}") cmd.withName("gremiumhub-test-${System.currentTimeMillis()}")
// Comment this in to be able to connect to the database, needs to be commented our during tests // Comment this in to be able to connect to the database, needs to be commented our during tests
// cmd.withHostConfig( // cmd.withHostConfig(
// HostConfig().apply { // HostConfig().apply {

View File

@@ -1,8 +1,8 @@
package com.betriebsratkanzlei.legalconsenthub.config package com.betriebsratkanzlei.gremiumhub.config
import com.betriebsratkanzlei.legalconsenthub_api.model.VisibilityConditionNode import com.betriebsratkanzlei.gremiumhub_api.model.VisibilityConditionNode
import com.betriebsratkanzlei.legalconsenthub_api.model.VisibilityConditionOperator import com.betriebsratkanzlei.gremiumhub_api.model.VisibilityConditionOperator
import com.betriebsratkanzlei.legalconsenthub_api.model.VisibilityConditionType import com.betriebsratkanzlei.gremiumhub_api.model.VisibilityConditionType
import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.DeserializationContext

View File

@@ -1,7 +1,7 @@
package com.betriebsratkanzlei.legalconsenthub.contact package com.betriebsratkanzlei.gremiumhub.contact
import com.betriebsratkanzlei.legalconsenthub_api.api.ContactApi import com.betriebsratkanzlei.gremiumhub_api.api.ContactApi
import com.betriebsratkanzlei.legalconsenthub_api.model.ContactMessageDto import com.betriebsratkanzlei.gremiumhub_api.model.ContactMessageDto
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController

View File

@@ -1,7 +1,7 @@
package com.betriebsratkanzlei.legalconsenthub.contact package com.betriebsratkanzlei.gremiumhub.contact
import com.betriebsratkanzlei.legalconsenthub.email.EmailService import com.betriebsratkanzlei.gremiumhub.email.EmailService
import com.betriebsratkanzlei.legalconsenthub.user.UserService import com.betriebsratkanzlei.gremiumhub.user.UserService
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import org.thymeleaf.TemplateEngine import org.thymeleaf.TemplateEngine

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.email package com.betriebsratkanzlei.gremiumhub.email
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.email package com.betriebsratkanzlei.gremiumhub.email
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.email package com.betriebsratkanzlei.gremiumhub.email
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.email package com.betriebsratkanzlei.gremiumhub.email
import java.util.UUID import java.util.UUID

View File

@@ -1,6 +1,6 @@
package com.betriebsratkanzlei.legalconsenthub.email package com.betriebsratkanzlei.gremiumhub.email
import com.betriebsratkanzlei.legalconsenthub.user.UserRepository import com.betriebsratkanzlei.gremiumhub.user.UserRepository
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.context.event.EventListener import org.springframework.context.event.EventListener
import org.springframework.scheduling.annotation.Async import org.springframework.scheduling.annotation.Async

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.email package com.betriebsratkanzlei.gremiumhub.email
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.mail.MailException import org.springframework.mail.MailException
@@ -28,7 +28,7 @@ class EmailService(
helper.setTo(to) helper.setTo(to)
helper.setSubject(subject) helper.setSubject(subject)
helper.setText(body, true) helper.setText(body, true)
helper.setFrom("noreply@legalconsenthub.com") helper.setFrom("noreply@gremiumhub.de")
mailSender.send(message) mailSender.send(message)
logger.info("Email sent successfully to: $to") logger.info("Email sent successfully to: $to")

View File

@@ -1,6 +1,6 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormStatus import com.betriebsratkanzlei.gremiumhub_api.model.ApplicationFormStatus
import java.util.UUID import java.util.UUID
class ApplicationFormInvalidStateException( class ApplicationFormInvalidStateException(

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class ApplicationFormNotCreatedException( class ApplicationFormNotCreatedException(
e: Exception, e: Exception,

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class ApplicationFormNotDeletedException( class ApplicationFormNotDeletedException(
e: Exception, e: Exception,

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class CommentNotCreatedException( class CommentNotCreatedException(
e: Exception, e: Exception,

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class CommentNotDeletedException( class CommentNotDeletedException(
e: Exception, e: Exception,

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import java.util.UUID import java.util.UUID

View File

@@ -1,6 +1,6 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import com.betriebsratkanzlei.legalconsenthub_api.model.ProblemDetails import com.betriebsratkanzlei.gremiumhub_api.model.ProblemDetails
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.http.MediaType import org.springframework.http.MediaType

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class FileStorageException( class FileStorageException(
message: String, message: String,

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class FileTooLargeException( class FileTooLargeException(
message: String, message: String,

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class UnsupportedFileTypeException( class UnsupportedFileTypeException(
message: String, message: String,

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class UserAlreadyExistsException( class UserAlreadyExistsException(
id: String, id: String,

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.error package com.betriebsratkanzlei.gremiumhub.error
class UserNotFoundException( class UserNotFoundException(
id: String, id: String,

View File

@@ -1,12 +1,12 @@
package com.betriebsratkanzlei.legalconsenthub.file package com.betriebsratkanzlei.gremiumhub.file
import com.betriebsratkanzlei.legalconsenthub.error.ApplicationFormNotFoundException import com.betriebsratkanzlei.gremiumhub.error.ApplicationFormNotFoundException
import com.betriebsratkanzlei.legalconsenthub.error.FileNotFoundException import com.betriebsratkanzlei.gremiumhub.error.FileNotFoundException
import com.betriebsratkanzlei.legalconsenthub.error.FileTooLargeException import com.betriebsratkanzlei.gremiumhub.error.FileTooLargeException
import com.betriebsratkanzlei.legalconsenthub.error.UnsupportedFileTypeException import com.betriebsratkanzlei.gremiumhub.error.UnsupportedFileTypeException
import com.betriebsratkanzlei.legalconsenthub_api.api.FileApi import com.betriebsratkanzlei.gremiumhub_api.api.FileApi
import com.betriebsratkanzlei.legalconsenthub_api.model.AssociateFilesWithApplicationFormRequest import com.betriebsratkanzlei.gremiumhub_api.model.AssociateFilesWithApplicationFormRequest
import com.betriebsratkanzlei.legalconsenthub_api.model.UploadedFileDto import com.betriebsratkanzlei.gremiumhub_api.model.UploadedFileDto
import org.springframework.core.io.ByteArrayResource import org.springframework.core.io.ByteArrayResource
import org.springframework.core.io.Resource import org.springframework.core.io.Resource
import org.springframework.http.HttpHeaders import org.springframework.http.HttpHeaders

View File

@@ -1,7 +1,7 @@
package com.betriebsratkanzlei.legalconsenthub.file package com.betriebsratkanzlei.gremiumhub.file
import com.betriebsratkanzlei.legalconsenthub.user.UserMapper import com.betriebsratkanzlei.gremiumhub.user.UserMapper
import com.betriebsratkanzlei.legalconsenthub_api.model.UploadedFileDto import com.betriebsratkanzlei.gremiumhub_api.model.UploadedFileDto
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.Instant import java.time.Instant

View File

@@ -1,4 +1,4 @@
package com.betriebsratkanzlei.legalconsenthub.file package com.betriebsratkanzlei.gremiumhub.file
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query import org.springframework.data.jpa.repository.Query

Some files were not shown because too many files have changed in this diff Show More