4 Commits

508 changed files with 5935 additions and 3552 deletions

View File

@@ -59,7 +59,21 @@
"Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository)", "Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository)",
"Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben)", "Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben)",
"Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity)", "Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity)",
"Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository)" "Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository)",
"Bash(grep -l \"script>\" /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/resources/static/*.html)",
"Bash(./gradlew compileJava -q)",
"Bash(do)",
"Bash(echo \"=== $f ===\")",
"Read(//home/mario/Workspaces/xxx-thegame/.claude/worktrees/agent-a211ce07/**)",
"Bash(./gradlew :xxxthegame:compileJava -q)",
"Bash(uniq done:*)",
"Bash(mv aufgaben.html games/bdsm/)",
"Bash(mv bdsm.html games/bdsm/)",
"Bash(mv bdsm-einladung.html games/bdsm/)",
"Bash(mv bdsmingame.html games/bdsm/)",
"Bash(mv bdsmplayers.html games/bdsm/)",
"Bash(perl -pi -e 's|\\\\.requestMatchers\\\\\\(\"\"/\\\\*\\\\.html\"\"\\\\\\)\\\\.permitAll\\\\\\(\\\\\\)|.requestMatchers\\(\"\"/*.html\"\"\\).permitAll\\(\\)\\\\n .requestMatchers\\(\"\"/**/*.html\"\"\\).permitAll\\(\\)|' /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/config/SecurityConfig.java)",
"Bash(./gradlew compileJava -x test)"
] ]
} }
} }

Submodule .claude/worktrees/agent-a211ce07 added at e262a1b46b

View File

@@ -1,5 +1,5 @@
#Fri Mar 27 07:46:21 CET 2026 #Tue Mar 31 20:02:52 CEST 2026
display=\:0 display=\:0
host=mario-mint host=mario-mint
process-id=5726 process-id=9888
user=mario user=mario

View File

@@ -1172,3 +1172,384 @@ java.lang.NullPointerException: Cannot invoke "org.eclipse.jdt.internal.compiler
at org.eclipse.jdt.internal.ui.util.SelectionUtil.logException(SelectionUtil.java:157) at org.eclipse.jdt.internal.ui.util.SelectionUtil.logException(SelectionUtil.java:157)
at org.eclipse.jdt.internal.ui.text.java.hover.AbstractJavaEditorTextHover.getJavaElementsAt(AbstractJavaEditorTextHover.java:124) at org.eclipse.jdt.internal.ui.text.java.hover.AbstractJavaEditorTextHover.getJavaElementsAt(AbstractJavaEditorTextHover.java:124)
... 14 more ... 14 more
!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-27 12:09:57.934
!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS
!SESSION 2026-03-29 16:28:05.532 -----------------------------------------------
eclipse.buildId=4.39.0.20260305-0817
java.version=21.0.6
java.vendor=Eclipse Adoptium
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE
Framework arguments: -product org.eclipse.epp.package.java.product
Command-line arguments: -os linux -ws gtk -arch x86_64 -clean -product org.eclipse.epp.package.java.product
!ENTRY ch.qos.logback.classic 1 0 2026-03-29 16:28:07.076
!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized.
!ENTRY ch.qos.logback.classic 1 0 2026-03-29 16:28:10.040
!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml
!ENTRY org.eclipse.ui 2 0 2026-03-29 16:28:10.201
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-29 16:28:10.201
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.ui 2 0 2026-03-29 16:28:10.332
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-29 16:28:10.332
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.jface 2 0 2026-03-29 17:27:01.590
!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation.
!SUBENTRY 1 org.eclipse.jface 2 0 2026-03-29 17:27:01.590
!MESSAGE A conflict occurred for CTRL+SHIFT+T:
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.jdt.ui.navigate.open.type,Open Type,
Open a type in a Java editor,
Category(org.eclipse.ui.category.navigate,Navigate,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.jdt.ui.navigate.open.type"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.lsp4e.symbolInWorkspace,Go to Symbol in Workspace,
,
Category(org.eclipse.lsp4e.category,Language Servers,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.lsp4e.symbolInWorkspace"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
!ENTRY org.eclipse.jdt.ui 4 10001 2026-03-29 17:41:39.966
!MESSAGE Internal Error
!STACK 1
Java Model Exception: Error in Java Model (code 969): toMitspielerBdsm(VanillaMitspieler) {key=Lde/oaa/xxx/games/vanilla/VanillaGameDurchfuehren;.toMitspielerBdsm(Lde/oaa/xxx/games/vanilla/VanillaMitspieler;)Lde/oaa/xxx/games/bdsm/BdsmMitspieler;} [in VanillaGameDurchfuehren [in [Working copy] VanillaGameDurchfuehren.java [in de.oaa.xxx.games.vanilla [in src/main/java [in xxxthegame]]]]] does not exist
at org.eclipse.jdt.internal.core.JavaElement.newNotPresentException(JavaElement.java:548)
at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:591)
at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:294)
at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:280)
at org.eclipse.jdt.internal.core.Member.getFlags(Member.java:193)
at org.eclipse.jdt.internal.corext.util.JdtFlags.isPrivate(JdtFlags.java:157)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkSuperImplementationDetector.isOverriddenMethod(JavaElementHyperlinkSuperImplementationDetector.java:57)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkSuperImplementationDetector.addHyperlinks(JavaElementHyperlinkSuperImplementationDetector.java:44)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector.detectHyperlinksCached(JavaElementHyperlinkDetector.java:139)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector.lambda$0(JavaElementHyperlinkDetector.java:84)
at org.eclipse.jdt.internal.core.JavaModelManager.cacheZipFiles(JavaModelManager.java:5709)
at org.eclipse.jdt.internal.core.JavaModelManager.callReadOnly(JavaModelManager.java:5698)
at org.eclipse.jdt.core.JavaCore.callReadOnly(JavaCore.java:6211)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector.detectHyperlinks(JavaElementHyperlinkDetector.java:84)
at org.eclipse.ui.texteditor.HyperlinkDetectorRegistry$HyperlinkDetectorDelegate.detectHyperlinks(HyperlinkDetectorRegistry.java:83)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:294)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:264)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.mouseMove(HyperlinkManager.java:474)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:254)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:5060)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4497)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563)
at org.eclipse.equinox.launcher.Main.run(Main.java:1415)
at org.eclipse.equinox.launcher.Main.main(Main.java:1387)
!SUBENTRY 1 org.eclipse.jdt.core 4 969 2026-03-29 17:41:39.967
!MESSAGE toMitspielerBdsm(VanillaMitspieler) {key=Lde/oaa/xxx/games/vanilla/VanillaGameDurchfuehren;.toMitspielerBdsm(Lde/oaa/xxx/games/vanilla/VanillaMitspieler;)Lde/oaa/xxx/games/bdsm/BdsmMitspieler;} [in VanillaGameDurchfuehren [in [Working copy] VanillaGameDurchfuehren.java [in de.oaa.xxx.games.vanilla [in src/main/java [in xxxthegame]]]]] does not exist
!ENTRY org.eclipse.jdt.ui 4 10001 2026-03-29 17:41:39.968
!MESSAGE Internal Error
!STACK 1
Java Model Exception: Error in Java Model (code 969): toMitspielerBdsm(VanillaMitspieler) {key=Lde/oaa/xxx/games/vanilla/VanillaGameDurchfuehren;.toMitspielerBdsm(Lde/oaa/xxx/games/vanilla/VanillaMitspieler;)Lde/oaa/xxx/games/bdsm/BdsmMitspieler;} [in VanillaGameDurchfuehren [in [Working copy] VanillaGameDurchfuehren.java [in de.oaa.xxx.games.vanilla [in src/main/java [in xxxthegame]]]]] does not exist
at org.eclipse.jdt.internal.core.JavaElement.newNotPresentException(JavaElement.java:548)
at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:591)
at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:294)
at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:280)
at org.eclipse.jdt.internal.core.SourceMethod.getReturnType(SourceMethod.java:223)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkReturnTypeDetector.addHyperlinks(JavaElementHyperlinkReturnTypeDetector.java:43)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector.detectHyperlinksCached(JavaElementHyperlinkDetector.java:139)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector.lambda$0(JavaElementHyperlinkDetector.java:84)
at org.eclipse.jdt.internal.core.JavaModelManager.cacheZipFiles(JavaModelManager.java:5709)
at org.eclipse.jdt.internal.core.JavaModelManager.callReadOnly(JavaModelManager.java:5698)
at org.eclipse.jdt.core.JavaCore.callReadOnly(JavaCore.java:6211)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector.detectHyperlinks(JavaElementHyperlinkDetector.java:84)
at org.eclipse.ui.texteditor.HyperlinkDetectorRegistry$HyperlinkDetectorDelegate.detectHyperlinks(HyperlinkDetectorRegistry.java:83)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:294)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:264)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.mouseMove(HyperlinkManager.java:474)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:254)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5845)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:5060)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4497)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563)
at org.eclipse.equinox.launcher.Main.run(Main.java:1415)
at org.eclipse.equinox.launcher.Main.main(Main.java:1387)
!SUBENTRY 1 org.eclipse.jdt.core 4 969 2026-03-29 17:41:39.969
!MESSAGE toMitspielerBdsm(VanillaMitspieler) {key=Lde/oaa/xxx/games/vanilla/VanillaGameDurchfuehren;.toMitspielerBdsm(Lde/oaa/xxx/games/vanilla/VanillaMitspieler;)Lde/oaa/xxx/games/bdsm/BdsmMitspieler;} [in VanillaGameDurchfuehren [in [Working copy] VanillaGameDurchfuehren.java [in de.oaa.xxx.games.vanilla [in src/main/java [in xxxthegame]]]]] does not exist
!ENTRY org.eclipse.debug.core 4 125 2026-03-29 21:26:35.374
!MESSAGE Error logged from Debug Core:
!STACK 0
java.io.IOException: Stream closed
at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:188)
at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:343)
at java.base/java.io.BufferedInputStream.implRead(BufferedInputStream.java:420)
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:405)
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:95)
at org.eclipse.debug.internal.core.OutputStreamMonitor.internalRead(OutputStreamMonitor.java:235)
at org.eclipse.debug.internal.core.OutputStreamMonitor.read(OutputStreamMonitor.java:211)
at java.base/java.lang.Thread.run(Thread.java:1583)
!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-29 22:58:21.587
!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS
!SESSION 2026-03-30 07:32:31.775 -----------------------------------------------
eclipse.buildId=4.39.0.20260305-0817
java.version=21.0.6
java.vendor=Eclipse Adoptium
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE
Framework arguments: -product org.eclipse.epp.package.java.product
Command-line arguments: -os linux -ws gtk -arch x86_64 -clean -product org.eclipse.epp.package.java.product
!ENTRY ch.qos.logback.classic 1 0 2026-03-30 07:32:34.763
!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized.
!ENTRY ch.qos.logback.classic 1 0 2026-03-30 07:33:02.086
!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml
!ENTRY org.eclipse.ui 2 0 2026-03-30 07:33:02.235
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-30 07:33:02.235
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.ui 2 0 2026-03-30 07:33:02.395
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-30 07:33:02.395
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.jface 2 0 2026-03-30 22:51:45.208
!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation.
!SUBENTRY 1 org.eclipse.jface 2 0 2026-03-30 22:51:45.208
!MESSAGE A conflict occurred for CTRL+SHIFT+T:
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.jdt.ui.navigate.open.type,Open Type,
Open a type in a Java editor,
Category(org.eclipse.ui.category.navigate,Navigate,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.jdt.ui.navigate.open.type"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.lsp4e.symbolInWorkspace,Go to Symbol in Workspace,
,
Category(org.eclipse.lsp4e.category,Language Servers,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.lsp4e.symbolInWorkspace"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-30 22:56:58.269
!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS
!SESSION 2026-03-31 08:24:30.017 -----------------------------------------------
eclipse.buildId=4.39.0.20260305-0817
java.version=21.0.6
java.vendor=Eclipse Adoptium
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE
Framework arguments: -product org.eclipse.epp.package.java.product
Command-line arguments: -os linux -ws gtk -arch x86_64 -clean -product org.eclipse.epp.package.java.product
!ENTRY ch.qos.logback.classic 1 0 2026-03-31 08:24:31.551
!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized.
!ENTRY ch.qos.logback.classic 1 0 2026-03-31 08:24:34.912
!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml
!ENTRY org.eclipse.ui 2 0 2026-03-31 08:24:35.071
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-31 08:24:35.071
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.ui 2 0 2026-03-31 08:24:35.221
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-31 08:24:35.221
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.jface 2 0 2026-03-31 09:50:47.663
!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation.
!SUBENTRY 1 org.eclipse.jface 2 0 2026-03-31 09:50:47.663
!MESSAGE A conflict occurred for CTRL+SHIFT+T:
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.jdt.ui.navigate.open.type,Open Type,
Open a type in a Java editor,
Category(org.eclipse.ui.category.navigate,Navigate,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.jdt.ui.navigate.open.type"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.lsp4e.symbolInWorkspace,Go to Symbol in Workspace,
,
Category(org.eclipse.lsp4e.category,Language Servers,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.lsp4e.symbolInWorkspace"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-31 10:19:59.888
!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS
!SESSION 2026-03-31 11:33:04.112 -----------------------------------------------
eclipse.buildId=4.39.0.20260305-0817
java.version=21.0.6
java.vendor=Eclipse Adoptium
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE
Framework arguments: -product org.eclipse.epp.package.java.product
Command-line arguments: -os linux -ws gtk -arch x86_64 -clean -product org.eclipse.epp.package.java.product
!ENTRY ch.qos.logback.classic 1 0 2026-03-31 11:33:05.636
!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized.
!ENTRY ch.qos.logback.classic 1 0 2026-03-31 11:33:15.062
!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml
!ENTRY org.eclipse.ui 2 0 2026-03-31 11:33:15.221
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-31 11:33:15.221
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.ui 2 0 2026-03-31 11:33:15.366
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-31 11:33:15.366
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.jface 2 0 2026-03-31 11:35:22.321
!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation.
!SUBENTRY 1 org.eclipse.jface 2 0 2026-03-31 11:35:22.321
!MESSAGE A conflict occurred for CTRL+SHIFT+T:
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.jdt.ui.navigate.open.type,Open Type,
Open a type in a Java editor,
Category(org.eclipse.ui.category.navigate,Navigate,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.jdt.ui.navigate.open.type"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.lsp4e.symbolInWorkspace,Go to Symbol in Workspace,
,
Category(org.eclipse.lsp4e.category,Language Servers,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.lsp4e.symbolInWorkspace"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-31 15:25:37.605
!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS
!SESSION 2026-03-31 20:02:49.357 -----------------------------------------------
eclipse.buildId=4.39.0.20260305-0817
java.version=21.0.6
java.vendor=Eclipse Adoptium
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE
Framework arguments: -product org.eclipse.epp.package.java.product
Command-line arguments: -os linux -ws gtk -arch x86_64 -clean -product org.eclipse.epp.package.java.product
!ENTRY ch.qos.logback.classic 1 0 2026-03-31 20:02:50.906
!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized.
!ENTRY ch.qos.logback.classic 1 0 2026-03-31 20:02:53.313
!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml
!ENTRY org.eclipse.ui 2 0 2026-03-31 20:02:53.439
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-31 20:02:53.440
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.ui 2 0 2026-03-31 20:02:53.586
!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points.
!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-31 20:02:53.586
!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory'
!ENTRY org.eclipse.jface 2 0 2026-03-31 20:48:38.922
!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation.
!SUBENTRY 1 org.eclipse.jface 2 0 2026-03-31 20:48:38.922
!MESSAGE A conflict occurred for CTRL+SHIFT+T:
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.jdt.ui.navigate.open.type,Open Type,
Open a type in a Java editor,
Category(org.eclipse.ui.category.navigate,Navigate,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.jdt.ui.navigate.open.type"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
Binding(CTRL+SHIFT+T,
ParameterizedCommand(Command(org.eclipse.lsp4e.symbolInWorkspace,Go to Symbol in Workspace,
,
Category(org.eclipse.lsp4e.category,Language Servers,null,true),
WorkbenchHandlerServiceHandler("org.eclipse.lsp4e.symbolInWorkspace"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
!ENTRY org.eclipse.lsp4e 2 0 2026-03-31 21:38:55.972
!MESSAGE Javadoc unavailable. Failed to obtain it.
!STACK 0
java.lang.InterruptedException
at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:386)
at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096)
at org.eclipse.lsp4e.jdt.LSJavaHoverProvider.getHoverInfo2(LSJavaHoverProvider.java:66)
at org.eclipse.jdt.internal.ui.text.java.hover.BestMatchHover.getHoverInfo2(BestMatchHover.java:165)
at org.eclipse.jdt.internal.ui.text.java.hover.BestMatchHover.getHoverInfo2(BestMatchHover.java:131)
at org.eclipse.jdt.internal.ui.text.java.hover.JavaEditorTextHoverProxy.getHoverInfo2(JavaEditorTextHoverProxy.java:89)
at org.eclipse.jface.text.TextViewerHoverManager$1.run(TextViewerHoverManager.java:155)
!ENTRY org.eclipse.jface 2 0 2026-03-31 22:11:43.432
!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation.
!SUBENTRY 1 org.eclipse.jface 2 0 2026-03-31 22:11:43.432
!MESSAGE A conflict occurred for CTRL+R:
Binding(CTRL+R,
ParameterizedCommand(Command(org.eclipse.debug.ui.commands.RunToLine,Run to Line,
Resume and break when execution reaches the current line,
Category(org.eclipse.debug.ui.category.run,Run/Debug,Run/Debug command category,true),
WorkbenchHandlerServiceHandler("org.eclipse.debug.ui.commands.RunToLine"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.debug.ui.debugging,,,system)
Binding(CTRL+R,
ParameterizedCommand(Command(org.springframework.ide.eclipse.boot.restart.commands.restart,Trigger Restart,
Restart Spring Boot Application,
Category(org.eclipse.debug.ui.category.run,Run/Debug,Run/Debug command category,true),
WorkbenchHandlerServiceHandler("org.springframework.ide.eclipse.boot.restart.commands.restart"),
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.debug.ui.console,,,system)

View File

@@ -1,7 +1,7 @@
[ { [ {
"version" : "9.5.0-20260326015913+0000", "version" : "9.5.0-20260331054436+0000",
"buildTime" : "20260326015913+0000", "buildTime" : "20260331054436+0000",
"commitId" : "b62b56136fe3f28a01c3e35f77694c3d5af75916", "commitId" : "04cdc7917382feb3229f13b035ea48f106ad01f1",
"current" : false, "current" : false,
"snapshot" : true, "snapshot" : true,
"nightly" : false, "nightly" : false,
@@ -10,15 +10,15 @@
"rcFor" : "", "rcFor" : "",
"milestoneFor" : "", "milestoneFor" : "",
"broken" : false, "broken" : false,
"downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260326015913+0000-bin.zip", "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260331054436+0000-bin.zip",
"checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260326015913+0000-bin.zip.sha256", "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260331054436+0000-bin.zip.sha256",
"checksum" : "ace6a98f3a565a82cd108c6a115f64837cd5bb8e95d563c6e2dfb884ea3a8fe5", "checksum" : "4ab20ff318524006769da0e39fa7cf8f355a5ca54ea213dd2edadd9019d95649",
"wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260326015913+0000-wrapper.jar.sha256", "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260331054436+0000-wrapper.jar.sha256",
"wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7" "wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7"
}, { }, {
"version" : "9.6.0-20260326003843+0000", "version" : "9.6.0-20260331012943+0000",
"buildTime" : "20260326003843+0000", "buildTime" : "20260331012943+0000",
"commitId" : "f6b5714b236ea05298517d966a339045da81a5ee", "commitId" : "6921c9df28f41760c3a348e57a9bf332d093742e",
"current" : false, "current" : false,
"snapshot" : true, "snapshot" : true,
"nightly" : true, "nightly" : true,
@@ -27,11 +27,28 @@
"rcFor" : "", "rcFor" : "",
"milestoneFor" : "", "milestoneFor" : "",
"broken" : false, "broken" : false,
"downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260326003843+0000-bin.zip", "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260331012943+0000-bin.zip",
"checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260326003843+0000-bin.zip.sha256", "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260331012943+0000-bin.zip.sha256",
"checksum" : "9d70bda347d4cdbc4fc8ce8550d53ce5d1b2add847f4720e8543ff6c74c322b8", "checksum" : "83f35f9ee38851b1835842ba93b9846fc43be77792c2cae138570c5f262039e0",
"wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260326003843+0000-wrapper.jar.sha256", "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260331012943+0000-wrapper.jar.sha256",
"wrapperChecksum" : "f307680272dffdb8e636f1169adfbf693513005c80aa06e8d381f20390a06e6a" "wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7"
}, {
"version" : "9.5.0-rc-1",
"buildTime" : "20260330120715+0000",
"commitId" : "6a1704c113de068f7e9a6744245c7eb4bc5091d0",
"current" : false,
"snapshot" : false,
"nightly" : false,
"releaseNightly" : false,
"activeRc" : true,
"rcFor" : "9.5.0",
"milestoneFor" : "",
"broken" : false,
"downloadUrl" : "https://services.gradle.org/distributions/gradle-9.5.0-rc-1-bin.zip",
"checksumUrl" : "https://services.gradle.org/distributions/gradle-9.5.0-rc-1-bin.zip.sha256",
"checksum" : "66d79b10eb939c954bf1ac3be9d9cde985301b56058d49542286c35782ae1e74",
"wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-9.5.0-rc-1-wrapper.jar.sha256",
"wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7"
}, { }, {
"version" : "9.4.1", "version" : "9.4.1",
"buildTime" : "20260319084628+0000", "buildTime" : "20260319084628+0000",

File diff suppressed because one or more lines are too long

View File

@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<typeInfoHistroy> <typeInfoHistroy>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.aufgaben{DefaultFiller.java[DefaultFiller" modifiers="1" timestamp="1772437686926"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.user{UserRepository.java[UserRepository" modifiers="513" timestamp="1774814915722"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.aufgaben.controller{FillerController.java[FillerController" modifiers="1" timestamp="1772385528555"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.ttlock{TTLockUserConfigEntity.java[TTLockUserConfigEntity" modifiers="1" timestamp="1774814915717"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.user{UserRepository.java[UserRepository" modifiers="513" timestamp="1774016609131"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.keyholder{KeyholderNotificationEntity.java[KeyholderNotificationEntity" modifiers="1" timestamp="1774814915717"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.ttlock{TTLockUserConfigEntity.java[TTLockUserConfigEntity" modifiers="1" timestamp="1774425822887"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.cardlock{CardLockEntity.java[CardLockEntity" modifiers="1" timestamp="1774814915718"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.keyholder{KeyholderNotificationEntity.java[KeyholderNotificationEntity" modifiers="1" timestamp="1774386563354"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.user{UserController.java[UserController" modifiers="1" timestamp="1774814915722"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.cardlock{CardLockEntity.java[CardLockEntity" modifiers="1" timestamp="1774171624571"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.ttlock{TTLockService.java[TTLockService" modifiers="1" timestamp="1774814915716"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.user{UserController.java[UserController" modifiers="1" timestamp="1774551025161"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.timelock{TimeLockController.java[TimeLockController" modifiers="1" timestamp="1774900567883"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.ttlock{TTLockService.java[TTLockService" modifiers="1" timestamp="1774375173709"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.common{BaseLockService.java[BaseLockService" modifiers="1025" timestamp="1774814915716"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.timelock{TimeLockController.java[TimeLockController" modifiers="1" timestamp="1774558039992"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.ttlock{TTLockCallback.java[TTLockCallback" modifiers="1" timestamp="1774814915716"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.common{BaseLockService.java[BaseLockService" modifiers="1025" timestamp="1774551269600"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.lockcontroll{TTLockControl.java[TTLockControl" modifiers="1" timestamp="1774814915717"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.ttlock{TTLockCallback.java[TTLockCallback" modifiers="1" timestamp="1774387007874"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.cardlock{CardLockController.java[CardLockController" modifiers="1" timestamp="1774903113531"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.lockcontroll{TTLockControl.java[TTLockControl" modifiers="1" timestamp="1774383035013"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.common{BaseLockEntity.java[BaseLockEntity" modifiers="1" timestamp="1774814915716"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.cardlock{CardLockController.java[CardLockController" modifiers="1" timestamp="1774550581083"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.cardlock{CardLockService.java[CardLockService" modifiers="1" timestamp="1774814915718"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.common{BaseLockEntity.java[BaseLockEntity" modifiers="1" timestamp="1774476260239"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.timelock{TimeLockService.java[TimeLockService" modifiers="1" timestamp="1774814915716"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.cardlock{CardLockService.java[CardLockService" modifiers="1" timestamp="1774551407143"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.common.aufgaben{Aufgabe.java[Aufgabe" modifiers="1" timestamp="1774814915721"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.chastity.timelock{TimeLockService.java[TimeLockService" modifiers="1" timestamp="1774551447849"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.games.common.aufgaben{DefaultFiller.java[DefaultFiller" modifiers="1" timestamp="1774814915721"/>
<typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.aufgaben.controller{AboController.java[AboController" modifiers="1" timestamp="1773400404000"/> <typeInfo handle="=xxxthegame/src\/main\/java=/gradle_scope=/main=/=/gradle_used_by_scope=/main,test=/&lt;de.oaa.xxx.mail{MailService.java[MailService" modifiers="1" timestamp="1774814915713"/>
</typeInfoHistroy> </typeInfoHistroy>

View File

@@ -32,4 +32,7 @@
<fullyQualifiedTypeName name="de.oaa.xxx.games.chastity.cardlock.CumCard"/> <fullyQualifiedTypeName name="de.oaa.xxx.games.chastity.cardlock.CumCard"/>
<fullyQualifiedTypeName name="de.oaa.xxx.games.chastity.cardlock.CumInCageCard"/> <fullyQualifiedTypeName name="de.oaa.xxx.games.chastity.cardlock.CumInCageCard"/>
<fullyQualifiedTypeName name="de.oaa.xxx.games.chastity.unlock.TempOpeningReason"/> <fullyQualifiedTypeName name="de.oaa.xxx.games.chastity.unlock.TempOpeningReason"/>
<fullyQualifiedTypeName name="de.oaa.xxx.games.vanilla.VanillaMitspieler"/>
<fullyQualifiedTypeName name="de.oaa.xxx.games.common.aufgaben.CommonMitspieler"/>
<fullyQualifiedTypeName name="java.util.Comparator"/>
</qualifiedTypeNameHistroy> </qualifiedTypeNameHistroy>

View File

@@ -65,6 +65,7 @@
<item key="updateTextualMatches" value="false"/> <item key="updateTextualMatches" value="false"/>
<item key="updateQualifiedNames" value="false"/> <item key="updateQualifiedNames" value="false"/>
<item key="patterns" value="*"/> <item key="patterns" value="*"/>
<item key="renameSubpackages" value="false"/>
</section> </section>
<section name="org.eclipse.jdt.internal.ui.typehierarchy.QuickHierarchy"> <section name="org.eclipse.jdt.internal.ui.typehierarchy.QuickHierarchy">
<item key="org.eclipse.jdt.internal.ui.typehierarchy.HierarchyInformationControlDIALOG_WIDTH" value="400"/> <item key="org.eclipse.jdt.internal.ui.typehierarchy.HierarchyInformationControlDIALOG_WIDTH" value="400"/>
@@ -76,4 +77,11 @@
<item key="width" value="600"/> <item key="width" value="600"/>
<item key="height" value="400"/> <item key="height" value="400"/>
</section> </section>
<section name="NewInterfaceCreationWizard.dialogBounds">
<item key="DIALOG_X_ORIGIN" value="974"/>
<item key="DIALOG_Y_ORIGIN" value="312"/>
<item key="DIALOG_WIDTH" value="613"/>
<item key="DIALOG_HEIGHT" value="559"/>
<item key="DIALOG_FONT_NAME" value="1|Ubuntu|10.0|0|GTK|1|"/>
</section>
</section> </section>

View File

@@ -14,3 +14,8 @@
2026-03-26 11:31:40,355 [Worker-8: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. 2026-03-26 11:31:40,355 [Worker-8: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read.
2026-03-26 16:50:11,098 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. 2026-03-26 16:50:11,098 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read.
2026-03-27 07:46:24,300 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. 2026-03-27 07:46:24,300 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read.
2026-03-29 16:28:13,219 [Worker-2: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is out-of-date. Trying to update.
2026-03-30 07:33:05,316 [Worker-5: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read.
2026-03-31 08:24:38,073 [Worker-1: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is out-of-date. Trying to update.
2026-03-31 11:33:17,509 [Worker-8: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read.
2026-03-31 20:02:56,538 [Worker-2: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read.

View File

@@ -1,3 +1,3 @@
#Fri Mar 27 07:46:21 CET 2026 #Tue Mar 31 20:02:52 CEST 2026
org.eclipse.core.runtime=2 org.eclipse.core.runtime=2
org.eclipse.platform=4.39.0.v20260226-0420 org.eclipse.platform=4.39.0.v20260226-0420

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

BIN
bilder/dunno.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
bilder/negative.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
bilder/neutral.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
bilder/positiv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
bilder/verynegative.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
bilder/verypositiv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

21
xxxsphere/deploy.sh Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
# Konfiguration
REMOTE_CONTEXT="proxmox-remote"
IMAGE_NAME="xxx-sphere"
TAG="latest"
echo "--- 1. Gradle Build: Erstelle Docker Image lokal ---"
# Dieser Befehl baut die Jar UND das Docker Image direkt in deinem lokalen Docker
./gradlew bootBuildImage --imageName=$IMAGE_NAME:$TAG
echo "--- 2. Transfer: Image zum Proxmox-Server schieben ---"
# Wir 'pipen' das Image direkt über SSH auf den Zielserver
docker save $IMAGE_NAME:$TAG | docker --context $REMOTE_CONTEXT load
echo "--- 3. Remote Deployment: Starten auf Proxmox ---"
# Wir führen Docker Compose direkt im Remote-Kontext aus
# --force-recreate stellt sicher, dass die App mit dem neuen Image neu startet
docker --context $REMOTE_CONTEXT compose up -d --force-recreate
echo "--- Fertig! Die App läuft auf dem Proxmox-Server ---"

View File

@@ -0,0 +1,32 @@
services:
db:
image: mysql:8.0
container_name: mysql-db
restart: always
environment:
MYSQL_DATABASE: xxx_sphere
MYSQL_ROOT_PASSWORD: xxxsphere123!
ports:
- "3306:3306" # <--- Jetzt steht es korrekt alleine!
volumes:
# Format: [Pfad auf dem Proxmox-Host]:[Pfad im Container]
- /mnt/pve_nas/.mysql_data:/var/lib/mysql
app:
image: xxx-sphere:latest
container_name: spring-boot-app
depends_on:
- db
ports:
- "8080:8080"
environment:
# Wir biegen localhost auf den Service-Namen 'db' um
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xxx_sphere?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
# Hier injizieren wir die Werte für deine Platzhalter
- DB_USER=root
- DB_PASSWORD=xxxsphere123!
# Wartet kurz, bis die DB wirklich bereit ist (optional, aber empfohlen)
restart: on-failure
volumes:
mysql_data:

View File

@@ -46,6 +46,7 @@ import de.oaa.xxx.subscription.UserSubscriptionEntity;
import de.oaa.xxx.subscription.UserSubscriptionRepository; import de.oaa.xxx.subscription.UserSubscriptionRepository;
import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserEntity;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserRepository;
import de.oaa.xxx.user.UserService;
@RestController @RestController
@RequestMapping("/admin") @RequestMapping("/admin")
@@ -54,6 +55,7 @@ public class AdminController {
private final AdminRepository adminRepository; private final AdminRepository adminRepository;
private final UserRepository userRepository; private final UserRepository userRepository;
private final UserService userService;
private final MeldungRepository meldungRepository; private final MeldungRepository meldungRepository;
private final FeedbackRepository feedbackRepository; private final FeedbackRepository feedbackRepository;
private final SupportUserService supportUserService; private final SupportUserService supportUserService;
@@ -68,6 +70,7 @@ public class AdminController {
private final UserSubscriptionRepository userSubscriptionRepository; private final UserSubscriptionRepository userSubscriptionRepository;
public AdminController(AdminRepository adminRepository, UserRepository userRepository, public AdminController(AdminRepository adminRepository, UserRepository userRepository,
UserService userService,
MeldungRepository meldungRepository, MeldungRepository meldungRepository,
FeedbackRepository feedbackRepository, FeedbackRepository feedbackRepository,
SupportUserService supportUserService, SupportUserService supportUserService,
@@ -82,6 +85,7 @@ public class AdminController {
UserSubscriptionRepository userSubscriptionRepository) { UserSubscriptionRepository userSubscriptionRepository) {
this.adminRepository = adminRepository; this.adminRepository = adminRepository;
this.userRepository = userRepository; this.userRepository = userRepository;
this.userService = userService;
this.meldungRepository = meldungRepository; this.meldungRepository = meldungRepository;
this.feedbackRepository = feedbackRepository; this.feedbackRepository = feedbackRepository;
this.supportUserService = supportUserService; this.supportUserService = supportUserService;
@@ -129,7 +133,7 @@ public class AdminController {
// Hilfsmethoden // Hilfsmethoden
private AdminEntity requireAdmin(Principal principal) { private AdminEntity requireAdmin(Principal principal) {
var user = userRepository.findByEmail(principal.getName()).orElseThrow(); var user = userService.requireUser(principal);
return adminRepository.findByUserId(user.getUserId()) return adminRepository.findByUserId(user.getUserId())
.orElseThrow(() -> new org.springframework.web.server.ResponseStatusException( .orElseThrow(() -> new org.springframework.web.server.ResponseStatusException(
org.springframework.http.HttpStatus.FORBIDDEN, "Kein Admin")); org.springframework.http.HttpStatus.FORBIDDEN, "Kein Admin"));
@@ -160,8 +164,7 @@ public class AdminController {
@GetMapping("/me") @GetMapping("/me")
public ResponseEntity<AdminDto> me(Principal principal) { public ResponseEntity<AdminDto> me(Principal principal) {
var user = userRepository.findByEmail(principal.getName()).orElse(null); var user = userService.requireUser(principal);
if (user == null) return ResponseEntity.status(403).build();
return adminRepository.findByUserId(user.getUserId()) return adminRepository.findByUserId(user.getUserId())
.map(a -> ResponseEntity.ok(toDto(a))) .map(a -> ResponseEntity.ok(toDto(a)))
.orElse(ResponseEntity.status(403).build()); .orElse(ResponseEntity.status(403).build());
@@ -185,7 +188,7 @@ public class AdminController {
@RequestBody StatusRequest body, @RequestBody StatusRequest body,
Principal principal) { Principal principal) {
requireAdmin(principal); requireAdmin(principal);
var user = userRepository.findByEmail(principal.getName()).orElseThrow(); var user = userService.requireUser(principal);
MeldungEntity meldung = meldungRepository.findById(id) MeldungEntity meldung = meldungRepository.findById(id)
.orElseThrow(() -> new org.springframework.web.server.ResponseStatusException( .orElseThrow(() -> new org.springframework.web.server.ResponseStatusException(
org.springframework.http.HttpStatus.NOT_FOUND)); org.springframework.http.HttpStatus.NOT_FOUND));
@@ -251,6 +254,40 @@ public class AdminController {
return ResponseEntity.noContent().build(); return ResponseEntity.noContent().build();
} }
// Item verschieben
@PutMapping("/aufgabengruppen/items/{kind}/{itemId}/move")
public ResponseEntity<Void> moveItem(
@PathVariable("kind") String kind,
@PathVariable("itemId") UUID itemId,
@RequestParam("targetGruppeId") UUID targetGruppeId,
Principal principal) {
requireAdmin(principal);
AufgabenGruppeEntity targetGruppe = aufgabenGruppeRepository.findById(targetGruppeId)
.orElseThrow(() -> new org.springframework.web.server.ResponseStatusException(
org.springframework.http.HttpStatus.NOT_FOUND, "Zielgruppe nicht gefunden"));
switch (kind) {
case "aufgabe" -> aufgabeRepository.findById(itemId).ifPresent(e -> {
e.setAufgabenGruppe(targetGruppe);
aufgabeRepository.save(e);
});
case "strafe" -> strafeRepository.findById(itemId).ifPresent(e -> {
e.setAufgabenGruppe(targetGruppe);
strafeRepository.save(e);
});
case "zeitstrafe" -> sperreRepository.findById(itemId).ifPresent(e -> {
e.setAufgabenGruppe(targetGruppe);
sperreRepository.save(e);
});
case "finisher" -> finisherRepository.findById(itemId).ifPresent(e -> {
e.setAufgabenGruppe(targetGruppe);
finisherRepository.save(e);
});
default -> { return ResponseEntity.badRequest().build(); }
}
return ResponseEntity.noContent().build();
}
// Toys // Toys
@GetMapping("/toys") @GetMapping("/toys")
@@ -357,7 +394,7 @@ public class AdminController {
@DeleteMapping("/admins/{id}") @DeleteMapping("/admins/{id}")
public ResponseEntity<Void> deleteAdmin(@PathVariable("id") UUID id, Principal principal) { public ResponseEntity<Void> deleteAdmin(@PathVariable("id") UUID id, Principal principal) {
var requestingUser = userRepository.findByEmail(principal.getName()).orElseThrow(); var requestingUser = userService.requireUser(principal);
requireSuperAdmin(principal); requireSuperAdmin(principal);
AdminEntity entity = adminRepository.findById(id) AdminEntity entity = adminRepository.findById(id)
.orElseThrow(() -> new org.springframework.web.server.ResponseStatusException( .orElseThrow(() -> new org.springframework.web.server.ResponseStatusException(

View File

@@ -37,47 +37,46 @@ public class SecurityConfig {
.requestMatchers("/error").permitAll() .requestMatchers("/error").permitAll()
.requestMatchers("/api").permitAll() .requestMatchers("/api").permitAll()
.requestMatchers("/userhome.html").authenticated() .requestMatchers("/userhome.html").authenticated()
.requestMatchers("/toys.html").authenticated() .requestMatchers("/games/chastity/toys.html").authenticated()
.requestMatchers("/aufgaben.html").authenticated() .requestMatchers("/games/bdsm/aufgaben.html").authenticated()
.requestMatchers("/entdecken.html").authenticated() .requestMatchers("/games/chastity/entdecken.html").authenticated()
.requestMatchers("/profile.html").authenticated() .requestMatchers("/konto/profile.html").authenticated()
.requestMatchers("/infovanilla.html").authenticated() .requestMatchers("/games/vanilla/infovanilla.html").authenticated()
.requestMatchers("/infobdsm.html").authenticated() .requestMatchers("/games/bdsm/infobdsm.html").authenticated()
.requestMatchers("/infochastity.html").authenticated() .requestMatchers("/games/chastity/infochastity.html").authenticated()
.requestMatchers("/sessionvanilla.html").authenticated() .requestMatchers("/games/vanilla/sessionvanilla.html").authenticated()
.requestMatchers("/sessionbdsm.html").authenticated() .requestMatchers("/sessionbdsm.html").authenticated()
.requestMatchers("/sessionchastity.html").authenticated() .requestMatchers("/games/chastity/sessionchastity.html").authenticated()
.requestMatchers("/neulock.html").authenticated() .requestMatchers("/games/chastity/neulock.html").authenticated()
.requestMatchers("/activelock.html").authenticated() .requestMatchers("/games/chastity/activelock.html").authenticated()
.requestMatchers("/sessionbdsmtasks.html").authenticated()
.requestMatchers("/sessionbdsmtoys.html").authenticated() .requestMatchers("/sessionbdsmtoys.html").authenticated()
.requestMatchers("/sessionbdsmingame.html").authenticated() .requestMatchers("/sessionbdsmingame.html").authenticated()
.requestMatchers("/neubdsm.html").authenticated() .requestMatchers("/games/bdsm/neubdsm.html").authenticated()
.requestMatchers("/bdsmingame.html").authenticated() .requestMatchers("/games/bdsm/bdsmingame.html").authenticated()
.requestMatchers("/bdsmwarten.html").authenticated() .requestMatchers("/community/personen-suchen.html").authenticated()
.requestMatchers("/personen-suchen.html").authenticated() .requestMatchers("/community/freunde.html").authenticated()
.requestMatchers("/freunde.html").authenticated() .requestMatchers("/community/nachrichten.html").authenticated()
.requestMatchers("/nachrichten.html").authenticated() .requestMatchers("/community/benutzer.html").authenticated()
.requestMatchers("/benutzer.html").authenticated() .requestMatchers("/community/gruppen.html").authenticated()
.requestMatchers("/gruppen.html").authenticated() .requestMatchers("/community/gruppe.html").authenticated()
.requestMatchers("/gruppe.html").authenticated() .requestMatchers("/community/feed.html").authenticated()
.requestMatchers("/feed.html").authenticated() .requestMatchers("/admin/admin.html").authenticated()
.requestMatchers("/admin.html").authenticated() .requestMatchers("/games/chastity/communityvotes.html").authenticated()
.requestMatchers("/communityvotes.html").authenticated() .requestMatchers("/games/chastity/keyholder.html").authenticated()
.requestMatchers("/keyholder.html").authenticated() .requestMatchers("/games/chastity/keyholder-finden.html").authenticated()
.requestMatchers("/keyholder-finden.html").authenticated() .requestMatchers("/games/chastity/meine-locks.html").authenticated()
.requestMatchers("/meine-locks.html").authenticated() .requestMatchers("/games/chastity/entdecken-vorlagen.html").authenticated()
.requestMatchers("/entdecken-vorlagen.html").authenticated() .requestMatchers("/games/chastity/unlock-history.html").authenticated()
.requestMatchers("/unlock-history.html").authenticated() .requestMatchers("/games/common/einladungen.html").authenticated()
.requestMatchers("/einladungen.html").authenticated() .requestMatchers("/games/chastity/joinlock.html").authenticated()
.requestMatchers("/joinlock.html").authenticated() .requestMatchers("/community/benachrichtigungen.html").authenticated()
.requestMatchers("/benachrichtigungen.html").authenticated() .requestMatchers("/community/abonnements.html").authenticated()
.requestMatchers("/abonnements.html").authenticated()
.requestMatchers("/gruppen/**").authenticated() .requestMatchers("/gruppen/**").authenticated()
.requestMatchers("/feed/**").authenticated() .requestMatchers("/feed/**").authenticated()
.requestMatchers("/notifications/**").authenticated() .requestMatchers("/notifications/**").authenticated()
.requestMatchers("/events/**").authenticated() .requestMatchers("/events/**").authenticated()
.requestMatchers("/*.html").permitAll() .requestMatchers("/*.html").permitAll()
.requestMatchers("/**/*.html").permitAll()
.requestMatchers("/help/*.html").permitAll() .requestMatchers("/help/*.html").permitAll()
.requestMatchers("/css/**").permitAll() .requestMatchers("/css/**").permitAll()
.requestMatchers("/js/**").permitAll() .requestMatchers("/js/**").permitAll()

View File

@@ -17,12 +17,14 @@ import org.springframework.web.bind.annotation.*;
import java.io.IOException; import java.io.IOException;
import java.security.Principal; import java.security.Principal;
import java.util.UUID; import java.util.UUID;
import java.util.regex.Pattern;
@RestController @RestController
@RequestMapping("/email-change") @RequestMapping("/email-change")
public class EmailChangeController { public class EmailChangeController {
private static final Logger LOGGER = LoggerFactory.getLogger(EmailChangeController.class); private static final Logger LOGGER = LoggerFactory.getLogger(EmailChangeController.class);
private static final Pattern EMAIL_PATTERN = Pattern.compile("^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$");
@Value("${app.base-url:http://localhost:8080}") @Value("${app.base-url:http://localhost:8080}")
private String baseUrl; private String baseUrl;
@@ -52,6 +54,10 @@ public class EmailChangeController {
String currentEmail = principal.getName(); String currentEmail = principal.getName();
String newEmail = request.newEmail(); String newEmail = request.newEmail();
if (newEmail == null || newEmail.isBlank() || !EMAIL_PATTERN.matcher(newEmail).matches()) {
return ResponseEntity.badRequest().build();
}
if (userRepository.findByEmail(newEmail).isPresent() if (userRepository.findByEmail(newEmail).isPresent()
|| registrationRepository.findByEmail(newEmail).isPresent()) { || registrationRepository.findByEmail(newEmail).isPresent()) {
return ResponseEntity.status(409).build(); return ResponseEntity.status(409).build();

View File

@@ -23,7 +23,6 @@ import org.springframework.web.bind.annotation.RestController;
import de.oaa.xxx.feed.dto.FeedItemDto; import de.oaa.xxx.feed.dto.FeedItemDto;
import de.oaa.xxx.feed.dto.FeedPostRequest; import de.oaa.xxx.feed.dto.FeedPostRequest;
import de.oaa.xxx.feed.entity.FeedPostEntity; import de.oaa.xxx.feed.entity.FeedPostEntity;
import de.oaa.xxx.feed.entity.FeedPostLikeEntity;
import de.oaa.xxx.feed.entity.FeedPostOptionEntity; import de.oaa.xxx.feed.entity.FeedPostOptionEntity;
import de.oaa.xxx.feed.entity.FeedPostVoteEntity; import de.oaa.xxx.feed.entity.FeedPostVoteEntity;
import de.oaa.xxx.feed.repository.FeedPostLikeRepository; import de.oaa.xxx.feed.repository.FeedPostLikeRepository;
@@ -40,11 +39,13 @@ import de.oaa.xxx.gruppe.repository.GruppenbeitragRepository;
import de.oaa.xxx.gruppe.repository.GruppenmitgliedRepository; import de.oaa.xxx.gruppe.repository.GruppenmitgliedRepository;
import de.oaa.xxx.gruppe.repository.UmfrageOptionRepository; import de.oaa.xxx.gruppe.repository.UmfrageOptionRepository;
import de.oaa.xxx.gruppe.repository.UmfrageStimmeRepository; import de.oaa.xxx.gruppe.repository.UmfrageStimmeRepository;
import de.oaa.xxx.social.LikeService;
import de.oaa.xxx.social.entity.FriendshipEntity; import de.oaa.xxx.social.entity.FriendshipEntity;
import de.oaa.xxx.social.repository.FriendshipRepository; import de.oaa.xxx.social.repository.FriendshipRepository;
import de.oaa.xxx.social.repository.KommentarRepository; import de.oaa.xxx.social.repository.KommentarRepository;
import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserEntity;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserRepository;
import de.oaa.xxx.user.UserService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -68,6 +69,8 @@ public class FeedController {
private final GruppeRepository gruppeRepository; private final GruppeRepository gruppeRepository;
private final KommentarRepository kommentarRepository; private final KommentarRepository kommentarRepository;
private final UserRepository userRepository; private final UserRepository userRepository;
private final UserService userService;
private final LikeService likeService;
public FeedController(FeedPostRepository feedPostRepository, public FeedController(FeedPostRepository feedPostRepository,
FeedPostLikeRepository feedPostLikeRepository, FeedPostLikeRepository feedPostLikeRepository,
@@ -81,7 +84,9 @@ public class FeedController {
GruppenbeitragLikeRepository gruppenbeitragLikeRepository, GruppenbeitragLikeRepository gruppenbeitragLikeRepository,
GruppeRepository gruppeRepository, GruppeRepository gruppeRepository,
KommentarRepository kommentarRepository, KommentarRepository kommentarRepository,
UserRepository userRepository) { UserRepository userRepository,
UserService userService,
LikeService likeService) {
this.feedPostRepository = feedPostRepository; this.feedPostRepository = feedPostRepository;
this.feedPostLikeRepository = feedPostLikeRepository; this.feedPostLikeRepository = feedPostLikeRepository;
this.feedPostOptionRepository = feedPostOptionRepository; this.feedPostOptionRepository = feedPostOptionRepository;
@@ -95,6 +100,8 @@ public class FeedController {
this.gruppeRepository = gruppeRepository; this.gruppeRepository = gruppeRepository;
this.kommentarRepository = kommentarRepository; this.kommentarRepository = kommentarRepository;
this.userRepository = userRepository; this.userRepository = userRepository;
this.userService = userService;
this.likeService = likeService;
} }
record FeedPage(List<FeedItemDto> posts, boolean hasMore) {} record FeedPage(List<FeedItemDto> posts, boolean hasMore) {}
@@ -253,19 +260,7 @@ public class FeedController {
if (myId == null) return ResponseEntity.status(401).build(); if (myId == null) return ResponseEntity.status(401).build();
if (feedPostRepository.findById(id).isEmpty()) return ResponseEntity.notFound().build(); if (feedPostRepository.findById(id).isEmpty()) return ResponseEntity.notFound().build();
var existing = feedPostLikeRepository.findByPostIdAndUserId(id, myId); likeService.toggleFeedPostLike(id, myId);
if (existing.isPresent()) {
feedPostLikeRepository.delete(existing.get());
LOGGER.debug("User {} hat Like auf Feed-Post {} entfernt", myId, id);
} else {
FeedPostLikeEntity like = new FeedPostLikeEntity();
like.setLikeId(UUID.randomUUID());
like.setPostId(id);
like.setUserId(myId);
like.setLikedAt(LocalDateTime.now());
feedPostLikeRepository.save(like);
LOGGER.debug("User {} hat Feed-Post {} geliked", myId, id);
}
return ResponseEntity.ok().build(); return ResponseEntity.ok().build();
} }
@@ -337,9 +332,7 @@ public class FeedController {
private UUID resolveMyId(Principal principal) { private UUID resolveMyId(Principal principal) {
if (principal == null) return null; if (principal == null) return null;
return userRepository.findByEmail(principal.getName()) return userService.requireUser(principal).getUserId();
.map(UserEntity::getUserId)
.orElse(null);
} }
private FeedItemDto toFeedItemDtoFromPost(FeedPostEntity p, UUID myId) { private FeedItemDto toFeedItemDtoFromPost(FeedPostEntity p, UUID myId) {

View File

@@ -13,7 +13,7 @@ import lombok.Setter;
public class AktiveSperre { public class AktiveSperre {
private UUID aktiveSperreId; private UUID aktiveSperreId;
private Mitspieler mitspieler; private BdsmMitspieler mitspieler;
private Integer minuten; private Integer minuten;
private LocalDateTime startzeit; private LocalDateTime startzeit;
private LocalDateTime endzeit; private LocalDateTime endzeit;

View File

@@ -19,7 +19,7 @@ import de.oaa.xxx.games.bdsm.sperre.SperrenVerlaengernCallback;
public class BdsmGameDurchfuehren { public class BdsmGameDurchfuehren {
private final AufgabenList aufgabenList; private final AufgabenList aufgabenList;
private final List<Mitspieler> mitspieler = new ArrayList<>(); private final List<BdsmMitspieler> mitspieler = new ArrayList<>();
private final List<AktiveSperre> aktiveSperren = new ArrayList<>(); private final List<AktiveSperre> aktiveSperren = new ArrayList<>();
private final Integer wahrscheinlichkeitSperre; private final Integer wahrscheinlichkeitSperre;
@@ -74,8 +74,8 @@ public class BdsmGameDurchfuehren {
} }
// Echtes Fallback: nur wenn wirklich keine Kategorie eine Aufgabe liefert // Echtes Fallback: nur wenn wirklich keine Kategorie eine Aufgabe liefert
Mitspieler aktiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_AKTIV); BdsmMitspieler aktiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_AKTIV);
Mitspieler passiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_PASSIV, aktiv); BdsmMitspieler passiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_PASSIV, aktiv);
String text = "Ups, da ist etwas schief gelaufen. Keine potenzielle Aufgabe gefunden. Entweder seid ihr inzwischen so gut weggesperrt, dass wirklich keine Aufgaben mehr zur Verfügung stehen, oder uns ist ein Fehler unterlaufen. {AKTIV} und {PASSIV} überbrücken die Zeit mit ein wenig Petting."; String text = "Ups, da ist etwas schief gelaufen. Keine potenzielle Aufgabe gefunden. Entweder seid ihr inzwischen so gut weggesperrt, dass wirklich keine Aufgaben mehr zur Verfügung stehen, oder uns ist ein Fehler unterlaufen. {AKTIV} und {PASSIV} überbrücken die Zeit mit ein wenig Petting.";
AufgabeAnzeige anzeige = new AufgabeAnzeige(); AufgabeAnzeige anzeige = new AufgabeAnzeige();
anzeige.setNameAktiverMitspieler(aktiv != null ? aktiv.getName() : ""); anzeige.setNameAktiverMitspieler(aktiv != null ? aktiv.getName() : "");
@@ -124,7 +124,7 @@ public class BdsmGameDurchfuehren {
} }
} }
private void setMitspielerInfo(AufgabeAnzeige anzeige, Mitspieler aktiv) { private void setMitspielerInfo(AufgabeAnzeige anzeige, BdsmMitspieler aktiv) {
if (aktiv != null) { if (aktiv != null) {
anzeige.setMitspielerId(aktiv.getId()); anzeige.setMitspielerId(aktiv.getId());
anzeige.setEigenesGeraet(aktiv.isEigenesGeraet()); anzeige.setEigenesGeraet(aktiv.isEigenesGeraet());
@@ -132,9 +132,9 @@ public class BdsmGameDurchfuehren {
} }
private AufgabeAnzeige findUltimativeStrafe() { private AufgabeAnzeige findUltimativeStrafe() {
Mitspieler aktiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_AKTIV); BdsmMitspieler aktiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_AKTIV);
if (aktiv != null) { if (aktiv != null) {
Mitspieler passiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_PASSIV, aktiv); BdsmMitspieler passiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_PASSIV, aktiv);
if (passiv != null) { if (passiv != null) {
String text = "{AKTIV}, verschnüre {PASSIV} fachmännisch inkl. KG, Plugs, Knebel, Augenbinde und was dir sonst einfällt. Nutze die Ruhe für was auch immer du möchtest."; String text = "{AKTIV}, verschnüre {PASSIV} fachmännisch inkl. KG, Plugs, Knebel, Augenbinde und was dir sonst einfällt. Nutze die Ruhe für was auch immer du möchtest.";
AufgabeAnzeige anzeige = new AufgabeAnzeige(); AufgabeAnzeige anzeige = new AufgabeAnzeige();
@@ -151,8 +151,8 @@ public class BdsmGameDurchfuehren {
private AufgabeAnzeige findSperreVerlaengern() { private AufgabeAnzeige findSperreVerlaengern() {
if (!aktiveSperren.isEmpty()) { if (!aktiveSperren.isEmpty()) {
AktiveSperre sperre = aktiveSperren.get(new Random().nextInt(aktiveSperren.size())); AktiveSperre sperre = aktiveSperren.get(new Random().nextInt(aktiveSperren.size()));
Mitspieler passiv = sperre.getMitspieler(); BdsmMitspieler passiv = sperre.getMitspieler();
Mitspieler aktiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_AKTIV, passiv); BdsmMitspieler aktiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_AKTIV, passiv);
if (aktiv != null) { if (aktiv != null) {
String text = "{AKTIV}, du entscheidest. Sollen alle bestehenden Zeitstrafen von {PASSIV} verlängert werden...?"; String text = "{AKTIV}, du entscheidest. Sollen alle bestehenden Zeitstrafen von {PASSIV} verlängert werden...?";
AufgabeAnzeige anzeige = new AufgabeAnzeige(); AufgabeAnzeige anzeige = new AufgabeAnzeige();
@@ -170,9 +170,9 @@ public class BdsmGameDurchfuehren {
} }
private AufgabeAnzeige findeAufgabe() { private AufgabeAnzeige findeAufgabe() {
Mitspieler aktiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_AKTIV); BdsmMitspieler aktiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_AKTIV);
if (aktiv != null) { if (aktiv != null) {
Mitspieler passiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_PASSIV, aktiv); BdsmMitspieler passiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_PASSIV, aktiv);
if (passiv != null) { if (passiv != null) {
List<Aufgabe> list = aufgabenList.getAufgaben().stream() List<Aufgabe> list = aufgabenList.getAufgaben().stream()
.filter(aufgabe -> aufgabe.isAufgabePassend(level, aktiv, passiv)) .filter(aufgabe -> aufgabe.isAufgabePassend(level, aktiv, passiv))
@@ -198,9 +198,9 @@ public class BdsmGameDurchfuehren {
} }
private AufgabeAnzeige findeStrafe() { private AufgabeAnzeige findeStrafe() {
Mitspieler aktiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_AKTIV); BdsmMitspieler aktiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_AKTIV);
if (aktiv != null) { if (aktiv != null) {
Mitspieler passiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_PASSIV, aktiv); BdsmMitspieler passiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_PASSIV, aktiv);
if (passiv != null) { if (passiv != null) {
List<Strafe> list = aufgabenList.getStrafen().stream() List<Strafe> list = aufgabenList.getStrafen().stream()
.filter(strafe -> strafe.isAufgabePassend(level, aktiv, passiv)) .filter(strafe -> strafe.isAufgabePassend(level, aktiv, passiv))
@@ -226,9 +226,9 @@ public class BdsmGameDurchfuehren {
} }
private AufgabeAnzeige findeSperre() { private AufgabeAnzeige findeSperre() {
Mitspieler aktiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_AKTIV); BdsmMitspieler aktiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_AKTIV);
if (aktiv != null) { if (aktiv != null) {
Mitspieler passiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_PASSIV, aktiv); BdsmMitspieler passiv = findeMitspielerMitRolle(RolleEnum.BESTRAFUNG_PASSIV, aktiv);
if (passiv != null) { if (passiv != null) {
List<Sperre> list = aufgabenList.getSperren().stream() List<Sperre> list = aufgabenList.getSperren().stream()
.filter(sperre -> sperre.isAufgabePassend(passiv)) .filter(sperre -> sperre.isAufgabePassend(passiv))
@@ -255,16 +255,16 @@ public class BdsmGameDurchfuehren {
return textMitPlatzhaltern.replace("{AKTIV}", nameAktiv).replace("{PASSIV}", namePassiv); return textMitPlatzhaltern.replace("{AKTIV}", nameAktiv).replace("{PASSIV}", namePassiv);
} }
private Mitspieler findeMitspielerMitRolle(RolleEnum rolle) { private BdsmMitspieler findeMitspielerMitRolle(RolleEnum rolle) {
List<Mitspieler> list = mitspieler.stream() List<BdsmMitspieler> list = mitspieler.stream()
.filter(m -> m.getRollen().contains(rolle)) .filter(m -> m.getRollen().contains(rolle))
.toList(); .toList();
return list.isEmpty() ? null : list.get(new Random().nextInt(list.size())); return list.isEmpty() ? null : list.get(new Random().nextInt(list.size()));
} }
private Mitspieler findeMitspielerMitRolle(RolleEnum rolle, Mitspieler gegenspieler) { private BdsmMitspieler findeMitspielerMitRolle(RolleEnum rolle, BdsmMitspieler gegenspieler) {
if (gegenspieler == null) return findeMitspielerMitRolle(rolle); if (gegenspieler == null) return findeMitspielerMitRolle(rolle);
List<Mitspieler> list = mitspieler.stream() List<BdsmMitspieler> list = mitspieler.stream()
.filter(m -> m != gegenspieler) .filter(m -> m != gegenspieler)
.filter(m -> m.isPassenderSpielpartner(gegenspieler)) .filter(m -> m.isPassenderSpielpartner(gegenspieler))
.filter(m -> m.getRollen().contains(rolle)) .filter(m -> m.getRollen().contains(rolle))

View File

@@ -162,7 +162,7 @@ public class BdsmGameService {
userRepository.findById(keyholderUserId).ifPresent(keyholder -> userRepository.findById(keyholderUserId).ifPresent(keyholder ->
systemMessageService.send(keyholderUserId, lockeeUserId, systemMessageService.send(keyholderUserId, lockeeUserId,
keyholder.getName() + " hat nach dem BDSM Game ein Chastity Lock auf dich gesetzt.", keyholder.getName() + " hat nach dem BDSM Game ein Chastity Lock auf dich gesetzt.",
"/activelock.html", MessageCause.GAME_STATE)); "/games/chastity/activelock.html", MessageCause.GAME_STATE));
} }
// Spielabschluss-Logik (History + XP + Cleanup) // Spielabschluss-Logik (History + XP + Cleanup)

View File

@@ -3,13 +3,14 @@ package de.oaa.xxx.games.bdsm;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import de.oaa.xxx.games.common.aufgaben.CommonMitspieler;
import de.oaa.xxx.games.common.aufgaben.Werkzeug; import de.oaa.xxx.games.common.aufgaben.Werkzeug;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class Mitspieler { public class BdsmMitspieler implements CommonMitspieler {
private UUID id; private UUID id;
private UUID userId; private UUID userId;
@@ -31,7 +32,7 @@ public class Mitspieler {
+ ", rollen=" + rollen + ", werkzeuge=" + verfuegbareWerkzeuge + "]"; + ", rollen=" + rollen + ", werkzeuge=" + verfuegbareWerkzeuge + "]";
} }
public boolean isPassenderSpielpartner(Mitspieler other) { public boolean isPassenderSpielpartner(BdsmMitspieler other) {
if (!spieltMit.contains(other.getGeschlecht())) { if (!spieltMit.contains(other.getGeschlecht())) {
return false; return false;
} }

View File

@@ -7,7 +7,7 @@ import de.oaa.xxx.games.common.entity.GruppenAboEntity;
import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository;
import de.oaa.xxx.games.common.repository.GruppenAboRepository; import de.oaa.xxx.games.common.repository.GruppenAboRepository;
import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserEntity;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserService;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
@@ -37,14 +37,14 @@ public class AboController {
private final GruppenAboRepository aboRepository; private final GruppenAboRepository aboRepository;
private final AufgabenGruppeRepository gruppeRepository; private final AufgabenGruppeRepository gruppeRepository;
private final UserRepository userRepository; private final UserService userService;
public AboController(GruppenAboRepository aboRepository, public AboController(GruppenAboRepository aboRepository,
AufgabenGruppeRepository gruppeRepository, AufgabenGruppeRepository gruppeRepository,
UserRepository userRepository) { UserService userService) {
this.aboRepository = aboRepository; this.aboRepository = aboRepository;
this.gruppeRepository = gruppeRepository; this.gruppeRepository = gruppeRepository;
this.userRepository = userRepository; this.userService = userService;
} }
// Abonnierte Gruppen laden // Abonnierte Gruppen laden
@@ -54,8 +54,7 @@ public class AboController {
@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size, @RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size,
Principal principal) { Principal principal) {
UserEntity user = resolveUser(principal); UserEntity user = userService.requireUser(principal);
if (user == null) return ResponseEntity.status(401).build();
List<AufgabenGruppe> dtos = aboRepository.findByUserId(user.getUserId()).stream() List<AufgabenGruppe> dtos = aboRepository.findByUserId(user.getUserId()).stream()
.map(GruppenAboEntity::getAufgabenGruppe) .map(GruppenAboEntity::getAufgabenGruppe)
@@ -75,8 +74,7 @@ public class AboController {
@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "" + DISCOVER_PAGE_SIZE) int size, @RequestParam(defaultValue = "" + DISCOVER_PAGE_SIZE) int size,
Principal principal) { Principal principal) {
UserEntity user = resolveUser(principal); UserEntity user = userService.requireUser(principal);
if (user == null) return ResponseEntity.status(401).build();
String namePattern = name != null && !name.isBlank() ? "%" + name.trim() + "%" : null; String namePattern = name != null && !name.isBlank() ? "%" + name.trim() + "%" : null;
@@ -94,8 +92,7 @@ public class AboController {
@PostMapping("/{gruppenId}") @PostMapping("/{gruppenId}")
public ResponseEntity<Void> subscribe(@PathVariable UUID gruppenId, Principal principal) { public ResponseEntity<Void> subscribe(@PathVariable UUID gruppenId, Principal principal) {
UserEntity user = resolveUser(principal); UserEntity user = userService.requireUser(principal);
if (user == null) return ResponseEntity.status(401).build();
AufgabenGruppeEntity gruppe = gruppeRepository.findById(gruppenId).orElse(null); AufgabenGruppeEntity gruppe = gruppeRepository.findById(gruppenId).orElse(null);
if (gruppe == null || gruppe.isPrivateGruppe() || user.getUserId().equals(gruppe.getUserId())) { if (gruppe == null || gruppe.isPrivateGruppe() || user.getUserId().equals(gruppe.getUserId())) {
@@ -117,8 +114,7 @@ public class AboController {
@DeleteMapping("/{gruppenId}") @DeleteMapping("/{gruppenId}")
public ResponseEntity<Void> unsubscribe(@PathVariable UUID gruppenId, Principal principal) { public ResponseEntity<Void> unsubscribe(@PathVariable UUID gruppenId, Principal principal) {
UserEntity user = resolveUser(principal); UserEntity user = userService.requireUser(principal);
if (user == null) return ResponseEntity.status(401).build();
AufgabenGruppeEntity gruppe = gruppeRepository.findById(gruppenId).orElse(null); AufgabenGruppeEntity gruppe = gruppeRepository.findById(gruppenId).orElse(null);
if (gruppe == null) return ResponseEntity.noContent().build(); if (gruppe == null) return ResponseEntity.noContent().build();
@@ -149,7 +145,4 @@ public class AboController {
return result; return result;
} }
private UserEntity resolveUser(Principal principal) {
return userRepository.findByEmail(principal.getName()).orElse(null);
}
} }

View File

@@ -9,7 +9,7 @@ import de.oaa.xxx.games.common.repository.AufgabeRepository;
import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository;
import de.oaa.xxx.games.common.repository.ToyRepository; import de.oaa.xxx.games.common.repository.ToyRepository;
import de.oaa.xxx.subscription.SubscriptionLimitService; import de.oaa.xxx.subscription.SubscriptionLimitService;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -39,18 +39,18 @@ public class AufgabeController {
private final AufgabeRepository aufgabeRepository; private final AufgabeRepository aufgabeRepository;
private final AufgabenGruppeRepository gruppeRepository; private final AufgabenGruppeRepository gruppeRepository;
private final ToyRepository toyRepository; private final ToyRepository toyRepository;
private final UserRepository userRepository; private final UserService userService;
private final SubscriptionLimitService limitService; private final SubscriptionLimitService limitService;
public AufgabeController(AufgabeRepository aufgabeRepository, public AufgabeController(AufgabeRepository aufgabeRepository,
AufgabenGruppeRepository gruppeRepository, AufgabenGruppeRepository gruppeRepository,
ToyRepository toyRepository, ToyRepository toyRepository,
UserRepository userRepository, UserService userService,
SubscriptionLimitService limitService) { SubscriptionLimitService limitService) {
this.aufgabeRepository = aufgabeRepository; this.aufgabeRepository = aufgabeRepository;
this.gruppeRepository = gruppeRepository; this.gruppeRepository = gruppeRepository;
this.toyRepository = toyRepository; this.toyRepository = toyRepository;
this.userRepository = userRepository; this.userService = userService;
this.limitService = limitService; this.limitService = limitService;
} }
@@ -70,9 +70,7 @@ public class AufgabeController {
if (gruppeEntity == null) { if (gruppeEntity == null) {
return ResponseEntity.badRequest().build(); return ResponseEntity.badRequest().build();
} }
var ownerOpt = userRepository.findByEmail(principal.getName()); int limit = limitService.maxTasksPerGroup(userService.requireUser(principal).getUserId());
int limit = ownerOpt.map(u -> limitService.maxTasksPerGroup(u.getUserId()))
.orElse(SubscriptionLimitService.STANDARD_MAX_TASKS_PER_GROUP);
if (gruppeEntity.getAufgaben().size() >= limit) { if (gruppeEntity.getAufgaben().size() >= limit) {
return ResponseEntity.status(409).build(); return ResponseEntity.status(409).build();
} }

View File

@@ -10,7 +10,6 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@@ -36,7 +35,7 @@ import de.oaa.xxx.games.common.repository.SperreRepository;
import de.oaa.xxx.games.common.repository.StrafeRepository; import de.oaa.xxx.games.common.repository.StrafeRepository;
import de.oaa.xxx.subscription.SubscriptionLimitService; import de.oaa.xxx.subscription.SubscriptionLimitService;
import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserEntity;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserService;
@RestController @RestController
@RequestMapping("/gruppe") @RequestMapping("/gruppe")
@@ -51,29 +50,29 @@ public class AufgabenGruppeController {
private final StrafeRepository strafeRepository; private final StrafeRepository strafeRepository;
private final SperreRepository sperreRepository; private final SperreRepository sperreRepository;
private final FinisherRepository finisherRepository; private final FinisherRepository finisherRepository;
private final UserRepository userRepository;
private final GruppenAboRepository aboRepository; private final GruppenAboRepository aboRepository;
private final AufgabenGruppeService aufgabenGruppeService; private final AufgabenGruppeService aufgabenGruppeService;
private final SubscriptionLimitService limitService; private final SubscriptionLimitService limitService;
private final UserService userService;
public AufgabenGruppeController(AufgabenGruppeRepository gruppeRepository, public AufgabenGruppeController(AufgabenGruppeRepository gruppeRepository,
AufgabeRepository aufgabeRepository, AufgabeRepository aufgabeRepository,
StrafeRepository strafeRepository, StrafeRepository strafeRepository,
SperreRepository sperreRepository, SperreRepository sperreRepository,
FinisherRepository finisherRepository, FinisherRepository finisherRepository,
UserRepository userRepository,
GruppenAboRepository aboRepository, GruppenAboRepository aboRepository,
AufgabenGruppeService aufgabenGruppeService, AufgabenGruppeService aufgabenGruppeService,
SubscriptionLimitService limitService) { SubscriptionLimitService limitService,
UserService userService) {
this.gruppeRepository = gruppeRepository; this.gruppeRepository = gruppeRepository;
this.aufgabeRepository = aufgabeRepository; this.aufgabeRepository = aufgabeRepository;
this.strafeRepository = strafeRepository; this.strafeRepository = strafeRepository;
this.sperreRepository = sperreRepository; this.sperreRepository = sperreRepository;
this.finisherRepository = finisherRepository; this.finisherRepository = finisherRepository;
this.userRepository = userRepository;
this.aboRepository = aboRepository; this.aboRepository = aboRepository;
this.aufgabenGruppeService = aufgabenGruppeService; this.aufgabenGruppeService = aufgabenGruppeService;
this.limitService = limitService; this.limitService = limitService;
this.userService = userService;
} }
// Paginierte Listen // Paginierte Listen
@@ -102,8 +101,8 @@ public class AufgabenGruppeController {
// Bestehende Endpunkte // Bestehende Endpunkte
@GetMapping("/all") @GetMapping("/all")
public ResponseEntity<AufgabenGruppeList> getAll(@RequestParam(required = false) String search) { public ResponseEntity<AufgabenGruppeList> getAll(@RequestParam(required = false) String search, Principal principal) {
UUID userId = (UUID) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); UUID userId = userService.requireUser(principal).getUserId();
String searchPattern = search != null ? "%" + search + "%" : null; String searchPattern = search != null ? "%" + search + "%" : null;
AufgabenGruppeList list = new AufgabenGruppeList(); AufgabenGruppeList list = new AufgabenGruppeList();
list.setGruppen(gruppeRepository.listWithUserAndSearch(userId, searchPattern, PageRequest.of(0, 500)) list.setGruppen(gruppeRepository.listWithUserAndSearch(userId, searchPattern, PageRequest.of(0, 500))
@@ -235,7 +234,8 @@ public class AufgabenGruppeController {
// Hilfsmethoden // Hilfsmethoden
private UserEntity resolveUser(Principal principal) { private UserEntity resolveUser(Principal principal) {
return userRepository.findByEmail(principal.getName()).orElse(null); if (principal == null) return null;
return userService.requireUser(principal);
} }
private AufgabenGruppePage toGruppePage(Page<AufgabenGruppeEntity> page) { private AufgabenGruppePage toGruppePage(Page<AufgabenGruppeEntity> page) {

View File

@@ -23,9 +23,9 @@ import de.oaa.xxx.games.bdsm.entity.BdsmEinladungEntity;
import de.oaa.xxx.games.bdsm.entity.BdsmEinladungEntity.Status; import de.oaa.xxx.games.bdsm.entity.BdsmEinladungEntity.Status;
import de.oaa.xxx.games.bdsm.repository.BdsmEinladungRepository; import de.oaa.xxx.games.bdsm.repository.BdsmEinladungRepository;
import de.oaa.xxx.social.SystemMessageService; import de.oaa.xxx.social.SystemMessageService;
import de.oaa.xxx.social.entity.MessageCause;
import de.oaa.xxx.social.repository.FriendshipRepository; import de.oaa.xxx.social.repository.FriendshipRepository;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserRepository;
import de.oaa.xxx.user.UserService;
@RestController @RestController
@RequestMapping("/bdsm/einladung") @RequestMapping("/bdsm/einladung")
@@ -36,15 +36,18 @@ public class BdsmEinladungController {
private final UserRepository userRepository; private final UserRepository userRepository;
private final FriendshipRepository friendshipRepository; private final FriendshipRepository friendshipRepository;
private final SystemMessageService systemMessageService; private final SystemMessageService systemMessageService;
private final UserService userService;
public BdsmEinladungController(BdsmEinladungRepository einladungRepository, public BdsmEinladungController(BdsmEinladungRepository einladungRepository,
UserRepository userRepository, UserRepository userRepository,
FriendshipRepository friendshipRepository, FriendshipRepository friendshipRepository,
SystemMessageService systemMessageService) { SystemMessageService systemMessageService,
UserService userService) {
this.einladungRepository = einladungRepository; this.einladungRepository = einladungRepository;
this.userRepository = userRepository; this.userRepository = userRepository;
this.friendshipRepository = friendshipRepository; this.friendshipRepository = friendshipRepository;
this.systemMessageService = systemMessageService; this.systemMessageService = systemMessageService;
this.userService = userService;
} }
record EinladungRequest(UUID setupId, int slotIndex, UUID inviteeId) {} record EinladungRequest(UUID setupId, int slotIndex, UUID inviteeId) {}
@@ -52,8 +55,7 @@ public class BdsmEinladungController {
record SpielerDatenRequest(String spielerDatenJson) {} record SpielerDatenRequest(String spielerDatenJson) {}
private UUID currentUserId(Principal principal) { private UUID currentUserId(Principal principal) {
return userRepository.findByEmail(principal.getName()) return userService.requireUser(principal).getUserId();
.map(u -> u.getUserId()).orElse(null);
} }
@PostMapping @PostMapping
@@ -94,13 +96,7 @@ public class BdsmEinladungController {
entity.setCreatedAt(LocalDateTime.now()); entity.setCreatedAt(LocalDateTime.now());
einladungRepository.save(entity); einladungRepository.save(entity);
String inviterName = userRepository.findById(inviterId).map(u -> u.getName()).orElse("Jemand"); systemMessageService.pushInvitationUpdate(req.inviteeId());
systemMessageService.send(
inviterId, req.inviteeId(),
inviterName + " hat dich zum BDSM Game eingeladen.",
"/einladungen.html",
MessageCause.INVITATION
);
Map<String, Object> result = new LinkedHashMap<>(); Map<String, Object> result = new LinkedHashMap<>();
result.put("einladungId", entity.getEinladungId()); result.put("einladungId", entity.getEinladungId());
@@ -115,10 +111,7 @@ public class BdsmEinladungController {
if (e == null) return ResponseEntity.notFound().build(); if (e == null) return ResponseEntity.notFound().build();
if (!e.getInviterId().equals(userId)) return ResponseEntity.status(403).build(); if (!e.getInviterId().equals(userId)) return ResponseEntity.status(403).build();
e.setStatus(Status.CANCELLED); e.setStatus(Status.CANCELLED);
String inviterName = userRepository.findById(userId).map(u -> u.getName()).orElse("Jemand"); systemMessageService.pushInvitationUpdate(e.getInviteeId());
systemMessageService.send(userId, e.getInviteeId(),
inviterName + " hat die BDSM-Spieleinladung zurückgezogen.",
"/einladungen.html", MessageCause.INVITATION);
return ResponseEntity.accepted().build(); return ResponseEntity.accepted().build();
} }
@@ -141,6 +134,13 @@ public class BdsmEinladungController {
.orElse(ResponseEntity.noContent().build()); .orElse(ResponseEntity.noContent().build());
} }
@GetMapping("/pending/count")
public ResponseEntity<Integer> getPendingCount(Principal principal) {
UUID userId = currentUserId(principal);
if (userId == null) return ResponseEntity.status(401).build();
return ResponseEntity.ok(einladungRepository.findByInviteeIdAndStatus(userId, Status.PENDING).size());
}
@GetMapping("/pending") @GetMapping("/pending")
public ResponseEntity<List<Map<String, Object>>> getPending(Principal principal) { public ResponseEntity<List<Map<String, Object>>> getPending(Principal principal) {
UUID userId = currentUserId(principal); UUID userId = currentUserId(principal);

View File

@@ -15,7 +15,6 @@ import java.util.UUID;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@@ -36,7 +35,7 @@ import de.oaa.xxx.games.bdsm.BdsmGame;
import de.oaa.xxx.games.bdsm.BdsmGameDurchfuehren; import de.oaa.xxx.games.bdsm.BdsmGameDurchfuehren;
import de.oaa.xxx.games.bdsm.BdsmGameService; import de.oaa.xxx.games.bdsm.BdsmGameService;
import de.oaa.xxx.games.bdsm.GeschlechtEnum; import de.oaa.xxx.games.bdsm.GeschlechtEnum;
import de.oaa.xxx.games.bdsm.Mitspieler; import de.oaa.xxx.games.bdsm.BdsmMitspieler;
import de.oaa.xxx.games.common.aufgaben.AufgabenList; import de.oaa.xxx.games.common.aufgaben.AufgabenList;
import de.oaa.xxx.games.common.aufgaben.Werkzeug; import de.oaa.xxx.games.common.aufgaben.Werkzeug;
import de.oaa.xxx.games.bdsm.entity.AktiveSperreEntity; import de.oaa.xxx.games.bdsm.entity.AktiveSperreEntity;
@@ -55,6 +54,7 @@ import de.oaa.xxx.games.chastity.cardlock.CardlockRepository;
import de.oaa.xxx.social.SystemMessageService; import de.oaa.xxx.social.SystemMessageService;
import de.oaa.xxx.social.entity.MessageCause; import de.oaa.xxx.social.entity.MessageCause;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserRepository;
import de.oaa.xxx.user.UserService;
@RestController @RestController
@RequestMapping("/bdsm") @RequestMapping("/bdsm")
@@ -77,12 +77,13 @@ public class BdsmGameController {
private final SystemMessageService systemMessageService; private final SystemMessageService systemMessageService;
private final CardlockRepository cardlockRepository; private final CardlockRepository cardlockRepository;
private final BdsmGameService bdsmGameService; private final BdsmGameService bdsmGameService;
private final UserService userService;
public BdsmGameController(BdsmGameRepository sessionRepository, MitspielerRepository mitspielerRepository, public BdsmGameController(BdsmGameRepository sessionRepository, MitspielerRepository mitspielerRepository,
AktiveSperreRepository aktiveSperreRepository, UserRepository userRepository, AktiveSperreRepository aktiveSperreRepository, UserRepository userRepository,
BdsmEinladungRepository einladungRepository, ObjectMapper objectMapper, BdsmEinladungRepository einladungRepository, ObjectMapper objectMapper,
SystemMessageService systemMessageService, CardlockRepository cardlockRepository, SystemMessageService systemMessageService, CardlockRepository cardlockRepository,
BdsmGameService bdsmGameService) { BdsmGameService bdsmGameService, UserService userService) {
this.sessionRepository = sessionRepository; this.sessionRepository = sessionRepository;
this.mitspielerRepository = mitspielerRepository; this.mitspielerRepository = mitspielerRepository;
this.aktiveSperreRepository = aktiveSperreRepository; this.aktiveSperreRepository = aktiveSperreRepository;
@@ -92,6 +93,7 @@ public class BdsmGameController {
this.systemMessageService = systemMessageService; this.systemMessageService = systemMessageService;
this.cardlockRepository = cardlockRepository; this.cardlockRepository = cardlockRepository;
this.bdsmGameService = bdsmGameService; this.bdsmGameService = bdsmGameService;
this.userService = userService;
} }
@GetMapping("/{sessionId}") @GetMapping("/{sessionId}")
@@ -109,10 +111,8 @@ public class BdsmGameController {
} }
@PostMapping @PostMapping
public ResponseEntity<Void> create(@RequestBody BdsmGame session) { public ResponseEntity<Void> create(@RequestBody BdsmGame session, Principal principal) {
String email = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); UUID userId = userService.requireUser(principal).getUserId();
UUID userId = userRepository.findByEmail(email).map(u -> u.getUserId()).orElse(null);
if (userId == null) return ResponseEntity.status(401).build();
var existingOpt = sessionRepository.findByUserId(userId); var existingOpt = sessionRepository.findByUserId(userId);
if (existingOpt.isPresent()) { if (existingOpt.isPresent()) {
BdsmGameEntity existing = existingOpt.get(); BdsmGameEntity existing = existingOpt.get();
@@ -175,8 +175,7 @@ public class BdsmGameController {
@DeleteMapping("/{sessionId}/verlassen") @DeleteMapping("/{sessionId}/verlassen")
public ResponseEntity<Void> verlasseSpiel(@PathVariable UUID sessionId, Principal principal) { public ResponseEntity<Void> verlasseSpiel(@PathVariable UUID sessionId, Principal principal) {
UUID userId = userRepository.findByEmail(principal.getName()).map(u -> u.getUserId()).orElse(null); UUID userId = userService.requireUser(principal).getUserId();
if (userId == null) return ResponseEntity.status(401).build();
BdsmGameEntity session = sessionRepository.findById(sessionId).orElse(null); BdsmGameEntity session = sessionRepository.findById(sessionId).orElse(null);
if (session == null) return ResponseEntity.notFound().build(); if (session == null) return ResponseEntity.notFound().build();
@@ -259,7 +258,7 @@ public class BdsmGameController {
} }
@PostMapping("/{sessionId}/mitspieler") @PostMapping("/{sessionId}/mitspieler")
public ResponseEntity<Void> addMitspieler(@RequestBody Mitspieler mitspieler, @PathVariable UUID sessionId) { public ResponseEntity<Void> addMitspieler(@RequestBody BdsmMitspieler mitspieler, @PathVariable UUID sessionId) {
if (mitspieler.getName() == null || mitspieler.getGeschlecht() == null || mitspieler.getRollen() == null if (mitspieler.getName() == null || mitspieler.getGeschlecht() == null || mitspieler.getRollen() == null
|| mitspieler.getRollen().isEmpty() || mitspieler.getSpieltMit() == null || mitspieler.getSpieltMit().isEmpty() || mitspieler.getRollen().isEmpty() || mitspieler.getSpieltMit() == null || mitspieler.getSpieltMit().isEmpty()
|| mitspieler.getVerfuegbareWerkzeuge() == null || mitspieler.getVerfuegbareWerkzeuge().isEmpty()) { || mitspieler.getVerfuegbareWerkzeuge() == null || mitspieler.getVerfuegbareWerkzeuge().isEmpty()) {
@@ -345,8 +344,7 @@ public class BdsmGameController {
@GetMapping("/{sessionId}/mitspieler/me") @GetMapping("/{sessionId}/mitspieler/me")
public ResponseEntity<Map<String, Object>> getMeinMitspieler(@PathVariable UUID sessionId, Principal principal) { public ResponseEntity<Map<String, Object>> getMeinMitspieler(@PathVariable UUID sessionId, Principal principal) {
UUID userId = userRepository.findByEmail(principal.getName()).map(u -> u.getUserId()).orElse(null); UUID userId = userService.requireUser(principal).getUserId();
if (userId == null) return ResponseEntity.status(401).build();
BdsmGameEntity session = sessionRepository.findById(sessionId).orElse(null); BdsmGameEntity session = sessionRepository.findById(sessionId).orElse(null);
if (session == null) return ResponseEntity.notFound().build(); if (session == null) return ResponseEntity.notFound().build();
return session.getMitspieler().stream() return session.getMitspieler().stream()

View File

@@ -2,7 +2,7 @@ package de.oaa.xxx.games.bdsm.controller;
import de.oaa.xxx.games.bdsm.entity.BdsmSetupDraftEntity; import de.oaa.xxx.games.bdsm.entity.BdsmSetupDraftEntity;
import de.oaa.xxx.games.bdsm.repository.BdsmSetupDraftRepository; import de.oaa.xxx.games.bdsm.repository.BdsmSetupDraftRepository;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserService;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -19,25 +19,20 @@ import java.util.UUID;
public class BdsmSetupDraftController { public class BdsmSetupDraftController {
private final BdsmSetupDraftRepository draftRepository; private final BdsmSetupDraftRepository draftRepository;
private final UserRepository userRepository; private final UserService userService;
public BdsmSetupDraftController(BdsmSetupDraftRepository draftRepository, UserRepository userRepository) { public BdsmSetupDraftController(BdsmSetupDraftRepository draftRepository, UserService userService) {
this.draftRepository = draftRepository; this.draftRepository = draftRepository;
this.userRepository = userRepository; this.userService = userService;
} }
record DraftRequest(String setupId, String settingsJson, String setupJson, String gruppenJson) {} record DraftRequest(String setupId, String settingsJson, String setupJson, String gruppenJson) {}
private UUID currentUserId(Principal principal) {
return userRepository.findByEmail(principal.getName()).map(u -> u.getUserId()).orElse(null);
}
@GetMapping @GetMapping
public ResponseEntity<Map<String, Object>> getDraft( public ResponseEntity<Map<String, Object>> getDraft(
@RequestParam(required = false) String setupId, @RequestParam(required = false) String setupId,
Principal principal) { Principal principal) {
UUID userId = currentUserId(principal); UUID userId = userService.requireUser(principal).getUserId();
if (userId == null) return ResponseEntity.status(401).build();
var lookup = (setupId != null && !setupId.isBlank()) var lookup = (setupId != null && !setupId.isBlank())
? draftRepository.findBySetupId(setupId) ? draftRepository.findBySetupId(setupId)
: draftRepository.findByUserId(userId); : draftRepository.findByUserId(userId);
@@ -55,8 +50,7 @@ public class BdsmSetupDraftController {
@PutMapping @PutMapping
public ResponseEntity<Void> saveDraft(@RequestBody DraftRequest req, Principal principal) { public ResponseEntity<Void> saveDraft(@RequestBody DraftRequest req, Principal principal) {
UUID userId = currentUserId(principal); UUID userId = userService.requireUser(principal).getUserId();
if (userId == null) return ResponseEntity.status(401).build();
BdsmSetupDraftEntity d = draftRepository.findByUserId(userId) BdsmSetupDraftEntity d = draftRepository.findByUserId(userId)
.orElseGet(() -> { BdsmSetupDraftEntity n = new BdsmSetupDraftEntity(); n.setUserId(userId); return n; }); .orElseGet(() -> { BdsmSetupDraftEntity n = new BdsmSetupDraftEntity(); n.setUserId(userId); return n; });
if (req.setupId() != null) d.setSetupId(req.setupId()); if (req.setupId() != null) d.setSetupId(req.setupId());
@@ -70,8 +64,7 @@ public class BdsmSetupDraftController {
@DeleteMapping @DeleteMapping
public ResponseEntity<Void> deleteDraft(Principal principal) { public ResponseEntity<Void> deleteDraft(Principal principal) {
UUID userId = currentUserId(principal); UUID userId = userService.requireUser(principal).getUserId();
if (userId == null) return ResponseEntity.status(401).build();
draftRepository.findByUserId(userId).ifPresent(draftRepository::delete); draftRepository.findByUserId(userId).ifPresent(draftRepository::delete);
return ResponseEntity.accepted().build(); return ResponseEntity.accepted().build();
} }

View File

@@ -4,11 +4,11 @@ import de.oaa.xxx.games.common.aufgaben.Favorit;
import de.oaa.xxx.games.common.aufgaben.FavoritList; import de.oaa.xxx.games.common.aufgaben.FavoritList;
import de.oaa.xxx.games.common.entity.FavoritEntity; import de.oaa.xxx.games.common.entity.FavoritEntity;
import de.oaa.xxx.games.common.repository.FavoritRepository; import de.oaa.xxx.games.common.repository.FavoritRepository;
import de.oaa.xxx.user.UserService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.security.Principal;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@@ -30,9 +31,11 @@ public class FavoritController {
private static final Logger LOGGER = LoggerFactory.getLogger(FavoritController.class); private static final Logger LOGGER = LoggerFactory.getLogger(FavoritController.class);
private final FavoritRepository favoritRepository; private final FavoritRepository favoritRepository;
private final UserService userService;
public FavoritController(FavoritRepository favoritRepository) { public FavoritController(FavoritRepository favoritRepository, UserService userService) {
this.favoritRepository = favoritRepository; this.favoritRepository = favoritRepository;
this.userService = userService;
} }
@GetMapping("/{favoritId}") @GetMapping("/{favoritId}")
@@ -43,8 +46,8 @@ public class FavoritController {
} }
@GetMapping @GetMapping
public ResponseEntity<FavoritList> all() { public ResponseEntity<FavoritList> all(Principal principal) {
UUID userId = (UUID) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); UUID userId = userService.requireUser(principal).getUserId();
List<FavoritEntity> entities = favoritRepository.findByUserId(userId); List<FavoritEntity> entities = favoritRepository.findByUserId(userId);
FavoritList result = new FavoritList(); FavoritList result = new FavoritList();
result.setFavoriten(entities.stream().map(FavoritEntity::toFavorit).toList()); result.setFavoriten(entities.stream().map(FavoritEntity::toFavorit).toList());
@@ -52,8 +55,8 @@ public class FavoritController {
} }
@PostMapping @PostMapping
public ResponseEntity<Void> create(@RequestBody Favorit favorit) { public ResponseEntity<Void> create(@RequestBody Favorit favorit, Principal principal) {
UUID userId = (UUID) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); UUID userId = userService.requireUser(principal).getUserId();
if (favorit.getAufgabenGruppeId() == null) { if (favorit.getAufgabenGruppeId() == null) {
return ResponseEntity.badRequest().build(); return ResponseEntity.badRequest().build();
} }
@@ -72,9 +75,9 @@ public class FavoritController {
} }
@DeleteMapping @DeleteMapping
public ResponseEntity<Void> delete(@RequestBody Favorit favorit) { public ResponseEntity<Void> delete(@RequestBody Favorit favorit, Principal principal) {
try { try {
UUID userId = (UUID) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); UUID userId = userService.requireUser(principal).getUserId();
favoritRepository.findByUserIdAndAufgabenGruppeId(userId, favorit.getAufgabenGruppeId()) favoritRepository.findByUserIdAndAufgabenGruppeId(userId, favorit.getAufgabenGruppeId())
.forEach(favoritRepository::delete); .forEach(favoritRepository::delete);
return ResponseEntity.accepted().build(); return ResponseEntity.accepted().build();

View File

@@ -8,7 +8,7 @@ import de.oaa.xxx.games.common.repository.GruppenAboRepository;
import de.oaa.xxx.games.common.repository.ToyRepository; import de.oaa.xxx.games.common.repository.ToyRepository;
import de.oaa.xxx.subscription.SubscriptionLimitService; import de.oaa.xxx.subscription.SubscriptionLimitService;
import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserEntity;
import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@@ -45,16 +45,16 @@ public class ToyController {
private static final int DEFAULT_PAGE_SIZE = 12; private static final int DEFAULT_PAGE_SIZE = 12;
private final ToyRepository toyRepository; private final ToyRepository toyRepository;
private final UserRepository userRepository; private final UserService userService;
private final GruppenAboRepository aboRepository; private final GruppenAboRepository aboRepository;
private final SubscriptionLimitService limitService; private final SubscriptionLimitService limitService;
public ToyController(ToyRepository toyRepository, public ToyController(ToyRepository toyRepository,
UserRepository userRepository, UserService userService,
GruppenAboRepository aboRepository, GruppenAboRepository aboRepository,
SubscriptionLimitService limitService) { SubscriptionLimitService limitService) {
this.toyRepository = toyRepository; this.toyRepository = toyRepository;
this.userRepository = userRepository; this.userService = userService;
this.aboRepository = aboRepository; this.aboRepository = aboRepository;
this.limitService = limitService; this.limitService = limitService;
} }
@@ -64,10 +64,7 @@ public class ToyController {
@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size, @RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size,
Principal principal) { Principal principal) {
UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); UserEntity user = userService.requireUser(principal);
if (user == null) {
return ResponseEntity.status(401).build();
}
Page<ToyEntity> result = toyRepository.findByUserId( Page<ToyEntity> result = toyRepository.findByUserId(
user.getUserId(), PageRequest.of(page, size, Sort.by("name"))); user.getUserId(), PageRequest.of(page, size, Sort.by("name")));
return ResponseEntity.ok(toToyPage(result)); return ResponseEntity.ok(toToyPage(result));
@@ -88,8 +85,7 @@ public class ToyController {
*/ */
@GetMapping("/available") @GetMapping("/available")
public ResponseEntity<List<Toy>> available(Principal principal) { public ResponseEntity<List<Toy>> available(Principal principal) {
UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); UserEntity user = userService.requireUser(principal);
if (user == null) return ResponseEntity.status(401).build();
List<ToyEntity> own = toyRepository.findByUserId(user.getUserId(), PageRequest.of(0, 500, Sort.by("name"))).getContent(); List<ToyEntity> own = toyRepository.findByUserId(user.getUserId(), PageRequest.of(0, 500, Sort.by("name"))).getContent();
List<ToyEntity> system = toyRepository.findByUserIdIsNull(PageRequest.of(0, 500, Sort.by("name"))).getContent(); List<ToyEntity> system = toyRepository.findByUserIdIsNull(PageRequest.of(0, 500, Sort.by("name"))).getContent();
@@ -136,10 +132,7 @@ public class ToyController {
if (toy.getName() == null || toy.getName().isBlank()) { if (toy.getName() == null || toy.getName().isBlank()) {
return ResponseEntity.badRequest().build(); return ResponseEntity.badRequest().build();
} }
UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); UserEntity user = userService.requireUser(principal);
if (user == null) {
return ResponseEntity.status(401).build();
}
if (toyRepository.existsByNameIgnoreCaseAndUserIdIsNull(toy.getName()) if (toyRepository.existsByNameIgnoreCaseAndUserIdIsNull(toy.getName())
|| toyRepository.existsByNameIgnoreCaseAndUserId(toy.getName(), user.getUserId())) { || toyRepository.existsByNameIgnoreCaseAndUserId(toy.getName(), user.getUserId())) {
return ResponseEntity.status(409) return ResponseEntity.status(409)
@@ -162,10 +155,7 @@ public class ToyController {
@PostMapping("/copy/{toyId}") @PostMapping("/copy/{toyId}")
public ResponseEntity<Void> copy(@PathVariable UUID toyId, Principal principal) { public ResponseEntity<Void> copy(@PathVariable UUID toyId, Principal principal) {
UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); UserEntity user = userService.requireUser(principal);
if (user == null) {
return ResponseEntity.status(401).build();
}
ToyEntity source = toyRepository.findById(toyId).orElse(null); ToyEntity source = toyRepository.findById(toyId).orElse(null);
if (source == null) { if (source == null) {
return ResponseEntity.notFound().build(); return ResponseEntity.notFound().build();
@@ -194,10 +184,7 @@ public class ToyController {
if (toy.getName() == null || toy.getName().isBlank()) { if (toy.getName() == null || toy.getName().isBlank()) {
return ResponseEntity.badRequest().build(); return ResponseEntity.badRequest().build();
} }
UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); UserEntity user = userService.requireUser(principal);
if (user == null) {
return ResponseEntity.status(401).build();
}
ToyEntity entity = toyRepository.findById(toyId).orElse(null); ToyEntity entity = toyRepository.findById(toyId).orElse(null);
if (entity == null) { if (entity == null) {
return ResponseEntity.notFound().build(); return ResponseEntity.notFound().build();
@@ -223,10 +210,7 @@ public class ToyController {
@DeleteMapping("/{toyId}") @DeleteMapping("/{toyId}")
public ResponseEntity<Void> delete(@PathVariable UUID toyId, Principal principal) { public ResponseEntity<Void> delete(@PathVariable UUID toyId, Principal principal) {
UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); UserEntity user = userService.requireUser(principal);
if (user == null) {
return ResponseEntity.status(401).build();
}
ToyEntity toy = toyRepository.findById(toyId).orElse(null); ToyEntity toy = toyRepository.findById(toyId).orElse(null);
if (toy == null) { if (toy == null) {
return ResponseEntity.noContent().build(); return ResponseEntity.noContent().build();

View File

@@ -7,7 +7,7 @@ import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import de.oaa.xxx.games.bdsm.AktiveSperre; import de.oaa.xxx.games.bdsm.AktiveSperre;
import de.oaa.xxx.games.bdsm.Mitspieler; import de.oaa.xxx.games.bdsm.BdsmMitspieler;
import de.oaa.xxx.games.common.aufgaben.Werkzeug; import de.oaa.xxx.games.common.aufgaben.Werkzeug;
import jakarta.persistence.CollectionTable; import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column; import jakarta.persistence.Column;
@@ -52,7 +52,7 @@ public class AktiveSperreEntity {
@JoinColumn(name = "sessionId", nullable = false) @JoinColumn(name = "sessionId", nullable = false)
private BdsmGameEntity session; private BdsmGameEntity session;
public AktiveSperre toSperre(List<Mitspieler> mitspielerList) { public AktiveSperre toSperre(List<BdsmMitspieler> mitspielerList) {
AktiveSperre sperre = new AktiveSperre(); AktiveSperre sperre = new AktiveSperre();
sperre.setAktiveSperreId(aktiveSperreId); sperre.setAktiveSperreId(aktiveSperreId);
sperre.setEndzeit(endzeit); sperre.setEndzeit(endzeit);
@@ -70,8 +70,8 @@ public class AktiveSperreEntity {
+ ", " + minuten + "min, von=" + startzeit + ", bis=" + endzeit + ", fuer=" + fuer + "]"; + ", " + minuten + "min, von=" + startzeit + ", bis=" + endzeit + ", fuer=" + fuer + "]";
} }
private Mitspieler getMitspielerFromList(List<Mitspieler> mitspielerList, UUID id) { private BdsmMitspieler getMitspielerFromList(List<BdsmMitspieler> mitspielerList, UUID id) {
Optional<Mitspieler> first = mitspielerList.stream().filter(m -> m.getId().equals(id)).findFirst(); Optional<BdsmMitspieler> first = mitspielerList.stream().filter(m -> m.getId().equals(id)).findFirst();
return first.orElse(null); return first.orElse(null);
} }
} }

View File

@@ -5,7 +5,7 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import de.oaa.xxx.games.bdsm.GeschlechtEnum; import de.oaa.xxx.games.bdsm.GeschlechtEnum;
import de.oaa.xxx.games.bdsm.Mitspieler; import de.oaa.xxx.games.bdsm.BdsmMitspieler;
import de.oaa.xxx.games.bdsm.RolleEnum; import de.oaa.xxx.games.bdsm.RolleEnum;
import de.oaa.xxx.games.common.aufgaben.Werkzeug; import de.oaa.xxx.games.common.aufgaben.Werkzeug;
import jakarta.persistence.CollectionTable; import jakarta.persistence.CollectionTable;
@@ -70,8 +70,8 @@ public class MitspielerEntity {
+ ", geschlecht=" + geschlecht + ", rollen=" + rollen + ", werkzeuge=" + werkzeuge + "]"; + ", geschlecht=" + geschlecht + ", rollen=" + rollen + ", werkzeuge=" + werkzeuge + "]";
} }
public Mitspieler toMitspieler() { public BdsmMitspieler toMitspieler() {
Mitspieler mitspieler = new Mitspieler(); BdsmMitspieler mitspieler = new BdsmMitspieler();
mitspieler.setGeschlecht(geschlecht); mitspieler.setGeschlecht(geschlecht);
mitspieler.setId(mitspielerId); mitspieler.setId(mitspielerId);
mitspieler.setUserId(userId); mitspieler.setUserId(userId);

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