From e262a1b46b60f613d7582ef76db82a8069263f31 Mon Sep 17 00:00:00 2001 From: Mario Date: Fri, 27 Mar 2026 12:06:29 +0100 Subject: [PATCH] =?UTF-8?q?Neues=20Spiel=20Vanilla=20Game=20hinzugef=C3=BC?= =?UTF-8?q?gt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 9 +- .metadata/.lock_info | 4 +- .metadata/.log | 69 + .../.safetable/org.eclipse.core.resources | Bin 1318 -> 1310 bytes .../org.eclipse.e4.workbench/workbench.xmi | 3872 +++++++++-------- .../org.eclipse.jdt.ui/OpenTypeHistory.xml | 17 +- .../QualifiedTypeNameHistory.xml | 3 + .../.plugins/org.eclipse.m2e.logback/0.log | 1 + .metadata/version.ini | 2 +- .../de/oaa/xxx/admin/AdminController.java | 27 +- .../java/de/oaa/xxx/aufgaben/Aufgabe.java | 23 - .../java/de/oaa/xxx/aufgaben/Finisher.java | 27 - .../main/java/de/oaa/xxx/aufgaben/Sperre.java | 22 - .../main/java/de/oaa/xxx/aufgaben/Strafe.java | 23 - .../aufgaben/controller/SperreController.java | 117 - .../de/oaa/xxx/games/bdsm/AktiveSperre.java | 7 +- .../xxx/games/bdsm/BdsmGameDurchfuehren.java | 8 +- .../de/oaa/xxx/games/bdsm/Mitspieler.java | 7 +- .../java/de/oaa/xxx/games/bdsm/Werkzeug.java | 26 - .../bdsm}/controller/AboController.java | 14 +- .../bdsm}/controller/AufgabeController.java | 18 +- .../controller/AufgabenGruppeController.java | 24 +- .../bdsm/controller/BdsmGameController.java | 4 +- .../bdsm}/controller/FavoritController.java | 11 +- .../bdsm}/controller/FillerController.java | 5 +- .../bdsm}/controller/FinisherController.java | 19 +- .../bdsm/controller/SperreController.java | 162 +- .../bdsm}/controller/StrafeController.java | 19 +- .../bdsm}/controller/ToyController.java | 14 +- .../games/bdsm/entity/AktiveSperreEntity.java | 14 +- .../games/bdsm/entity/MitspielerEntity.java | 10 +- .../games/bdsm/sperre/SperreVerarbeiten.java | 21 +- .../keyholder/KeyholderOfferController.java | 53 +- .../{bdsm => common}/aufgaben/Aufgabe.java | 106 +- .../common}/aufgaben/AufgabenGruppe.java | 52 +- .../aufgaben/AufgabenGruppeDisplay.java | 38 +- .../common}/aufgaben/AufgabenGruppeList.java | 26 +- .../common}/aufgaben/AufgabenGruppePage.java | 32 +- .../aufgaben/AufgabenGruppeService.java | 27 +- .../aufgaben/AufgabenList.java | 50 +- .../common}/aufgaben/DefaultFiller.java | 35 +- .../{ => games/common}/aufgaben/Favorit.java | 30 +- .../common}/aufgaben/FavoritList.java | 26 +- .../{bdsm => common}/aufgaben/Finisher.java | 21 +- .../common}/aufgaben/ImageScaler.java | 116 +- .../{bdsm => common}/aufgaben/Sperre.java | 76 +- .../{bdsm => common}/aufgaben/Strafe.java | 94 +- .../xxx/{ => games/common}/aufgaben/Toy.java | 34 +- .../{ => games/common}/aufgaben/ToyList.java | 28 +- .../{ => games/common}/aufgaben/ToyPage.java | 32 +- .../{ => games/common}/aufgaben/Werkzeug.java | 42 +- .../common}/entity/AufgabeEntity.java | 193 +- .../common}/entity/AufgabenGruppeEntity.java | 189 +- .../common}/entity/FavoritEntity.java | 95 +- .../common}/entity/FinisherEntity.java | 178 +- .../common}/entity/GruppenAboEntity.java | 72 +- .../common}/entity/SperreEntity.java | 179 +- .../common}/entity/StrafeEntity.java | 193 +- .../common}/entity/ToyEntity.java | 117 +- .../common}/repository/AufgabeRepository.java | 27 +- .../repository/AufgabenGruppeRepository.java | 73 +- .../common}/repository/FavoritRepository.java | 33 +- .../repository/FinisherRepository.java | 19 +- .../repository/GruppenAboRepository.java | 43 +- .../common}/repository/SperreRepository.java | 27 +- .../common}/repository/StrafeRepository.java | 27 +- .../common}/repository/ToyRepository.java | 83 +- .../games/vanilla/VanillaAufgabeAnzeige.java | 23 + .../de/oaa/xxx/games/vanilla/VanillaGame.java | 17 + .../vanilla/VanillaGameDurchfuehren.java | 128 + .../xxx/games/vanilla/VanillaMitspieler.java | 24 + .../controller/VanillaAboController.java | 160 + .../controller/VanillaAufgabeController.java | 128 + .../VanillaAufgabenGruppeController.java | 284 ++ .../VanillaEinladungController.java | 247 ++ .../controller/VanillaFavoritController.java | 101 + .../controller/VanillaFillerController.java | 34 + .../controller/VanillaFinisherController.java | 116 + .../controller/VanillaGameController.java | 410 ++ .../VanillaSetupDraftController.java | 78 + .../controller/VanillaToyController.java | 253 ++ .../entity/VanillaEinladungEntity.java | 22 + .../vanilla/entity/VanillaGameEntity.java | 26 + .../entity/VanillaMitspielerEntity.java | 41 + .../entity/VanillaSetupDraftEntity.java | 17 + .../VanillaEinladungRepository.java | 11 + .../repository/VanillaGameRepository.java | 8 + .../VanillaMitspielerRepository.java | 5 + .../VanillaSetupDraftRepository.java | 9 + .../java/de/oaa/xxx/user/UserService.java | 14 +- .../src/main/resources/static/aufgaben.html | 67 +- .../src/main/resources/static/js/sidebar.js | 42 +- .../src/main/resources/static/neuvanilla.html | 1345 ++++++ .../src/main/resources/static/vanilla.html | 11 + .../main/resources/static/vanillaingame.html | 1019 +++++ .../main/resources/static/vanillawarten.html | 11 + 96 files changed, 8132 insertions(+), 3584 deletions(-) delete mode 100644 xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Aufgabe.java delete mode 100644 xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Finisher.java delete mode 100644 xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Sperre.java delete mode 100644 xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Strafe.java delete mode 100644 xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/SperreController.java delete mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/Werkzeug.java rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/bdsm}/controller/AboController.java (91%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/bdsm}/controller/AufgabeController.java (90%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/bdsm}/controller/AufgabenGruppeController.java (92%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/bdsm}/controller/FavoritController.java (90%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/bdsm}/controller/FillerController.java (87%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/bdsm}/controller/FinisherController.java (88%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/bdsm}/controller/StrafeController.java (88%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/bdsm}/controller/ToyController.java (94%) rename xxxthegame/src/main/java/de/oaa/xxx/games/{bdsm => common}/aufgaben/Aufgabe.java (91%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/AufgabenGruppe.java (90%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/AufgabenGruppeDisplay.java (86%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/AufgabenGruppeList.java (80%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/AufgabenGruppePage.java (84%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/AufgabenGruppeService.java (91%) rename xxxthegame/src/main/java/de/oaa/xxx/games/{bdsm => common}/aufgaben/AufgabenList.java (89%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/DefaultFiller.java (96%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/Favorit.java (81%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/FavoritList.java (78%) rename xxxthegame/src/main/java/de/oaa/xxx/games/{bdsm => common}/aufgaben/Finisher.java (85%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/ImageScaler.java (96%) rename xxxthegame/src/main/java/de/oaa/xxx/games/{bdsm => common}/aufgaben/Sperre.java (88%) rename xxxthegame/src/main/java/de/oaa/xxx/games/{bdsm => common}/aufgaben/Strafe.java (90%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/Toy.java (83%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/ToyList.java (80%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/ToyPage.java (83%) rename xxxthegame/src/main/java/de/oaa/xxx/{ => games/common}/aufgaben/Werkzeug.java (94%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/entity/AufgabeEntity.java (94%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/entity/AufgabenGruppeEntity.java (93%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/entity/FavoritEntity.java (90%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/entity/FinisherEntity.java (94%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/entity/GruppenAboEntity.java (91%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/entity/SperreEntity.java (94%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/entity/StrafeEntity.java (94%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/entity/ToyEntity.java (91%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/repository/AufgabeRepository.java (63%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/repository/AufgabenGruppeRepository.java (67%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/repository/FavoritRepository.java (79%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/repository/FinisherRepository.java (63%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/repository/GruppenAboRepository.java (76%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/repository/SperreRepository.java (63%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/repository/StrafeRepository.java (63%) rename xxxthegame/src/main/java/de/oaa/xxx/{aufgaben => games/common}/repository/ToyRepository.java (92%) create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaAufgabeAnzeige.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaGame.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaGameDurchfuehren.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaMitspieler.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAboController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAufgabeController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAufgabenGruppeController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaEinladungController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFavoritController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFillerController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFinisherController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaGameController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaSetupDraftController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaToyController.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaEinladungEntity.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaGameEntity.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaMitspielerEntity.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaSetupDraftEntity.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaEinladungRepository.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaGameRepository.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaMitspielerRepository.java create mode 100644 xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaSetupDraftRepository.java create mode 100644 xxxthegame/src/main/resources/static/neuvanilla.html create mode 100644 xxxthegame/src/main/resources/static/vanilla.html create mode 100644 xxxthegame/src/main/resources/static/vanillaingame.html create mode 100644 xxxthegame/src/main/resources/static/vanillawarten.html diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 3f3c91d..93e8b85 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -52,7 +52,14 @@ "Bash(head -5 echo \"---\" grep -n \"⬆\\\\|⬇\\\\|sort\\\\|up\\\\|down\" /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/resources/static/admin.html)", "Bash(head -8 echo \"---\" grep -n \"⭐\\\\|star\\\\|premium\\\\|abo\" /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/resources/static/abonnements.html)", "Bash(head -8 echo \"---\" grep -n \"👁\\\\|view\\\\|sichtbar\\\\|Ansicht\" /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/resources/static/einladungen.html)", - "Bash(/dev/null echo:*)" + "Bash(/dev/null echo:*)", + "Read(//home/mario/Workspaces/xxx-thegame/**)", + "Bash(done)", + "Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity)", + "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/vanilla/entity)", + "Bash(mkdir -p /home/mario/Workspaces/xxx-thegame/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository)" ] } } diff --git a/.metadata/.lock_info b/.metadata/.lock_info index 23b70f1..b8486e5 100644 --- a/.metadata/.lock_info +++ b/.metadata/.lock_info @@ -1,5 +1,5 @@ -#Thu Mar 26 16:50:07 CET 2026 +#Fri Mar 27 07:46:21 CET 2026 display=\:0 host=mario-mint -process-id=121337 +process-id=5726 user=mario diff --git a/.metadata/.log b/.metadata/.log index d52844f..b208bc1 100644 --- a/.metadata/.log +++ b/.metadata/.log @@ -1103,3 +1103,72 @@ java.lang.NullPointerException: Cannot invoke "org.eclipse.debug.core.ILaunchCon at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1456) at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:521) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) + +!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-26 23:30:06.930 +!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS +!SESSION 2026-03-27 07:46:14.949 ----------------------------------------------- +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-27 07:46:16.465 +!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. + +!ENTRY ch.qos.logback.classic 1 0 2026-03-27 07:46:21.681 +!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-27 07:46:21.840 +!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-27 07:46:21.840 +!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-27 07:46:21.978 +!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-27 07:46:21.978 +!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.jdt.ui 4 0 2026-03-27 07:55:15.883 +!MESSAGE NullPointerException computing hover information in BdsmGameDurchfuehren.java at offset 8641 +!STACK 0 +java.lang.NullPointerException: Cannot invoke "org.eclipse.jdt.internal.compiler.lookup.TypeBinding.signableName()" because "binding.type" is null + at org.eclipse.jdt.internal.core.SelectionRequestor.acceptLocalVariable(SelectionRequestor.java:422) + at org.eclipse.jdt.internal.codeassist.SelectionEngine.selectFrom(SelectionEngine.java:1353) + at org.eclipse.jdt.internal.codeassist.SelectionEngine.select(SelectionEngine.java:1043) + at org.eclipse.jdt.internal.core.Openable.codeSelect(Openable.java:171) + at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:476) + at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:466) + at org.eclipse.jdt.internal.ui.text.java.hover.AbstractJavaEditorTextHover.getJavaElementsAt(AbstractJavaEditorTextHover.java:122) + at org.eclipse.jdt.internal.ui.text.java.hover.JavadocHover.lambda$0(JavadocHover.java:708) + 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.text.java.hover.JavadocHover.internalGetHoverInfo(JavadocHover.java:708) + at org.eclipse.jdt.internal.ui.text.java.hover.JavadocHover.getHoverInfo2(JavadocHover.java:704) + at org.eclipse.lsp4e.jdt.LSJavaHoverProvider.lambda$0(LSJavaHoverProvider.java:64) + at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) + at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) + at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387) + at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312) + at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843) + at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) + at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188) + Suppressed: java.lang.Throwable: Source line 178 : +----- + } + return findeSperre(); + } + + private AufgabeAnzeige findeAufgabe() { + Mitspieler aktiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_AKTIV); + if (aktiv != null) { + Mitspieler passiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_PASSIV, aktiv); + if (passiv != null) { + List list = aufgabenList.getAufgaben().stream() + .filter(|aufgabe -> aufgabe.isAufgabePassend(level, aktiv, passiv)) +----- + 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) + ... 14 more diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources index 82d6fdef2bcbb978dbed24f640491c8377cdda35..b78f5015b25f1943061915919b01a472fed61eac 100644 GIT binary patch delta 124 zcmZ3+HIHk87Q2zLm9c@9!9+u0Mw7_`Ov;=8F-tH`4rbQkFf%bSFgG+boxF?D8b#S= z0j69=WN8C6x1vl1-^3yXBXb1 - - + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration - + @@ -11,9 +11,9 @@ topLevel shellMaximized - - - + + + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation persp.actionSet:org.eclipse.ui.cheatsheets.actionSet @@ -84,131 +84,131 @@ persp.editorOnboardingCommand:Show Key Assist$$$Shift+Ctrl+L persp.editorOnboardingCommand:New$$$Ctrl+N persp.editorOnboardingCommand:Open Type$$$Shift+Ctrl+T - - - - + + + + org.eclipse.e4.primaryNavigationStack active noFocus - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:Java - + Minimized - + View categoryTag:Spring - - + + View categoryTag:Git - - - - + + + + org.eclipse.e4.secondaryNavigationStack - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Mylyn - + View categoryTag:Java - + View categoryTag:Ant - + org.eclipse.e4.secondaryDataStack Oomph Gradle Debug Version Control (Team) - + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Terminal - + View categoryTag:Gradle - + View categoryTag:Gradle - + View categoryTag:Debug - + View categoryTag:Version Control (Team) - + View categoryTag:Oomph NoRestore @@ -217,7 +217,7 @@ - + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation persp.actionSet:org.eclipse.ui.cheatsheets.actionSet @@ -266,99 +266,99 @@ persp.editorOnboardingCommand:Step Over$$$F6 persp.editorOnboardingCommand:Step Return$$$F7 persp.editorOnboardingCommand:Resume$$$F8 - - + + org.eclipse.e4.primaryNavigationStack - + View categoryTag:Debug - + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java - - - - + + + + org.eclipse.e4.secondaryNavigationStack - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Ant - - + + View categoryTag:General - + View categoryTag:General - + View categoryTag:Debug - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Terminal - + View categoryTag:Debug - + View categoryTag:General @@ -367,2674 +367,2736 @@ - - + + View categoryTag:Help - + View categoryTag:General - + View categoryTag:Help - + View categoryTag:Help - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:Help - - + + EditorStack - + Editor removeOnHide org.eclipse.jdt.ui.ClassFileEditor - - + + Editor removeOnHide org.eclipse.jdt.ui.ClassFileEditor + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + - + View categoryTag:Java active - + ViewMenu menuContribution:menu - + - + View categoryTag:Java - + View categoryTag:General - + - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Mylyn - + View categoryTag:Terminal - + View categoryTag:Java - + View categoryTag:Git - + View categoryTag:Java - + View categoryTag:Spring - + ViewMenu menuContribution:menu - + - + View categoryTag:Ant - + View categoryTag:Gradle - + ViewMenu menuContribution:menu - + - + View categoryTag:Gradle - + ViewMenu menuContribution:menu - + - + View categoryTag:Debug - busy - + ViewMenu menuContribution:menu - + - + View categoryTag:Debug - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Debug - + ViewMenu menuContribution:menu - + - + View categoryTag:Version Control (Team) - + ViewMenu menuContribution:menu - + - + View categoryTag:Oomph NoRestore - + ViewMenu menuContribution:menu - + - - + + toolbarSeparator - + - + Draggable - + - + toolbarSeparator - + - + Draggable - - + + - + toolbarSeparator - + - + Draggable - + Draggable - + Draggable - + Draggable - + toolbarSeparator - + - + Draggable - + - + Draggable - + + Draggable + + toolbarSeparator - + - + toolbarSeparator - + - + Draggable - + stretch SHOW_RESTORE_MENU - + Draggable HIDEABLE SHOW_RESTORE_MENU - - + + stretch - + Draggable - + Draggable - - + + TrimStack Draggable - + TrimStack Draggable - + TrimStack Draggable - + TrimStack Draggable - - + + TrimStack Draggable - + TrimStack Draggable - + TrimStack Draggable - + TrimStack Draggable - + TrimStack Draggable - - - - - - - - - - - - - - + + + + + + + + + + + + + + platform:gtk - - - - + + + + platform:gtk - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + + - - + + - - - - - - - - - + + + + + + + + + - - + + - - - + + + - - - - - + + + + + - - + + - - - + + + - - - + + + - - - - - - - - + + + + + + + + platform:gtk - - - - - + + + + + - - + + - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + + + - - + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - - - - - + + + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - + + - - - - - - + + + + + + - - - - - - + + + + + + - - + + - - - - - - - - + + + + + + + + - - - + + + - - - - + + + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor removeOnHide - + View categoryTag:Ant - + View categoryTag:Gradle - + View categoryTag:Gradle - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Java - + View categoryTag:Git - + View categoryTag:Git - + View categoryTag:Git - + View categoryTag:Git NoRestore - + View categoryTag:Git - + View categoryTag:Help - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Debug - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Docker - + View categoryTag:Docker - + View categoryTag:Docker - + View categoryTag:Docker - + View categoryTag:Language Servers - + View categoryTag:Language Servers - + View categoryTag:Language Servers - + View categoryTag:Maven - + View categoryTag:Maven - + View categoryTag:Maven - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Oomph - + View categoryTag:Oomph NoRestore - + View categoryTag:Plug-in Development - + View categoryTag:General - + View categoryTag:Version Control (Team) - + View categoryTag:Version Control (Team) - + View categoryTag:Terminal - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Spring - + View categoryTag:Spring - + View categoryTag:Spring - - + + glue move_after:PerspectiveSpacer SHOW_RESTORE_MENU - + move_after:Spacer Glue HIDEABLE SHOW_RESTORE_MENU - + glue move_after:SearchField SHOW_RESTORE_MENU - - - - - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml b/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml index 35ef23d..46f1ff8 100644 --- a/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml +++ b/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml @@ -2,16 +2,19 @@ - - - - - + + + + + + + - - + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml b/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml index 868a6a3..6803ddd 100644 --- a/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml +++ b/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml @@ -29,4 +29,7 @@ + + + diff --git a/.metadata/.plugins/org.eclipse.m2e.logback/0.log b/.metadata/.plugins/org.eclipse.m2e.logback/0.log index 8d1096a..b6b70c4 100644 --- a/.metadata/.plugins/org.eclipse.m2e.logback/0.log +++ b/.metadata/.plugins/org.eclipse.m2e.logback/0.log @@ -13,3 +13,4 @@ 2026-03-26 10:32:24,614 [Worker-1: 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-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. diff --git a/.metadata/version.ini b/.metadata/version.ini index 1b8cc98..9c361bc 100644 --- a/.metadata/version.ini +++ b/.metadata/version.ini @@ -1,3 +1,3 @@ -#Thu Mar 26 16:50:07 CET 2026 +#Fri Mar 27 07:46:21 CET 2026 org.eclipse.core.runtime=2 org.eclipse.platform=4.39.0.v20260226-0420 diff --git a/xxxthegame/src/main/java/de/oaa/xxx/admin/AdminController.java b/xxxthegame/src/main/java/de/oaa/xxx/admin/AdminController.java index a42aee6..f9b08ce 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/admin/AdminController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/admin/AdminController.java @@ -20,21 +20,22 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import de.oaa.xxx.aufgaben.AufgabenGruppe; -import de.oaa.xxx.aufgaben.Toy; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import de.oaa.xxx.aufgaben.repository.AufgabeRepository; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.FinisherRepository; -import de.oaa.xxx.aufgaben.repository.GruppenAboRepository; -import de.oaa.xxx.aufgaben.repository.SperreRepository; -import de.oaa.xxx.aufgaben.repository.StrafeRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; import de.oaa.xxx.feedback.FeedbackEntity; import de.oaa.xxx.feedback.FeedbackRepository; import de.oaa.xxx.feedback.FeedbackStatus; import de.oaa.xxx.support.SupportUserService; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppe; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppeDisplay; +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabeRepository; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.FinisherRepository; +import de.oaa.xxx.games.common.repository.GruppenAboRepository; +import de.oaa.xxx.games.common.repository.SperreRepository; +import de.oaa.xxx.games.common.repository.StrafeRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; import de.oaa.xxx.games.chastity.ttlock.TTLockConfigEntity; import de.oaa.xxx.games.chastity.ttlock.TTLockConfigRepository; import de.oaa.xxx.meldung.MeldungEntity; @@ -197,7 +198,7 @@ public class AdminController { // ── Aufgabengruppen ────────────────────────────────────────────────────── @GetMapping("/aufgabengruppen") - public ResponseEntity> getAufgabengruppen(Principal principal) { + public ResponseEntity> getAufgabengruppen(Principal principal) { requireAdmin(principal); List list = aufgabenGruppeRepository .findByUserIdIsNull(PageRequest.of(0, 1000)).getContent(); @@ -205,7 +206,7 @@ public class AdminController { } @PostMapping("/aufgabengruppen") - public ResponseEntity createAufgabengruppe( + public ResponseEntity createAufgabengruppe( @RequestBody AufgabenGruppe gruppe, Principal principal) { requireAdmin(principal); gruppe.setUserId(null); diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Aufgabe.java b/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Aufgabe.java deleted file mode 100644 index c686fee..0000000 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Aufgabe.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -public class Aufgabe { - - private UUID aufgabeId; - private String kurzText; - private String text; - private Integer level; - private Integer sekundenVon; - private Integer sekundenBis; - private UUID gruppeId; - private List benoetigtAktiv; - private List benoetigtPassiv; - private List benoetigteToys; -} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Finisher.java b/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Finisher.java deleted file mode 100644 index 4df7e27..0000000 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Finisher.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.oaa.xxx.aufgaben; - -import de.oaa.xxx.games.bdsm.GeschlechtEnum; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -public class Finisher { - - private UUID finisherId; - private String kurzText; - private String text; - private GeschlechtEnum geschlecht; - private List benoetigtAktiv; - private List benoetigtPassiv; - private List benoetigteToys; - private UUID gruppeId; - - @Override - public String toString() { - return "Finisher[id=" + finisherId + ", kurzText=" + kurzText + ", geschlecht=" + geschlecht + ", gruppeId=" + gruppeId + "]"; - } -} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Sperre.java b/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Sperre.java deleted file mode 100644 index 17509b5..0000000 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Sperre.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -public class Sperre { - - private UUID sperreId; - private String kurzText; - private String text; - private String releaseText; - private UUID gruppeId; - private List sperreFuer; - private Integer minutenVon; - private Integer minutenBis; - private List benoetigteToys; -} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Strafe.java b/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Strafe.java deleted file mode 100644 index f91966c..0000000 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Strafe.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -public class Strafe { - - private UUID strafeId; - private Integer level; - private String text; - private String kurzText; - private Integer sekundenVon; - private Integer sekundenBis; - private UUID gruppeId; - private List benoetigtAktiv; - private List benoetigtPassiv; - private List benoetigteToys; -} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/SperreController.java b/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/SperreController.java deleted file mode 100644 index 9c8fa1c..0000000 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/SperreController.java +++ /dev/null @@ -1,117 +0,0 @@ -package de.oaa.xxx.aufgaben.controller; - -import de.oaa.xxx.aufgaben.Sperre; -import de.oaa.xxx.aufgaben.Toy; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.SperreEntity; -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.SperreRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@RestController("aufgabenSperreController") -@RequestMapping("/sperre") -@Transactional -public class SperreController { - - private static final Logger LOGGER = LoggerFactory.getLogger(SperreController.class); - - private final SperreRepository sperreRepository; - private final AufgabenGruppeRepository gruppeRepository; - private final ToyRepository toyRepository; - - public SperreController(SperreRepository sperreRepository, - AufgabenGruppeRepository gruppeRepository, - ToyRepository toyRepository) { - this.sperreRepository = sperreRepository; - this.gruppeRepository = gruppeRepository; - this.toyRepository = toyRepository; - } - - @GetMapping("/{sperreId}") - public ResponseEntity get(@PathVariable UUID sperreId) { - return sperreRepository.findById(sperreId) - .map(entity -> ResponseEntity.ok(entity.toSperre())) - .orElse(ResponseEntity.noContent().build()); - } - - @PostMapping - public ResponseEntity create(@RequestBody Sperre sperre) { - if (sperre.getKurzText() == null || sperre.getText() == null || sperre.getMinutenVon() == null - || sperre.getGruppeId() == null || sperre.getSperreFuer() == null || sperre.getSperreFuer().isEmpty()) { - return ResponseEntity.badRequest().build(); - } - AufgabenGruppeEntity gruppeEntity = gruppeRepository.findById(sperre.getGruppeId()).orElse(null); - if (gruppeEntity == null) { - return ResponseEntity.badRequest().build(); - } - if (gruppeEntity.getSperren().size() >= 100) { - return ResponseEntity.status(409).build(); - } - List toys = resolveToys(sperre.getBenoetigteToys()); - SperreEntity entity = SperreEntity.create(sperre, gruppeEntity, toys); - sperreRepository.save(entity); - LOGGER.debug("Sperre {} '{}' in Gruppe {} erstellt", entity.getSperreId(), entity.getKurzText(), sperre.getGruppeId()); - return ResponseEntity.created( - ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(entity.getSperreId()).toUri() - ).build(); - } - - @PutMapping("/{sperreId}") - public ResponseEntity update(@PathVariable UUID sperreId, @RequestBody Sperre sperre) { - if (sperre.getKurzText() == null || sperre.getText() == null || sperre.getMinutenVon() == null - || sperre.getSperreFuer() == null || sperre.getSperreFuer().isEmpty()) { - return ResponseEntity.badRequest().build(); - } - SperreEntity entity = sperreRepository.findById(sperreId).orElse(null); - if (entity == null) return ResponseEntity.notFound().build(); - entity.setKurzText(sperre.getKurzText()); - entity.setText(sperre.getText()); - entity.setReleaseText(sperre.getReleaseText()); - entity.setMinutenVon(sperre.getMinutenVon()); - entity.setMinutenBis(sperre.getMinutenBis()); - entity.setSperreFuer(sperre.getSperreFuer()); - entity.setBenoetigteToys(resolveToys(sperre.getBenoetigteToys())); - sperreRepository.save(entity); - LOGGER.debug("Sperre {} aktualisiert", sperreId); - return ResponseEntity.ok().build(); - } - - @DeleteMapping - public ResponseEntity delete(@RequestBody Sperre sperre) { - try { - sperreRepository.findById(sperre.getSperreId()).ifPresent(sperreRepository::delete); - return ResponseEntity.accepted().build(); - } catch (Exception exception) { - LOGGER.error(exception.getMessage(), exception); - return ResponseEntity.internalServerError().build(); - } - } - - private List resolveToys(List toys) { - if (toys == null || toys.isEmpty()) return new ArrayList<>(); - List ids = toys.stream() - .filter(t -> t.getToyId() != null) - .map(Toy::getToyId) - .toList(); - if (ids.isEmpty()) return new ArrayList<>(); - return toyRepository.findAllById(ids); - } -} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/AktiveSperre.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/AktiveSperre.java index a19c7e8..cfd4149 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/AktiveSperre.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/AktiveSperre.java @@ -1,12 +1,13 @@ package de.oaa.xxx.games.bdsm; -import lombok.Getter; -import lombok.Setter; - import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; +import lombok.Getter; +import lombok.Setter; + @Getter @Setter public class AktiveSperre { diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/BdsmGameDurchfuehren.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/BdsmGameDurchfuehren.java index a52a879..64b0714 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/BdsmGameDurchfuehren.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/BdsmGameDurchfuehren.java @@ -8,10 +8,10 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.databind.ObjectMapper; -import de.oaa.xxx.games.bdsm.aufgaben.Aufgabe; -import de.oaa.xxx.games.bdsm.aufgaben.AufgabenList; -import de.oaa.xxx.games.bdsm.aufgaben.Sperre; -import de.oaa.xxx.games.bdsm.aufgaben.Strafe; +import de.oaa.xxx.games.common.aufgaben.Aufgabe; +import de.oaa.xxx.games.common.aufgaben.AufgabenList; +import de.oaa.xxx.games.common.aufgaben.Sperre; +import de.oaa.xxx.games.common.aufgaben.Strafe; import de.oaa.xxx.games.bdsm.entity.BdsmGameEntity; import de.oaa.xxx.games.bdsm.sperre.SperreCallback; import de.oaa.xxx.games.bdsm.sperre.SperrenVerlaengernCallback; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/Mitspieler.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/Mitspieler.java index a8b5236..0b07b34 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/Mitspieler.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/Mitspieler.java @@ -1,11 +1,12 @@ package de.oaa.xxx.games.bdsm; -import lombok.Getter; -import lombok.Setter; - import java.util.List; import java.util.UUID; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; +import lombok.Getter; +import lombok.Setter; + @Getter @Setter public class Mitspieler { diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/Werkzeug.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/Werkzeug.java deleted file mode 100644 index 0314551..0000000 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/Werkzeug.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.oaa.xxx.games.bdsm; - -public enum Werkzeug { - - MUND("Mund", "Ob die Person gewillt ist den Mund einzusetzen."), - VAGINA("Vagina", "Ob die Person über eine Vagina verfügt und gewillt ist diese einzusetzen."), - PENIS("Penis", "Ob die Person über einen Penis verfügt und gewillt ist diesen einzusetzen."), - ANUS("Anus", "Ob die Person gewillt ist den Anus einzusetzen."), - UMSCHNALLDILDO("Umschnall-Dildo", "Ob die Person über einen Umschnall-Dildo verfügt und gewillt ist diesen einzusetzen."); - - private final String anzeige; - private final String beschreibung; - - Werkzeug(String anzeige, String beschreibung) { - this.anzeige = anzeige; - this.beschreibung = beschreibung; - } - - public String beschreibungsText() { - return beschreibung; - } - - public String anzeigeText() { - return anzeige; - } -} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AboController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AboController.java similarity index 91% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AboController.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AboController.java index d327636..39effb3 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AboController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AboController.java @@ -1,11 +1,11 @@ -package de.oaa.xxx.aufgaben.controller; +package de.oaa.xxx.games.bdsm.controller; -import de.oaa.xxx.aufgaben.AufgabenGruppe; -import de.oaa.xxx.aufgaben.AufgabenGruppePage; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.GruppenAboEntity; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.GruppenAboRepository; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppe; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppePage; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.GruppenAboEntity; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.GruppenAboRepository; import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserRepository; import org.springframework.http.ResponseEntity; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AufgabeController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabeController.java similarity index 90% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AufgabeController.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabeController.java index faca4c5..b39de3e 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AufgabeController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabeController.java @@ -1,13 +1,13 @@ -package de.oaa.xxx.aufgaben.controller; +package de.oaa.xxx.games.bdsm.controller; -import de.oaa.xxx.aufgaben.Aufgabe; -import de.oaa.xxx.aufgaben.Toy; -import de.oaa.xxx.aufgaben.entity.AufgabeEntity; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import de.oaa.xxx.aufgaben.repository.AufgabeRepository; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; +import de.oaa.xxx.games.common.aufgaben.Aufgabe; +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.entity.AufgabeEntity; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabeRepository; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; import de.oaa.xxx.subscription.SubscriptionLimitService; import de.oaa.xxx.user.UserRepository; import org.slf4j.Logger; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AufgabenGruppeController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabenGruppeController.java similarity index 92% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AufgabenGruppeController.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabenGruppeController.java index 7e6a4b0..0b18173 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/AufgabenGruppeController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabenGruppeController.java @@ -1,4 +1,4 @@ -package de.oaa.xxx.aufgaben.controller; +package de.oaa.xxx.games.bdsm.controller; import java.security.Principal; import java.util.Base64; @@ -23,17 +23,17 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; -import de.oaa.xxx.aufgaben.AufgabenGruppe; -import de.oaa.xxx.aufgaben.AufgabenGruppeList; -import de.oaa.xxx.aufgaben.AufgabenGruppePage; -import de.oaa.xxx.aufgaben.AufgabenGruppeService; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.repository.AufgabeRepository; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.FinisherRepository; -import de.oaa.xxx.aufgaben.repository.GruppenAboRepository; -import de.oaa.xxx.aufgaben.repository.SperreRepository; -import de.oaa.xxx.aufgaben.repository.StrafeRepository; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppe; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppeList; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppePage; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppeService; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.repository.AufgabeRepository; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.FinisherRepository; +import de.oaa.xxx.games.common.repository.GruppenAboRepository; +import de.oaa.xxx.games.common.repository.SperreRepository; +import de.oaa.xxx.games.common.repository.StrafeRepository; import de.oaa.xxx.subscription.SubscriptionLimitService; import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserRepository; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/BdsmGameController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/BdsmGameController.java index f21470f..a95f1eb 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/BdsmGameController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/BdsmGameController.java @@ -37,8 +37,8 @@ import de.oaa.xxx.games.bdsm.BdsmGameDurchfuehren; import de.oaa.xxx.games.bdsm.BdsmGameService; import de.oaa.xxx.games.bdsm.GeschlechtEnum; import de.oaa.xxx.games.bdsm.Mitspieler; -import de.oaa.xxx.games.bdsm.Werkzeug; -import de.oaa.xxx.games.bdsm.aufgaben.AufgabenList; +import de.oaa.xxx.games.common.aufgaben.AufgabenList; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; import de.oaa.xxx.games.bdsm.entity.AktiveSperreEntity; import de.oaa.xxx.games.bdsm.entity.BdsmEinladungEntity; import de.oaa.xxx.games.bdsm.entity.BdsmGameEntity; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FavoritController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FavoritController.java similarity index 90% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FavoritController.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FavoritController.java index bf7f72f..3d4d80b 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FavoritController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FavoritController.java @@ -1,9 +1,10 @@ -package de.oaa.xxx.aufgaben.controller; +package de.oaa.xxx.games.bdsm.controller; + +import de.oaa.xxx.games.common.aufgaben.Favorit; +import de.oaa.xxx.games.common.aufgaben.FavoritList; +import de.oaa.xxx.games.common.entity.FavoritEntity; +import de.oaa.xxx.games.common.repository.FavoritRepository; -import de.oaa.xxx.aufgaben.Favorit; -import de.oaa.xxx.aufgaben.FavoritList; -import de.oaa.xxx.aufgaben.entity.FavoritEntity; -import de.oaa.xxx.aufgaben.repository.FavoritRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FillerController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FillerController.java similarity index 87% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FillerController.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FillerController.java index 1fee196..5e8f46b 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FillerController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FillerController.java @@ -1,6 +1,5 @@ -package de.oaa.xxx.aufgaben.controller; +package de.oaa.xxx.games.bdsm.controller; -import de.oaa.xxx.aufgaben.DefaultFiller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; @@ -8,6 +7,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import de.oaa.xxx.games.common.aufgaben.DefaultFiller; + @RestController @RequestMapping("/filler") public class FillerController { diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FinisherController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FinisherController.java similarity index 88% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FinisherController.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FinisherController.java index be0f688..1e60fd5 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/FinisherController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/FinisherController.java @@ -1,13 +1,14 @@ -package de.oaa.xxx.aufgaben.controller; +package de.oaa.xxx.games.bdsm.controller; + +import de.oaa.xxx.games.common.aufgaben.Finisher; +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.FinisherEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.FinisherRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; -import de.oaa.xxx.aufgaben.Finisher; -import de.oaa.xxx.aufgaben.Toy; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.FinisherEntity; -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.FinisherRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/SperreController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/SperreController.java index e31022e..f7ce1b2 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/SperreController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/SperreController.java @@ -1,112 +1,118 @@ package de.oaa.xxx.games.bdsm.controller; -import de.oaa.xxx.games.bdsm.AktiveSperre; -import de.oaa.xxx.games.bdsm.Mitspieler; -import de.oaa.xxx.games.bdsm.entity.AktiveSperreEntity; -import de.oaa.xxx.games.bdsm.entity.BdsmGameEntity; -import de.oaa.xxx.games.bdsm.repository.AktiveSperreRepository; -import de.oaa.xxx.games.bdsm.repository.MitspielerRepository; -import de.oaa.xxx.games.bdsm.repository.BdsmGameRepository; -import de.oaa.xxx.games.bdsm.sperre.SperreCallback; -import de.oaa.xxx.games.bdsm.sperre.SperreVerarbeiten; -import de.oaa.xxx.games.bdsm.sperre.SperrenVerlaengernCallback; +import de.oaa.xxx.games.common.aufgaben.Sperre; +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.SperreEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.SperreRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; -@RestController("bdsmSperreController") -@RequestMapping("/bdsm/sperre") +@RestController("aufgabenSperreController") +@RequestMapping("/sperre") @Transactional public class SperreController { private static final Logger LOGGER = LoggerFactory.getLogger(SperreController.class); - private final BdsmGameRepository sessionRepository; - private final MitspielerRepository mitspielerRepository; - private final AktiveSperreRepository aktiveSperreRepository; + private final SperreRepository sperreRepository; + private final AufgabenGruppeRepository gruppeRepository; + private final ToyRepository toyRepository; - public SperreController(BdsmGameRepository sessionRepository, MitspielerRepository mitspielerRepository, - AktiveSperreRepository aktiveSperreRepository) { - this.sessionRepository = sessionRepository; - this.mitspielerRepository = mitspielerRepository; - this.aktiveSperreRepository = aktiveSperreRepository; + public SperreController(SperreRepository sperreRepository, + AufgabenGruppeRepository gruppeRepository, + ToyRepository toyRepository) { + this.sperreRepository = sperreRepository; + this.gruppeRepository = gruppeRepository; + this.toyRepository = toyRepository; + } + + @GetMapping("/{sperreId}") + public ResponseEntity get(@PathVariable UUID sperreId) { + return sperreRepository.findById(sperreId) + .map(entity -> ResponseEntity.ok(entity.toSperre())) + .orElse(ResponseEntity.noContent().build()); } @PostMapping - public ResponseEntity sperren(@RequestBody SperreCallback callback) { - try { - new SperreVerarbeiten().sperreAnwenden(callback, sessionRepository, mitspielerRepository, aktiveSperreRepository); - LOGGER.info("Sperre angewandt für Session {}", callback.getSessionId()); - return ResponseEntity.status(201).build(); - } catch (Exception exception) { - LOGGER.error(exception.getMessage(), exception); - return ResponseEntity.internalServerError().build(); - } - } - - @GetMapping("/abgelaufene") - public ResponseEntity getAbgelaufeneSperren(@RequestParam UUID sessionId) { - try { - List abgelaufene = aktiveSperreRepository.findAbgelaufene(sessionId, LocalDateTime.now()); - StringBuilder builder = new StringBuilder(); - SperreVerarbeiten verarbeiten = new SperreVerarbeiten(); - if (!abgelaufene.isEmpty()) { - for (AktiveSperreEntity abgelaufen : abgelaufene) { - builder.append(verarbeiten.sperreAufheben(abgelaufen, aktiveSperreRepository, mitspielerRepository)); - builder.append(";"); - } - } - return ResponseEntity.ok(builder.toString()); - } catch (Exception exception) { - LOGGER.error(exception.getMessage(), exception); - return ResponseEntity.internalServerError().build(); - } - } - - @GetMapping("/aktive") - public ResponseEntity> getAktiveSperren(@RequestParam UUID sessionId) { - try { - BdsmGameEntity session = sessionRepository.findById(sessionId).orElse(null); - if (session == null) return ResponseEntity.noContent().build(); - List mitspielerList = session.getMitspieler().stream() - .map(m -> m.toMitspieler()) - .collect(Collectors.toList()); - List sperren = session.getAktiveSperren().stream() - .map(e -> e.toSperre(mitspielerList)) - .collect(Collectors.toList()); - return ResponseEntity.ok(sperren); - } catch (Exception exception) { - LOGGER.error(exception.getMessage(), exception); - return ResponseEntity.internalServerError().build(); - } - } - - @PostMapping("/verlaengern") - public ResponseEntity aktiveVerlaengern(@RequestBody SperrenVerlaengernCallback callback) { - if (callback == null || callback.getSpielerId() == null || callback.getFaktor() == null) { + public ResponseEntity create(@RequestBody Sperre sperre) { + if (sperre.getKurzText() == null || sperre.getText() == null || sperre.getMinutenVon() == null + || sperre.getGruppeId() == null || sperre.getSperreFuer() == null || sperre.getSperreFuer().isEmpty()) { return ResponseEntity.badRequest().build(); } + AufgabenGruppeEntity gruppeEntity = gruppeRepository.findById(sperre.getGruppeId()).orElse(null); + if (gruppeEntity == null) { + return ResponseEntity.badRequest().build(); + } + if (gruppeEntity.getSperren().size() >= 100) { + return ResponseEntity.status(409).build(); + } + List toys = resolveToys(sperre.getBenoetigteToys()); + SperreEntity entity = SperreEntity.create(sperre, gruppeEntity, toys); + sperreRepository.save(entity); + LOGGER.debug("Sperre {} '{}' in Gruppe {} erstellt", entity.getSperreId(), entity.getKurzText(), sperre.getGruppeId()); + return ResponseEntity.created( + ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(entity.getSperreId()).toUri() + ).build(); + } + + @PutMapping("/{sperreId}") + public ResponseEntity update(@PathVariable UUID sperreId, @RequestBody Sperre sperre) { + if (sperre.getKurzText() == null || sperre.getText() == null || sperre.getMinutenVon() == null + || sperre.getSperreFuer() == null || sperre.getSperreFuer().isEmpty()) { + return ResponseEntity.badRequest().build(); + } + SperreEntity entity = sperreRepository.findById(sperreId).orElse(null); + if (entity == null) return ResponseEntity.notFound().build(); + entity.setKurzText(sperre.getKurzText()); + entity.setText(sperre.getText()); + entity.setReleaseText(sperre.getReleaseText()); + entity.setMinutenVon(sperre.getMinutenVon()); + entity.setMinutenBis(sperre.getMinutenBis()); + entity.setSperreFuer(sperre.getSperreFuer()); + entity.setBenoetigteToys(resolveToys(sperre.getBenoetigteToys())); + sperreRepository.save(entity); + LOGGER.debug("Sperre {} aktualisiert", sperreId); + return ResponseEntity.ok().build(); + } + + @DeleteMapping + public ResponseEntity delete(@RequestBody Sperre sperre) { try { - List aktiveLocks = aktiveSperreRepository.findAktiveLocks(callback.getSpielerId()); - SperreVerarbeiten verarbeiten = new SperreVerarbeiten(); - aktiveLocks.forEach(lock -> verarbeiten.sperreVerlaengern(lock, callback.getFaktor(), aktiveSperreRepository)); - LOGGER.debug("Sperren für Spieler {} um Faktor {} verlängert ({} Sperren)", callback.getSpielerId(), callback.getFaktor(), aktiveLocks.size()); + sperreRepository.findById(sperre.getSperreId()).ifPresent(sperreRepository::delete); return ResponseEntity.accepted().build(); } catch (Exception exception) { LOGGER.error(exception.getMessage(), exception); return ResponseEntity.internalServerError().build(); } } + + private List resolveToys(List toys) { + if (toys == null || toys.isEmpty()) return new ArrayList<>(); + List ids = toys.stream() + .filter(t -> t.getToyId() != null) + .map(Toy::getToyId) + .toList(); + if (ids.isEmpty()) return new ArrayList<>(); + return toyRepository.findAllById(ids); + } } diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/StrafeController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/StrafeController.java similarity index 88% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/StrafeController.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/StrafeController.java index 56838d4..dd78aed 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/StrafeController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/StrafeController.java @@ -1,13 +1,14 @@ -package de.oaa.xxx.aufgaben.controller; +package de.oaa.xxx.games.bdsm.controller; + +import de.oaa.xxx.games.common.aufgaben.Strafe; +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.StrafeEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.StrafeRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; -import de.oaa.xxx.aufgaben.Strafe; -import de.oaa.xxx.aufgaben.Toy; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.StrafeEntity; -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.StrafeRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/ToyController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/ToyController.java similarity index 94% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/ToyController.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/ToyController.java index 9a8e07a..237b98c 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/controller/ToyController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/controller/ToyController.java @@ -1,11 +1,11 @@ -package de.oaa.xxx.aufgaben.controller; +package de.oaa.xxx.games.bdsm.controller; -import de.oaa.xxx.aufgaben.Toy; -import de.oaa.xxx.aufgaben.ToyPage; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import de.oaa.xxx.aufgaben.repository.GruppenAboRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.aufgaben.ToyPage; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.GruppenAboRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; import de.oaa.xxx.subscription.SubscriptionLimitService; import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserRepository; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/entity/AktiveSperreEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/entity/AktiveSperreEntity.java index 5365ba5..3d51149 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/entity/AktiveSperreEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/entity/AktiveSperreEntity.java @@ -1,8 +1,14 @@ package de.oaa.xxx.games.bdsm.entity; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + import de.oaa.xxx.games.bdsm.AktiveSperre; import de.oaa.xxx.games.bdsm.Mitspieler; -import de.oaa.xxx.games.bdsm.Werkzeug; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; @@ -17,12 +23,6 @@ import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - @Getter @Setter @Entity diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/entity/MitspielerEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/entity/MitspielerEntity.java index 9e7d4bc..59ed9f3 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/entity/MitspielerEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/entity/MitspielerEntity.java @@ -1,9 +1,13 @@ package de.oaa.xxx.games.bdsm.entity; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + import de.oaa.xxx.games.bdsm.GeschlechtEnum; import de.oaa.xxx.games.bdsm.Mitspieler; import de.oaa.xxx.games.bdsm.RolleEnum; -import de.oaa.xxx.games.bdsm.Werkzeug; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; @@ -19,10 +23,6 @@ import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - @Getter @Setter @Entity diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/sperre/SperreVerarbeiten.java b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/sperre/SperreVerarbeiten.java index 051d434..e97e2e9 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/sperre/SperreVerarbeiten.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/sperre/SperreVerarbeiten.java @@ -1,20 +1,21 @@ package de.oaa.xxx.games.bdsm.sperre; -import com.fasterxml.jackson.databind.ObjectMapper; -import de.oaa.xxx.games.bdsm.aufgaben.AufgabenList; -import de.oaa.xxx.games.bdsm.aufgaben.Sperre; -import de.oaa.xxx.games.bdsm.entity.AktiveSperreEntity; -import de.oaa.xxx.games.bdsm.entity.MitspielerEntity; -import de.oaa.xxx.games.bdsm.entity.BdsmGameEntity; -import de.oaa.xxx.games.bdsm.repository.AktiveSperreRepository; -import de.oaa.xxx.games.bdsm.repository.MitspielerRepository; -import de.oaa.xxx.games.bdsm.repository.BdsmGameRepository; - import java.time.LocalDateTime; import java.util.Optional; import java.util.Random; import java.util.UUID; +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.oaa.xxx.games.common.aufgaben.AufgabenList; +import de.oaa.xxx.games.common.aufgaben.Sperre; +import de.oaa.xxx.games.bdsm.entity.AktiveSperreEntity; +import de.oaa.xxx.games.bdsm.entity.BdsmGameEntity; +import de.oaa.xxx.games.bdsm.entity.MitspielerEntity; +import de.oaa.xxx.games.bdsm.repository.AktiveSperreRepository; +import de.oaa.xxx.games.bdsm.repository.BdsmGameRepository; +import de.oaa.xxx.games.bdsm.repository.MitspielerRepository; + public class SperreVerarbeiten { private final ObjectMapper objectMapper = new ObjectMapper(); diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.java index f9f2117..ab015c2 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.java @@ -1,22 +1,45 @@ package de.oaa.xxx.games.chastity.keyholder; -import de.oaa.xxx.games.chastity.cardlock.*; -import de.oaa.xxx.games.chastity.common.*; -import de.oaa.xxx.games.chastity.lockcontroll.LockControllType; -import de.oaa.xxx.games.chastity.tasks.TaskMode; -import de.oaa.xxx.games.chastity.timelock.*; -import de.oaa.xxx.social.SystemMessageService; -import de.oaa.xxx.social.entity.MessageCause; -import de.oaa.xxx.subscription.SubscriptionLimitService; -import de.oaa.xxx.user.Geschlecht; -import de.oaa.xxx.user.UserRepository; -import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; - import java.security.Principal; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import de.oaa.xxx.games.chastity.cardlock.CardEnum; +import de.oaa.xxx.games.chastity.cardlock.CardLockEntity; +import de.oaa.xxx.games.chastity.cardlock.CardLockService; +import de.oaa.xxx.games.chastity.cardlock.CardLockServiceFactory; +import de.oaa.xxx.games.chastity.cardlock.CardlockRepository; +import de.oaa.xxx.games.chastity.cardlock.CardlockTemplateEntity; +import de.oaa.xxx.games.chastity.common.BaseLockTemplateRepository; +import de.oaa.xxx.games.chastity.common.CodeCreator; +import de.oaa.xxx.games.chastity.common.TemplateSubscriptionRepository; +import de.oaa.xxx.games.chastity.lockcontroll.LockControllType; +import de.oaa.xxx.games.chastity.tasks.TaskMode; +import de.oaa.xxx.games.chastity.timelock.TimeLockAdditionalSettings; +import de.oaa.xxx.games.chastity.timelock.TimeLockEntity; +import de.oaa.xxx.games.chastity.timelock.TimeLockRepository; +import de.oaa.xxx.games.chastity.timelock.TimeLockServiceFactory; +import de.oaa.xxx.games.chastity.timelock.TimeLockTemplateEntity; +import de.oaa.xxx.social.SystemMessageService; +import de.oaa.xxx.social.entity.MessageCause; +import de.oaa.xxx.subscription.SubscriptionLimitService; +import de.oaa.xxx.user.UserRepository; @RestController @RequestMapping("/keyholder-offers") diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Aufgabe.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Aufgabe.java similarity index 91% rename from xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Aufgabe.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Aufgabe.java index 307852f..b17668f 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Aufgabe.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Aufgabe.java @@ -1,53 +1,53 @@ -package de.oaa.xxx.games.bdsm.aufgaben; - -import de.oaa.xxx.games.bdsm.Mitspieler; -import de.oaa.xxx.games.bdsm.Werkzeug; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -public class Aufgabe { - - private UUID aufgabeId; - private String kurzText; - private String text; - private Integer level; - private Integer sekundenVon; - private Integer sekundenBis; - private UUID gruppeId; - private List benoetigtAktiv; - private List benoetigtPassiv; - - @Override - public String toString() { - return "Aufgabe[id=" + aufgabeId + ", kurzText=" + kurzText + ", level=" + level - + ", sekunden=" + sekundenVon + "-" + sekundenBis + ", gruppeId=" + gruppeId + "]"; - } - - public boolean isAufgabePassend(int level, Mitspieler aktiv, Mitspieler passiv) { - if (level != this.level && level - 1 != this.level) { - return false; - } - if (benoetigtPassiv != null) { - for (Werkzeug werkzeug : benoetigtPassiv) { - if (!passiv.isVerfuegbar(werkzeug)) { - return false; - } - } - } - if (benoetigtAktiv == null || benoetigtAktiv.isEmpty()) { - return true; - } else { - for (Werkzeug werkzeug : benoetigtAktiv) { - if (aktiv.isVerfuegbar(werkzeug)) { - return true; - } - } - return false; - } - } -} +package de.oaa.xxx.games.common.aufgaben; + +import java.util.List; +import java.util.UUID; + +import de.oaa.xxx.games.bdsm.Mitspieler; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Aufgabe { + + private UUID aufgabeId; + private String kurzText; + private String text; + private Integer level; + private Integer sekundenVon; + private Integer sekundenBis; + private UUID gruppeId; + private List benoetigtAktiv; + private List benoetigtPassiv; + private List benoetigteToys; + + @Override + public String toString() { + return "Aufgabe[id=" + aufgabeId + ", kurzText=" + kurzText + ", level=" + level + + ", sekunden=" + sekundenVon + "-" + sekundenBis + ", gruppeId=" + gruppeId + "]"; + } + + public boolean isAufgabePassend(int level, Mitspieler aktiv, Mitspieler passiv) { + if (level != this.level && level - 1 != this.level) { + return false; + } + if (benoetigtPassiv != null) { + for (Werkzeug werkzeug : benoetigtPassiv) { + if (!passiv.isVerfuegbar(werkzeug)) { + return false; + } + } + } + if (benoetigtAktiv == null || benoetigtAktiv.isEmpty()) { + return true; + } else { + for (Werkzeug werkzeug : benoetigtAktiv) { + if (aktiv.isVerfuegbar(werkzeug)) { + return true; + } + } + return false; + } + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppe.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppe.java similarity index 90% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppe.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppe.java index 1c67ea9..3062971 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppe.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppe.java @@ -1,26 +1,26 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -public class AufgabenGruppe { - - private UUID gruppenId; - private String name; - private String beschreibung; - private String von; - private UUID userId; - private boolean privateGruppe; - private List aufgaben; - private List strafen; - private List sperren; - private List finisher; - private String bild; - private long subscriberCount; - private boolean subscribed; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +public class AufgabenGruppe { + + private UUID gruppenId; + private String name; + private String beschreibung; + private String von; + private UUID userId; + private boolean privateGruppe; + private List aufgaben; + private List strafen; + private List sperren; + private List finisher; + private String bild; + private long subscriberCount; + private boolean subscribed; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeDisplay.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeDisplay.java similarity index 86% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeDisplay.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeDisplay.java index aee5798..2512042 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeDisplay.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeDisplay.java @@ -1,19 +1,19 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.UUID; - -@Getter -@Setter -public class AufgabenGruppeDisplay { - - private UUID gruppenId; - private String name; - private String beschreibung; - private UUID userId; - private boolean privateGruppe; - private String bild; - private String von; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class AufgabenGruppeDisplay { + + private UUID gruppenId; + private String name; + private String beschreibung; + private UUID userId; + private boolean privateGruppe; + private String bild; + private String von; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeList.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeList.java similarity index 80% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeList.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeList.java index 26b8883..a67fbdb 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeList.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeList.java @@ -1,13 +1,13 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class AufgabenGruppeList { - - private List gruppen; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class AufgabenGruppeList { + + private List gruppen; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppePage.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppePage.java similarity index 84% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppePage.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppePage.java index 073d00f..103f032 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppePage.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppePage.java @@ -1,16 +1,16 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class AufgabenGruppePage { - - private List content; - private int currentPage; - private int totalPages; - private long totalElements; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class AufgabenGruppePage { + + private List content; + private int currentPage; + private int totalPages; + private long totalElements; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeService.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeService.java similarity index 91% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeService.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeService.java index eb069d4..a4c6535 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/AufgabenGruppeService.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenGruppeService.java @@ -1,17 +1,18 @@ -package de.oaa.xxx.aufgaben; +package de.oaa.xxx.games.common.aufgaben; + +import de.oaa.xxx.games.common.entity.AufgabeEntity; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.FinisherEntity; +import de.oaa.xxx.games.common.entity.SperreEntity; +import de.oaa.xxx.games.common.entity.StrafeEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabeRepository; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.FinisherRepository; +import de.oaa.xxx.games.common.repository.SperreRepository; +import de.oaa.xxx.games.common.repository.StrafeRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; -import de.oaa.xxx.aufgaben.entity.AufgabeEntity; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.FinisherEntity; -import de.oaa.xxx.aufgaben.entity.SperreEntity; -import de.oaa.xxx.aufgaben.entity.StrafeEntity; -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import de.oaa.xxx.aufgaben.repository.AufgabeRepository; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.FinisherRepository; -import de.oaa.xxx.aufgaben.repository.SperreRepository; -import de.oaa.xxx.aufgaben.repository.StrafeRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/AufgabenList.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenList.java similarity index 89% rename from xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/AufgabenList.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenList.java index 6701e48..05d163d 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/AufgabenList.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/AufgabenList.java @@ -1,25 +1,25 @@ -package de.oaa.xxx.games.bdsm.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class AufgabenList { - - private List aufgaben; - private List sperren; - private List strafen; - private List finisher; - - public int size() { - int size = 0; - if (aufgaben != null) size += aufgaben.size(); - if (sperren != null) size += sperren.size(); - if (strafen != null) size += strafen.size(); - if (getFinisher() != null) size += getFinisher().size(); - return size; - } -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class AufgabenList { + + private List aufgaben; + private List sperren; + private List strafen; + private List finisher; + + public int size() { + int size = 0; + if (aufgaben != null) size += aufgaben.size(); + if (sperren != null) size += sperren.size(); + if (strafen != null) size += strafen.size(); + if (getFinisher() != null) size += getFinisher().size(); + return size; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/DefaultFiller.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/DefaultFiller.java similarity index 96% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/DefaultFiller.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/DefaultFiller.java index e64a1a5..b78ce26 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/DefaultFiller.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/DefaultFiller.java @@ -1,18 +1,25 @@ -package de.oaa.xxx.aufgaben; +package de.oaa.xxx.games.common.aufgaben; + +import de.oaa.xxx.games.common.entity.AufgabeEntity; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.SperreEntity; +import de.oaa.xxx.games.common.entity.StrafeEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabeRepository; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.SperreRepository; +import de.oaa.xxx.games.common.repository.StrafeRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; -import de.oaa.xxx.aufgaben.entity.AufgabeEntity; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.SperreEntity; -import de.oaa.xxx.aufgaben.entity.StrafeEntity; -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import de.oaa.xxx.aufgaben.repository.AufgabeRepository; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.SperreRepository; -import de.oaa.xxx.aufgaben.repository.StrafeRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import static de.oaa.xxx.games.common.aufgaben.Werkzeug.ANUS; +import static de.oaa.xxx.games.common.aufgaben.Werkzeug.MUND; +import static de.oaa.xxx.games.common.aufgaben.Werkzeug.PENIS; +import static de.oaa.xxx.games.common.aufgaben.Werkzeug.UMSCHNALLDILDO; +import static de.oaa.xxx.games.common.aufgaben.Werkzeug.VAGINA; + import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -20,12 +27,6 @@ import java.util.Collections; import java.util.List; import java.util.UUID; -import static de.oaa.xxx.aufgaben.Werkzeug.ANUS; -import static de.oaa.xxx.aufgaben.Werkzeug.MUND; -import static de.oaa.xxx.aufgaben.Werkzeug.PENIS; -import static de.oaa.xxx.aufgaben.Werkzeug.UMSCHNALLDILDO; -import static de.oaa.xxx.aufgaben.Werkzeug.VAGINA; - @Component public class DefaultFiller { diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Favorit.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Favorit.java similarity index 81% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Favorit.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Favorit.java index 758c0be..891deb3 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Favorit.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Favorit.java @@ -1,15 +1,15 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.UUID; - -@Getter -@Setter -public class Favorit { - - private UUID favoritId; - private UUID userId; - private UUID aufgabenGruppeId; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class Favorit { + + private UUID favoritId; + private UUID userId; + private UUID aufgabenGruppeId; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/FavoritList.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/FavoritList.java similarity index 78% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/FavoritList.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/FavoritList.java index 9b9cf50..0e66478 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/FavoritList.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/FavoritList.java @@ -1,13 +1,13 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class FavoritList { - - private List favoriten; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class FavoritList { + + private List favoriten; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Finisher.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Finisher.java similarity index 85% rename from xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Finisher.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Finisher.java index 0a2c413..2b8bec7 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Finisher.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Finisher.java @@ -1,14 +1,13 @@ -package de.oaa.xxx.games.bdsm.aufgaben; - -import de.oaa.xxx.games.bdsm.GeschlechtEnum; -import de.oaa.xxx.games.bdsm.Mitspieler; -import de.oaa.xxx.games.bdsm.Werkzeug; -import lombok.Getter; -import lombok.Setter; +package de.oaa.xxx.games.common.aufgaben; import java.util.List; import java.util.UUID; +import de.oaa.xxx.games.bdsm.GeschlechtEnum; +import de.oaa.xxx.games.bdsm.Mitspieler; +import lombok.Getter; +import lombok.Setter; + @Getter @Setter public class Finisher { @@ -19,13 +18,15 @@ public class Finisher { private GeschlechtEnum geschlecht; private List benoetigtAktiv; private List benoetigtPassiv; + private List benoetigteToys; + private UUID gruppeId; @Override public String toString() { - return "Finisher[id=" + finisherId + ", kurzText=" + kurzText + ", geschlecht=" + geschlecht + "]"; + return "Finisher[id=" + finisherId + ", kurzText=" + kurzText + ", geschlecht=" + geschlecht + ", gruppeId=" + gruppeId + "]"; } - - public boolean isAufgabePassend(Mitspieler aktiv, Mitspieler passiv) { + + public boolean isAufgabePassend(Mitspieler aktiv, Mitspieler passiv) { if (benoetigtPassiv != null) { for (Werkzeug werkzeug : benoetigtPassiv) { if (!passiv.isVerfuegbar(werkzeug)) { diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ImageScaler.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ImageScaler.java similarity index 96% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ImageScaler.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ImageScaler.java index 0125014..09df2d0 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ImageScaler.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ImageScaler.java @@ -1,58 +1,58 @@ -package de.oaa.xxx.aufgaben; - -import org.slf4j.LoggerFactory; - -import javax.imageio.ImageIO; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -public class ImageScaler { - - private static final int MAX_SIZE = 128; - - public byte[] scale(byte[] origBytes) { - try (ByteArrayInputStream bais = new ByteArrayInputStream(origBytes)) { - BufferedImage orig = ImageIO.read(bais); - if (orig == null) { - return origBytes; - } - - int origWidth = orig.getWidth(); - int origHeight = orig.getHeight(); - - // Bereits klein genug – unverändern zurückgeben - if (origWidth <= MAX_SIZE && origHeight <= MAX_SIZE) { - return origBytes; - } - - // Seitenverhältnis beibehalten: längste Seite auf MAX_SIZE - int newWidth, newHeight; - if (origWidth >= origHeight) { - newWidth = MAX_SIZE; - newHeight = Math.max(1, Math.round((float) MAX_SIZE * origHeight / origWidth)); - } else { - newHeight = MAX_SIZE; - newWidth = Math.max(1, Math.round((float) MAX_SIZE * origWidth / origHeight)); - } - - BufferedImage scaled = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = scaled.createGraphics(); - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g.drawImage(orig, 0, 0, newWidth, newHeight, null); - g.dispose(); - - try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - ImageIO.write(scaled, "png", baos); - return baos.toByteArray(); - } - } catch (IOException e) { - LoggerFactory.getLogger(ImageScaler.class).error("Fehler beim Skalieren des Bildes", e); - return origBytes; - } - } -} +package de.oaa.xxx.games.common.aufgaben; + +import org.slf4j.LoggerFactory; + +import javax.imageio.ImageIO; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +public class ImageScaler { + + private static final int MAX_SIZE = 128; + + public byte[] scale(byte[] origBytes) { + try (ByteArrayInputStream bais = new ByteArrayInputStream(origBytes)) { + BufferedImage orig = ImageIO.read(bais); + if (orig == null) { + return origBytes; + } + + int origWidth = orig.getWidth(); + int origHeight = orig.getHeight(); + + // Bereits klein genug – unverändern zurückgeben + if (origWidth <= MAX_SIZE && origHeight <= MAX_SIZE) { + return origBytes; + } + + // Seitenverhältnis beibehalten: längste Seite auf MAX_SIZE + int newWidth, newHeight; + if (origWidth >= origHeight) { + newWidth = MAX_SIZE; + newHeight = Math.max(1, Math.round((float) MAX_SIZE * origHeight / origWidth)); + } else { + newHeight = MAX_SIZE; + newWidth = Math.max(1, Math.round((float) MAX_SIZE * origWidth / origHeight)); + } + + BufferedImage scaled = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = scaled.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g.drawImage(orig, 0, 0, newWidth, newHeight, null); + g.dispose(); + + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + ImageIO.write(scaled, "png", baos); + return baos.toByteArray(); + } + } catch (IOException e) { + LoggerFactory.getLogger(ImageScaler.class).error("Fehler beim Skalieren des Bildes", e); + return origBytes; + } + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Sperre.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Sperre.java similarity index 88% rename from xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Sperre.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Sperre.java index 28fa8e4..48727d1 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Sperre.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Sperre.java @@ -1,38 +1,38 @@ -package de.oaa.xxx.games.bdsm.aufgaben; - -import de.oaa.xxx.games.bdsm.Mitspieler; -import de.oaa.xxx.games.bdsm.Werkzeug; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -public class Sperre { - - private UUID sperreId; - private String kurzText; - private String text; - private String releaseText; - private UUID gruppeId; - private List sperreFuer; - private Integer minutenVon; - private Integer minutenBis; - - @Override - public String toString() { - return "Sperre[id=" + sperreId + ", kurzText=" + kurzText - + ", minuten=" + minutenVon + "-" + minutenBis + ", fuer=" + sperreFuer + ", gruppeId=" + gruppeId + "]"; - } - - public boolean isAufgabePassend(Mitspieler passiv) { - for (Werkzeug werkzeug : sperreFuer) { - if (!passiv.isVerfuegbar(werkzeug)) { - return false; - } - } - return true; - } -} +package de.oaa.xxx.games.common.aufgaben; + +import java.util.List; +import java.util.UUID; + +import de.oaa.xxx.games.bdsm.Mitspieler; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Sperre { + + private UUID sperreId; + private String kurzText; + private String text; + private String releaseText; + private UUID gruppeId; + private List sperreFuer; + private Integer minutenVon; + private Integer minutenBis; + private List benoetigteToys; + + @Override + public String toString() { + return "Sperre[id=" + sperreId + ", kurzText=" + kurzText + + ", minuten=" + minutenVon + "-" + minutenBis + ", fuer=" + sperreFuer + ", gruppeId=" + gruppeId + "]"; + } + + public boolean isAufgabePassend(Mitspieler passiv) { + for (Werkzeug werkzeug : sperreFuer) { + if (!passiv.isVerfuegbar(werkzeug)) { + return false; + } + } + return true; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Strafe.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Strafe.java similarity index 90% rename from xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Strafe.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Strafe.java index b1cb3ad..a795d87 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/games/bdsm/aufgaben/Strafe.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Strafe.java @@ -1,47 +1,47 @@ -package de.oaa.xxx.games.bdsm.aufgaben; - -import de.oaa.xxx.games.bdsm.Mitspieler; -import de.oaa.xxx.games.bdsm.Werkzeug; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -public class Strafe { - - private UUID strafeId; - private Integer level; - private String text; - private String kurzText; - private Integer sekundenVon; - private Integer sekundenBis; - private UUID gruppeId; - private List benoetigtAktiv; - private List benoetigtPassiv; - - public boolean isAufgabePassend(int level, Mitspieler aktiv, Mitspieler passiv) { - if (level != this.level && level - 1 != this.level) { - return false; - } - if (benoetigtPassiv != null) { - for (Werkzeug werkzeug : benoetigtPassiv) { - if (!passiv.isVerfuegbar(werkzeug)) { - return false; - } - } - } - if (benoetigtAktiv == null || benoetigtAktiv.isEmpty()) { - return true; - } else { - for (Werkzeug werkzeug : benoetigtAktiv) { - if (aktiv.isVerfuegbar(werkzeug)) { - return true; - } - } - return false; - } - } -} +package de.oaa.xxx.games.common.aufgaben; + +import java.util.List; +import java.util.UUID; + +import de.oaa.xxx.games.bdsm.Mitspieler; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Strafe { + + private UUID strafeId; + private Integer level; + private String text; + private String kurzText; + private Integer sekundenVon; + private Integer sekundenBis; + private UUID gruppeId; + private List benoetigtAktiv; + private List benoetigtPassiv; + private List benoetigteToys; + + public boolean isAufgabePassend(int level, Mitspieler aktiv, Mitspieler passiv) { + if (level != this.level && level - 1 != this.level) { + return false; + } + if (benoetigtPassiv != null) { + for (Werkzeug werkzeug : benoetigtPassiv) { + if (!passiv.isVerfuegbar(werkzeug)) { + return false; + } + } + } + if (benoetigtAktiv == null || benoetigtAktiv.isEmpty()) { + return true; + } else { + for (Werkzeug werkzeug : benoetigtAktiv) { + if (aktiv.isVerfuegbar(werkzeug)) { + return true; + } + } + return false; + } + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Toy.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Toy.java similarity index 83% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Toy.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Toy.java index b7f005a..fe12a70 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Toy.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Toy.java @@ -1,17 +1,17 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.UUID; - -@Getter -@Setter -public class Toy { - - private UUID toyId; - private String name; - private String beschreibung; - private UUID userId; - private String bild; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class Toy { + + private UUID toyId; + private String name; + private String beschreibung; + private UUID userId; + private String bild; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ToyList.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ToyList.java similarity index 80% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ToyList.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ToyList.java index 32999f3..ed35647 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ToyList.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ToyList.java @@ -1,14 +1,14 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class ToyList { - - private List systemToys; - private List userToys; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class ToyList { + + private List systemToys; + private List userToys; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ToyPage.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ToyPage.java similarity index 83% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ToyPage.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ToyPage.java index e6aa300..0c76b81 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/ToyPage.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/ToyPage.java @@ -1,16 +1,16 @@ -package de.oaa.xxx.aufgaben; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class ToyPage { - - private List content; - private int currentPage; - private int totalPages; - private long totalElements; -} +package de.oaa.xxx.games.common.aufgaben; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class ToyPage { + + private List content; + private int currentPage; + private int totalPages; + private long totalElements; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Werkzeug.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Werkzeug.java similarity index 94% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Werkzeug.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Werkzeug.java index c243330..84f3f5c 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/Werkzeug.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/aufgaben/Werkzeug.java @@ -1,21 +1,21 @@ -package de.oaa.xxx.aufgaben; - -public enum Werkzeug { - - MUND("Mund", "Ob die Person gewillt ist den Mund einzusetzen."), - VAGINA("Vagina", "Ob die Person über eine Vagina verfügt und gewillt ist diese einzusetzen."), - PENIS("Penis", "Ob die Person über einen Penis verfügt und gewillt ist diesen einzusetzen."), - ANUS("Anus", "Ob die Person gewillt ist den Anus einzusetzen."), - UMSCHNALLDILDO("Umschnall-Dildo", "Ob die Person über einen Umschnall-Dildo verfügt und gewillt ist diesen einzusetzen."); - - private final String anzeige; - private final String beschreibung; - - Werkzeug(String anzeige, String beschreibung) { - this.anzeige = anzeige; - this.beschreibung = beschreibung; - } - - public String beschreibungsText() { return beschreibung; } - public String anzeigeText() { return anzeige; } -} +package de.oaa.xxx.games.common.aufgaben; + +public enum Werkzeug { + + MUND("Mund", "Ob die Person gewillt ist den Mund einzusetzen."), + VAGINA("Vagina", "Ob die Person über eine Vagina verfügt und gewillt ist diese einzusetzen."), + PENIS("Penis", "Ob die Person über einen Penis verfügt und gewillt ist diesen einzusetzen."), + ANUS("Anus", "Ob die Person gewillt ist den Anus einzusetzen."), + UMSCHNALLDILDO("Umschnall-Dildo", "Ob die Person über einen Umschnall-Dildo verfügt und gewillt ist diesen einzusetzen."); + + private final String anzeige; + private final String beschreibung; + + Werkzeug(String anzeige, String beschreibung) { + this.anzeige = anzeige; + this.beschreibung = beschreibung; + } + + public String beschreibungsText() { return beschreibung; } + public String anzeigeText() { return anzeige; } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/AufgabeEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/AufgabeEntity.java similarity index 94% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/AufgabeEntity.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/AufgabeEntity.java index 0b1f491..c92aa33 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/AufgabeEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/AufgabeEntity.java @@ -1,96 +1,97 @@ -package de.oaa.xxx.aufgaben.entity; - -import de.oaa.xxx.aufgaben.Aufgabe; -import de.oaa.xxx.aufgaben.Werkzeug; -import jakarta.persistence.CascadeType; -import jakarta.persistence.CollectionTable; -import jakarta.persistence.Column; -import jakarta.persistence.ElementCollection; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.JoinTable; -import jakarta.persistence.ManyToMany; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "aufgabe") -public class AufgabeEntity { - - @Id - @Column - private UUID aufgabeId; - @Column - private String kurzText; - @Column(columnDefinition = "TEXT") - private String text; - @Column - private Integer level; - @Column - private Integer sekundenVon; - @Column - private Integer sekundenBis; - @ManyToOne - @JoinColumn(name = "gruppeId") - private AufgabenGruppeEntity aufgabenGruppe; - @Enumerated(EnumType.STRING) - @ElementCollection(targetClass = Werkzeug.class) - @CollectionTable(name = "aufgabe_benoetigtAktiv", joinColumns = @JoinColumn(name = "aufgabeId")) - @Column(name = "werkzeug") - private List benoetigtAktiv; - @Enumerated(EnumType.STRING) - @ElementCollection(targetClass = Werkzeug.class) - @CollectionTable(name = "aufgabe_benoetigtPassiv", joinColumns = @JoinColumn(name = "aufgabeId")) - @Column(name = "werkzeug") - private List benoetigtPassiv; - @ManyToMany(cascade = CascadeType.DETACH) - @JoinTable(name = "aufgabeToy", joinColumns = {@JoinColumn(name = "aufgabeId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) - private List benoetigteToys; - - @Override - public String toString() { - return "AufgabeEntity[id=" + aufgabeId + ", kurzText=" + kurzText + ", level=" + level - + ", sekunden=" + sekundenVon + "-" + sekundenBis + "]"; - } - - public Aufgabe toAufgabe() { - Aufgabe aufgabe = new Aufgabe(); - aufgabe.setAufgabeId(aufgabeId); - aufgabe.setBenoetigtAktiv(benoetigtAktiv != null ? new ArrayList<>(benoetigtAktiv) : new ArrayList<>()); - aufgabe.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); - aufgabe.setBenoetigtPassiv(benoetigtPassiv != null ? new ArrayList<>(benoetigtPassiv) : new ArrayList<>()); - aufgabe.setGruppeId(aufgabenGruppe.getGruppenId()); - aufgabe.setKurzText(kurzText); - aufgabe.setLevel(level); - aufgabe.setSekundenBis(sekundenBis); - aufgabe.setSekundenVon(sekundenVon); - aufgabe.setText(text); - return aufgabe; - } - - public static AufgabeEntity create(Aufgabe aufgabe, AufgabenGruppeEntity aufgabenGruppeEntity, List toys) { - AufgabeEntity entity = new AufgabeEntity(); - entity.setAufgabeId(UUID.randomUUID()); - entity.setAufgabenGruppe(aufgabenGruppeEntity); - entity.setBenoetigtAktiv(aufgabe.getBenoetigtAktiv()); - entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); - entity.setBenoetigtPassiv(aufgabe.getBenoetigtPassiv()); - entity.setKurzText(aufgabe.getKurzText()); - entity.setLevel(aufgabe.getLevel()); - entity.setSekundenBis(aufgabe.getSekundenBis()); - entity.setSekundenVon(aufgabe.getSekundenVon()); - entity.setText(aufgabe.getText()); - return entity; - } -} +package de.oaa.xxx.games.common.entity; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import de.oaa.xxx.games.common.aufgaben.Aufgabe; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; + +@Getter +@Setter +@Entity +@Table(name = "aufgabe") +public class AufgabeEntity { + + @Id + @Column + private UUID aufgabeId; + @Column + private String kurzText; + @Column(columnDefinition = "TEXT") + private String text; + @Column + private Integer level; + @Column + private Integer sekundenVon; + @Column + private Integer sekundenBis; + @ManyToOne + @JoinColumn(name = "gruppeId") + private AufgabenGruppeEntity aufgabenGruppe; + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = Werkzeug.class) + @CollectionTable(name = "aufgabe_benoetigtAktiv", joinColumns = @JoinColumn(name = "aufgabeId")) + @Column(name = "werkzeug") + private List benoetigtAktiv; + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = Werkzeug.class) + @CollectionTable(name = "aufgabe_benoetigtPassiv", joinColumns = @JoinColumn(name = "aufgabeId")) + @Column(name = "werkzeug") + private List benoetigtPassiv; + @ManyToMany(cascade = CascadeType.DETACH) + @JoinTable(name = "aufgabeToy", joinColumns = {@JoinColumn(name = "aufgabeId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) + private List benoetigteToys; + + @Override + public String toString() { + return "AufgabeEntity[id=" + aufgabeId + ", kurzText=" + kurzText + ", level=" + level + + ", sekunden=" + sekundenVon + "-" + sekundenBis + "]"; + } + + public Aufgabe toAufgabe() { + Aufgabe aufgabe = new Aufgabe(); + aufgabe.setAufgabeId(aufgabeId); + aufgabe.setBenoetigtAktiv(benoetigtAktiv != null ? new ArrayList<>(benoetigtAktiv) : new ArrayList<>()); + aufgabe.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); + aufgabe.setBenoetigtPassiv(benoetigtPassiv != null ? new ArrayList<>(benoetigtPassiv) : new ArrayList<>()); + aufgabe.setGruppeId(aufgabenGruppe.getGruppenId()); + aufgabe.setKurzText(kurzText); + aufgabe.setLevel(level); + aufgabe.setSekundenBis(sekundenBis); + aufgabe.setSekundenVon(sekundenVon); + aufgabe.setText(text); + return aufgabe; + } + + public static AufgabeEntity create(Aufgabe aufgabe, AufgabenGruppeEntity aufgabenGruppeEntity, List toys) { + AufgabeEntity entity = new AufgabeEntity(); + entity.setAufgabeId(UUID.randomUUID()); + entity.setAufgabenGruppe(aufgabenGruppeEntity); + entity.setBenoetigtAktiv(aufgabe.getBenoetigtAktiv()); + entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); + entity.setBenoetigtPassiv(aufgabe.getBenoetigtPassiv()); + entity.setKurzText(aufgabe.getKurzText()); + entity.setLevel(aufgabe.getLevel()); + entity.setSekundenBis(aufgabe.getSekundenBis()); + entity.setSekundenVon(aufgabe.getSekundenVon()); + entity.setText(aufgabe.getText()); + return entity; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/AufgabenGruppeEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/AufgabenGruppeEntity.java similarity index 93% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/AufgabenGruppeEntity.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/AufgabenGruppeEntity.java index 1f1fb00..09efbae 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/AufgabenGruppeEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/AufgabenGruppeEntity.java @@ -1,94 +1,95 @@ -package de.oaa.xxx.aufgaben.entity; - -import de.oaa.xxx.aufgaben.AufgabenGruppe; -import de.oaa.xxx.aufgaben.AufgabenGruppeDisplay; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Lob; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.util.Base64; -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "aufgaben_gruppe") -public class AufgabenGruppeEntity { - - @Id - @Column - private UUID gruppenId; - @Column - private String name; - @Column - private String beschreibung; - @Column - private UUID userId; - @Column - private boolean privateGruppe; - @Lob - @Column(columnDefinition = "BLOB") - private byte[] bild; - @Column - private String von; - @OneToMany(mappedBy = "aufgabenGruppe") - private List aufgaben; - @OneToMany(mappedBy = "aufgabenGruppe") - private List strafen; - @OneToMany(mappedBy = "aufgabenGruppe") - private List sperren; - @OneToMany(mappedBy = "aufgabenGruppe") - private List finisher; - - @Override - public String toString() { - return "AufgabenGruppeEntity[gruppenId=" + gruppenId + ", name=" + name + ", userId=" + userId - + ", privat=" + privateGruppe + ", von=" + von + "]"; - } - - public AufgabenGruppe toAufgabenGruppe() { - AufgabenGruppe gruppe = new AufgabenGruppe(); - gruppe.setGruppenId(gruppenId); - gruppe.setUserId(userId); - gruppe.setName(name); - gruppe.setBeschreibung(beschreibung); - gruppe.setPrivateGruppe(privateGruppe); - gruppe.setBild(bild != null ? Base64.getEncoder().encodeToString(bild) : null); - gruppe.setVon(von); - gruppe.setAufgaben(aufgaben.stream().map(AufgabeEntity::toAufgabe).toList()); - gruppe.setStrafen(strafen.stream().map(StrafeEntity::toStrafe).toList()); - gruppe.setSperren(sperren.stream().map(SperreEntity::toSperre).toList()); - gruppe.setFinisher(finisher.stream().map(FinisherEntity::toFinisher).toList()); - return gruppe; - } - - public static AufgabenGruppeEntity create(AufgabenGruppe gruppe) { - AufgabenGruppeEntity entity = new AufgabenGruppeEntity(); - entity.setGruppenId(UUID.randomUUID()); - entity.setName(gruppe.getName()); - entity.setBeschreibung(gruppe.getBeschreibung()); - entity.setUserId(gruppe.getUserId()); - entity.setPrivateGruppe(gruppe.isPrivateGruppe()); - entity.setBild(gruppe.getBild() != null ? Base64.getDecoder().decode(gruppe.getBild()) : null); - entity.setVon(gruppe.getVon()); - return entity; - } - - public AufgabenGruppeDisplay toAufgabenGruppeDisplay() { - AufgabenGruppeDisplay display = new AufgabenGruppeDisplay(); - display.setGruppenId(gruppenId); - display.setUserId(userId); - display.setName(name); - display.setBeschreibung(beschreibung); - display.setPrivateGruppe(privateGruppe); - display.setBild(bild != null ? Base64.getEncoder().encodeToString(bild) : null); - display.setVon(von); - return display; - } -} +package de.oaa.xxx.games.common.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.util.Base64; +import java.util.List; +import java.util.UUID; + +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppe; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppeDisplay; + +@Getter +@Setter +@Entity +@Table(name = "aufgaben_gruppe") +public class AufgabenGruppeEntity { + + @Id + @Column + private UUID gruppenId; + @Column + private String name; + @Column + private String beschreibung; + @Column + private UUID userId; + @Column + private boolean privateGruppe; + @Lob + @Column(columnDefinition = "BLOB") + private byte[] bild; + @Column + private String von; + @OneToMany(mappedBy = "aufgabenGruppe") + private List aufgaben; + @OneToMany(mappedBy = "aufgabenGruppe") + private List strafen; + @OneToMany(mappedBy = "aufgabenGruppe") + private List sperren; + @OneToMany(mappedBy = "aufgabenGruppe") + private List finisher; + + @Override + public String toString() { + return "AufgabenGruppeEntity[gruppenId=" + gruppenId + ", name=" + name + ", userId=" + userId + + ", privat=" + privateGruppe + ", von=" + von + "]"; + } + + public AufgabenGruppe toAufgabenGruppe() { + AufgabenGruppe gruppe = new AufgabenGruppe(); + gruppe.setGruppenId(gruppenId); + gruppe.setUserId(userId); + gruppe.setName(name); + gruppe.setBeschreibung(beschreibung); + gruppe.setPrivateGruppe(privateGruppe); + gruppe.setBild(bild != null ? Base64.getEncoder().encodeToString(bild) : null); + gruppe.setVon(von); + gruppe.setAufgaben(aufgaben.stream().map(AufgabeEntity::toAufgabe).toList()); + gruppe.setStrafen(strafen.stream().map(StrafeEntity::toStrafe).toList()); + gruppe.setSperren(sperren.stream().map(SperreEntity::toSperre).toList()); + gruppe.setFinisher(finisher.stream().map(FinisherEntity::toFinisher).toList()); + return gruppe; + } + + public static AufgabenGruppeEntity create(AufgabenGruppe gruppe) { + AufgabenGruppeEntity entity = new AufgabenGruppeEntity(); + entity.setGruppenId(UUID.randomUUID()); + entity.setName(gruppe.getName()); + entity.setBeschreibung(gruppe.getBeschreibung()); + entity.setUserId(gruppe.getUserId()); + entity.setPrivateGruppe(gruppe.isPrivateGruppe()); + entity.setBild(gruppe.getBild() != null ? Base64.getDecoder().decode(gruppe.getBild()) : null); + entity.setVon(gruppe.getVon()); + return entity; + } + + public AufgabenGruppeDisplay toAufgabenGruppeDisplay() { + AufgabenGruppeDisplay display = new AufgabenGruppeDisplay(); + display.setGruppenId(gruppenId); + display.setUserId(userId); + display.setName(name); + display.setBeschreibung(beschreibung); + display.setPrivateGruppe(privateGruppe); + display.setBild(bild != null ? Base64.getEncoder().encodeToString(bild) : null); + display.setVon(von); + return display; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/FavoritEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/FavoritEntity.java similarity index 90% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/FavoritEntity.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/FavoritEntity.java index 31563a7..f9a45a9 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/FavoritEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/FavoritEntity.java @@ -1,47 +1,48 @@ -package de.oaa.xxx.aufgaben.entity; - -import de.oaa.xxx.aufgaben.Favorit; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "favorit") -public class FavoritEntity { - - @Id - @Column - private UUID favoritId; - @Column - private UUID userId; - @Column - private UUID aufgabenGruppeId; - - @Override - public String toString() { - return "FavoritEntity[favoritId=" + favoritId + ", userId=" + userId + ", gruppeId=" + aufgabenGruppeId + "]"; - } - - public Favorit toFavorit() { - Favorit favorit = new Favorit(); - favorit.setAufgabenGruppeId(aufgabenGruppeId); - favorit.setFavoritId(favoritId); - favorit.setUserId(userId); - return favorit; - } - - public static FavoritEntity fromFavorit(Favorit favorit, UUID userId) { - FavoritEntity entity = new FavoritEntity(); - entity.setFavoritId(UUID.randomUUID()); - entity.setAufgabenGruppeId(favorit.getAufgabenGruppeId()); - entity.setUserId(userId); - return entity; - } -} +package de.oaa.xxx.games.common.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +import de.oaa.xxx.games.common.aufgaben.Favorit; + +@Getter +@Setter +@Entity +@Table(name = "favorit") +public class FavoritEntity { + + @Id + @Column + private UUID favoritId; + @Column + private UUID userId; + @Column + private UUID aufgabenGruppeId; + + @Override + public String toString() { + return "FavoritEntity[favoritId=" + favoritId + ", userId=" + userId + ", gruppeId=" + aufgabenGruppeId + "]"; + } + + public Favorit toFavorit() { + Favorit favorit = new Favorit(); + favorit.setAufgabenGruppeId(aufgabenGruppeId); + favorit.setFavoritId(favoritId); + favorit.setUserId(userId); + return favorit; + } + + public static FavoritEntity fromFavorit(Favorit favorit, UUID userId) { + FavoritEntity entity = new FavoritEntity(); + entity.setFavoritId(UUID.randomUUID()); + entity.setAufgabenGruppeId(favorit.getAufgabenGruppeId()); + entity.setUserId(userId); + return entity; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/FinisherEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/FinisherEntity.java similarity index 94% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/FinisherEntity.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/FinisherEntity.java index b4b7c55..36aabe6 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/FinisherEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/FinisherEntity.java @@ -1,89 +1,89 @@ -package de.oaa.xxx.aufgaben.entity; - -import de.oaa.xxx.aufgaben.Finisher; -import de.oaa.xxx.aufgaben.Werkzeug; -import de.oaa.xxx.games.bdsm.GeschlechtEnum; -import jakarta.persistence.CascadeType; -import jakarta.persistence.CollectionTable; -import jakarta.persistence.Column; -import jakarta.persistence.ElementCollection; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.JoinTable; -import jakarta.persistence.ManyToMany; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "finisher") -public class FinisherEntity { - - @Id - @Column - private UUID finisherId; - @Column - private String kurzText; - @Column(columnDefinition = "TEXT") - private String text; - @Enumerated(EnumType.STRING) - @Column - private GeschlechtEnum geschlecht; - @ManyToOne - @JoinColumn(name = "gruppeId") - private AufgabenGruppeEntity aufgabenGruppe; - @Enumerated(EnumType.STRING) - @ElementCollection(targetClass = Werkzeug.class) - @CollectionTable(name = "finisher_benoetigtAktiv", joinColumns = @JoinColumn(name = "finisherId")) - @Column(name = "werkzeug") - private List benoetigtAktiv; - @Enumerated(EnumType.STRING) - @ElementCollection(targetClass = Werkzeug.class) - @CollectionTable(name = "finisher_benoetigtPassiv", joinColumns = @JoinColumn(name = "finisherId")) - @Column(name = "werkzeug") - private List benoetigtPassiv; - @ManyToMany(cascade = CascadeType.DETACH) - @JoinTable(name = "finisherToy", joinColumns = {@JoinColumn(name = "finisherId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) - private List benoetigteToys; - - @Override - public String toString() { - return "FinisherEntity[id=" + finisherId + ", kurzText=" + kurzText + ", geschlecht=" + geschlecht + "]"; - } - - public Finisher toFinisher() { - Finisher finisher = new Finisher(); - finisher.setFinisherId(finisherId); - finisher.setKurzText(kurzText); - finisher.setText(text); - finisher.setGeschlecht(geschlecht); - finisher.setBenoetigtAktiv(benoetigtAktiv != null ? new ArrayList<>(benoetigtAktiv) : new ArrayList<>()); - finisher.setBenoetigtPassiv(benoetigtPassiv != null ? new ArrayList<>(benoetigtPassiv) : new ArrayList<>()); - finisher.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); - finisher.setGruppeId(aufgabenGruppe.getGruppenId()); - return finisher; - } - - public static FinisherEntity create(Finisher finisher, AufgabenGruppeEntity aufgabenGruppeEntity, List toys) { - FinisherEntity entity = new FinisherEntity(); - entity.setFinisherId(UUID.randomUUID()); - entity.setAufgabenGruppe(aufgabenGruppeEntity); - entity.setKurzText(finisher.getKurzText()); - entity.setText(finisher.getText()); - entity.setGeschlecht(finisher.getGeschlecht()); - entity.setBenoetigtAktiv(finisher.getBenoetigtAktiv()); - entity.setBenoetigtPassiv(finisher.getBenoetigtPassiv()); - entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); - return entity; - } -} +package de.oaa.xxx.games.common.entity; + +import de.oaa.xxx.games.bdsm.GeschlechtEnum; +import de.oaa.xxx.games.common.aufgaben.Finisher; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; +import jakarta.persistence.CascadeType; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +@Entity +@Table(name = "finisher") +public class FinisherEntity { + + @Id + @Column + private UUID finisherId; + @Column + private String kurzText; + @Column(columnDefinition = "TEXT") + private String text; + @Enumerated(EnumType.STRING) + @Column + private GeschlechtEnum geschlecht; + @ManyToOne + @JoinColumn(name = "gruppeId") + private AufgabenGruppeEntity aufgabenGruppe; + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = Werkzeug.class) + @CollectionTable(name = "finisher_benoetigtAktiv", joinColumns = @JoinColumn(name = "finisherId")) + @Column(name = "werkzeug") + private List benoetigtAktiv; + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = Werkzeug.class) + @CollectionTable(name = "finisher_benoetigtPassiv", joinColumns = @JoinColumn(name = "finisherId")) + @Column(name = "werkzeug") + private List benoetigtPassiv; + @ManyToMany(cascade = CascadeType.DETACH) + @JoinTable(name = "finisherToy", joinColumns = {@JoinColumn(name = "finisherId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) + private List benoetigteToys; + + @Override + public String toString() { + return "FinisherEntity[id=" + finisherId + ", kurzText=" + kurzText + ", geschlecht=" + geschlecht + "]"; + } + + public Finisher toFinisher() { + Finisher finisher = new Finisher(); + finisher.setFinisherId(finisherId); + finisher.setKurzText(kurzText); + finisher.setText(text); + finisher.setGeschlecht(geschlecht); + finisher.setBenoetigtAktiv(benoetigtAktiv != null ? new ArrayList<>(benoetigtAktiv) : new ArrayList<>()); + finisher.setBenoetigtPassiv(benoetigtPassiv != null ? new ArrayList<>(benoetigtPassiv) : new ArrayList<>()); + finisher.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); + finisher.setGruppeId(aufgabenGruppe.getGruppenId()); + return finisher; + } + + public static FinisherEntity create(Finisher finisher, AufgabenGruppeEntity aufgabenGruppeEntity, List toys) { + FinisherEntity entity = new FinisherEntity(); + entity.setFinisherId(UUID.randomUUID()); + entity.setAufgabenGruppe(aufgabenGruppeEntity); + entity.setKurzText(finisher.getKurzText()); + entity.setText(finisher.getText()); + entity.setGeschlecht(finisher.getGeschlecht()); + entity.setBenoetigtAktiv(finisher.getBenoetigtAktiv()); + entity.setBenoetigtPassiv(finisher.getBenoetigtPassiv()); + entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); + return entity; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/GruppenAboEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/GruppenAboEntity.java similarity index 91% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/GruppenAboEntity.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/GruppenAboEntity.java index cf62c4f..762a2b1 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/GruppenAboEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/GruppenAboEntity.java @@ -1,36 +1,36 @@ -package de.oaa.xxx.aufgaben.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "gruppen_abo") -public class GruppenAboEntity { - - @Id - @Column - private UUID aboId; - - @Column - private UUID userId; - - @ManyToOne - @JoinColumn(name = "gruppenId") - private AufgabenGruppeEntity aufgabenGruppe; - - @Override - public String toString() { - return "GruppenAboEntity[aboId=" + aboId + ", userId=" + userId - + ", gruppe=" + (aufgabenGruppe != null ? aufgabenGruppe.getName() : null) + "]"; - } -} +package de.oaa.xxx.games.common.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +@Entity +@Table(name = "gruppen_abo") +public class GruppenAboEntity { + + @Id + @Column + private UUID aboId; + + @Column + private UUID userId; + + @ManyToOne + @JoinColumn(name = "gruppenId") + private AufgabenGruppeEntity aufgabenGruppe; + + @Override + public String toString() { + return "GruppenAboEntity[aboId=" + aboId + ", userId=" + userId + + ", gruppe=" + (aufgabenGruppe != null ? aufgabenGruppe.getName() : null) + "]"; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/SperreEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/SperreEntity.java similarity index 94% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/SperreEntity.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/SperreEntity.java index 10fc49f..5b8134f 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/SperreEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/SperreEntity.java @@ -1,89 +1,90 @@ -package de.oaa.xxx.aufgaben.entity; - -import de.oaa.xxx.aufgaben.Sperre; -import de.oaa.xxx.aufgaben.Werkzeug; -import jakarta.persistence.CascadeType; -import jakarta.persistence.CollectionTable; -import jakarta.persistence.Column; -import jakarta.persistence.ElementCollection; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.JoinTable; -import jakarta.persistence.ManyToMany; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "sperre") -public class SperreEntity { - - @Id - @Column - private UUID sperreId; - @Column - private String kurzText; - @Column(columnDefinition = "TEXT") - private String text; - @Column(columnDefinition = "TEXT") - private String releaseText; - @ManyToOne - @JoinColumn(name = "gruppeId") - private AufgabenGruppeEntity aufgabenGruppe; - @Enumerated(EnumType.STRING) - @ElementCollection(targetClass = Werkzeug.class) - @CollectionTable(name = "sperre_sperreFuer", joinColumns = @JoinColumn(name = "sperreId")) - @Column(name = "werkzeug") - private List sperreFuer; - @Column - private Integer minutenVon; - @Column - private Integer minutenBis; - @ManyToMany(cascade = CascadeType.DETACH) - @JoinTable(name = "sperreToy", joinColumns = {@JoinColumn(name = "sperreId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) - private List benoetigteToys; - - @Override - public String toString() { - return "SperreEntity[id=" + sperreId + ", kurzText=" + kurzText - + ", minuten=" + minutenVon + "-" + minutenBis + ", fuer=" + sperreFuer + "]"; - } - - public Sperre toSperre() { - Sperre sperre = new Sperre(); - sperre.setSperreId(sperreId); - sperre.setGruppeId(aufgabenGruppe.getGruppenId()); - sperre.setKurzText(kurzText); - sperre.setMinutenBis(minutenBis); - sperre.setMinutenVon(minutenVon); - sperre.setReleaseText(releaseText); - sperre.setSperreFuer(sperreFuer != null ? new ArrayList<>(sperreFuer) : new ArrayList<>()); - sperre.setText(text); - sperre.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); - return sperre; - } - - public static SperreEntity create(Sperre sperre, AufgabenGruppeEntity aufgabenGruppeEntity, List toys) { - SperreEntity entity = new SperreEntity(); - entity.setSperreId(UUID.randomUUID()); - entity.setAufgabenGruppe(aufgabenGruppeEntity); - entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); - entity.setKurzText(sperre.getKurzText()); - entity.setMinutenBis(sperre.getMinutenBis()); - entity.setMinutenVon(sperre.getMinutenVon()); - entity.setReleaseText(sperre.getReleaseText()); - entity.setSperreFuer(sperre.getSperreFuer()); - entity.setText(sperre.getText()); - return entity; - } -} +package de.oaa.xxx.games.common.entity; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import de.oaa.xxx.games.common.aufgaben.Sperre; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; + +@Getter +@Setter +@Entity +@Table(name = "sperre") +public class SperreEntity { + + @Id + @Column + private UUID sperreId; + @Column + private String kurzText; + @Column(columnDefinition = "TEXT") + private String text; + @Column(columnDefinition = "TEXT") + private String releaseText; + @ManyToOne + @JoinColumn(name = "gruppeId") + private AufgabenGruppeEntity aufgabenGruppe; + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = Werkzeug.class) + @CollectionTable(name = "sperre_sperreFuer", joinColumns = @JoinColumn(name = "sperreId")) + @Column(name = "werkzeug") + private List sperreFuer; + @Column + private Integer minutenVon; + @Column + private Integer minutenBis; + @ManyToMany(cascade = CascadeType.DETACH) + @JoinTable(name = "sperreToy", joinColumns = {@JoinColumn(name = "sperreId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) + private List benoetigteToys; + + @Override + public String toString() { + return "SperreEntity[id=" + sperreId + ", kurzText=" + kurzText + + ", minuten=" + minutenVon + "-" + minutenBis + ", fuer=" + sperreFuer + "]"; + } + + public Sperre toSperre() { + Sperre sperre = new Sperre(); + sperre.setSperreId(sperreId); + sperre.setGruppeId(aufgabenGruppe.getGruppenId()); + sperre.setKurzText(kurzText); + sperre.setMinutenBis(minutenBis); + sperre.setMinutenVon(minutenVon); + sperre.setReleaseText(releaseText); + sperre.setSperreFuer(sperreFuer != null ? new ArrayList<>(sperreFuer) : new ArrayList<>()); + sperre.setText(text); + sperre.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); + return sperre; + } + + public static SperreEntity create(Sperre sperre, AufgabenGruppeEntity aufgabenGruppeEntity, List toys) { + SperreEntity entity = new SperreEntity(); + entity.setSperreId(UUID.randomUUID()); + entity.setAufgabenGruppe(aufgabenGruppeEntity); + entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); + entity.setKurzText(sperre.getKurzText()); + entity.setMinutenBis(sperre.getMinutenBis()); + entity.setMinutenVon(sperre.getMinutenVon()); + entity.setReleaseText(sperre.getReleaseText()); + entity.setSperreFuer(sperre.getSperreFuer()); + entity.setText(sperre.getText()); + return entity; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/StrafeEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/StrafeEntity.java similarity index 94% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/StrafeEntity.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/StrafeEntity.java index b97d64b..d95b476 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/StrafeEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/StrafeEntity.java @@ -1,96 +1,97 @@ -package de.oaa.xxx.aufgaben.entity; - -import de.oaa.xxx.aufgaben.Strafe; -import de.oaa.xxx.aufgaben.Werkzeug; -import jakarta.persistence.CascadeType; -import jakarta.persistence.CollectionTable; -import jakarta.persistence.Column; -import jakarta.persistence.ElementCollection; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.JoinTable; -import jakarta.persistence.ManyToMany; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "strafe") -public class StrafeEntity { - - @Id - @Column - private UUID strafeId; - @Column - private String kurzText; - @Column - private Integer level; - @Column(columnDefinition = "TEXT") - private String text; - @Column - private Integer sekundenVon; - @Column - private Integer sekundenBis; - @ManyToOne - @JoinColumn(name = "gruppeId") - private AufgabenGruppeEntity aufgabenGruppe; - @Enumerated(EnumType.STRING) - @ElementCollection(targetClass = Werkzeug.class) - @CollectionTable(name = "strafe_benoetigtAktiv", joinColumns = @JoinColumn(name = "strafeId")) - @Column(name = "werkzeug") - private List benoetigtAktiv; - @Enumerated(EnumType.STRING) - @ElementCollection(targetClass = Werkzeug.class) - @CollectionTable(name = "strafe_benoetigtPassiv", joinColumns = @JoinColumn(name = "strafeId")) - @Column(name = "werkzeug") - private List benoetigtPassiv; - @ManyToMany(cascade = CascadeType.DETACH) - @JoinTable(name = "strafeToy", joinColumns = {@JoinColumn(name = "strafeId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) - private List benoetigteToys; - - @Override - public String toString() { - return "StrafeEntity[id=" + strafeId + ", kurzText=" + kurzText + ", level=" + level - + ", sekunden=" + sekundenVon + "-" + sekundenBis + "]"; - } - - public Strafe toStrafe() { - Strafe strafe = new Strafe(); - strafe.setStrafeId(strafeId); - strafe.setBenoetigtAktiv(benoetigtAktiv != null ? new ArrayList<>(benoetigtAktiv) : new ArrayList<>()); - strafe.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); - strafe.setBenoetigtPassiv(benoetigtPassiv != null ? new ArrayList<>(benoetigtPassiv) : new ArrayList<>()); - strafe.setGruppeId(aufgabenGruppe.getGruppenId()); - strafe.setKurzText(kurzText); - strafe.setLevel(level); - strafe.setSekundenBis(sekundenBis); - strafe.setSekundenVon(sekundenVon); - strafe.setText(text); - return strafe; - } - - public static StrafeEntity create(Strafe strafe, AufgabenGruppeEntity aufgabenGruppeEntity, List toys) { - StrafeEntity entity = new StrafeEntity(); - entity.setStrafeId(UUID.randomUUID()); - entity.setAufgabenGruppe(aufgabenGruppeEntity); - entity.setBenoetigtAktiv(strafe.getBenoetigtAktiv()); - entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); - entity.setBenoetigtPassiv(strafe.getBenoetigtPassiv()); - entity.setKurzText(strafe.getKurzText()); - entity.setLevel(strafe.getLevel()); - entity.setSekundenBis(strafe.getSekundenBis()); - entity.setSekundenVon(strafe.getSekundenVon()); - entity.setText(strafe.getText()); - return entity; - } -} +package de.oaa.xxx.games.common.entity; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import de.oaa.xxx.games.common.aufgaben.Strafe; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; + +@Getter +@Setter +@Entity +@Table(name = "strafe") +public class StrafeEntity { + + @Id + @Column + private UUID strafeId; + @Column + private String kurzText; + @Column + private Integer level; + @Column(columnDefinition = "TEXT") + private String text; + @Column + private Integer sekundenVon; + @Column + private Integer sekundenBis; + @ManyToOne + @JoinColumn(name = "gruppeId") + private AufgabenGruppeEntity aufgabenGruppe; + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = Werkzeug.class) + @CollectionTable(name = "strafe_benoetigtAktiv", joinColumns = @JoinColumn(name = "strafeId")) + @Column(name = "werkzeug") + private List benoetigtAktiv; + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = Werkzeug.class) + @CollectionTable(name = "strafe_benoetigtPassiv", joinColumns = @JoinColumn(name = "strafeId")) + @Column(name = "werkzeug") + private List benoetigtPassiv; + @ManyToMany(cascade = CascadeType.DETACH) + @JoinTable(name = "strafeToy", joinColumns = {@JoinColumn(name = "strafeId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) + private List benoetigteToys; + + @Override + public String toString() { + return "StrafeEntity[id=" + strafeId + ", kurzText=" + kurzText + ", level=" + level + + ", sekunden=" + sekundenVon + "-" + sekundenBis + "]"; + } + + public Strafe toStrafe() { + Strafe strafe = new Strafe(); + strafe.setStrafeId(strafeId); + strafe.setBenoetigtAktiv(benoetigtAktiv != null ? new ArrayList<>(benoetigtAktiv) : new ArrayList<>()); + strafe.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); + strafe.setBenoetigtPassiv(benoetigtPassiv != null ? new ArrayList<>(benoetigtPassiv) : new ArrayList<>()); + strafe.setGruppeId(aufgabenGruppe.getGruppenId()); + strafe.setKurzText(kurzText); + strafe.setLevel(level); + strafe.setSekundenBis(sekundenBis); + strafe.setSekundenVon(sekundenVon); + strafe.setText(text); + return strafe; + } + + public static StrafeEntity create(Strafe strafe, AufgabenGruppeEntity aufgabenGruppeEntity, List toys) { + StrafeEntity entity = new StrafeEntity(); + entity.setStrafeId(UUID.randomUUID()); + entity.setAufgabenGruppe(aufgabenGruppeEntity); + entity.setBenoetigtAktiv(strafe.getBenoetigtAktiv()); + entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); + entity.setBenoetigtPassiv(strafe.getBenoetigtPassiv()); + entity.setKurzText(strafe.getKurzText()); + entity.setLevel(strafe.getLevel()); + entity.setSekundenBis(strafe.getSekundenBis()); + entity.setSekundenVon(strafe.getSekundenVon()); + entity.setText(strafe.getText()); + return entity; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/ToyEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/ToyEntity.java similarity index 91% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/ToyEntity.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/ToyEntity.java index 1ea0ea2..c688a67 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/entity/ToyEntity.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/entity/ToyEntity.java @@ -1,58 +1,59 @@ -package de.oaa.xxx.aufgaben.entity; - -import de.oaa.xxx.aufgaben.Toy; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Lob; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.util.Base64; -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "toy") -public class ToyEntity { - - @Id - @Column - private UUID toyId; - @Column - private String name; - @Column - private String beschreibung; - @Column - private UUID userId; - @Lob - @Column(columnDefinition = "BLOB") - private byte[] bild; - - @Override - public String toString() { - return "ToyEntity[toyId=" + toyId + ", name=" + name + ", userId=" + userId + "]"; - } - - public Toy toToy() { - Toy toy = new Toy(); - toy.setToyId(toyId); - toy.setName(name); - toy.setBeschreibung(beschreibung); - toy.setUserId(userId); - toy.setBild(bild != null ? Base64.getEncoder().encodeToString(bild) : null); - return toy; - } - - public static ToyEntity create(Toy toy) { - ToyEntity entity = new ToyEntity(); - entity.setToyId(UUID.randomUUID()); - entity.setName(toy.getName()); - entity.setBeschreibung(toy.getBeschreibung()); - entity.setUserId(toy.getUserId()); - entity.setBild(toy.getBild() != null ? Base64.getDecoder().decode(toy.getBild()) : null); - return entity; - } -} +package de.oaa.xxx.games.common.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +import java.util.Base64; +import java.util.UUID; + +import de.oaa.xxx.games.common.aufgaben.Toy; + +@Getter +@Setter +@Entity +@Table(name = "toy") +public class ToyEntity { + + @Id + @Column + private UUID toyId; + @Column + private String name; + @Column + private String beschreibung; + @Column + private UUID userId; + @Lob + @Column(columnDefinition = "BLOB") + private byte[] bild; + + @Override + public String toString() { + return "ToyEntity[toyId=" + toyId + ", name=" + name + ", userId=" + userId + "]"; + } + + public Toy toToy() { + Toy toy = new Toy(); + toy.setToyId(toyId); + toy.setName(name); + toy.setBeschreibung(beschreibung); + toy.setUserId(userId); + toy.setBild(bild != null ? Base64.getEncoder().encodeToString(bild) : null); + return toy; + } + + public static ToyEntity create(Toy toy) { + ToyEntity entity = new ToyEntity(); + entity.setToyId(UUID.randomUUID()); + entity.setName(toy.getName()); + entity.setBeschreibung(toy.getBeschreibung()); + entity.setUserId(toy.getUserId()); + entity.setBild(toy.getBild() != null ? Base64.getDecoder().decode(toy.getBild()) : null); + return entity; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/AufgabeRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/AufgabeRepository.java similarity index 63% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/AufgabeRepository.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/AufgabeRepository.java index 28d2e5f..9cb0532 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/AufgabeRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/AufgabeRepository.java @@ -1,13 +1,14 @@ -package de.oaa.xxx.aufgaben.repository; - -import de.oaa.xxx.aufgaben.entity.AufgabeEntity; -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.UUID; - -public interface AufgabeRepository extends JpaRepository { - - List findByAufgabenGruppeIn(List gruppen); -} +package de.oaa.xxx.games.common.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import de.oaa.xxx.games.common.entity.AufgabeEntity; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; + +import java.util.List; +import java.util.UUID; + +public interface AufgabeRepository extends JpaRepository { + + List findByAufgabenGruppeIn(List gruppen); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/AufgabenGruppeRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/AufgabenGruppeRepository.java similarity index 67% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/AufgabenGruppeRepository.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/AufgabenGruppeRepository.java index 2fae55f..e997610 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/AufgabenGruppeRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/AufgabenGruppeRepository.java @@ -1,33 +1,40 @@ -package de.oaa.xxx.aufgaben.repository; - -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; -import java.util.UUID; - -public interface AufgabenGruppeRepository extends JpaRepository { - - @Query("select age from AufgabenGruppeEntity age where age.userId = :userId") - List findByUserId(@Param("userId") UUID userId); - - long countByUserId(UUID userId); - - Page findByUserIdIsNull(Pageable pageable); - - Page findByUserId(UUID userId, Pageable pageable); - - @Query("select age from AufgabenGruppeEntity age where (age.privateGruppe = false or age.userId = :userId) and (:search is null or age.name like :search)") - List listWithUserAndSearch(@Param("userId") UUID userId, @Param("search") String search, PageRequest pageable); - - @Query("select age from AufgabenGruppeEntity age where age.privateGruppe = false and (:search is null or age.name like :search)") - List listPublicWithSearch(@Param("search") String search, PageRequest pageable); - - @Query("select age from AufgabenGruppeEntity age where age.privateGruppe = false and age.userId is not null and age.userId <> :userId and (:name is null or lower(age.name) like lower(:name))") - List findPublicFromOthers(@Param("userId") UUID userId, @Param("name") String name); -} +package de.oaa.xxx.games.common.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; + +import java.util.List; +import java.util.UUID; + +public interface AufgabenGruppeRepository extends JpaRepository { + + @Query("select age from AufgabenGruppeEntity age where age.userId = :userId") + List findByUserId(@Param("userId") UUID userId); + + long countByUserId(UUID userId); + + Page findByUserIdIsNull(Pageable pageable); + + Page findByUserId(UUID userId, Pageable pageable); + + @Query("select age from AufgabenGruppeEntity age where (age.privateGruppe = false or age.userId = :userId) and (:search is null or age.name like :search)") + List listWithUserAndSearch(@Param("userId") UUID userId, @Param("search") String search, PageRequest pageable); + + @Query("select age from AufgabenGruppeEntity age where age.privateGruppe = false and (:search is null or age.name like :search)") + List listPublicWithSearch(@Param("search") String search, PageRequest pageable); + + @Query("select age from AufgabenGruppeEntity age where age.privateGruppe = false and age.userId is not null and age.userId <> :userId and (:name is null or lower(age.name) like lower(:name))") + List findPublicFromOthers(@Param("userId") UUID userId, @Param("name") String name); + + @Query("SELECT g FROM AufgabenGruppeEntity g WHERE (g.privateGruppe = false OR g.userId = :userId) AND g.strafen IS EMPTY AND g.sperren IS EMPTY AND (:search IS NULL OR g.name LIKE :search)") + List listVanillaSafeWithUserAndSearch(@Param("userId") UUID userId, @Param("search") String search, PageRequest pageable); + + @Query("SELECT g FROM AufgabenGruppeEntity g WHERE g.privateGruppe = false AND g.userId IS NOT NULL AND g.userId <> :userId AND g.strafen IS EMPTY AND g.sperren IS EMPTY AND (:name IS NULL OR LOWER(g.name) LIKE LOWER(:name))") + List findVanillaSafePublicFromOthers(@Param("userId") UUID userId, @Param("name") String name); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/FavoritRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/FavoritRepository.java similarity index 79% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/FavoritRepository.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/FavoritRepository.java index 48d07c4..6f40ca7 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/FavoritRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/FavoritRepository.java @@ -1,16 +1,17 @@ -package de.oaa.xxx.aufgaben.repository; - -import de.oaa.xxx.aufgaben.entity.FavoritEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.UUID; - -public interface FavoritRepository extends JpaRepository { - - List findByUserId(UUID userId); - - List findByUserIdAndAufgabenGruppeId(UUID userId, UUID aufgabenGruppeId); - - void deleteByAufgabenGruppeId(UUID aufgabenGruppeId); -} +package de.oaa.xxx.games.common.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import de.oaa.xxx.games.common.entity.FavoritEntity; + +import java.util.List; +import java.util.UUID; + +public interface FavoritRepository extends JpaRepository { + + List findByUserId(UUID userId); + + List findByUserIdAndAufgabenGruppeId(UUID userId, UUID aufgabenGruppeId); + + void deleteByAufgabenGruppeId(UUID aufgabenGruppeId); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/FinisherRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/FinisherRepository.java similarity index 63% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/FinisherRepository.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/FinisherRepository.java index ba8841c..a6093bf 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/FinisherRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/FinisherRepository.java @@ -1,9 +1,10 @@ -package de.oaa.xxx.aufgaben.repository; - -import de.oaa.xxx.aufgaben.entity.FinisherEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.UUID; - -public interface FinisherRepository extends JpaRepository { -} +package de.oaa.xxx.games.common.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import de.oaa.xxx.games.common.entity.FinisherEntity; + +import java.util.UUID; + +public interface FinisherRepository extends JpaRepository { +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/GruppenAboRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/GruppenAboRepository.java similarity index 76% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/GruppenAboRepository.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/GruppenAboRepository.java index 4dadd19..be98ed4 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/GruppenAboRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/GruppenAboRepository.java @@ -1,21 +1,22 @@ -package de.oaa.xxx.aufgaben.repository; - -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.GruppenAboEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.UUID; - -public interface GruppenAboRepository extends JpaRepository { - - List findByUserId(UUID userId); - - boolean existsByUserIdAndAufgabenGruppe(UUID userId, AufgabenGruppeEntity gruppe); - - void deleteByUserIdAndAufgabenGruppe(UUID userId, AufgabenGruppeEntity gruppe); - - long countByAufgabenGruppe(AufgabenGruppeEntity gruppe); - - void deleteByAufgabenGruppe(AufgabenGruppeEntity gruppe); -} +package de.oaa.xxx.games.common.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.GruppenAboEntity; + +import java.util.List; +import java.util.UUID; + +public interface GruppenAboRepository extends JpaRepository { + + List findByUserId(UUID userId); + + boolean existsByUserIdAndAufgabenGruppe(UUID userId, AufgabenGruppeEntity gruppe); + + void deleteByUserIdAndAufgabenGruppe(UUID userId, AufgabenGruppeEntity gruppe); + + long countByAufgabenGruppe(AufgabenGruppeEntity gruppe); + + void deleteByAufgabenGruppe(AufgabenGruppeEntity gruppe); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/SperreRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/SperreRepository.java similarity index 63% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/SperreRepository.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/SperreRepository.java index bac1cf7..0126028 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/SperreRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/SperreRepository.java @@ -1,13 +1,14 @@ -package de.oaa.xxx.aufgaben.repository; - -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.SperreEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.UUID; - -public interface SperreRepository extends JpaRepository { - - List findByAufgabenGruppeIn(List gruppen); -} +package de.oaa.xxx.games.common.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.SperreEntity; + +import java.util.List; +import java.util.UUID; + +public interface SperreRepository extends JpaRepository { + + List findByAufgabenGruppeIn(List gruppen); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/StrafeRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/StrafeRepository.java similarity index 63% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/StrafeRepository.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/StrafeRepository.java index 4d91cdb..6dfe55a 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/StrafeRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/StrafeRepository.java @@ -1,13 +1,14 @@ -package de.oaa.xxx.aufgaben.repository; - -import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; -import de.oaa.xxx.aufgaben.entity.StrafeEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.UUID; - -public interface StrafeRepository extends JpaRepository { - - List findByAufgabenGruppeIn(List gruppen); -} +package de.oaa.xxx.games.common.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.StrafeEntity; + +import java.util.List; +import java.util.UUID; + +public interface StrafeRepository extends JpaRepository { + + List findByAufgabenGruppeIn(List gruppen); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/ToyRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/ToyRepository.java similarity index 92% rename from xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/ToyRepository.java rename to xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/ToyRepository.java index 7bc2d1a..8a9014c 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/aufgaben/repository/ToyRepository.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/common/repository/ToyRepository.java @@ -1,41 +1,42 @@ -package de.oaa.xxx.aufgaben.repository; - -import de.oaa.xxx.aufgaben.entity.ToyEntity; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -public interface ToyRepository extends JpaRepository { - - Page findByUserIdIsNull(Pageable pageable); - - Page findByUserId(UUID userId, Pageable pageable); - long countByUserId(UUID userId); - - List findByUserId(UUID userId); - - boolean existsByNameIgnoreCaseAndUserIdIsNull(String name); - - boolean existsByNameIgnoreCaseAndUserId(String name, UUID userId); - - boolean existsByNameIgnoreCaseAndUserIdIsNullAndToyIdNot(String name, UUID toyId); - - boolean existsByNameIgnoreCaseAndUserIdAndToyIdNot(String name, UUID userId, UUID toyId); - - Optional findByNameIgnoreCaseAndUserId(String name, UUID userId); - - @Query("SELECT COUNT(a) FROM AufgabeEntity a JOIN a.benoetigteToys t WHERE t.toyId = :toyId") - long countAufgabeUsage(@Param("toyId") UUID toyId); - - @Query("SELECT COUNT(s) FROM StrafeEntity s JOIN s.benoetigteToys t WHERE t.toyId = :toyId") - long countStrafeUsage(@Param("toyId") UUID toyId); - - @Query("SELECT COUNT(sp) FROM SperreEntity sp JOIN sp.benoetigteToys t WHERE t.toyId = :toyId") - long countSperreUsage(@Param("toyId") UUID toyId); -} +package de.oaa.xxx.games.common.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import de.oaa.xxx.games.common.entity.ToyEntity; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ToyRepository extends JpaRepository { + + Page findByUserIdIsNull(Pageable pageable); + + Page findByUserId(UUID userId, Pageable pageable); + long countByUserId(UUID userId); + + List findByUserId(UUID userId); + + boolean existsByNameIgnoreCaseAndUserIdIsNull(String name); + + boolean existsByNameIgnoreCaseAndUserId(String name, UUID userId); + + boolean existsByNameIgnoreCaseAndUserIdIsNullAndToyIdNot(String name, UUID toyId); + + boolean existsByNameIgnoreCaseAndUserIdAndToyIdNot(String name, UUID userId, UUID toyId); + + Optional findByNameIgnoreCaseAndUserId(String name, UUID userId); + + @Query("SELECT COUNT(a) FROM AufgabeEntity a JOIN a.benoetigteToys t WHERE t.toyId = :toyId") + long countAufgabeUsage(@Param("toyId") UUID toyId); + + @Query("SELECT COUNT(s) FROM StrafeEntity s JOIN s.benoetigteToys t WHERE t.toyId = :toyId") + long countStrafeUsage(@Param("toyId") UUID toyId); + + @Query("SELECT COUNT(sp) FROM SperreEntity sp JOIN sp.benoetigteToys t WHERE t.toyId = :toyId") + long countSperreUsage(@Param("toyId") UUID toyId); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaAufgabeAnzeige.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaAufgabeAnzeige.java new file mode 100644 index 0000000..f9febec --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaAufgabeAnzeige.java @@ -0,0 +1,23 @@ +package de.oaa.xxx.games.vanilla; + +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class VanillaAufgabeAnzeige { + + private String nameAktiverMitspieler; + private String aufgabeText; + private Integer timer; + private Integer level; + private UUID mitspielerId; + private boolean eigenesGeraet; + + @Override + public String toString() { + return "VanillaAufgabeAnzeige[mitspieler=" + nameAktiverMitspieler + ", level=" + level + ", timer=" + timer + "]"; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaGame.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaGame.java new file mode 100644 index 0000000..ad168df --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaGame.java @@ -0,0 +1,17 @@ +package de.oaa.xxx.games.vanilla; +import lombok.Getter; +import lombok.Setter; +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter @Setter +public class VanillaGame { + private UUID sessionId; + private UUID userId; + private UUID setupId; + private Integer aufgabenProLevel; + private Integer level; + private Integer aufgabenAufAktuellemLevel; + private LocalDateTime startZeit; + private LocalDateTime letzteAktivitaet; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaGameDurchfuehren.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaGameDurchfuehren.java new file mode 100644 index 0000000..4fdbe45 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaGameDurchfuehren.java @@ -0,0 +1,128 @@ +package de.oaa.xxx.games.vanilla; + +import com.fasterxml.jackson.databind.ObjectMapper; +import de.oaa.xxx.games.common.aufgaben.Aufgabe; +import de.oaa.xxx.games.common.aufgaben.AufgabenList; +import de.oaa.xxx.games.bdsm.GeschlechtEnum; +import de.oaa.xxx.games.bdsm.RolleEnum; +import de.oaa.xxx.games.vanilla.entity.VanillaGameEntity; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class VanillaGameDurchfuehren { + + private final AufgabenList aufgabenList; + private final List mitspieler = new ArrayList<>(); + private int aufgabenProLevel; + private int level; + private int aufgabenAufAktuellemLevel; + + public VanillaGameDurchfuehren(VanillaGameEntity entity) throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + aufgabenList = objectMapper.readValue(entity.getAufgaben(), AufgabenList.class); + entity.getMitspieler().forEach(m -> mitspieler.add(m.toMitspieler())); + this.aufgabenProLevel = entity.getAufgabenProLevel() != null ? entity.getAufgabenProLevel() : 5; + this.level = entity.getLevel() != null ? entity.getLevel() : 1; + this.aufgabenAufAktuellemLevel = entity.getAufgabenAufAktuellemLevel() != null ? entity.getAufgabenAufAktuellemLevel() : 0; + } + + public int getLevel() { return level; } + public int getAufgabenAufAktuellemLevel() { return aufgabenAufAktuellemLevel; } + + public VanillaAufgabeAnzeige getNext() { + checkLevel(); + if (level == 6) return null; + + VanillaAufgabeAnzeige anzeige = findeAufgabe(); + if (anzeige != null) return anzeige; + + // Fallback + VanillaMitspieler aktiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_AKTIV); + VanillaMitspieler passiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_PASSIV, aktiv); + VanillaAufgabeAnzeige fallback = new VanillaAufgabeAnzeige(); + fallback.setNameAktiverMitspieler(aktiv != null ? aktiv.getName() : ""); + if (aktiv != null) { fallback.setMitspielerId(aktiv.getId()); fallback.setEigenesGeraet(aktiv.isEigenesGeraet()); } + fallback.setAufgabeText("Keine passende Aufgabe gefunden. Überbrückt die Zeit mit Kuscheln."); + fallback.setTimer(120); + return fallback; + } + + public void backToLvl5() { this.level = 5; this.aufgabenAufAktuellemLevel = 0; } + + public List getFinisher() { + var list = new ArrayList(); + List.of(GeschlechtEnum.WEIBLICH, GeschlechtEnum.DIVERS, GeschlechtEnum.MAENNLICH).forEach(geschlecht -> { + mitspieler.stream().filter(m -> geschlecht == m.getGeschlecht()).toList().forEach(cumming -> { + var partner = findeMitspielerMitRolle(RolleEnum.AUFGABE_PASSIV, cumming); + var finishers = aufgabenList.getFinisher().stream() + .filter(f -> geschlecht == f.getGeschlecht() && f.isAufgabePassend(partner != null ? toMitspielerBdsm(partner) : null, toMitspielerBdsm(cumming))) + .toList(); + VanillaAufgabeAnzeige anzeige = new VanillaAufgabeAnzeige(); + anzeige.setNameAktiverMitspieler(cumming.getName()); + anzeige.setMitspielerId(cumming.getId()); + anzeige.setEigenesGeraet(cumming.isEigenesGeraet()); + if (!finishers.isEmpty()) { + var f = finishers.get(new Random().nextInt(finishers.size())); + anzeige.setAufgabeText(getAnzeigeText(f.getText(), cumming.getName(), partner != null ? partner.getName() : "")); + } else { + anzeige.setAufgabeText(cumming.getName() + " geht heute leider leer aus..."); + } + list.add(anzeige); + }); + }); + return list; + } + + private void checkLevel() { + if (++aufgabenAufAktuellemLevel >= 1 + aufgabenProLevel) { + aufgabenAufAktuellemLevel = 0; + level++; + } + } + + private VanillaAufgabeAnzeige findeAufgabe() { + VanillaMitspieler aktiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_AKTIV); + if (aktiv == null) return null; + VanillaMitspieler passiv = findeMitspielerMitRolle(RolleEnum.AUFGABE_PASSIV, aktiv); + de.oaa.xxx.games.bdsm.Mitspieler aktivBdsm = toMitspielerBdsm(aktiv); + de.oaa.xxx.games.bdsm.Mitspieler passivBdsm = passiv != null ? toMitspielerBdsm(passiv) : null; + List passende = aufgabenList.getAufgaben().stream() + .filter(a -> a.isAufgabePassend(level, aktivBdsm, passivBdsm != null ? passivBdsm : aktivBdsm)) + .toList(); + if (passende.isEmpty()) return null; + Aufgabe aufgabe = passende.get(new Random().nextInt(passende.size())); + VanillaAufgabeAnzeige anzeige = new VanillaAufgabeAnzeige(); + anzeige.setNameAktiverMitspieler(aktiv.getName()); + anzeige.setMitspielerId(aktiv.getId()); + anzeige.setEigenesGeraet(aktiv.isEigenesGeraet()); + anzeige.setAufgabeText(getAnzeigeText(aufgabe.getText(), aktiv.getName(), passiv != null ? passiv.getName() : "")); + if (aufgabe.getSekundenVon() != null && aufgabe.getSekundenBis() != null && aufgabe.getSekundenBis() > 0) { + anzeige.setTimer(new Random().nextInt(aufgabe.getSekundenVon(), aufgabe.getSekundenBis() + 1)); + } + return anzeige; + } + + private VanillaMitspieler findeMitspielerMitRolle(RolleEnum rolle) { return findeMitspielerMitRolle(rolle, null); } + private VanillaMitspieler findeMitspielerMitRolle(RolleEnum rolle, VanillaMitspieler ausschliessen) { + List kandidaten = mitspieler.stream() + .filter(m -> m.getRollen().contains(rolle) && !m.equals(ausschliessen)) + .toList(); + if (kandidaten.isEmpty()) return null; + return kandidaten.get(new Random().nextInt(kandidaten.size())); + } + + private de.oaa.xxx.games.bdsm.Mitspieler toMitspielerBdsm(VanillaMitspieler vm) { + de.oaa.xxx.games.bdsm.Mitspieler m = new de.oaa.xxx.games.bdsm.Mitspieler(); + m.setId(vm.getId()); m.setName(vm.getName()); m.setGeschlecht(vm.getGeschlecht()); + m.setRollen(vm.getRollen()); m.setSpieltMit(vm.getSpieltMit()); + m.setVerfuegbareWerkzeuge(vm.getVerfuegbareWerkzeuge()); m.setEigenesGeraet(vm.isEigenesGeraet()); + return m; + } + + private String getAnzeigeText(String text, String aktiv, String passiv) { + if (text == null) return ""; + return text.replace("{AKTIV}", aktiv != null ? aktiv : "").replace("{PASSIV}", passiv != null ? passiv : ""); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaMitspieler.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaMitspieler.java new file mode 100644 index 0000000..7c50551 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/VanillaMitspieler.java @@ -0,0 +1,24 @@ +package de.oaa.xxx.games.vanilla; +import de.oaa.xxx.games.bdsm.GeschlechtEnum; +import de.oaa.xxx.games.bdsm.RolleEnum; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; +import lombok.Getter; +import lombok.Setter; +import java.util.List; +import java.util.UUID; + +@Getter @Setter +public class VanillaMitspieler { + private UUID id; + private UUID userId; + private String name; + private GeschlechtEnum geschlecht; + private List rollen; + private List spieltMit; + private List verfuegbareWerkzeuge; + private boolean eigenesGeraet; + + public boolean isVerfuegbar(Werkzeug werkzeug) { + return verfuegbareWerkzeuge != null && verfuegbareWerkzeuge.contains(werkzeug); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAboController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAboController.java new file mode 100644 index 0000000..93be936 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAboController.java @@ -0,0 +1,160 @@ +package de.oaa.xxx.games.vanilla.controller; + +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppe; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppePage; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.GruppenAboEntity; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.GruppenAboRepository; +import de.oaa.xxx.user.UserEntity; +import de.oaa.xxx.user.UserRepository; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.security.Principal; +import java.util.Comparator; +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/vanilla/abo") +@Transactional +public class VanillaAboController { + + private static final Logger LOGGER = LoggerFactory.getLogger(VanillaAboController.class); + private static final int DEFAULT_PAGE_SIZE = 5; + private static final int DISCOVER_PAGE_SIZE = 10; + + private final GruppenAboRepository aboRepository; + private final AufgabenGruppeRepository gruppeRepository; + private final UserRepository userRepository; + + public VanillaAboController(GruppenAboRepository aboRepository, + AufgabenGruppeRepository gruppeRepository, + UserRepository userRepository) { + this.aboRepository = aboRepository; + this.gruppeRepository = gruppeRepository; + this.userRepository = userRepository; + } + + // ── Abonnierte Gruppen laden (nur vanilla-safe) ── + + @GetMapping("/list") + public ResponseEntity listSubscribed( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size, + Principal principal) { + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + + List dtos = aboRepository.findByUserId(user.getUserId()).stream() + .map(GruppenAboEntity::getAufgabenGruppe) + .filter(g -> !g.isPrivateGruppe()) + .filter(g -> g.getStrafen().isEmpty() && g.getSperren().isEmpty()) + .map(g -> enrich(g, user.getUserId(), true)) + .sorted(Comparator.comparing(AufgabenGruppe::getName, String.CASE_INSENSITIVE_ORDER)) + .toList(); + + return ResponseEntity.ok(manualPage(dtos, page, size)); + } + + // ── Entdecken (nur vanilla-safe Gruppen von anderen) ── + + @GetMapping("/discover") + public ResponseEntity discover( + @RequestParam(required = false) String name, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "" + DISCOVER_PAGE_SIZE) int size, + Principal principal) { + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + + String namePattern = name != null && !name.isBlank() ? "%" + name.trim() + "%" : null; + + List dtos = gruppeRepository + .findVanillaSafePublicFromOthers(user.getUserId(), namePattern).stream() + .map(g -> enrich(g, user.getUserId(), aboRepository.existsByUserIdAndAufgabenGruppe(user.getUserId(), g))) + .sorted(Comparator.comparingLong(AufgabenGruppe::getSubscriberCount).reversed() + .thenComparing(AufgabenGruppe::getName, String.CASE_INSENSITIVE_ORDER)) + .toList(); + + return ResponseEntity.ok(manualPage(dtos, page, size)); + } + + // ── Abonnieren (nur vanilla-safe) ── + + @PostMapping("/{gruppenId}") + public ResponseEntity subscribe(@PathVariable UUID gruppenId, Principal principal) { + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + + AufgabenGruppeEntity gruppe = gruppeRepository.findById(gruppenId).orElse(null); + if (gruppe == null || gruppe.isPrivateGruppe() || user.getUserId().equals(gruppe.getUserId())) { + return ResponseEntity.badRequest().build(); + } + // Vanilla-safe validation + if (!gruppe.getStrafen().isEmpty() || !gruppe.getSperren().isEmpty()) { + return ResponseEntity.status(403).build(); + } + if (aboRepository.existsByUserIdAndAufgabenGruppe(user.getUserId(), gruppe)) { + return ResponseEntity.ok().build(); + } + GruppenAboEntity abo = new GruppenAboEntity(); + abo.setAboId(UUID.randomUUID()); + abo.setUserId(user.getUserId()); + abo.setAufgabenGruppe(gruppe); + aboRepository.save(abo); + LOGGER.info("User {} hat Vanilla-Gruppe {} abonniert", user.getUserId(), gruppenId); + return ResponseEntity.status(201).build(); + } + + // ── Abonnement kündigen ── + + @DeleteMapping("/{gruppenId}") + public ResponseEntity unsubscribe(@PathVariable UUID gruppenId, Principal principal) { + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + + AufgabenGruppeEntity gruppe = gruppeRepository.findById(gruppenId).orElse(null); + if (gruppe == null) return ResponseEntity.noContent().build(); + + aboRepository.deleteByUserIdAndAufgabenGruppe(user.getUserId(), gruppe); + LOGGER.info("User {} hat Vanilla-Abo auf Gruppe {} beendet", user.getUserId(), gruppenId); + return ResponseEntity.accepted().build(); + } + + // ── Hilfsmethoden ── + + private AufgabenGruppe enrich(AufgabenGruppeEntity entity, UUID userId, boolean subscribed) { + AufgabenGruppe g = entity.toAufgabenGruppe(); + g.setSubscriberCount(aboRepository.countByAufgabenGruppe(entity)); + g.setSubscribed(subscribed); + return g; + } + + private AufgabenGruppePage manualPage(List all, int page, int size) { + int total = all.size(); + int start = page * size; + List content = start >= total ? List.of() : all.subList(start, Math.min(start + size, total)); + AufgabenGruppePage result = new AufgabenGruppePage(); + result.setContent(content); + result.setCurrentPage(page); + result.setTotalPages(total == 0 ? 1 : (int) Math.ceil((double) total / size)); + result.setTotalElements(total); + return result; + } + + private UserEntity resolveUser(Principal principal) { + return userRepository.findByEmail(principal.getName()).orElse(null); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAufgabeController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAufgabeController.java new file mode 100644 index 0000000..e4c81b0 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAufgabeController.java @@ -0,0 +1,128 @@ +package de.oaa.xxx.games.vanilla.controller; + +import de.oaa.xxx.games.common.aufgaben.Aufgabe; +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.entity.AufgabeEntity; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabeRepository; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; +import de.oaa.xxx.subscription.SubscriptionLimitService; +import de.oaa.xxx.user.UserRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.security.Principal; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/vanilla/aufgabe") +@Transactional +public class VanillaAufgabeController { + + private static final Logger LOGGER = LoggerFactory.getLogger(VanillaAufgabeController.class); + + private final AufgabeRepository aufgabeRepository; + private final AufgabenGruppeRepository gruppeRepository; + private final ToyRepository toyRepository; + private final UserRepository userRepository; + private final SubscriptionLimitService limitService; + + public VanillaAufgabeController(AufgabeRepository aufgabeRepository, + AufgabenGruppeRepository gruppeRepository, + ToyRepository toyRepository, + UserRepository userRepository, + SubscriptionLimitService limitService) { + this.aufgabeRepository = aufgabeRepository; + this.gruppeRepository = gruppeRepository; + this.toyRepository = toyRepository; + this.userRepository = userRepository; + this.limitService = limitService; + } + + @GetMapping("/{aufgabeId}") + public ResponseEntity get(@PathVariable UUID aufgabeId) { + return aufgabeRepository.findById(aufgabeId) + .map(entity -> ResponseEntity.ok(entity.toAufgabe())) + .orElse(ResponseEntity.noContent().build()); + } + + @PostMapping + public ResponseEntity create(@RequestBody Aufgabe aufgabe, Principal principal) { + if (aufgabe.getKurzText() == null || aufgabe.getText() == null || aufgabe.getLevel() == null || aufgabe.getGruppeId() == null) { + return ResponseEntity.badRequest().build(); + } + AufgabenGruppeEntity gruppeEntity = gruppeRepository.findById(aufgabe.getGruppeId()).orElse(null); + if (gruppeEntity == null) { + return ResponseEntity.badRequest().build(); + } + var ownerOpt = userRepository.findByEmail(principal.getName()); + int limit = ownerOpt.map(u -> limitService.maxTasksPerGroup(u.getUserId())) + .orElse(SubscriptionLimitService.STANDARD_MAX_TASKS_PER_GROUP); + if (gruppeEntity.getAufgaben().size() >= limit) { + return ResponseEntity.status(409).build(); + } + List toys = resolveToys(aufgabe.getBenoetigteToys()); + AufgabeEntity entity = AufgabeEntity.create(aufgabe, gruppeEntity, toys); + aufgabeRepository.save(entity); + LOGGER.debug("Vanilla-Aufgabe {} '{}' in Gruppe {} erstellt", entity.getAufgabeId(), entity.getKurzText(), aufgabe.getGruppeId()); + return ResponseEntity.created( + ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(entity.getAufgabeId()).toUri() + ).build(); + } + + @PutMapping("/{aufgabeId}") + public ResponseEntity update(@PathVariable UUID aufgabeId, @RequestBody Aufgabe aufgabe) { + if (aufgabe.getKurzText() == null || aufgabe.getText() == null || aufgabe.getLevel() == null) { + return ResponseEntity.badRequest().build(); + } + AufgabeEntity entity = aufgabeRepository.findById(aufgabeId).orElse(null); + if (entity == null) return ResponseEntity.notFound().build(); + entity.setKurzText(aufgabe.getKurzText()); + entity.setText(aufgabe.getText()); + entity.setLevel(aufgabe.getLevel()); + entity.setSekundenVon(aufgabe.getSekundenVon()); + entity.setSekundenBis(aufgabe.getSekundenBis()); + entity.setBenoetigtAktiv(aufgabe.getBenoetigtAktiv()); + entity.setBenoetigtPassiv(aufgabe.getBenoetigtPassiv()); + entity.setBenoetigteToys(resolveToys(aufgabe.getBenoetigteToys())); + aufgabeRepository.save(entity); + LOGGER.debug("Vanilla-Aufgabe {} aktualisiert", aufgabeId); + return ResponseEntity.ok().build(); + } + + @DeleteMapping + public ResponseEntity delete(@RequestBody Aufgabe aufgabe) { + try { + aufgabeRepository.findById(aufgabe.getAufgabeId()).ifPresent(aufgabeRepository::delete); + return ResponseEntity.accepted().build(); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } + + private List resolveToys(List toys) { + if (toys == null || toys.isEmpty()) return new ArrayList<>(); + List ids = toys.stream() + .filter(t -> t.getToyId() != null) + .map(Toy::getToyId) + .toList(); + if (ids.isEmpty()) return new ArrayList<>(); + return toyRepository.findAllById(ids); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAufgabenGruppeController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAufgabenGruppeController.java new file mode 100644 index 0000000..64755d1 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaAufgabenGruppeController.java @@ -0,0 +1,284 @@ +package de.oaa.xxx.games.vanilla.controller; + +import java.security.Principal; +import java.util.Base64; +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppe; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppeList; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppePage; +import de.oaa.xxx.games.common.aufgaben.AufgabenGruppeService; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.repository.AufgabeRepository; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.FinisherRepository; +import de.oaa.xxx.games.common.repository.GruppenAboRepository; +import de.oaa.xxx.games.common.repository.SperreRepository; +import de.oaa.xxx.games.common.repository.StrafeRepository; +import de.oaa.xxx.subscription.SubscriptionLimitService; +import de.oaa.xxx.user.UserEntity; +import de.oaa.xxx.user.UserRepository; + +@RestController +@RequestMapping("/vanilla/gruppe") +@Transactional +public class VanillaAufgabenGruppeController { + + private static final Logger LOGGER = LoggerFactory.getLogger(VanillaAufgabenGruppeController.class); + private static final int DEFAULT_PAGE_SIZE = 5; + + private final AufgabenGruppeRepository gruppeRepository; + private final AufgabeRepository aufgabeRepository; + private final StrafeRepository strafeRepository; + private final SperreRepository sperreRepository; + private final FinisherRepository finisherRepository; + private final UserRepository userRepository; + private final GruppenAboRepository aboRepository; + private final AufgabenGruppeService aufgabenGruppeService; + private final SubscriptionLimitService limitService; + + public VanillaAufgabenGruppeController(AufgabenGruppeRepository gruppeRepository, + AufgabeRepository aufgabeRepository, + StrafeRepository strafeRepository, + SperreRepository sperreRepository, + FinisherRepository finisherRepository, + UserRepository userRepository, + GruppenAboRepository aboRepository, + AufgabenGruppeService aufgabenGruppeService, + SubscriptionLimitService limitService) { + this.gruppeRepository = gruppeRepository; + this.aufgabeRepository = aufgabeRepository; + this.strafeRepository = strafeRepository; + this.sperreRepository = sperreRepository; + this.finisherRepository = finisherRepository; + this.userRepository = userRepository; + this.aboRepository = aboRepository; + this.aufgabenGruppeService = aufgabenGruppeService; + this.limitService = limitService; + } + + // ── Paginierte Listen ── + + @GetMapping("/list/user") + public ResponseEntity listUser( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size, + Principal principal) { + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + // Only vanilla-safe user groups (no Strafen, no Sperren) + UUID userId = user.getUserId(); + String searchPattern = null; + java.util.List all = gruppeRepository.listVanillaSafeWithUserAndSearch( + userId, searchPattern, PageRequest.of(0, 500, Sort.by("name"))); + java.util.List ownOnly = all.stream() + .filter(g -> userId.equals(g.getUserId())).toList(); + AufgabenGruppePage result = manualPage(ownOnly.stream().map(entity -> { + AufgabenGruppe g = entity.toAufgabenGruppe(); + g.setSubscriberCount(aboRepository.countByAufgabenGruppe(entity)); + return g; + }).toList(), page, DEFAULT_PAGE_SIZE); + return ResponseEntity.ok(result); + } + + @GetMapping("/list/system") + public ResponseEntity listSystem( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size) { + // Only vanilla-safe system groups (userId IS NULL → no strafen/sperren anyway, but filter for safety) + Page result = gruppeRepository.findByUserIdIsNull( + PageRequest.of(page, size, Sort.by("name"))); + AufgabenGruppePage r = new AufgabenGruppePage(); + r.setContent(result.getContent().stream() + .filter(g -> g.getStrafen().isEmpty() && g.getSperren().isEmpty()) + .map(AufgabenGruppeEntity::toAufgabenGruppe).toList()); + r.setCurrentPage(result.getNumber()); + r.setTotalPages(result.getTotalPages()); + r.setTotalElements(result.getTotalElements()); + return ResponseEntity.ok(r); + } + + // ── Bestehende Endpunkte ── + + @GetMapping("/all") + public ResponseEntity getAll(@RequestParam(required = false) String search) { + UUID userId = (UUID) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + String searchPattern = search != null ? "%" + search + "%" : null; + AufgabenGruppeList list = new AufgabenGruppeList(); + list.setGruppen(gruppeRepository.listVanillaSafeWithUserAndSearch(userId, searchPattern, PageRequest.of(0, 500)) + .stream().map(AufgabenGruppeEntity::toAufgabenGruppeDisplay).toList()); + return ResponseEntity.ok(list); + } + + @GetMapping("/own") + public ResponseEntity getOwn(@RequestParam UUID userId) { + AufgabenGruppeList list = new AufgabenGruppeList(); + list.setGruppen(gruppeRepository.findByUserId(userId).stream() + .filter(g -> g.getStrafen().isEmpty() && g.getSperren().isEmpty()) + .map(AufgabenGruppeEntity::toAufgabenGruppeDisplay).toList()); + return ResponseEntity.ok(list); + } + + @GetMapping("/{gruppeId}") + public ResponseEntity get(@PathVariable UUID gruppeId) { + return gruppeRepository.findById(gruppeId) + .filter(g -> g.getStrafen().isEmpty() && g.getSperren().isEmpty()) + .map(entity -> ResponseEntity.ok(entity.toAufgabenGruppe())) + .orElse(ResponseEntity.status(403).build()); + } + + // ── Anlegen ── + + @PostMapping + public ResponseEntity create(@RequestBody AufgabenGruppe gruppe, Principal principal) { + if (gruppe.getName() == null || gruppe.getName().isBlank()) { + return ResponseEntity.badRequest().build(); + } + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + + if (gruppeRepository.countByUserId(user.getUserId()) >= limitService.maxTaskGroups(user.getUserId())) { + return ResponseEntity.status(409).build(); + } + + AufgabenGruppeEntity entity = AufgabenGruppeEntity.create(gruppe); + entity.setUserId(user.getUserId()); + entity.setPrivateGruppe(true); + gruppeRepository.save(entity); + LOGGER.debug("User {} hat Vanilla-AufgabenGruppe '{}' ({}) erstellt", user.getUserId(), entity.getName(), entity.getGruppenId()); + return ResponseEntity.created( + ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(entity.getGruppenId()).toUri() + ).build(); + } + + // ── Bearbeiten ── + + @PutMapping("/{gruppeId}") + public ResponseEntity update(@PathVariable UUID gruppeId, + @RequestBody AufgabenGruppe gruppe, + Principal principal) { + if (gruppe.getName() == null || gruppe.getName().isBlank()) { + return ResponseEntity.badRequest().build(); + } + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + + AufgabenGruppeEntity entity = gruppeRepository.findById(gruppeId).orElse(null); + if (entity == null) return ResponseEntity.notFound().build(); + if (!user.getUserId().equals(entity.getUserId())) return ResponseEntity.status(403).build(); + // Vanilla-safe check: cannot edit a non-vanilla-safe group + if (!entity.getStrafen().isEmpty() || !entity.getSperren().isEmpty()) return ResponseEntity.status(403).build(); + + entity.setName(gruppe.getName().trim()); + entity.setBeschreibung(gruppe.getBeschreibung()); + entity.setVon(gruppe.getVon()); + entity.setPrivateGruppe(gruppe.isPrivateGruppe()); + if (gruppe.getBild() != null) { + entity.setBild(Base64.getDecoder().decode(gruppe.getBild())); + } + gruppeRepository.save(entity); + LOGGER.debug("User {} hat Vanilla-AufgabenGruppe {} aktualisiert", user.getUserId(), gruppeId); + return ResponseEntity.ok().build(); + } + + // ── Kopieren (Systemgruppe → eigene) ── + + @PostMapping("/copy/{gruppeId}") + public ResponseEntity copy(@PathVariable UUID gruppeId, Principal principal) { + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + // Only allow copying vanilla-safe groups + AufgabenGruppeEntity source = gruppeRepository.findById(gruppeId).orElse(null); + if (source == null) return ResponseEntity.notFound().build(); + if (!source.getStrafen().isEmpty() || !source.getSperren().isEmpty()) return ResponseEntity.status(403).build(); + try { + aufgabenGruppeService.copyGruppe(gruppeId, user.getUserId()); + return ResponseEntity.status(201).build(); + } catch (IllegalStateException e) { + return ResponseEntity.status(409).build(); + } catch (IllegalArgumentException e) { + String msg = e.getMessage(); + if (msg != null && msg.contains("nicht gefunden")) return ResponseEntity.notFound().build(); + return ResponseEntity.status(403).build(); + } + } + + // ── Löschen ── + + @DeleteMapping("/{gruppeId}") + public ResponseEntity deleteById(@PathVariable UUID gruppeId, Principal principal) { + UserEntity user = resolveUser(principal); + if (user == null) return ResponseEntity.status(401).build(); + + AufgabenGruppeEntity entity = gruppeRepository.findById(gruppeId).orElse(null); + if (entity == null) return ResponseEntity.noContent().build(); + if (!user.getUserId().equals(entity.getUserId())) return ResponseEntity.status(403).build(); + // Only allow deletion of vanilla-safe groups + if (!entity.getStrafen().isEmpty() || !entity.getSperren().isEmpty()) return ResponseEntity.status(403).build(); + + try { + aboRepository.deleteByAufgabenGruppe(entity); + aufgabeRepository.deleteAll(entity.getAufgaben()); + strafeRepository.deleteAll(entity.getStrafen()); + sperreRepository.deleteAll(entity.getSperren()); + finisherRepository.deleteAll(entity.getFinisher()); + gruppeRepository.delete(entity); + return ResponseEntity.accepted().build(); + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + return ResponseEntity.internalServerError().build(); + } + } + + @DeleteMapping + public ResponseEntity delete(@RequestBody AufgabenGruppe gruppe) { + try { + gruppeRepository.findById(gruppe.getGruppenId()).ifPresent(entity -> { + if (entity.getStrafen().isEmpty() && entity.getSperren().isEmpty()) { + gruppeRepository.delete(entity); + } + }); + return ResponseEntity.accepted().build(); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } + + // ── Hilfsmethoden ── + + private UserEntity resolveUser(Principal principal) { + return userRepository.findByEmail(principal.getName()).orElse(null); + } + + private AufgabenGruppePage manualPage(java.util.List all, int page, int size) { + int total = all.size(); + int start = page * size; + java.util.List content = start >= total ? java.util.List.of() : all.subList(start, Math.min(start + size, total)); + AufgabenGruppePage result = new AufgabenGruppePage(); + result.setContent(content); + result.setCurrentPage(page); + result.setTotalPages(total == 0 ? 1 : (int) Math.ceil((double) total / size)); + result.setTotalElements(total); + return result; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaEinladungController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaEinladungController.java new file mode 100644 index 0000000..160f71b --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaEinladungController.java @@ -0,0 +1,247 @@ +package de.oaa.xxx.games.vanilla.controller; + +import java.security.Principal; +import java.time.LocalDateTime; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import de.oaa.xxx.games.vanilla.entity.VanillaEinladungEntity; +import de.oaa.xxx.games.vanilla.entity.VanillaEinladungEntity.Status; +import de.oaa.xxx.games.vanilla.repository.VanillaEinladungRepository; +import de.oaa.xxx.social.SystemMessageService; +import de.oaa.xxx.social.entity.MessageCause; +import de.oaa.xxx.social.repository.FriendshipRepository; +import de.oaa.xxx.user.UserRepository; + +@RestController +@RequestMapping("/vanilla/einladung") +@Transactional +public class VanillaEinladungController { + + private final VanillaEinladungRepository einladungRepository; + private final UserRepository userRepository; + private final FriendshipRepository friendshipRepository; + private final SystemMessageService systemMessageService; + + public VanillaEinladungController(VanillaEinladungRepository einladungRepository, + UserRepository userRepository, + FriendshipRepository friendshipRepository, + SystemMessageService systemMessageService) { + this.einladungRepository = einladungRepository; + this.userRepository = userRepository; + this.friendshipRepository = friendshipRepository; + this.systemMessageService = systemMessageService; + } + + record EinladungRequest(UUID setupId, int slotIndex, UUID inviteeId) {} + record AntwortRequest(boolean accepted, String mode) {} // mode: OWN_DEVICE | HOST_DEVICE + record SpielerDatenRequest(String spielerDatenJson) {} + + private UUID currentUserId(Principal principal) { + return userRepository.findByEmail(principal.getName()) + .map(u -> u.getUserId()).orElse(null); + } + + @PostMapping + public ResponseEntity> sendEinladung(@RequestBody EinladungRequest req, Principal principal) { + UUID inviterId = currentUserId(principal); + if (inviterId == null) return ResponseEntity.status(401).build(); + + // Freundschaft prüfen + var friendship = friendshipRepository.findExisting(inviterId, req.inviteeId()); + if (friendship.isEmpty() || friendship.get().getStatus() != de.oaa.xxx.social.entity.FriendshipEntity.Status.ACCEPTED) { + return ResponseEntity.status(403).build(); + } + + if (req.setupId() == null) return ResponseEntity.badRequest().build(); + + // Vanilla: max 1 Gast-Slot – prüfen ob bereits eine aktive Einladung für dieses Setup existiert + boolean slotOccupied = einladungRepository.findBySetupId(req.setupId()).stream() + .anyMatch(e -> e.getStatus() == Status.PENDING + || e.getStatus() == Status.ACCEPTED_OWN + || e.getStatus() == Status.ACCEPTED_HOST); + if (slotOccupied) { + return ResponseEntity.status(409).build(); + } + + // Prüfen ob Person bereits aktiv eingeladen + boolean alreadyInvited = einladungRepository.findBySetupId(req.setupId()).stream() + .anyMatch(e -> req.inviteeId().equals(e.getInviteeId()) + && (e.getStatus() == Status.PENDING + || e.getStatus() == Status.ACCEPTED_OWN + || e.getStatus() == Status.ACCEPTED_HOST)); + if (alreadyInvited) { + return ResponseEntity.status(409).build(); + } + + // Alte Einladung für diesen Slot canceln + einladungRepository.findBySetupId(req.setupId()).stream() + .filter(e -> e.getSlotIndex() == req.slotIndex() && e.getStatus() == Status.PENDING) + .forEach(e -> e.setStatus(Status.CANCELLED)); + + VanillaEinladungEntity entity = new VanillaEinladungEntity(); + entity.setEinladungId(UUID.randomUUID()); + entity.setSetupId(req.setupId()); + entity.setInviterId(inviterId); + entity.setInviteeId(req.inviteeId()); + entity.setSlotIndex(req.slotIndex()); + entity.setStatus(Status.PENDING); + entity.setCreatedAt(LocalDateTime.now()); + einladungRepository.save(entity); + + String inviterName = userRepository.findById(inviterId).map(u -> u.getName()).orElse("Jemand"); + systemMessageService.send( + inviterId, req.inviteeId(), + inviterName + " hat dich zum Vanilla Game eingeladen.", + "/einladungen.html", + MessageCause.INVITATION + ); + + Map result = new LinkedHashMap<>(); + result.put("einladungId", entity.getEinladungId()); + return ResponseEntity.ok(result); + } + + @DeleteMapping("/{id}") + public ResponseEntity cancelEinladung(@PathVariable UUID id, Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + VanillaEinladungEntity e = einladungRepository.findById(id).orElse(null); + if (e == null) return ResponseEntity.notFound().build(); + if (!e.getInviterId().equals(userId)) return ResponseEntity.status(403).build(); + e.setStatus(Status.CANCELLED); + String inviterName = userRepository.findById(userId).map(u -> u.getName()).orElse("Jemand"); + systemMessageService.send(userId, e.getInviteeId(), + inviterName + " hat die Vanilla-Spieleinladung zurückgezogen.", + "/einladungen.html", MessageCause.INVITATION); + return ResponseEntity.accepted().build(); + } + + @GetMapping + public ResponseEntity>> getBySetupId(@RequestParam UUID setupId, Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + List> list = einladungRepository.findBySetupId(setupId).stream() + .map(this::toMap).toList(); + return ResponseEntity.ok(list); + } + + @GetMapping("/meine-aktive") + public ResponseEntity> getAktive(Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + return einladungRepository.findByInviteeIdAndStatus(userId, Status.ACCEPTED_OWN) + .stream().findFirst() + .map(e -> ResponseEntity.ok(toMap(e))) + .orElse(ResponseEntity.noContent().build()); + } + + @GetMapping("/pending") + public ResponseEntity>> getPending(Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + List> list = einladungRepository.findByInviteeIdAndStatus(userId, Status.PENDING) + .stream().map(e -> { + Map m = toMap(e); + userRepository.findById(e.getInviterId()).ifPresent(u -> { + m.put("inviterName", u.getName()); + m.put("inviterAvatar", u.getProfilePicture() != null ? u.getProfilePicture() : ""); + }); + return m; + }).toList(); + return ResponseEntity.ok(list); + } + + @GetMapping("/sent") + public ResponseEntity>> getSent(Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + List> list = einladungRepository.findByInviterIdAndStatus(userId, Status.PENDING) + .stream().map(e -> { + Map m = toMap(e); + userRepository.findById(e.getInviteeId()).ifPresent(u -> { + m.put("inviteeName", u.getName()); + m.put("inviteeAvatar", u.getProfilePicture() != null ? u.getProfilePicture() : ""); + }); + return m; + }).toList(); + return ResponseEntity.ok(list); + } + + @GetMapping("/{id}") + public ResponseEntity> getById(@PathVariable("id") UUID id, Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + VanillaEinladungEntity e = einladungRepository.findById(id).orElse(null); + if (e == null) return ResponseEntity.notFound().build(); + if (!e.getInviteeId().equals(userId) && !e.getInviterId().equals(userId)) { + return ResponseEntity.status(403).build(); + } + Map m = toMap(e); + userRepository.findById(e.getInviterId()).ifPresent(u -> { + m.put("inviterName", u.getName()); + m.put("inviterAvatar", u.getProfilePicture() != null ? u.getProfilePicture() : ""); + }); + return ResponseEntity.ok(m); + } + + @PutMapping("/{id}/spielerdaten") + public ResponseEntity spielerDatenEinreichen(@PathVariable UUID id, @RequestBody SpielerDatenRequest req, Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + VanillaEinladungEntity e = einladungRepository.findById(id).orElse(null); + if (e == null) return ResponseEntity.notFound().build(); + if (!e.getInviteeId().equals(userId)) return ResponseEntity.status(403).build(); + if (e.getStatus() != Status.ACCEPTED_OWN) return ResponseEntity.badRequest().build(); + e.setSpielerDatenJson(req.spielerDatenJson()); + e.setBereit(true); + return ResponseEntity.accepted().build(); + } + + @PutMapping("/{id}/antwort") + public ResponseEntity antwort(@PathVariable UUID id, @RequestBody AntwortRequest req, Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + VanillaEinladungEntity e = einladungRepository.findById(id).orElse(null); + if (e == null) return ResponseEntity.notFound().build(); + if (!e.getInviteeId().equals(userId)) return ResponseEntity.status(403).build(); + if (e.getStatus() != Status.PENDING) return ResponseEntity.badRequest().build(); + if (!req.accepted()) { + e.setStatus(Status.DECLINED); + } else if ("OWN_DEVICE".equals(req.mode())) { + e.setStatus(Status.ACCEPTED_OWN); + } else { + e.setStatus(Status.ACCEPTED_HOST); + } + return ResponseEntity.accepted().build(); + } + + private Map toMap(VanillaEinladungEntity e) { + Map m = new LinkedHashMap<>(); + m.put("einladungId", e.getEinladungId()); + m.put("setupId", e.getSetupId()); + m.put("slotIndex", e.getSlotIndex()); + m.put("inviteeId", e.getInviteeId()); + m.put("inviterId", e.getInviterId()); + m.put("status", e.getStatus().name()); + m.put("sessionId", e.getSessionId()); + m.put("bereit", e.isBereit()); + m.put("spielerDatenJson", e.getSpielerDatenJson()); + userRepository.findById(e.getInviteeId()).ifPresent(u -> m.put("inviteeName", u.getName())); + return m; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFavoritController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFavoritController.java new file mode 100644 index 0000000..c008c0a --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFavoritController.java @@ -0,0 +1,101 @@ +package de.oaa.xxx.games.vanilla.controller; + +import de.oaa.xxx.games.common.aufgaben.Favorit; +import de.oaa.xxx.games.common.aufgaben.FavoritList; +import de.oaa.xxx.games.common.entity.FavoritEntity; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.FavoritRepository; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/vanilla/favorit") +@Transactional +public class VanillaFavoritController { + + private static final Logger LOGGER = LoggerFactory.getLogger(VanillaFavoritController.class); + + private final FavoritRepository favoritRepository; + private final AufgabenGruppeRepository gruppeRepository; + + public VanillaFavoritController(FavoritRepository favoritRepository, + AufgabenGruppeRepository gruppeRepository) { + this.favoritRepository = favoritRepository; + this.gruppeRepository = gruppeRepository; + } + + @GetMapping("/{favoritId}") + public ResponseEntity get(@PathVariable UUID favoritId) { + return favoritRepository.findById(favoritId) + .map(entity -> ResponseEntity.ok(entity.toFavorit())) + .orElse(ResponseEntity.noContent().build()); + } + + @GetMapping + public ResponseEntity all() { + UUID userId = (UUID) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + List entities = favoritRepository.findByUserId(userId); + FavoritList result = new FavoritList(); + // Only return favorites pointing to vanilla-safe groups + result.setFavoriten(entities.stream() + .filter(f -> { + var gruppe = gruppeRepository.findById(f.getAufgabenGruppeId()).orElse(null); + return gruppe != null && gruppe.getStrafen().isEmpty() && gruppe.getSperren().isEmpty(); + }) + .map(FavoritEntity::toFavorit).toList()); + return ResponseEntity.ok(result); + } + + @PostMapping + public ResponseEntity create(@RequestBody Favorit favorit) { + UUID userId = (UUID) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + if (favorit.getAufgabenGruppeId() == null) { + return ResponseEntity.badRequest().build(); + } + // Validate vanilla-safe + var gruppe = gruppeRepository.findById(favorit.getAufgabenGruppeId()).orElse(null); + if (gruppe == null || !gruppe.getStrafen().isEmpty() || !gruppe.getSperren().isEmpty()) { + return ResponseEntity.status(403).build(); + } + List existing = favoritRepository.findByUserIdAndAufgabenGruppeId(userId, favorit.getAufgabenGruppeId()); + FavoritEntity entity; + if (existing.isEmpty()) { + entity = FavoritEntity.fromFavorit(favorit, userId); + favoritRepository.save(entity); + LOGGER.debug("User {} hat Vanilla-AufgabenGruppe {} als Favorit gespeichert", userId, favorit.getAufgabenGruppeId()); + } else { + entity = existing.get(0); + } + return ResponseEntity.created( + ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(entity.getFavoritId()).toUri() + ).build(); + } + + @DeleteMapping + public ResponseEntity delete(@RequestBody Favorit favorit) { + try { + UUID userId = (UUID) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + favoritRepository.findByUserIdAndAufgabenGruppeId(userId, favorit.getAufgabenGruppeId()) + .forEach(favoritRepository::delete); + return ResponseEntity.accepted().build(); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFillerController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFillerController.java new file mode 100644 index 0000000..31d9144 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFillerController.java @@ -0,0 +1,34 @@ +package de.oaa.xxx.games.vanilla.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import de.oaa.xxx.games.common.aufgaben.DefaultFiller; + +@RestController +@RequestMapping("/vanilla/filler") +public class VanillaFillerController { + + private static final Logger LOGGER = LoggerFactory.getLogger(VanillaFillerController.class); + + private final DefaultFiller defaultFiller; + + public VanillaFillerController(DefaultFiller defaultFiller) { + this.defaultFiller = defaultFiller; + } + + @PostMapping + public ResponseEntity fill() { + try { + defaultFiller.fill(); + return ResponseEntity.ok().build(); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFinisherController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFinisherController.java new file mode 100644 index 0000000..3a15a53 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaFinisherController.java @@ -0,0 +1,116 @@ +package de.oaa.xxx.games.vanilla.controller; + +import de.oaa.xxx.games.common.aufgaben.Finisher; +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.FinisherEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; +import de.oaa.xxx.games.common.repository.FinisherRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/vanilla/finisher") +@Transactional +public class VanillaFinisherController { + + private static final Logger LOGGER = LoggerFactory.getLogger(VanillaFinisherController.class); + + private final FinisherRepository finisherRepository; + private final AufgabenGruppeRepository gruppeRepository; + private final ToyRepository toyRepository; + + public VanillaFinisherController(FinisherRepository finisherRepository, + AufgabenGruppeRepository gruppeRepository, + ToyRepository toyRepository) { + this.finisherRepository = finisherRepository; + this.gruppeRepository = gruppeRepository; + this.toyRepository = toyRepository; + } + + @GetMapping("/{finisherId}") + public ResponseEntity get(@PathVariable UUID finisherId) { + return finisherRepository.findById(finisherId) + .map(entity -> ResponseEntity.ok(entity.toFinisher())) + .orElse(ResponseEntity.noContent().build()); + } + + @PostMapping + public ResponseEntity create(@RequestBody Finisher finisher) { + if (finisher.getKurzText() == null || finisher.getText() == null + || finisher.getGeschlecht() == null || finisher.getGruppeId() == null) { + return ResponseEntity.badRequest().build(); + } + AufgabenGruppeEntity gruppeEntity = gruppeRepository.findById(finisher.getGruppeId()).orElse(null); + if (gruppeEntity == null) { + return ResponseEntity.badRequest().build(); + } + if (gruppeEntity.getFinisher().size() >= 100) { + return ResponseEntity.status(409).build(); + } + List toys = resolveToys(finisher.getBenoetigteToys()); + FinisherEntity entity = FinisherEntity.create(finisher, gruppeEntity, toys); + finisherRepository.save(entity); + LOGGER.debug("Vanilla-Finisher {} '{}' in Gruppe {} erstellt", entity.getFinisherId(), entity.getKurzText(), finisher.getGruppeId()); + return ResponseEntity.created( + ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(entity.getFinisherId()).toUri() + ).build(); + } + + @PutMapping("/{finisherId}") + public ResponseEntity update(@PathVariable UUID finisherId, @RequestBody Finisher finisher) { + if (finisher.getKurzText() == null || finisher.getText() == null || finisher.getGeschlecht() == null) { + return ResponseEntity.badRequest().build(); + } + FinisherEntity entity = finisherRepository.findById(finisherId).orElse(null); + if (entity == null) return ResponseEntity.notFound().build(); + entity.setKurzText(finisher.getKurzText()); + entity.setText(finisher.getText()); + entity.setGeschlecht(finisher.getGeschlecht()); + entity.setBenoetigtAktiv(finisher.getBenoetigtAktiv()); + entity.setBenoetigtPassiv(finisher.getBenoetigtPassiv()); + entity.setBenoetigteToys(resolveToys(finisher.getBenoetigteToys())); + finisherRepository.save(entity); + LOGGER.debug("Vanilla-Finisher {} aktualisiert", finisherId); + return ResponseEntity.ok().build(); + } + + @DeleteMapping + public ResponseEntity delete(@RequestBody Finisher finisher) { + try { + finisherRepository.findById(finisher.getFinisherId()).ifPresent(finisherRepository::delete); + return ResponseEntity.accepted().build(); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } + + private List resolveToys(List toys) { + if (toys == null || toys.isEmpty()) return new ArrayList<>(); + List ids = toys.stream() + .filter(t -> t.getToyId() != null) + .map(Toy::getToyId) + .toList(); + if (ids.isEmpty()) return new ArrayList<>(); + return toyRepository.findAllById(ids); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaGameController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaGameController.java new file mode 100644 index 0000000..12c8ae8 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaGameController.java @@ -0,0 +1,410 @@ +package de.oaa.xxx.games.vanilla.controller; + +import java.security.Principal; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.oaa.xxx.games.common.aufgaben.AufgabenList; +import de.oaa.xxx.games.vanilla.VanillaAufgabeAnzeige; +import de.oaa.xxx.games.vanilla.VanillaGame; +import de.oaa.xxx.games.vanilla.VanillaGameDurchfuehren; +import de.oaa.xxx.games.vanilla.VanillaMitspieler; +import de.oaa.xxx.games.vanilla.entity.VanillaEinladungEntity; +import de.oaa.xxx.games.vanilla.entity.VanillaGameEntity; +import de.oaa.xxx.games.vanilla.entity.VanillaMitspielerEntity; +import de.oaa.xxx.games.vanilla.repository.VanillaEinladungRepository; +import de.oaa.xxx.games.vanilla.repository.VanillaGameRepository; +import de.oaa.xxx.games.vanilla.repository.VanillaMitspielerRepository; +import de.oaa.xxx.social.SystemMessageService; +import de.oaa.xxx.social.entity.MessageCause; +import de.oaa.xxx.user.UserRepository; + +@RestController +@RequestMapping("/vanilla") +@Transactional +public class VanillaGameController { + + private static final Logger LOGGER = LoggerFactory.getLogger(VanillaGameController.class); + /** + * Kurzlebiger In-Memory-Marker: Sessions die ordentlich über spielAbgeschlossen + * beendet wurden. + */ + private static final Set ORDENTLICH_BEENDET = Collections.synchronizedSet(new HashSet<>()); + + private final VanillaGameRepository sessionRepository; + private final VanillaMitspielerRepository mitspielerRepository; + private final VanillaEinladungRepository einladungRepository; + private final UserRepository userRepository; + private final ObjectMapper objectMapper; + private final SystemMessageService systemMessageService; + + public VanillaGameController(VanillaGameRepository sessionRepository, + VanillaMitspielerRepository mitspielerRepository, + VanillaEinladungRepository einladungRepository, + UserRepository userRepository, + ObjectMapper objectMapper, + SystemMessageService systemMessageService) { + this.sessionRepository = sessionRepository; + this.mitspielerRepository = mitspielerRepository; + this.einladungRepository = einladungRepository; + this.userRepository = userRepository; + this.objectMapper = objectMapper; + this.systemMessageService = systemMessageService; + } + + @GetMapping("/{sessionId}") + public ResponseEntity getBySessionId(@PathVariable UUID sessionId) { + return sessionRepository.findById(sessionId) + .map(entity -> ResponseEntity.ok(toSession(entity))) + .orElse(ResponseEntity.noContent().build()); + } + + @GetMapping + public ResponseEntity getByUserId(@org.springframework.web.bind.annotation.RequestParam UUID userId) { + return sessionRepository.findByUserId(userId) + .map(entity -> ResponseEntity.ok(toSession(entity))) + .orElse(ResponseEntity.noContent().build()); + } + + @PostMapping + public ResponseEntity create(@RequestBody VanillaGame session) { + String email = (String) org.springframework.security.core.context.SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + UUID userId = userRepository.findByEmail(email).map(u -> u.getUserId()).orElse(null); + if (userId == null) return ResponseEntity.status(401).build(); + var existingOpt = sessionRepository.findByUserId(userId); + if (existingOpt.isPresent()) { + VanillaGameEntity existing = existingOpt.get(); + if (existing.getAufgaben() != null) return ResponseEntity.status(409).build(); + // Unvollständige Session (aufgaben=null) bereinigen + mitspielerRepository.deleteAll(existing.getMitspieler()); + sessionRepository.delete(existing); + } + VanillaGameEntity entity = new VanillaGameEntity(); + entity.setSessionId(UUID.randomUUID()); + entity.setUserId(userId); + entity.setAufgabenAufAktuellemLevel(0); + entity.setAufgabenProLevel(session.getAufgabenProLevel() != null ? session.getAufgabenProLevel() : 5); + LocalDateTime now = LocalDateTime.now(); + entity.setLetzteAktivitaet(now); + entity.setStartZeit(now); + entity.setLevel(1); + entity.setSetupId(session.getSetupId()); + sessionRepository.save(entity); + LOGGER.debug("VanillaGame gestartet [sessionId={}, userId={}, aufgabenProLevel={}]", + entity.getSessionId(), entity.getUserId(), entity.getAufgabenProLevel()); + return ResponseEntity.created( + ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(entity.getSessionId()).toUri() + ).build(); + } + + @DeleteMapping + public ResponseEntity deleteSession(@RequestBody VanillaGame session) { + return sessionRepository.findById(session.getSessionId()) + .map(entity -> { + mitspielerRepository.deleteAll(entity.getMitspieler()); + sessionRepository.delete(entity); + return ResponseEntity.accepted().build(); + }) + .orElse(ResponseEntity.noContent().build()); + } + + @PostMapping("/{sessionId}/abgeschlossen") + public ResponseEntity spielAbgeschlossen(@PathVariable UUID sessionId) { + VanillaGameEntity entity = sessionRepository.findById(sessionId).orElse(null); + if (entity == null) return ResponseEntity.notFound().build(); + ORDENTLICH_BEENDET.add(sessionId); + mitspielerRepository.deleteAll(entity.getMitspieler()); + sessionRepository.delete(entity); + return ResponseEntity.accepted().build(); + } + + /** Prüft ob eine Session ordentlich (nicht abgebrochen) beendet wurde. */ + @GetMapping("/{sessionId}/beendet") + public ResponseEntity istBeendet(@PathVariable UUID sessionId) { + if (ORDENTLICH_BEENDET.remove(sessionId)) return ResponseEntity.ok().build(); + return ResponseEntity.notFound().build(); + } + + @DeleteMapping("/{sessionId}/verlassen") + public ResponseEntity verlasseSpiel(@PathVariable UUID sessionId, Principal principal) { + UUID userId = userRepository.findByEmail(principal.getName()).map(u -> u.getUserId()).orElse(null); + if (userId == null) return ResponseEntity.status(401).build(); + + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) return ResponseEntity.notFound().build(); + + VanillaMitspielerEntity self = session.getMitspieler().stream() + .filter(m -> userId.equals(m.getUserId())) + .findFirst().orElse(null); + if (self == null) return ResponseEntity.status(403).build(); + + String name = self.getName(); + String nachricht = name + " hat das Vanilla-Spiel verlassen. Das Spiel wurde abgebrochen."; + + systemMessageService.send(userId, session.getUserId(), nachricht, "/userhome.html", MessageCause.GAME_STATE); + session.getMitspieler().stream() + .filter(m -> m.isEigenesGeraet() && m.getUserId() != null && !userId.equals(m.getUserId())) + .forEach(m -> systemMessageService.send(userId, m.getUserId(), nachricht, "/userhome.html", MessageCause.GAME_STATE)); + + mitspielerRepository.deleteAll(session.getMitspieler()); + sessionRepository.delete(session); + return ResponseEntity.accepted().build(); + } + + @PostMapping("/{sessionId}/aufgaben") + public ResponseEntity setAufgaben(@RequestBody AufgabenList list, @PathVariable UUID sessionId) { + try { + if (list.size() > 1000) { + return ResponseEntity.badRequest().build(); + } + String aufgaben = objectMapper.writeValueAsString(list); + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) { + return ResponseEntity.badRequest().build(); + } + session.setAufgaben(aufgaben); + sessionRepository.save(session); + // Erst jetzt Einladungen mit der Session verknüpfen – Gäste werden nur weitergeleitet wenn aufgaben bereit sind + if (session.getSetupId() != null) { + einladungRepository.findBySetupId(session.getSetupId()).stream() + .filter(e -> e.getStatus() == VanillaEinladungEntity.Status.ACCEPTED_OWN + || e.getStatus() == VanillaEinladungEntity.Status.ACCEPTED_HOST) + .forEach(e -> e.setSessionId(session.getSessionId())); + } + return ResponseEntity.accepted().build(); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } + + @GetMapping("/{sessionId}/aufgaben/next") + public ResponseEntity getNextAufgabe(@PathVariable UUID sessionId) { + try { + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null || session.getAufgaben() == null) { + return ResponseEntity.badRequest().build(); + } + session.setLetzteAktivitaet(LocalDateTime.now()); + VanillaGameDurchfuehren durchfuehren = new VanillaGameDurchfuehren(session); + VanillaAufgabeAnzeige next = durchfuehren.getNext(); + session.setLevel(durchfuehren.getLevel()); + session.setAufgabenAufAktuellemLevel(durchfuehren.getAufgabenAufAktuellemLevel()); + if (next == null) { + return ResponseEntity.noContent().build(); + } + next.setLevel(durchfuehren.getLevel()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Neue Vanilla-Aufgabe [sessionId={}, level={}, aufgaben={}/{}]", + sessionId, session.getLevel(), session.getAufgabenAufAktuellemLevel(), + session.getAufgabenProLevel()); + } + return ResponseEntity.ok(next); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } + + @PostMapping("/{sessionId}/mitspieler") + public ResponseEntity addMitspieler(@RequestBody VanillaMitspieler mitspieler, @PathVariable UUID sessionId) { + if (mitspieler.getName() == null || mitspieler.getGeschlecht() == null || mitspieler.getRollen() == null + || mitspieler.getRollen().isEmpty() || mitspieler.getSpieltMit() == null || mitspieler.getSpieltMit().isEmpty() + || mitspieler.getVerfuegbareWerkzeuge() == null || mitspieler.getVerfuegbareWerkzeuge().isEmpty()) { + return ResponseEntity.badRequest().build(); + } + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) { + return ResponseEntity.badRequest().build(); + } + // Max 2 Mitspieler (1 Host + max 1 Gast) + if (session.getMitspieler().size() >= 1) { + return ResponseEntity.status(409).build(); + } + VanillaMitspielerEntity entity = new VanillaMitspielerEntity(); + entity.setMitspielerId(UUID.randomUUID()); + entity.setGeschlecht(mitspieler.getGeschlecht()); + entity.setName(mitspieler.getName()); + entity.setRollen(mitspieler.getRollen()); + entity.setSpieltMit(mitspieler.getSpieltMit()); + entity.setWerkzeuge(new ArrayList<>(mitspieler.getVerfuegbareWerkzeuge())); + entity.setUserId(mitspieler.getUserId()); + entity.setEigenesGeraet(mitspieler.isEigenesGeraet()); + entity.setSession(session); + mitspielerRepository.save(entity); + return ResponseEntity.accepted().build(); + } + + @GetMapping("/{sessionId}/finisher") + public ResponseEntity> getFinisher(@PathVariable UUID sessionId) { + try { + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) return ResponseEntity.badRequest().build(); + VanillaGameDurchfuehren durchfuehren = new VanillaGameDurchfuehren(session); + return ResponseEntity.ok(durchfuehren.getFinisher()); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } + + @PostMapping("/{sessionId}/backToLevel5") + public ResponseEntity backToLevel5(@PathVariable UUID sessionId) { + try { + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) return ResponseEntity.badRequest().build(); + VanillaGameDurchfuehren durchfuehren = new VanillaGameDurchfuehren(session); + durchfuehren.backToLvl5(); + session.setLevel(durchfuehren.getLevel()); + session.setAufgabenAufAktuellemLevel(durchfuehren.getAufgabenAufAktuellemLevel()); + sessionRepository.save(session); + return ResponseEntity.accepted().build(); + } catch (Exception exception) { + LOGGER.error(exception.getMessage(), exception); + return ResponseEntity.internalServerError().build(); + } + } + + @GetMapping("/{sessionId}/mitspieler/me") + public ResponseEntity> getMeinMitspieler(@PathVariable UUID sessionId, Principal principal) { + UUID userId = userRepository.findByEmail(principal.getName()).map(u -> u.getUserId()).orElse(null); + if (userId == null) return ResponseEntity.status(401).build(); + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) return ResponseEntity.notFound().build(); + return session.getMitspieler().stream() + .filter(m -> userId.equals(m.getUserId())) + .findFirst() + .map(m -> { + Map result = new LinkedHashMap<>(); + result.put("mitspielerId", m.getMitspielerId()); + result.put("name", m.getName()); + result.put("eigenesGeraet", m.isEigenesGeraet()); + return ResponseEntity.ok(result); + }) + .orElse(ResponseEntity.noContent().build()); + } + + record AbschliessenRequest(boolean sperreAnwenden) {} + record AbschliessenResponse(List abgelaufeneSperren) {} + + @PostMapping("/{sessionId}/active-task/abschliessen") + public ResponseEntity activeTaskAbschliessen( + @PathVariable UUID sessionId, @RequestBody AbschliessenRequest req) { + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) return ResponseEntity.notFound().build(); + // Vanilla: keine Sperren/Strafen – einfach activeTask löschen + session.setActiveTaskJson(null); + session.setTaskStartedAt(null); + sessionRepository.save(session); + return ResponseEntity.ok(new AbschliessenResponse(List.of())); + } + + record ActiveTaskRequest(String taskJson, LocalDateTime timerStartedAt) {} + record ActiveTaskResponse(String taskJson, Long elapsedSeconds) {} + + @PutMapping("/{sessionId}/active-task") + public ResponseEntity setActiveTask(@PathVariable UUID sessionId, @RequestBody ActiveTaskRequest req) { + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) return ResponseEntity.notFound().build(); + session.setActiveTaskJson(req.taskJson()); + session.setTaskStartedAt(req.timerStartedAt()); + sessionRepository.save(session); + return ResponseEntity.accepted().build(); + } + + @DeleteMapping("/{sessionId}/active-task") + public ResponseEntity clearActiveTask(@PathVariable UUID sessionId) { + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) return ResponseEntity.notFound().build(); + session.setActiveTaskJson(null); + session.setTaskStartedAt(null); + sessionRepository.save(session); + return ResponseEntity.accepted().build(); + } + + @GetMapping("/{sessionId}/active-task") + public ResponseEntity getActiveTask(@PathVariable UUID sessionId) { + VanillaGameEntity session = sessionRepository.findById(sessionId).orElse(null); + if (session == null) return ResponseEntity.notFound().build(); + if (session.getActiveTaskJson() == null) return ResponseEntity.noContent().build(); + Long elapsed = null; + if (session.getTaskStartedAt() != null) { + elapsed = Duration.between(session.getTaskStartedAt(), LocalDateTime.now()).getSeconds(); + } + return ResponseEntity.ok(new ActiveTaskResponse(session.getActiveTaskJson(), elapsed)); + } + + // ── Debug-Endpoint: vollständiger Entity-Zustand ── + @GetMapping("/{sessionId}/debug") + public ResponseEntity> debug(@PathVariable UUID sessionId) { + VanillaGameEntity entity = sessionRepository.findById(sessionId).orElse(null); + if (entity == null) return ResponseEntity.notFound().build(); + + Map session = new LinkedHashMap<>(); + session.put("sessionId", entity.getSessionId()); + session.put("userId", entity.getUserId()); + session.put("setupId", entity.getSetupId()); + session.put("startZeit", entity.getStartZeit()); + session.put("letzteAktivitaet", entity.getLetzteAktivitaet()); + session.put("level", entity.getLevel()); + session.put("aufgabenAufAktuellemLevel", entity.getAufgabenAufAktuellemLevel()); + session.put("aufgabenProLevel", entity.getAufgabenProLevel()); + session.put("taskStartedAt", entity.getTaskStartedAt()); + session.put("hatAufgaben", entity.getAufgaben() != null); + session.put("hatActiveTask", entity.getActiveTaskJson() != null); + + List> mitspielerList = entity.getMitspieler().stream().map(m -> { + Map mp = new LinkedHashMap<>(); + mp.put("mitspielerId", m.getMitspielerId()); + mp.put("name", m.getName()); + mp.put("userId", m.getUserId()); + mp.put("geschlecht", m.getGeschlecht()); + mp.put("rollen", m.getRollen()); + mp.put("werkzeuge", m.getWerkzeuge()); + mp.put("spieltMit", m.getSpieltMit()); + mp.put("eigenesGeraet", m.isEigenesGeraet()); + return mp; + }).toList(); + + Map result = new LinkedHashMap<>(); + result.put("session", session); + result.put("mitspieler", mitspielerList); + return ResponseEntity.ok(result); + } + + private VanillaGame toSession(VanillaGameEntity entity) { + VanillaGame session = new VanillaGame(); + session.setSessionId(entity.getSessionId()); + session.setUserId(entity.getUserId()); + session.setAufgabenProLevel(entity.getAufgabenProLevel()); + session.setLevel(entity.getLevel()); + session.setAufgabenAufAktuellemLevel(entity.getAufgabenAufAktuellemLevel()); + session.setStartZeit(entity.getStartZeit()); + session.setLetzteAktivitaet(entity.getLetzteAktivitaet()); + return session; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaSetupDraftController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaSetupDraftController.java new file mode 100644 index 0000000..e7d6765 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaSetupDraftController.java @@ -0,0 +1,78 @@ +package de.oaa.xxx.games.vanilla.controller; + +import de.oaa.xxx.games.vanilla.entity.VanillaSetupDraftEntity; +import de.oaa.xxx.games.vanilla.repository.VanillaSetupDraftRepository; +import de.oaa.xxx.user.UserRepository; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.security.Principal; +import java.time.LocalDateTime; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + +@RestController +@RequestMapping("/vanilla/setup") +@Transactional +public class VanillaSetupDraftController { + + private final VanillaSetupDraftRepository draftRepository; + private final UserRepository userRepository; + + public VanillaSetupDraftController(VanillaSetupDraftRepository draftRepository, UserRepository userRepository) { + this.draftRepository = draftRepository; + this.userRepository = userRepository; + } + + 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 + public ResponseEntity> getDraft( + @RequestParam(required = false) String setupId, + Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + var lookup = (setupId != null && !setupId.isBlank()) + ? draftRepository.findBySetupId(setupId) + : draftRepository.findByUserId(userId); + return lookup + .map(d -> { + Map m = new LinkedHashMap<>(); + m.put("setupId", d.getSetupId()); + m.put("settingsJson", d.getSettingsJson()); + m.put("setupJson", d.getSetupJson()); + m.put("gruppenJson", d.getGruppenJson()); + return ResponseEntity.ok(m); + }) + .orElse(ResponseEntity.noContent().build()); + } + + @PutMapping + public ResponseEntity saveDraft(@RequestBody DraftRequest req, Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + VanillaSetupDraftEntity d = draftRepository.findByUserId(userId) + .orElseGet(() -> { VanillaSetupDraftEntity n = new VanillaSetupDraftEntity(); n.setUserId(userId); return n; }); + if (req.setupId() != null) d.setSetupId(req.setupId()); + if (req.settingsJson() != null) d.setSettingsJson(req.settingsJson()); + if (req.setupJson() != null) d.setSetupJson(req.setupJson()); + if (req.gruppenJson() != null) d.setGruppenJson(req.gruppenJson()); + d.setUpdatedAt(LocalDateTime.now()); + draftRepository.save(d); + return ResponseEntity.accepted().build(); + } + + @DeleteMapping + public ResponseEntity deleteDraft(Principal principal) { + UUID userId = currentUserId(principal); + if (userId == null) return ResponseEntity.status(401).build(); + draftRepository.findByUserId(userId).ifPresent(draftRepository::delete); + return ResponseEntity.accepted().build(); + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaToyController.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaToyController.java new file mode 100644 index 0000000..497e883 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/controller/VanillaToyController.java @@ -0,0 +1,253 @@ +package de.oaa.xxx.games.vanilla.controller; + +import de.oaa.xxx.games.common.aufgaben.Toy; +import de.oaa.xxx.games.common.aufgaben.ToyPage; +import de.oaa.xxx.games.common.entity.AufgabenGruppeEntity; +import de.oaa.xxx.games.common.entity.ToyEntity; +import de.oaa.xxx.games.common.repository.GruppenAboRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; +import de.oaa.xxx.subscription.SubscriptionLimitService; +import de.oaa.xxx.user.UserEntity; +import de.oaa.xxx.user.UserRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.security.Principal; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +@RestController +@RequestMapping("/vanilla/toy") +@Transactional +public class VanillaToyController { + + private static final Logger LOGGER = LoggerFactory.getLogger(VanillaToyController.class); + private static final int DEFAULT_PAGE_SIZE = 12; + + private final ToyRepository toyRepository; + private final UserRepository userRepository; + private final GruppenAboRepository aboRepository; + private final SubscriptionLimitService limitService; + + public VanillaToyController(ToyRepository toyRepository, + UserRepository userRepository, + GruppenAboRepository aboRepository, + SubscriptionLimitService limitService) { + this.toyRepository = toyRepository; + this.userRepository = userRepository; + this.aboRepository = aboRepository; + this.limitService = limitService; + } + + @GetMapping("/list/user") + public ResponseEntity listUser( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size, + Principal principal) { + UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); + if (user == null) { + return ResponseEntity.status(401).build(); + } + Page result = toyRepository.findByUserId( + user.getUserId(), PageRequest.of(page, size, Sort.by("name"))); + return ResponseEntity.ok(toToyPage(result)); + } + + @GetMapping("/list/system") + public ResponseEntity listSystem( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "" + DEFAULT_PAGE_SIZE) int size) { + Page result = toyRepository.findByUserIdIsNull( + PageRequest.of(page, size, Sort.by("name"))); + return ResponseEntity.ok(toToyPage(result)); + } + + /** + * Returns all toys available to the current user for assignment to items: + * own toys + system toys + toys referenced in subscribed vanilla-safe groups' items. + */ + @GetMapping("/available") + public ResponseEntity> available(Principal principal) { + UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); + if (user == null) return ResponseEntity.status(401).build(); + + List own = toyRepository.findByUserId(user.getUserId(), PageRequest.of(0, 500, Sort.by("name"))).getContent(); + List system = toyRepository.findByUserIdIsNull(PageRequest.of(0, 500, Sort.by("name"))).getContent(); + + Set knownIds = new HashSet<>(); + own.forEach(t -> knownIds.add(t.getToyId())); + system.forEach(t -> knownIds.add(t.getToyId())); + + Set fromAbos = new HashSet<>(); + aboRepository.findByUserId(user.getUserId()).forEach(abo -> { + AufgabenGruppeEntity gruppe = abo.getAufgabenGruppe(); + // Only include toys from vanilla-safe groups (no Strafen, no Sperren) + if (!gruppe.getStrafen().isEmpty() || !gruppe.getSperren().isEmpty()) return; + gruppe.getAufgaben().forEach(a -> { + if (a.getBenoetigteToys() != null) + a.getBenoetigteToys().stream().filter(t -> !knownIds.contains(t.getToyId())).forEach(fromAbos::add); + }); + }); + + List result = new ArrayList<>(); + result.addAll(own.stream().map(ToyEntity::toToy).toList()); + result.addAll(system.stream().map(ToyEntity::toToy).toList()); + result.addAll(fromAbos.stream() + .sorted(Comparator.comparing(ToyEntity::getName, String.CASE_INSENSITIVE_ORDER)) + .map(ToyEntity::toToy).toList()); + return ResponseEntity.ok(result); + } + + @GetMapping("/{toyId}") + public ResponseEntity get(@PathVariable UUID toyId) { + return toyRepository.findById(toyId) + .map(entity -> ResponseEntity.ok(entity.toToy())) + .orElse(ResponseEntity.noContent().build()); + } + + @PostMapping + public ResponseEntity create(@RequestBody Toy toy, Principal principal) { + if (toy.getName() == null || toy.getName().isBlank()) { + return ResponseEntity.badRequest().build(); + } + UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); + if (user == null) { + return ResponseEntity.status(401).build(); + } + if (toyRepository.existsByNameIgnoreCaseAndUserIdIsNull(toy.getName()) + || toyRepository.existsByNameIgnoreCaseAndUserId(toy.getName(), user.getUserId())) { + return ResponseEntity.status(409) + .header("X-Error", "duplicate-name") + .build(); + } + if (toyRepository.countByUserId(user.getUserId()) >= limitService.maxToys(user.getUserId())) { + return ResponseEntity.status(409) + .header("X-Error", "limit-reached") + .build(); + } + ToyEntity entity = ToyEntity.create(toy); + entity.setUserId(user.getUserId()); + toyRepository.save(entity); + LOGGER.debug("User {} hat Vanilla-Toy {} '{}' erstellt", user.getUserId(), entity.getToyId(), entity.getName()); + return ResponseEntity.created( + ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(entity.getToyId()).toUri() + ).build(); + } + + @PostMapping("/copy/{toyId}") + public ResponseEntity copy(@PathVariable UUID toyId, Principal principal) { + UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); + if (user == null) { + return ResponseEntity.status(401).build(); + } + ToyEntity source = toyRepository.findById(toyId).orElse(null); + if (source == null) { + return ResponseEntity.notFound().build(); + } + if (source.getUserId() != null) { + return ResponseEntity.status(403).build(); + } + if (toyRepository.existsByNameIgnoreCaseAndUserId(source.getName(), user.getUserId())) { + return ResponseEntity.status(409) + .header("X-Error", "duplicate-name") + .build(); + } + ToyEntity copy = new ToyEntity(); + copy.setToyId(UUID.randomUUID()); + copy.setName(source.getName()); + copy.setBeschreibung(source.getBeschreibung()); + copy.setUserId(user.getUserId()); + copy.setBild(source.getBild()); + toyRepository.save(copy); + LOGGER.debug("User {} hat System-Toy {} kopiert für Vanilla (Kopie: {})", user.getUserId(), toyId, copy.getToyId()); + return ResponseEntity.status(201).build(); + } + + @PutMapping("/{toyId}") + public ResponseEntity update(@PathVariable UUID toyId, @RequestBody Toy toy, Principal principal) { + if (toy.getName() == null || toy.getName().isBlank()) { + return ResponseEntity.badRequest().build(); + } + UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); + if (user == null) { + return ResponseEntity.status(401).build(); + } + ToyEntity entity = toyRepository.findById(toyId).orElse(null); + if (entity == null) { + return ResponseEntity.notFound().build(); + } + if (!user.getUserId().equals(entity.getUserId())) { + return ResponseEntity.status(403).build(); + } + if (toyRepository.existsByNameIgnoreCaseAndUserIdIsNullAndToyIdNot(toy.getName(), toyId) + || toyRepository.existsByNameIgnoreCaseAndUserIdAndToyIdNot(toy.getName(), user.getUserId(), toyId)) { + return ResponseEntity.status(409) + .header("X-Error", "duplicate-name") + .build(); + } + entity.setName(toy.getName().trim()); + entity.setBeschreibung(toy.getBeschreibung()); + if (toy.getBild() != null) { + entity.setBild(Base64.getDecoder().decode(toy.getBild())); + } + toyRepository.save(entity); + LOGGER.debug("User {} hat Vanilla-Toy {} aktualisiert", user.getUserId(), toyId); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/{toyId}") + public ResponseEntity delete(@PathVariable UUID toyId, Principal principal) { + UserEntity user = userRepository.findByEmail(principal.getName()).orElse(null); + if (user == null) { + return ResponseEntity.status(401).build(); + } + ToyEntity toy = toyRepository.findById(toyId).orElse(null); + if (toy == null) { + return ResponseEntity.noContent().build(); + } + if (!user.getUserId().equals(toy.getUserId())) { + return ResponseEntity.status(403).build(); + } + if (toyRepository.countAufgabeUsage(toyId) > 0 + || toyRepository.countStrafeUsage(toyId) > 0 + || toyRepository.countSperreUsage(toyId) > 0) { + return ResponseEntity.status(409).build(); + } + try { + toyRepository.delete(toy); + return ResponseEntity.accepted().build(); + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + return ResponseEntity.internalServerError().build(); + } + } + + private ToyPage toToyPage(Page page) { + ToyPage toyPage = new ToyPage(); + toyPage.setContent(page.getContent().stream().map(ToyEntity::toToy).toList()); + toyPage.setCurrentPage(page.getNumber()); + toyPage.setTotalPages(page.getTotalPages()); + toyPage.setTotalElements(page.getTotalElements()); + return toyPage; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaEinladungEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaEinladungEntity.java new file mode 100644 index 0000000..fce76c4 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaEinladungEntity.java @@ -0,0 +1,22 @@ +package de.oaa.xxx.games.vanilla.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter @Setter @Entity @Table(name = "vanilla_einladung") +public class VanillaEinladungEntity { + public enum Status { PENDING, ACCEPTED_OWN, ACCEPTED_HOST, DECLINED, CANCELLED } + @Id @Column private UUID einladungId; + @Column(nullable = false) private UUID setupId; + @Column private UUID sessionId; + @Column(nullable = false) private UUID inviterId; + @Column(nullable = false) private UUID inviteeId; + @Column(nullable = false) private int slotIndex; + @Enumerated(EnumType.STRING) @Column(nullable = false, length = 20) private Status status; + @Column(nullable = false) private LocalDateTime createdAt; + @Column(columnDefinition = "TEXT") private String spielerDatenJson; + @Column(nullable = false, columnDefinition = "BOOLEAN DEFAULT false") private boolean bereit; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaGameEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaGameEntity.java new file mode 100644 index 0000000..258e1d0 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaGameEntity.java @@ -0,0 +1,26 @@ +package de.oaa.xxx.games.vanilla.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Getter @Setter @Entity @Table(name = "vanilla_game") +public class VanillaGameEntity { + @Id @Column private UUID sessionId; + @Column(unique = true) private UUID userId; + @Column private LocalDateTime startZeit; + @Column private LocalDateTime letzteAktivitaet; + @OneToMany(mappedBy = "session", fetch = FetchType.EAGER) + private List mitspieler = new ArrayList<>(); + @Column private Integer aufgabenProLevel; + @Column private Integer level; + @Column private Integer aufgabenAufAktuellemLevel; + @Column(columnDefinition = "TEXT") private String aufgaben; + @Column(columnDefinition = "TEXT") private String activeTaskJson; + @Column private LocalDateTime taskStartedAt; + @Column private UUID setupId; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaMitspielerEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaMitspielerEntity.java new file mode 100644 index 0000000..0bd9cd2 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaMitspielerEntity.java @@ -0,0 +1,41 @@ +package de.oaa.xxx.games.vanilla.entity; + +import de.oaa.xxx.games.bdsm.GeschlechtEnum; +import de.oaa.xxx.games.bdsm.RolleEnum; +import de.oaa.xxx.games.common.aufgaben.Werkzeug; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Getter @Setter @Entity @Table(name = "vanilla_mitspieler") +public class VanillaMitspielerEntity { + @Id @Column private UUID mitspielerId; + @Column private UUID userId; + @Column private boolean eigenesGeraet; + @Column private String name; + @Enumerated(EnumType.STRING) @Column private GeschlechtEnum geschlecht; + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = Werkzeug.class, fetch = FetchType.EAGER) + @CollectionTable(name = "vanilla_mitspieler_werkzeuge", joinColumns = @JoinColumn(name = "mitspielerId")) + @Column(name = "werkzeug") private List werkzeuge = new ArrayList<>(); + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = GeschlechtEnum.class, fetch = FetchType.EAGER) + @CollectionTable(name = "vanilla_mitspieler_spieltMit", joinColumns = @JoinColumn(name = "mitspielerId")) + @Column(name = "geschlecht") private List spieltMit = new ArrayList<>(); + @Enumerated(EnumType.STRING) + @ElementCollection(targetClass = RolleEnum.class, fetch = FetchType.EAGER) + @CollectionTable(name = "vanilla_mitspieler_rollen", joinColumns = @JoinColumn(name = "mitspielerId")) + @Column(name = "rolle") private List rollen = new ArrayList<>(); + @ManyToOne @JoinColumn(name = "sessionId", nullable = false) private VanillaGameEntity session; + + public de.oaa.xxx.games.vanilla.VanillaMitspieler toMitspieler() { + de.oaa.xxx.games.vanilla.VanillaMitspieler m = new de.oaa.xxx.games.vanilla.VanillaMitspieler(); + m.setGeschlecht(geschlecht); m.setId(mitspielerId); m.setUserId(userId); + m.setEigenesGeraet(eigenesGeraet); m.setName(name); m.setRollen(rollen); + m.setSpieltMit(spieltMit); m.setVerfuegbareWerkzeuge(new ArrayList<>(werkzeuge)); + return m; + } +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaSetupDraftEntity.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaSetupDraftEntity.java new file mode 100644 index 0000000..06896ea --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/entity/VanillaSetupDraftEntity.java @@ -0,0 +1,17 @@ +package de.oaa.xxx.games.vanilla.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter @Setter @Entity @Table(name = "vanilla_setup_draft") +public class VanillaSetupDraftEntity { + @Id @Column(name = "user_id") private UUID userId; + @Column(length = 36) private String setupId; + @Column(columnDefinition = "TEXT") private String settingsJson; + @Column(columnDefinition = "TEXT") private String setupJson; + @Column(columnDefinition = "TEXT") private String gruppenJson; + @Column private LocalDateTime updatedAt; +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaEinladungRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaEinladungRepository.java new file mode 100644 index 0000000..fc4f5ad --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaEinladungRepository.java @@ -0,0 +1,11 @@ +package de.oaa.xxx.games.vanilla.repository; +import de.oaa.xxx.games.vanilla.entity.VanillaEinladungEntity; +import de.oaa.xxx.games.vanilla.entity.VanillaEinladungEntity.Status; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.UUID; +public interface VanillaEinladungRepository extends JpaRepository { + List findBySetupId(UUID setupId); + List findByInviteeIdAndStatus(UUID inviteeId, Status status); + List findByInviterIdAndStatus(UUID inviterId, Status status); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaGameRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaGameRepository.java new file mode 100644 index 0000000..f1f84ba --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaGameRepository.java @@ -0,0 +1,8 @@ +package de.oaa.xxx.games.vanilla.repository; +import de.oaa.xxx.games.vanilla.entity.VanillaGameEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; +import java.util.UUID; +public interface VanillaGameRepository extends JpaRepository { + Optional findByUserId(UUID userId); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaMitspielerRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaMitspielerRepository.java new file mode 100644 index 0000000..8a11087 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaMitspielerRepository.java @@ -0,0 +1,5 @@ +package de.oaa.xxx.games.vanilla.repository; +import de.oaa.xxx.games.vanilla.entity.VanillaMitspielerEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; +public interface VanillaMitspielerRepository extends JpaRepository {} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaSetupDraftRepository.java b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaSetupDraftRepository.java new file mode 100644 index 0000000..e1e9474 --- /dev/null +++ b/xxxthegame/src/main/java/de/oaa/xxx/games/vanilla/repository/VanillaSetupDraftRepository.java @@ -0,0 +1,9 @@ +package de.oaa.xxx.games.vanilla.repository; +import de.oaa.xxx.games.vanilla.entity.VanillaSetupDraftEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; +import java.util.UUID; +public interface VanillaSetupDraftRepository extends JpaRepository { + Optional findByUserId(UUID userId); + Optional findBySetupId(String setupId); +} diff --git a/xxxthegame/src/main/java/de/oaa/xxx/user/UserService.java b/xxxthegame/src/main/java/de/oaa/xxx/user/UserService.java index dd0319c..a899509 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/user/UserService.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/user/UserService.java @@ -1,18 +1,18 @@ package de.oaa.xxx.user; -import de.oaa.xxx.aufgaben.repository.AufgabeRepository; -import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; -import de.oaa.xxx.aufgaben.repository.FavoritRepository; -import de.oaa.xxx.aufgaben.repository.GruppenAboRepository; -import de.oaa.xxx.aufgaben.repository.SperreRepository; -import de.oaa.xxx.aufgaben.repository.StrafeRepository; -import de.oaa.xxx.aufgaben.repository.ToyRepository; import de.oaa.xxx.emailchange.EmailChangeRepository; import de.oaa.xxx.games.bdsm.entity.AktiveSperreEntity; import de.oaa.xxx.games.bdsm.entity.MitspielerEntity; import de.oaa.xxx.games.bdsm.repository.AktiveSperreRepository; +import de.oaa.xxx.games.common.repository.AufgabeRepository; +import de.oaa.xxx.games.common.repository.AufgabenGruppeRepository; import de.oaa.xxx.games.bdsm.repository.BdsmGameRepository; +import de.oaa.xxx.games.common.repository.FavoritRepository; +import de.oaa.xxx.games.common.repository.GruppenAboRepository; import de.oaa.xxx.games.bdsm.repository.MitspielerRepository; +import de.oaa.xxx.games.common.repository.SperreRepository; +import de.oaa.xxx.games.common.repository.StrafeRepository; +import de.oaa.xxx.games.common.repository.ToyRepository; import de.oaa.xxx.passwordreset.PasswordResetRepository; import de.oaa.xxx.registration.Registration; import de.oaa.xxx.social.entity.MessageCause; diff --git a/xxxthegame/src/main/resources/static/aufgaben.html b/xxxthegame/src/main/resources/static/aufgaben.html index 490578d..a61e826 100644 --- a/xxxthegame/src/main/resources/static/aufgaben.html +++ b/xxxthegame/src/main/resources/static/aufgaben.html @@ -4,7 +4,7 @@ - Aufgaben – xXx Sphere + Aufgaben – xXx Sphere + + + + + + + + + + + + + + + + diff --git a/xxxthegame/src/main/resources/static/vanilla.html b/xxxthegame/src/main/resources/static/vanilla.html new file mode 100644 index 0000000..6d9e465 --- /dev/null +++ b/xxxthegame/src/main/resources/static/vanilla.html @@ -0,0 +1,11 @@ + + + + + + Vanilla Game – xXx Sphere + + + + + diff --git a/xxxthegame/src/main/resources/static/vanillaingame.html b/xxxthegame/src/main/resources/static/vanillaingame.html new file mode 100644 index 0000000..1f456fa --- /dev/null +++ b/xxxthegame/src/main/resources/static/vanillaingame.html @@ -0,0 +1,1019 @@ + + + + + + + Vanilla Game – Im Spiel – xXx Sphere + + + + + + + + + +
+
+ + + + + +
+
Aufgabe wird geladen…
+ +
+ + +
+ + +
+
Wird geladen…
+
+
+ +
+
+ + + + + + diff --git a/xxxthegame/src/main/resources/static/vanillawarten.html b/xxxthegame/src/main/resources/static/vanillawarten.html new file mode 100644 index 0000000..6d9e465 --- /dev/null +++ b/xxxthegame/src/main/resources/static/vanillawarten.html @@ -0,0 +1,11 @@ + + + + + + Vanilla Game – xXx Sphere + + + + +