From 0f9f109067622636e99c483d258e95b81a3849e9 Mon Sep 17 00:00:00 2001 From: Mario Date: Sun, 5 Apr 2026 23:04:09 +0200 Subject: [PATCH] An den Verantaltungen und Locations gearbeitet --- bin/main/Ideen.txt | 8 +- .../de/oaa/xxx/config/SecurityConfig.class | Bin 10579 -> 10800 bytes .../LocationController$BatchRequest.class | Bin 0 -> 1927 bytes .../LocationController$CreateRequest.class | Bin 0 -> 2534 bytes .../LocationController$GalleryImageDto.class | Bin 0 -> 1625 bytes ...ationController$GalleryUploadRequest.class | Bin 0 -> 1474 bytes .../LocationController$IdsResult.class | Bin 0 -> 1706 bytes ...LocationController$LocationDetailDto.class | Bin 0 -> 4364 bytes ...ocationController$LocationPreviewDto.class | Bin 0 -> 1904 bytes .../LocationController$OpeningHourDto.class | Bin 0 -> 1819 bytes .../LocationController$UpdateRequest.class | Bin 0 -> 2392 bytes .../oaa/xxx/location/LocationController.class | Bin 0 -> 24422 bytes .../LocationEventController$AttendeeDto.class | Bin 0 -> 1900 bytes ...LocationEventController$BatchRequest.class | Bin 0 -> 1957 bytes ...onEventController$CreateEventRequest.class | Bin 0 -> 1954 bytes ...cationEventController$EventDetailDto.class | Bin 0 -> 3323 bytes ...ationEventController$EventPreviewDto.class | Bin 0 -> 2621 bytes .../LocationEventController$IdsResult.class | Bin 0 -> 1736 bytes ...onEventController$UpdateEventRequest.class | Bin 0 -> 1954 bytes .../location/LocationEventController.class | Bin 0 -> 23622 bytes .../xxx/location/entity/LocationEntity.class | Bin 0 -> 3914 bytes .../entity/LocationEventAttendeeEntity.class | Bin 0 -> 1901 bytes .../location/entity/LocationEventEntity.class | Bin 0 -> 2590 bytes .../entity/LocationFollowEntity.class | Bin 0 -> 1742 bytes .../location/entity/LocationImageEntity.class | Bin 0 -> 1849 bytes .../entity/LocationOpeningHoursEntity.class | Bin 0 -> 2468 bytes .../LocationEventAttendeeRepository.class | Bin 0 -> 1021 bytes .../repository/LocationEventRepository.class | Bin 0 -> 1107 bytes .../repository/LocationFollowRepository.class | Bin 0 -> 878 bytes .../repository/LocationImageRepository.class | Bin 0 -> 726 bytes .../LocationOpeningHoursRepository.class | Bin 0 -> 689 bytes .../repository/LocationRepository.class | Bin 0 -> 716 bytes bin/main/de/oaa/xxx/user/User.class | Bin 7179 -> 8112 bytes ...UserController$LocationFilterRequest.class | Bin 0 -> 1943 bytes bin/main/de/oaa/xxx/user/UserController.class | Bin 32302 -> 33256 bytes bin/main/de/oaa/xxx/user/UserEntity.class | Bin 12359 -> 13433 bytes bin/main/static/community/event-detail.html | 177 +++++ bin/main/static/community/events.html | 582 ++++++++++++++++ .../static/community/location-detail.html | 628 +++++++++++++++++ bin/main/static/community/locations.html | 647 ++++++++++++++++++ bin/main/static/js/sidebar.js | 2 + src/main/java/Ideen.txt | 8 +- .../de/oaa/xxx/config/SecurityConfig.java | 6 +- .../oaa/xxx/location/LocationController.java | 425 ++++++++++++ .../xxx/location/LocationEventController.java | 384 +++++++++++ .../xxx/location/entity/LocationEntity.java | 55 ++ .../entity/LocationEventAttendeeEntity.java | 29 + .../location/entity/LocationEventEntity.java | 38 + .../location/entity/LocationFollowEntity.java | 31 + .../location/entity/LocationImageEntity.java | 29 + .../entity/LocationOpeningHoursEntity.java | 40 ++ .../LocationEventAttendeeRepository.java | 21 + .../repository/LocationEventRepository.java | 24 + .../repository/LocationFollowRepository.java | 14 + .../repository/LocationImageRepository.java | 16 + .../LocationOpeningHoursRepository.java | 14 + .../repository/LocationRepository.java | 15 + src/main/java/de/oaa/xxx/user/User.java | 4 + .../java/de/oaa/xxx/user/UserController.java | 13 + src/main/java/de/oaa/xxx/user/UserEntity.java | 17 + .../static/community/event-detail.html | 177 +++++ .../resources/static/community/events.html | 582 ++++++++++++++++ .../static/community/location-detail.html | 628 +++++++++++++++++ .../resources/static/community/locations.html | 647 ++++++++++++++++++ src/main/resources/static/js/sidebar.js | 2 + 65 files changed, 5260 insertions(+), 3 deletions(-) create mode 100644 bin/main/de/oaa/xxx/location/LocationController$BatchRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$CreateRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$GalleryImageDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$GalleryUploadRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$IdsResult.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$LocationDetailDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$LocationPreviewDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$OpeningHourDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$UpdateRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController.class create mode 100644 bin/main/de/oaa/xxx/location/LocationEventController$AttendeeDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationEventController$BatchRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationEventController$CreateEventRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationEventController$EventDetailDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationEventController$EventPreviewDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationEventController$IdsResult.class create mode 100644 bin/main/de/oaa/xxx/location/LocationEventController$UpdateEventRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationEventController.class create mode 100644 bin/main/de/oaa/xxx/location/entity/LocationEntity.class create mode 100644 bin/main/de/oaa/xxx/location/entity/LocationEventAttendeeEntity.class create mode 100644 bin/main/de/oaa/xxx/location/entity/LocationEventEntity.class create mode 100644 bin/main/de/oaa/xxx/location/entity/LocationFollowEntity.class create mode 100644 bin/main/de/oaa/xxx/location/entity/LocationImageEntity.class create mode 100644 bin/main/de/oaa/xxx/location/entity/LocationOpeningHoursEntity.class create mode 100644 bin/main/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.class create mode 100644 bin/main/de/oaa/xxx/location/repository/LocationEventRepository.class create mode 100644 bin/main/de/oaa/xxx/location/repository/LocationFollowRepository.class create mode 100644 bin/main/de/oaa/xxx/location/repository/LocationImageRepository.class create mode 100644 bin/main/de/oaa/xxx/location/repository/LocationOpeningHoursRepository.class create mode 100644 bin/main/de/oaa/xxx/location/repository/LocationRepository.class create mode 100644 bin/main/de/oaa/xxx/user/UserController$LocationFilterRequest.class create mode 100644 bin/main/static/community/event-detail.html create mode 100644 bin/main/static/community/events.html create mode 100644 bin/main/static/community/location-detail.html create mode 100644 bin/main/static/community/locations.html create mode 100644 src/main/java/de/oaa/xxx/location/LocationController.java create mode 100644 src/main/java/de/oaa/xxx/location/LocationEventController.java create mode 100644 src/main/java/de/oaa/xxx/location/entity/LocationEntity.java create mode 100644 src/main/java/de/oaa/xxx/location/entity/LocationEventAttendeeEntity.java create mode 100644 src/main/java/de/oaa/xxx/location/entity/LocationEventEntity.java create mode 100644 src/main/java/de/oaa/xxx/location/entity/LocationFollowEntity.java create mode 100644 src/main/java/de/oaa/xxx/location/entity/LocationImageEntity.java create mode 100644 src/main/java/de/oaa/xxx/location/entity/LocationOpeningHoursEntity.java create mode 100644 src/main/java/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.java create mode 100644 src/main/java/de/oaa/xxx/location/repository/LocationEventRepository.java create mode 100644 src/main/java/de/oaa/xxx/location/repository/LocationFollowRepository.java create mode 100644 src/main/java/de/oaa/xxx/location/repository/LocationImageRepository.java create mode 100644 src/main/java/de/oaa/xxx/location/repository/LocationOpeningHoursRepository.java create mode 100644 src/main/java/de/oaa/xxx/location/repository/LocationRepository.java create mode 100644 src/main/resources/static/community/event-detail.html create mode 100644 src/main/resources/static/community/events.html create mode 100644 src/main/resources/static/community/location-detail.html create mode 100644 src/main/resources/static/community/locations.html diff --git a/bin/main/Ideen.txt b/bin/main/Ideen.txt index 851ad46..12c52cd 100644 --- a/bin/main/Ideen.txt +++ b/bin/main/Ideen.txt @@ -1,3 +1,5 @@ +Slomo und Speedup Card + Sammeln von Erfahrung TODO: Im Time Lock, wenn im Spinning Wheel tasks drin sind, dürfen keine sonst keine Tasks gefordert sein und umgekehrt @@ -33,4 +35,8 @@ Ich kann Spieler einladen zu spielen, dann kriegt die Person eine E-Mail und mus Die interessantesten wären wohl Würfel und Countdown, da sie mehr Spannung erzeugen ohne den Ablauf zu sehr zu unterbrechen. - \ No newline at end of file + + + wenn ich dates erfasse kann ich diese auch zu einer Verantstaltung machen, + hier kann ich die auswählen, zu denen ich "Ich bin dabei" gedrückt habe, das + Date wird dann auf den Standort und Zeitpunkt festgelegt. fragen? diff --git a/bin/main/de/oaa/xxx/config/SecurityConfig.class b/bin/main/de/oaa/xxx/config/SecurityConfig.class index 6235a307fc7c1daedf5af93934a629fbb63b8ebd..34ffe480c73dbfeb8e78438bb3492a48ecbc120a 100644 GIT binary patch delta 1973 zcmZvdTWl0%7>3`sJF`1owsfHW;L2lCi5x7JfkMkQOz{csocP$1YcED3ck=IufI6!uGIz)|TOQ5j)JRe6 z_&woO=R_jnAM9Eqsm1kD{-doll5uD8x@{EG3Pv=Y8W2AUej=(>Ek9$V9lqoGp{;9tUeqd{$^xFfH)khqcZ zV}VitXDJi=dacEVZmXfOr%0b|WSZjA=7kZf1N0MwG&(Xit}s9ZOZ93dKb$YCflD6|S{cvwGafnOSEL6xQ3*o5aJ-dm9-hGaLLbR`rOwZ|2bKAy=AfNH`07rcsAr4s#Y_Uey)mYnGn>^3* zpf%BYg!`?<*2¬pxd80J||<>*Zt+!)10nfC)?rb}Wd=GMf%SM@%p+h**%D?AmyM zecU9N4a79=O{Mhgu7r5!dd|lL(QWN)X|gV~`K%Y)s-+asRt9UO1!Ah)Uf)tz`yk~U z`e0f|!zX#hdN+L0?>hjmm>|fPmtNk`?%8@ydJoSZ_N@JUY#A?nfWk6vlP~WfUss5A zt?RX7x%B5d_;i`vyodaD5BZ})-ojs{!a8znnI5N&(=O_DQ7X5!#g)aYT;hsxjf+++ zYF)IVUE`t^t(!X9qIhq0taFJg77Z?1v1nS6HoIuWVf~7<)kTXH<8~LW&_?UQ53-Aeyins$lbRvu{45Aymt!+J*innl73gVd5f#cE;rlcJ>Ax+?< zlz=9k#kBMaqSATHNFPF%t{^5|M_l$|R&IeI4`NQYGV(<% zASm_>l!leP+$gf~yGR7s81&o!7F3~8EP2Ieub(QaMZ8Bak9hj~>UjU#++w}n8!kS~ zM+6d(+qm6!7SW@8Oh_d@F0v}_K(kFnw9`2^xJ%?ikohz`+{ZB delta 1741 zcmZvcTWlLu5QhKXUfUbTX`MQk*5uaElEk6eQVOLMdZ7)y(2&q3DZQoLY}U>?8{4%V zr-F{;jvq1K2@31Rv4y;x8R%*AFz5YqeBwY2AaEpx4DJ!N|Sw=&Y2PPtXTmqJOsWEt5^pZHPn15u;tGZR+U4fs(iCHiui zl!~7{JDn5u70)h|g#D{`)md{qSA*YhE#$-R&h5r-|8?AO5=~ko{*=*nHf3ePIEB9> zcosLEOw&*qw`FdzXlIQnkxNGC!wo_i8az0xQX!&Vo|c;#w=HAJJfkv5)Xh_&nVl)B zREdB#Q!w)?!}2t5rmR9S@6J~hqNvq$qiB`p!7^f*1a4m~< zHb1d0Zx+m=CWe!=^3y6CwGa*Nx!0{`=(a7x#6;K@Vf)*hLe&T?0s;SAz zMS7jtwwSSBCV(7@U>EwA2RRr;|2!LsU=)W08;;`8JUbGBiKJkMqew=%M&_P~@J_A~ zY)k;LiF-2{Gr!Xo!#4{dPB=fcC6px5=3HrOb2hivDi$#&t~NIJTKfhDvgk$5xzurz zGtSo4AB2Nf5d?w2^K%WI?fy-tm3Q&fVgHKH4xYo)@1b-K3*^%O$d?u3q}RSueiK*c zv;Pn$e|gyzc&iGEZT0Fb6&a(yDs(|K#y}Na5Qs6fK+8D2SS-ex1uSSKxSCdkYpY@_ zw62O)6qYYZ>jf?Ux8oRNRlybE#wuD7ZeEhET9V#TMHh8DS%uHB)t&!yXT^W5AIkx5 zz<%di*Ei)GII7g)n9_;k$|j5{12~}=IH{b0uDpP8A9irH@P_|II)P|dE-ZX#5+_0U%3RAX)CgyffPV1| z_r}=s7JGe=m-WfZdP|AbZh;OjiuZ^X{M^OIIKbV~e4J14fC~?Dl!sjFNgm}f*E-IV)HyCv<096e$&?U2#Yv`7 KkCJ#!f&T!-GPRrl diff --git a/bin/main/de/oaa/xxx/location/LocationController$BatchRequest.class b/bin/main/de/oaa/xxx/location/LocationController$BatchRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..2a18645eb31d71ffaeba6e06cd175c3a24a96ef8 GIT binary patch literal 1927 zcmbVMT~8ZF6g`6hgW1I3^3gVFNGT+?32ahmNxOt3KoVTJX%!M4+NZ%D!NRgbcgKkS zn*M=46sf2Z5B&l8QBlu+AlBGH6%RW*bMKsc?%c2UAI|;-@EjX?^aw08m93?;kB^US zPdB7-wQtwc&6@U2pgm6o)2q@ncHgMqS}HVo^a>2`$s=id(%-S)sD=)j0y(!CQc;gJ zE#rE2-3^T+Fu3XN_|mijB`|eKy_`9}dska`RtU&>(g>6iRm`!jTic$BRobVjT*=^4 zn&}QUtSaP-`K)}hGGn1w+U zqTPgrAru4#jNUYX>+cA(qY|l8Vg_zm_!PGVYUTPha^R%zk9|q4l6O~zyV3I)!g8e+ z(cHE01-=w`d`+5~KtIziJ*IZ7oXN;f+k2{EoXRf|%Z!C7+!OfWdMw?{l6TqlU9%#v zl=5EGR0fb%MyI5*6$iJy8oN|PC$dvg*(xB1Sqt~^AdW3<5C5plu5SJ;19_l~3K*cm zrfvld_0o-sXri-?<|Ai_T-DlyCXk1TiLijLv6#n#z~n_+1ufsW2g*(Yo!+$Y4ZdYZ zZJ%2ZILT(k^^f$vvXk2z(raPR+h z38C$?YE@w7BB)oyCy#Z3J6B(2Q6|A;uf66d+|VHhRev%8@sJ}R$8N}>6ipVM@;vom zfM-q!?n}{p;6G1YA1vyU8#i#1(iutx|9#cJQT&UW9*l5}3;}--97({_AU@%G88Uhm zWT-1-{Ns=jj;GI3miy$5e8^YN@Huc9#DST*Ho{?ZrweEj_%pt8@t!Pb3SXt5GMS<` z4pe8)FntvY?8P!eodmEFM`MxLUZO{<|Dal(Jw>tl;FPDiQ;eT{lz)zz8#(3!3@n%- zW&rbCdtfuCz%ZR#qKs1%-^0N&o={q%USI{!7^vr1!wZJ%WsF+EEBC{@4np$na3hfjqP_$GZ!pv<+8gb=%2Je)aq?wozjz4x5G=dZsH{{(OsKjqOQaI+=ru4&c} z4i4(J+cX2qb?S|HvEVv^=i0XPrWQPD26A2QccdTW(I;^JrTN;d+otoPzAl@t*AnP+ z%snYE)HwcWBk(Neg&}aRCHgVc1?d* zJw;f2S=G6&VGf@N+&XKWWp;jr+{ne8ZrUm~*?^0>!gJ0_vmaRO^k)}yD7BQ-4I zTY=)vQ3ipx$>*}1*X}D>kD`}Mr)5ijs^Pk?I&C9y_tQ6xftzpIaxvz->m?xzw(0xH zjX1}%MB0q%CuTREqH+%36tE=lR7sDK&=@1FFsY5DeS_*^P(}>CA4SAa5@MVdkg~uq zZIo7_jnT$w6SPU%6m3R8TXv{C;mxF<$ELuQ|Hn^(ft0p>FED-FyNri8YC|4Rd6svF zk_=JLs3R+s?j_f!T;?Lh#&ya}FKJlBkkUV{hLo&@o}w0dN?PctT%o6Kg`TPvdTLha zsa5m?%-D|${8aRwrWf@6`tKP2jf)x8dZn+6F}>2?#kgL{bupn=@?A{ol|mO& z`be>hnYY9yr}Ox1xB1I-kyFjf(+adAO%>B<1GGU}nbwc5_}POy_?rF_FLa-55%>-8zU}8 IObmJW53NoR0ssI2 literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationController$GalleryImageDto.class b/bin/main/de/oaa/xxx/location/LocationController$GalleryImageDto.class new file mode 100644 index 0000000000000000000000000000000000000000..4e1ef8c9a4920c8380902dd9b8d2f1a77993f2e4 GIT binary patch literal 1625 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 literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationController$LocationPreviewDto.class b/bin/main/de/oaa/xxx/location/LocationController$LocationPreviewDto.class new file mode 100644 index 0000000000000000000000000000000000000000..c902301cbeae20ef8af43dd11bf549bcbf800d6e GIT binary patch literal 1904 zcmbtVSyK~15dJ0va=3D%5f8k8WC7Rvih@E^QbwRedC;dN8DVwViL(<#f0I>em6TOH z_yhb=mOZ;0vI3?oeVD6vy1(w8uX}&|-1!dRKFTR17;e?LC2ZT;+S;;QQMHvLJgX9I z=7guDa9u9XH$_X5Z#w*4Nr@Da485=IP1|y9Z_Rqjt3uWovQ0B(I`me83k~JC*7N7( zQjsC)*&CdpKl~D?E-UGHYxJ$RF2yUy?Fffdh42${7Kj*U;#T9pjVAgGaT}KyqP}X2)44lGQhUxzT zD>HQQw+-9%8HVz)$5>o_&8wL^LrWtNV=q-}O6e4Qu zmy`-CS#)5+KpvApa#n~xPqWy4d>2Dic-MK=vx!*wF+YSRM4mv}-QZ&SSCR(N~f_G&Ko zsh-4}M!mQ{u9zfJeD=Q1OWdzYr>=yItIWB!@5cpEwqEWx5=Z}yY0-1{bm3AOw;0S; z`4)Ah7WbB9akn6Q7`kZ;&={hTV=&5|$7SFa_fxpXF!p!#p!-48bmARmj$yQw{WghA z;Q_;`_E(8=Vb-at7PznGg|A2!_AOkb+U_96C(*B42<`fH3kX(f0KrOyPivZPcEX_f zFr7weWwdshU(x-UHVO37+!Y9~p)ZhtPAM|DUuB@3O6EY7p>`@+9Nk4p1U_iTa-aU_ zSRZw+reoveypAPh?%+7E7l-Xe(?=a>B*KX+od!PcL5eG#!}&-lPe=*6nKmbOD1~jb zK=oaqyE@mm>4o&m44dCzniJdTHYc|+U`}mg$jl|Tk^AyT^eOt%m!yZI@MvUcWNCEb z0?i3nL;(Hd3^#(eyGdY0+`(N;2XdX58TxDHFpCl%;uszUdNY`(b(m-qk|v}~NSJ^w FzW|h=vm*ci literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationController$OpeningHourDto.class b/bin/main/de/oaa/xxx/location/LocationController$OpeningHourDto.class new file mode 100644 index 0000000000000000000000000000000000000000..ae79af55c2f42b5367888efe71faecbdaa41770d GIT binary patch literal 1819 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 d!7}Sgj58b}w+(*_> ziU&WykFvb8P#LL^QheyXy`8>&PoH~#{@VKiU>?sjBp7C!+!U5&Zf|d!j%ZlQ7Oq*3 z28&zVRSUvZQaBEm6Z1-Ox5;@`2@Oex{6}lcG9AlZH(&9FkWGek$K$d_gM2;M>?qqY z-@dI?D-223+TaYua3_GhR?>FYX)oWF;)Ct*6}zE2lGisGa_ih{v>e`ODFT(sJuX}j zO`ZkAF&!zS8HVe&%a=PFYh1pu)||i@#p0}5()Q=k;>iAG@i+MQ9M_>C+rwJY7m}FQ!x~E=OlkYj(wbdhrTI9Q{iWnf$!r!cv zS92IZS;rL^0aL4_pch=VM03TGq%y@Ng_?UUI6so@60g|5tH$5r+QH$&c{lR9qUHbZu8{|1JgILWrVB|dR8JpJ5qn-2FT>Oy?# zv@3n1jeu`Hw|SLvLE3F4WE`^KSe_SOh&X&7yS9h-KeQJ~U^opkgIR{FVFp+HWUU;` z%1SpUhZ%;b6{(F-8)eXIuFGZcChlpV|DO7XOy5yd`-8WtGN_diM+ z3<;+cTjrj6E<7qK>9A_iN0W#s0g@>Cb%aJmzYYYJsz6|=29V9r$rJ{u*J(CMmXS>v z-!Sx*1_=yPpAHsZAs?)OW*Q3AAA}V9L9#s|BmE$`o{-VQAq6U8`wzQHkN0EIj6IwN z4uU8_qG$?Kj?P8V#6jnQFTs&61#!?gE=8acc}md9j4`!`%l%NG{Ptb=#62LJB0FY$ zN6DDl#gK7r7e!-w7bC{$ zhBU7B?RvUcJ5|0}(Y^_^=c!<7S(?V-w)(B5LX$_gz|b3cDs4~t2llpV=%6W(bDJR@ z_1M!gu4mWX&^QA9JMMumO)F3WlQ-N8nf>l=ZPi&KAm>RVP)b}e$Et4adn$HmpRRHx zgG*_q+Ke58cdzKC>IZLXp$EMJ#k%XO&DQb03SLXHM9h@I+mnGC?Nj5(W%%rcqBx@# z`ca5h_bd#cAkb&@jtN} zsj#D4K|`&(QB95C(ppcVb|HLOYZID4o+NR?0=~w49^VK&xN5ba~Pt>Xk8-aUbbdZIt zcrpyLhBU^n?Lo5a*XlN{o?cjT}1Dqlb``_`jUu1LgH^SeTfK~H-6~vq>%;N`v znfK@%;;#>}Wr67{W$zFvk5z$*yN|Lw6Ghp7o1BpwI^+cFO-3W0ayI1H966Mtk;7e{ zyDs!`&(XnkDHFC;$7ccH+pEK}-4z)GyfJh9zGk5vCgwK{W-Vs-YMySa0Wy}gxxj-J6B^8pGA zW{4TU6F$3OGpE21FZYZ#{+Z$h94ugw))M^!OZbsOy~GOEDA#(7TEZ*7$9cKyRgly` HTmkO@628+% literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationEventController$CreateEventRequest.class b/bin/main/de/oaa/xxx/location/LocationEventController$CreateEventRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..a1cea7415181ce662ec48ced757fdb0b9d34c03b GIT binary patch literal 1954 zcmbtUTT|0O6#f?5ro|w%2ns6RK-+-S`>l#X5oM-c29XDSTG}0mge)do2LF=}G9%** z5B>mul;hb=kjR8O4iB5Ndvd-#m;KK9`D^zFfN4Cp(8Vy-5>?50b!%&@>d7WouJo&o zc=K#i_^K{_6-dt$!Du}YTnVFH5TDv2R2DJ}eINNIuX@~HsV<173|b6X%xTNk%3sG6X8#mD{0qe z>aryYU^rnTiyT95!}Z0h_WH627Wr}%4rS&o@xaw*qtt+s4GTHFJ82`Yp=b77qy(Vt zPT44+n<1}clvasqI&9-K&M+*N8%L{ZEj7RVDi2q6jts}jm3i&)yp6NCz)(NB$9aYv zy(#xXhJkXTzOR=*il(Yn-fM@WHZEd};oXrPrg@+c9=X1&rWh8IA;io{K>ndgd9}(? zH;$oV;|d&8z$GH?OQBX}>kSY1x=KI$vxP{xq{pGzI7`BrcyZ)wJ6V=H21@~K?2uB-IuC+I6 z9m@~{7e8-^*|^JOkc8Ad9)?LpT*?oLYg4@cMah^Fy*X6#xW{nWbbBq)*0n!PU5i_~ zm!XGNkybygK?Zx?_eEgh5upWo^zr{_8|vD$aWu^^wqN^{ME1&Pq0TVU*_8Mg)tnmr z6-~PrGNjRzi-sJ%HSvggB7>5iH?%A1F=8YQ5hH0xkj#^17RTvp(`k$(Bbjx+q30`Y zy3kACoKbT084c)Ur9z6GAo)~Ces%~n7el~75cNo$ zO_2uGx!6wdXM6`e z&cqIi&b1x%J42Zr3~nFleVqOjGX`$aHczWSD~k#GcHtT(NtP(QJLc`~;yxab!x|nL jy)MjSJfUJe#SCVtJkJd7G3H1P6Kx{WM3jjLW9af5!qdu6 literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationEventController$EventDetailDto.class b/bin/main/de/oaa/xxx/location/LocationEventController$EventDetailDto.class new file mode 100644 index 0000000000000000000000000000000000000000..62cb57985cf67eb56335491d58532c11e7d88f0d GIT binary patch literal 3323 zcmdT`>rxy=6#kk3yDY~mh; z-`_90ew|Cl_sX@nap#rrwy3{D$ZO z9mql#x)}y)jwhCyyIUey;aloD^6HJ;H6A#suLl+2eG3@{INLUBUZz^`frTu3RO>?v zxu|u?LT}Xi$by9)hVyNB%2g_C$wD9cRqKj{0rWGRDVEk%|C)tC3?IIv4uR|VaQ59ikLjb_GcD8!RHJQiYI!SqtRW7-^IK@^0ULk9rZf;#8u_(riB}z zm%Md4Z&ikF@ne&_6oJD&8}eRF&2k{`?s8x z-~rW8DFOf)}W3dQKZ6!UAUG!y)`@5@jId@r&S=1{{@28#@1howDedipJ* zSd3R%xQ_=^8@JjP7+#x!>v*sHm!cf4Uf^EC72&0t@4syBRgMjp7`XD&o|un|z8{#7 zIhTi_IS>cohG90v`;nB6(`uj__p(@KsK=~TX>(GwanMxsRM9+CF<7W_z(JLmfhq?a zQ!yAOZWFf*FpQ9ll8ljDBpD}}ASsgAB$Fgl#EezX6M;Ub2s8Me;l_VtnGCk5N}m8s z^k|S2L;umbn86RUL||GIL1|6&q&3l!*2EWN^(?hJFidmwi-C9P`yP!< zkY=R2?B6i*t6p-BzTJ9o73cK`sFz8Fj3yy#1|*9M1WbAvOF|wSkX$O{ViNMifb^z9 z#*>hz2EPBaMHBQTkldsRn#NZ#s7RhV z$XM3C@)k44q0}GyZOVn{Xmk2#n}qEp^o;!m^Y)b%M(nFCjM|eejM;_G7B1R_t`^4a zLU#)jb|KS3(Jo|Lur`VJg*jL<0iFm{fG|*5&3dI&7Zks-6m8Ky$2?k>buQt$^uy;U-kf^k#w7;pH zHZ$>bh7bJ#{ZXCXUCFkhxJ)~IxVn3#J$rZW-gETV-{*e_%F&(6+@ zwp%lW zl))FKCl&?6SO5{$F<0BRX#(G-h>)4OMf04WSC1K3iDAGLf;)B2m)wR!Shm8@AH1Vf zYm|fS(I)bR*LU5wkAjvRPu^e7)93OCR+dPo_%gL(QyQXK!SiO{hw=|?A z;A(5x=;`Eyw>6}Zk)sg{wrC83X z`vEJ%Z|f6bvEv&K)N*dKgdb?^qN+GLvqo%#4Z(S-A4-Fkt$t0m3lw8Jfe7& z`(oMkNl=r)9{}%>)btYhGNd-7mNd#q5mcVEPI*!~0`+zruA#7CT8`~OcT03(%;1V3$^`DcXsynfWFLRsH^GlWNET2SwERfI7l{3CVyfH zEYY(EB|IcAOIM+J3~N}&2A*IOTiC`9cJU=`SYl*RpJJbA@io51_f$nwt?(2Fz1r?WlCEw zhc9pTgsm2&tsH4t!pW6t?uu|5mP(+Vp=+D(aoytfroJMo(y1}DnKhRV%Kk}1nU-EQ zU1cz&R?SVDtA-;OMp}+%Bm4FB(xNd(fVh&1TMVqkkj)n&E@8ynDdU-O+81O^q`=Ur zA&w4O%cd=s8@mlvyevG5K@B%>i{bgDDM-%_@uk5nDpYSi(A6jW zP}vq$WfVSnJa;qtr6;{kCHTCQ%2f`p2XWjqCNY(O&M@5U za;IS{b64nrQlY1Y2Y5&gUOA4ya1fQ%wD;tW&;#!!Zr3c~=E_p;H0nk~q_B-5mJqo1 zwJsKgTXoF3l1>z|U~$)t8p0T#PX~#zpXjo%=$#$7pTsn!K?7{~qu0rhp{IvIE7`Vi zd^X`G@SI`dKiZpOMy`z)45Lj!FVH4|mkdJ}yHY;|Leh{d3s)^kSCK8aj4(yh+eWP% zL)M#o+9mv5lJ+#x^zPZ>xI!MmiH56W9VIKHHD3II%y%Es6*>cp==LojmlOqJryxDw z&V_W-_0ShW#);KqNfeK89cblY|9HA-;E#EtpqoG|Qxr6W;gBg$Ofh0g7AKBy`yv!* zqH?5JpvI`5nod|x#m?eSj1?yiktq%yqUV52F*J2)QWxkX6(e0~p(l=_?>d2dv}Wj= r9-*CnAL9w0;u+bp6o_F42Kq6JIlRIE{X2Q#XE0A|AHAKdpI^Pds*0aU literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationEventController$UpdateEventRequest.class b/bin/main/de/oaa/xxx/location/LocationEventController$UpdateEventRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..d63f5a1168e49ed77b996606e1fc15cca171737a GIT binary patch literal 1954 zcmbtUTT|0O6#f?5riCE3C<>y8g0?}e_gnD-1(lh48AKlRX=!&L60$YfGWef-&>0zL zc<=}Kqa4p}f#x=r`dT7v25wvXVko#9d{xYG#Tl$n@j%TehT#aP+znyE@yI|d(TVWK%ayci zGj-V#1uz`7kwuPSpyB%BWoKhW1WSA+3WqZDmU-anvr%e5$%ciT-W|7**U;0uE>Z%} zb|-BV(94ilGD@pNH65{W3a1&C%8kQSwU(M+evOA~I!A^h<;sHgIA&uM=NRgT_qf22 zqc`PV$Z(>ZsPC(l52C4Rm3P|VgpF}bGQ2&s!!!>R!nEtV>Jh_YGK82p3CKS*DX&&p z?!^&QY+Qt63b;(feIeAEY`x|I-w;X!lzQ(Q*$JBBsjKNSdO#yw)ubl)tduHL0dGh5 zguS?i8y2oJjP21r==dg_sE)Cvjhnbd++W$ff#GX1W7pr5>!KQ2Kj(hS6X8Td%JojW z*0l^VaOqQ9%*9RQ~= z0}TDNinIo44KdgYzApk3j|eT$qfh-u+fdi0jiVWc$-UaAB(hsZ3w4IG-A##)QO&8* zU(&RDE<+kkxoF7ITN96{Co(AMc|*IB9wSE55HXU51j#&EX3H%LAeGT04LzzOoTKd_;LAw`;UySZGV;B_vRvx8w^KZtrH z&ZbC%>P+k>2|5dWHYR%|NP@<3J_eP^Qx93@ov9sM=!OEdxOSmadO$Kua>V(LvNN@f ze&_Nwiq4g73_8P^Z47-q(EAkqDP|1ZqHUg5fmRlm>Dz-VxJt4_;oUZGcL(=ypB&aO kZS=Y@5Am3a^#rq+qw>rf+(SGiIYP9FNE1;eB8;KSZ)YLOq5uE@ literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationEventController.class b/bin/main/de/oaa/xxx/location/LocationEventController.class new file mode 100644 index 0000000000000000000000000000000000000000..4beaf73e0f3ae9841dbe00c43148aaafcd37e2de GIT binary patch literal 23622 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
  • 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 V-C`Vnz6BH?!^z>*y3|Z23Xka(%ntP|H&Wp z9D90>Klro9Kg!eZota1ok=-94nfv(6ojdp5$v^-8`4+Fwwy{-4@BwtCD9s0nf2vDac5n*bhtKB(;P#=uOmjp z(BblKU11am0h@FMsfMXMPk7{QZ8;hD{hqYcPA$b%PWgJrSim# zLA{kg*pa9%0x_nJ%1M@Y<`$qSW5p+4;L|+7w)x3j?6%}rMTR=)eUsj%cY2Yp4@?@T zHw_vnIiA?4*Y-tF=5%uSC;)fY4jf)`VU3as3yL%q5PzZxw%ks zx=@PVi#DY)RC4{=zJFq^3S2xNeV(JgYf>k5A^X^2QDwrs8l zHvQbBe##n@g=yiuAXqhT(lu5ML$%dX1FU~w(nx##+H=+~nl#G#F8G(YAT9=>OM)$z zO}b7uw59K{Xw9TC7WKjz1&m^0=~pJ*WF#MK36;aL4U=*#8*xIJf|e@6&7+P?b~vw@ zTq7NAs)m_mlWx%jZZ5odbHn-8i{r8yTo=)iU){0;Za6< z>m#(u99w6${d!OlD;OAvw^8+KhTh@n_lm#a*D~efZ>??c0+MsClgzl!}y63>0Y)ZYX=LZMY4EGz;dUV*Wt6&H?xNZ-P~DBl)0dGav`G5PTST_k7$ zh6X2X>J_~=)$x*U|1Q&($N#KMZkEzCi?Fja37M&^X^N(?GU!A42!uQM&WE$`$y5v9 znc6w^2hIG3FDYUmoACXdgF62MeH;s#O$PduK8uOyUNX=Zv7otRpoLh_{bZmoV?hs- zfgaIPOpXf4Kr6AJ)nuSz?9m=41C?Sy>&ZZyv=x)1+rK8N?62ub3}`!9L_4&Lj%@9< zIlxogTvO98Y396pRkQWUX5%r$?Wekyzo~Kg4Wyk07Cb+m#^Yy`;?>mE_>9CqqrJH3 z?Kepc=Zrz{HVnLKtIOi zzK|5Jo->WVF7ZFb<5!d7)yt^yV-j!2C+Bfeyn19c{-(t5$K%(N;?+~F@i~dFQ1!~( z=PtatS9h&?@HKv1;sqUCiN{dbP8z-X#h~%GfKSn(9C1hTht&Yq4%WvQ7X2ZeyapI1 BER6sF literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/entity/LocationEventAttendeeEntity.class b/bin/main/de/oaa/xxx/location/entity/LocationEventAttendeeEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..9816eaad68c5dfb0a332663991316cffeb35f553 GIT binary patch literal 1901 zcmbVLT~8BH5S=ZB((P(XQ9djx2x2M9`iUsU*Z`U)6%A4z=GTuEqDwSItA#5*q1N99FY&UsnO4a9p#| zsI9MRG`SVxeVgq#fzxzZm2*$1oPkCY2tTrXVVUokA2wU}A6@oXybYRz-QHpg{_ z$qHr4VII1!1>^zrNE)TN)n;(3fISBhLt(&t8JdwF%4PU$U#9b!T}2O*QQ5LgMS;6+ z3APOjnTDP?+!0ST8YnO90DjH0nN9;VZqO)Q&?sMbINJ={P3CXQGBhem7Tq1occdLV z)8fEE$1C;!V;_Z_+h@Nek=+!_3xBg+irKF5;{?8ob=PY*y(9AljDH2?N9B@zX7Ni&F=KxLXBM8^TQVRAoyRvsJ>#~3TL>55=G0rHmv5!4 z*aG}tL<$q9hI6p;mBv1)oD=w$xCH!3{2NgKU7`{!5KEVVekG2&in9~wGfjVlGev)Z z^hBU*J%MKX1G?T5Xudz7GA;CItkmogJAZCpY0bu8nGB&SMaxc!_W5%AI)eCpI7jA=x#4^D*eJoLmtDA06s8ZGKbVH{ta(5@w#CQgzv_+ROajx#>^ z?D$7HerI;{hbrWj`d!IksHOruL;YpW7$+kX*uv(O&@YG372>6 z^;@3j0Nw>}WKcH@c*39&6^)E_H4a_Bft5X;@Eh?aPyJy~e_cei(0$L&5q?ebOX7{| zyJ{$3Ex)W9)aN#xhA26)gS}VEC3|f}356(zfhC;6gxZb0%ER+8TU61*rhT5en|cfy z06r-myUxn2NkvwAp;T3BMw4yZlf!f8Od6m;g9b6Tw3{22E}FEDB@>dJq=SVkCXKSd z##WPbOeQ;YNC+>wVbT~KRJ7$JJ1i`kG|oaXYCER=(|b>eb2q#q;?1D`+zFkgh*83D zk5#+w;Te7H`G97$TV~22rnFf_NEp~Lr~=usHKidPTrrE6?zq9y)u0vD!~>VhXgrCl z?Mlz_ef`&MQ@0)!GYRv5-&0wLQ1d?A!-l6{jMwrxpyN18zGZl6xG>NwpjSk%7i}N@ za$FXAydN!}e*Y^nA)p4dFf4_f5{7IVhKe%KYO-u3qWut127e0&ARyIy1icYb-ANe2 zAZ{bRlL*v8YoP6({Yq1xWaLNi<=6>39>v#G6X+Ox^BZ)6PGZ|rde&*Qe}X>KnU5IE z(JrXi5j33&n#l$_N9R)_x{wWIrGnrE4kHu4eLzRafW+TV$IoZQtEWKY_euP6I{tE2yn0YHepKR1R8Bjb>sj&YS7wqeq#3PNvtyZ&U2 z(bVe{x7%VTNP=c4)}@S;c`9KviQ|VnR@{3p;v`6vkS*cWeO#N)O>IPB+LlN=9l`q5 zA(@6D2fPo}5u<@L5wT7v=OZ_y!s04nesdZmx=3H`gW*C`mW0>B( z=2EG1-s-XLRXd7u{L}YpE{)O{>PSx4F3F480-*h81_Y&APIjrC8^7n=Em%>tc(O1YpbT|u+G zfv$E1&G!bnPB*%gw$K}Bk(SWWvmQMJyr6wsTK-BiXWbq(CQaBAncKP(b|RK>ub&|( zqXjp+<7a!t+ri54j=|sRj-T%pZ^tvkmkfRdQ`g0ug~pHxTeGBme*a literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/entity/LocationImageEntity.class b/bin/main/de/oaa/xxx/location/entity/LocationImageEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..94a676668b6d3f261f2d5bd10b875aa1e1de7059 GIT binary patch literal 1849 zcmb7@ZBG+H5Xa|Ap>Q0uln240f~XWw4xbf_388436gAQk;~TT>t>xf)N3M4Szm+B$ z6JPiN{7}aK>|LQ?P3w!h&Ft*_cIH2`zkdJtNkp5pk)nh~tClo9Aw1B@sHxF3jvop?5ayBen|3phZcUm+3t_VzU0a?LHe9&%R=Rxa zpc^`l0K5;ikw!x*pMnU4M%gGMmG5rg+io4vnVRAh!X8Af>I zc*2s_CaRl>2wZ~_#Q|8BVF5Joi~-Lz>dPQUMx@r9RLIQmTeU} z-Vt=YD`=rN&`rA4C8NdOKufgT1+>x|=nk!-trs;~2Ry;LEw6l|xr=HKE0Lz66S3Od ziD)cL#Pw@1xYcXj@e94;qv?wAy29V3d)=~M>=hr)XpA3G`1|yr8-Ar%d^F@SeoW2% WLp6Ml)I&-`&Bw5xK(wb#TK@x3@=YfI literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/entity/LocationOpeningHoursEntity.class b/bin/main/de/oaa/xxx/location/entity/LocationOpeningHoursEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..8f726aef2de6379e156587e400db2176b95f221d GIT binary patch literal 2468 zcmbVNZF3V<6h1di`jRZA4N$E;SPiKoX&uXl%r?1gmu~Lj?hTgz ztXpqc0HOV{>YwQq0kK9?;mXySll zoHm>_WZMt-*>UOBe%WC+x6v|Qh_$-MS?CN{Ll@xYrl|TSo5iqs_XkMz{ijx3Cb$BBLx+DF-;FaQ*HOv=H3rd9tsi;ys(?W zUh`+OG8rJ-251T@#yOY_pXv}Lz@ov--e8N$=L)N?I=IzSKr+E@`o}_Id)8Xky%G}I09njqk)9al}_f%vdlb@ z`XFe3=Z5GgjUGiF*wxPi=fNIepDj7Ov4GV+=?e+?AZL!^y|1~Vt$HRXW=lI9k$;NO zYRL_cb-&s>my!QFnzwoG-ZVAw^g`nKp+jXF2;MnAnfxXX1Mr(>t_96@mG@IuRst32 z(Djr?89p2ewRIv8sD*eW>L_4D*PsW_&^TqdD_~8)%EOw(a|*u<_e8QjgXa`h3Oi(> z?lg^ew8R^{v+$w=5^urm#rQdN0SNcLE|{$XMljp*AM{>% z?3fmQGkmY(f7)avX`D0p23m;Ej0v{V+Q{_~66lXatd_1}de9^G4j)uRN7CycJ68Jd-zfK#cvPW?S yM*MVX<7*^=zX*RoS-q0NNUgs1;kr>p-J>w+-fz=H^M@@~0XtP=0cQ*?L-v+w`%4Z^! z%%mC#T>P1^>wl+(r7g@4IvnIaw`QRn%mk`)tHv>!YsF7kM%uQV5Lo;~$&q6{)^#g+HJZLs8pKXgb2*_HM4m{pvp0_{C|%-Cs28hdlzN= zOr<)&LlN1rt^curTiF&6czDyTu!F8Y(Ebf9(bvJ%TzdlqhU_@&Q5M8+qAuiA_z6u-!C%9B6dcY+!E^&u2E&(S^&uXj$1;@(Ba!7sy|EP!l z0Dct1+D?cInV~QoG#>A+p7y=eaxC$15gHSNVIh#(WEK)sgq>7mqW0gpw z^o;rQm^Trz34X?_uufoW$S0gdJRY#t`B3ys6>boCsq}y)V=d!BU-OapqV#7La>Lnh z%*)X4#(W7#;AvmR;n8gIU^8s#Q0Svs+i-1M<0d@<&z}4Fo2iizJ3VbSoEN2lFB9Vs zsI}!F<|fsGK=`5?9BAdytl6(pKtE~(11M)as@Jlc5}h@P=vmB6Xe9*sgR1Fx^yvluG^QhS`d&+ zfm}GhNhAUz&AdEUY0$1?-_I4gZ^vDrP+>Z(}xL`(W8?7_5t-X$l=qY-%hew&O@Y-cHx{GV3F z6{&6NHae6*9#;W>gFL#}f;GrN5pOvt!3Lhi9IWF}hQ#EXur*6p(sY3&X-sWH6>*X; PFoe}uS4;Pu3Eb`%W-$%7 literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/repository/LocationImageRepository.class b/bin/main/de/oaa/xxx/location/repository/LocationImageRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..58e87030be5b1bacb4c0e289dea5ae12552b3ce0 GIT binary patch literal 726 zcmbVK%T59@6ukv;1YbN{x-u?wV^_KvLIP0}$QX=>`|Grf#i5;aItt(5AGz=Y{3v4? z5eGFPx@el7+;dOwIrsJL`2_%)u;W0EzzO42A=2@9Ohe_P5lT|cBNYpy^n`jdtUbbj zU(Im`RtS`b_<%G-8PM+Sko(4gRRYIK2Q-efkikIXh(9WQPZ=7d!w9pjI}v_0B(Oga zlC>stLDtob>(-KQQNRyq1K<(#OIs~eWhnBRo z^u~(zRHA);EuY>5P15qB@>V9{VSS3+mp#74XEMTwIGnUr(jnvZ&$~G mHON8HzH(544SN>|tiyDxHet&aEq@wu{o&@Nqo&06vs) zTS1ygV!~mwyYoNa%;(qp2LPNw-GLH=Q$buI^6_}gL)AkgRm3&LDv?I%lzS7IA5$cw z;8Klra{H@xV3|Q}fG@~Hi~{aI4yb1wSYdFibik8XTc^IpXL?n7$ORhYgBXh$u40@8 zWU$+pk!YsVylvrYLAsf?F!lTQL_-F92VS0XWMs&@-FC}8EC@WA7?(k%BZCOdNE3sH ze;rP|c^oJ*(#&UYo~zu3%~YLoYYPkGn#_|DH<duqv|hmPdJCan6hQ%fK8uEHr_W%?p0ZuElHCvoR-puy><3j? aw|AMr8f43}0h`uvCbAY=xm|5yzx@ruF4)ch literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/repository/LocationRepository.class b/bin/main/de/oaa/xxx/location/repository/LocationRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..f8942dd7d87a9348e0edfd3497dbe8673c11730f GIT binary patch literal 716 zcmbVK%}xR_5T2sAf`5ny&w9d(jR#L_Fd&*>RxlDCVBD6qxVD>aSKtMFC=Wh>4`u8w z1U7-h;Gt>eo9XoX=9}-I&o2OIz>xz50vC)^g-FNaF%6ZEMkq-&k5nv-(i7^43(O7BU!UeB&dfUnxU_bQod2>wScah6GLqLbB$h zJCaPHSHFXJSN1`~7yyJ<9=}h>c62)DwY3lW0z$`{#oz zZnCD)?0w5WQsPtFG@A4Zm8^s3&0hR>jOsIt8OVX80zsnUd?6o`(+I ziBTtP-z=G~keiEEVHOk5mQ1fOTQYsNQkpn>6s8H0zjC z&6j!ok%9v|b_L3{m6&dNnTD~5ZwA6-K9l(94hCBr^{ zEB0hvFy549kCc5LD|%rpg)g$$Qb2s zJKSp2DVkYoq#JY^qU+FO(z4CN)k@xUj~cK8+lGDOcEh#!clff&pS7?jy({*F{TqvF zEt!5e(VoHGiG@e*(?%M-RHt>cK1(mB8#D9@xS8)m;OnWg~+ga3TV}wfU3}n8t!pu9`>Az;c5VtC>Zk4!CDwZpxSsE#2xnfwLf) zM9WWxKO6E@IyF;EmS*T!hK@#7NNDl!*zKL++7nr4I5~^ZD;fD}oifzQPbYP1qt-4Y zwb$r$nqG@-s2FqRsACrl|G4GP;)(s%hZ$~34iM53n}5YOt4sn;4Ig56;*8i8Ej^hN z`){k-yf+i}g5_Co&Jo*okS#1si2b(gRPxSTZrrp@7b&d>zs!JnSY%T6(3^w2*^bBQ zFm>{ZOFCt#70Q-35~NXV?@5-->C{d-Hkf;)vMNh$ojSPRdPv7pDHaLR9}luAE4n&$ z(gu+?p(v6lzpm=k#jiU=|5`@fjK!~!Q@QIoox16&fEZ>`jrv#V7o}M4^hTX}s26dE z@#=Fa($^}z>$Qd%^Jbkk($>4 zkWO3Znj}A&#aZJcI$g_K$_^8(GD_(z{g_VM>!e|RXXz(&+7Y?K!8qBoK4UbW*1%fcdng&m@>IRmlA`6a%cj-+ux4-i{BUkQ zIz!Y3Oh!%M0_j*uy^Bvkylu6(2-XuvL+YnE!NuCK=fhcMoT^(e(F+HiHZC?daOsAd zA8;Js^Ic;;@OLjuf1p2Q=#R*Ywc>8s3(lOG3(8th5Dyv!-*J(SPt%_@x{&n0P&)t~ zGVEg6^tMkr&RlhVc+Dc2>Ub0eTt)pmOm13WE8g`tpQ9nn^D3GR?p?|`6S6E=RHD&1E8f{)%73a~w0JIfZ zs1aw3K5F2z44xYJ03uo(KSYb7ELxOc(W2Oj7KcdDqNa)#MO3t?h@wT26D_KgXi+7L$t{4nAKMCybbd~CKu1h*`h^u7Ay1)TSZ)caLokwpc?SQQV+kN2KuNJ^pG0p<5JMWYM@U_-QW>5(5I!l_oy1^ zvr^DSHPGj!HhN4A^f-MH{#0KmZ-m!3aPb_v?h;Mc9}sj=DSHEruu^iN=M$4gUqZiT zeEY@61&zLpdM&{pSH<%|EXHR9{s}q$gesoTcQL+A;J+%zpHap0u`$MH1^#RF{R_DiaGzCgtIZh`+6JtM>4sfy=&NsR9i_;1s9Wca&P z@qFEh@f!vHyK=|8M-|Vvs2JZT@ZXb%)xD~CzMRGQO#=UY`Rwmg#q*sn#`g>S59o(7 z+uyH>=c{Cl9}xIw<@g6w@q9y#@tXzyNAzQA3Xdm0Sy5IdlV#;W9wvE5yi!>SF2K)0 zJGhg!;B)7;+Q3`Hz(1A8^99v)@eMm(*R=xwGdcbtRXktZWBhi3|G6ChuqvLv2gLXt z0{;uS%RZut=g$l=ey70yQtnfas^a4uZU2}mp1-xk l_}#!a(r@6m4fI?39a^^BU-0)=`a6DQ@$?V+7yXC&{ts<}P^JI? literal 7179 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 Ov}n?jNed<^m;V60EX6he literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/user/UserController.class b/bin/main/de/oaa/xxx/user/UserController.class index 50527a9c95d3d8697ba46a2b3f86c1269c84f5b5..5a7ab6087fb736478d118b9f37564c0e59f6cd5a 100644 GIT binary patch delta 1492 zcmah|YfzL`7=F&TFW<7u2^N%bGg+cWf#sG0YjiP4K#fJ0~GiEc)Fgg9~kNwH%M?V>|39a}0b|J@UrrFtj-uHQ*=bZPP z^X|Dh@!LVoF?Hkow*YEr!U|2mr81YfCQ3a%=i;GV+X9iGcVKHE5*p~Q5A{ZZy9M^C z!OFbUc~(tl`BYo>@|%fZ?xM23U|Da{ShC%8+R07DRw@#x;4N}v^D89Q^#=!sg5ijy z5_AaI6PC51$X+|bR3_;j3=7;A4n`7kv%(9ml2ne90=9&~8;BVCN=Y8X1muF=D6srq zNmWUCmvI{JK)<2CU(y4&=()i9HIg2}cLEuS(z1JDSe})P2^J*P1Ab2q|NlGvieu(TO>V3ovPe_LbR*z z{hj=KcXM3trG6{*sVmL-mI2zOY%RZ}>=ei@P!ko4dO94m+YUiPl4_|gL#K#?>XO_( zNspM^UW3CGLl=|OKwj28;~;O6dtQ>CnwdN3pk{|SZ|IInY7y6%J0eh3P^fC$OV#D3 zoFxu=F{wB%>2d02#mfTaqiu`TRBK+=iDdCLNl(yLF21U+w^obS)ta^g8MoYx`lfAM ze4;wr-Snw3gWc^eb*BA-aDBCN^P#(9+{AKPffQ`uN!2JH4UFj!@bb5D3q+U-u!%XF z#)OXpAeX;CgZKl4++V{}97pfQqBs>^LRyJ|aVlk4nM_y4se;qh$#iv`?&I{qOSq$C z31x~IBZ=d}Bz~C0^dv6FsalP6=EPjE0%8s}aUD)^1Nq`_cr>7u|4iMQhC<%oo#+C! zsN;OQ9fdsL^)w;j=jE0q9AtBpyFRJGj0cRvLtb!t@k9 zZAN=&n4)I1pAOKoX7n5#q8H5QFdd_p%xHvOp;0qZbduhnH+i*DWLeI}EaUVR-~Jd+ z;21w|Cga<18W&IRz^Pqid>2k~GoIr7D&u>M)r{}6zMt^}#vH~E89j_2!D*>tJk7{2 zL?5$%oX*f^xLwN^ztZQr%_1#2oz-n9>p_6d={9YI@eAEXUvg(lA+<4X#jjl?w{}&l O7X2becq~3CFfn0eVxlfxs2hoiiEE9-c-qvRiJSTU`R70LIP-N>KA9Kh>)$gk ziKqsXHj;v}RYq3!(_&wv`Vh{w7Z~&&Zb7B$oqM?|$~2Wf(x;agD8(xEDDp=48wg;H z8g9w*fu2yGHB#i`G4CEqj zk&dW|JQGQ;!+cTiBE zz^!ULPBjp5EiuuTN(>kXqJ|SkmAlQq?0CvPWnd#Vv3*id6&Jn@1~e0A)bqBuYKYwv zSJk(e2jhtbeUD|U%Jx^n_3UT+*h;6FmUsdQ%HcMKnUb02d4YU2GvclA&@Y}ZBqED$XTYvoMXnBLFNU{ z^)oLrUCdFYk9mn4T7WsmUNns!Qz%~ c$8ElmgVN;`Um+}K<(v$Pe&G^6Euc010X~SF2><{9 diff --git a/bin/main/de/oaa/xxx/user/UserEntity.class b/bin/main/de/oaa/xxx/user/UserEntity.class index 723c568a4e83def1baea2fb94f5c939e0032a234..cb36ec9081498af0eac1e8fa387a557a9a67fb1e 100644 GIT binary patch literal 13433 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 literal 12359 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 diff --git a/bin/main/static/community/event-detail.html b/bin/main/static/community/event-detail.html new file mode 100644 index 0000000..5ccece3 --- /dev/null +++ b/bin/main/static/community/event-detail.html @@ -0,0 +1,177 @@ + + + + + + + Veranstaltung – xXx Sphere + + + + + +
    + ← Veranstaltungen + +
    +

    Wird geladen…

    +
    +
    + + + + + + diff --git a/bin/main/static/community/events.html b/bin/main/static/community/events.html new file mode 100644 index 0000000..efe6967 --- /dev/null +++ b/bin/main/static/community/events.html @@ -0,0 +1,582 @@ + + + + + + + Veranstaltungen – xXx Sphere + + + + + + + + + + +
    +
    +
    +

    Filter

    + +
    +
    +
    + Veranstaltungen von abonnierten Locations werden immer angezeigt, unabhängig vom Umkreis. +
    + +
    + +
    + + +
    +
    + +
    + + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    +
    + + + + + + diff --git a/bin/main/static/community/location-detail.html b/bin/main/static/community/location-detail.html new file mode 100644 index 0000000..aa3ebf8 --- /dev/null +++ b/bin/main/static/community/location-detail.html @@ -0,0 +1,628 @@ + + + + + + + Location – xXx Sphere + + + + + +
    + ← Locations + +
    +

    Wird geladen…

    +
    +
    + + + + + + + + + + + + + + + diff --git a/bin/main/static/community/locations.html b/bin/main/static/community/locations.html new file mode 100644 index 0000000..4b2b6d8 --- /dev/null +++ b/bin/main/static/community/locations.html @@ -0,0 +1,647 @@ + + + + + + + Locations – xXx Sphere + + + + + + + + + + +
    +
    +
    +

    Filter

    + +
    +
    +
    + +
    + + +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    + + +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + + + diff --git a/bin/main/static/js/sidebar.js b/bin/main/static/js/sidebar.js index 68d4b8b..fed0e99 100644 --- a/bin/main/static/js/sidebar.js +++ b/bin/main/static/js/sidebar.js @@ -52,6 +52,8 @@ { href: '/community/nachrichten.html', icon: I('MESSAGES'), label: 'Nachrichten', badgeId: null }, { href: '/community/benachrichtigungen.html', icon: I('NOTIFICATIONS'), label: 'Benachrichtigungen', badgeId: null }, { href: '/community/gruppen.html', icon: I('GROUPS'), label: 'Gruppen', badgeId: 'socialGruppenBadge'}, + { href: '/community/locations.html', icon: I('LOCATION') || '📍', label: 'Locations', badgeId: null }, + { href: '/community/events.html', icon: I('EVENT') || '🗓', label: 'Veranstaltungen', badgeId: null }, { href: '/games/common/einladungen.html', icon: I('INVITATIONS'), label: 'Einladungen', badgeId: null }, ]; const socialNav = socialLinks.map(({ href, icon, label, badgeId }) => { diff --git a/src/main/java/Ideen.txt b/src/main/java/Ideen.txt index 851ad46..12c52cd 100644 --- a/src/main/java/Ideen.txt +++ b/src/main/java/Ideen.txt @@ -1,3 +1,5 @@ +Slomo und Speedup Card + Sammeln von Erfahrung TODO: Im Time Lock, wenn im Spinning Wheel tasks drin sind, dürfen keine sonst keine Tasks gefordert sein und umgekehrt @@ -33,4 +35,8 @@ Ich kann Spieler einladen zu spielen, dann kriegt die Person eine E-Mail und mus Die interessantesten wären wohl Würfel und Countdown, da sie mehr Spannung erzeugen ohne den Ablauf zu sehr zu unterbrechen. - \ No newline at end of file + + + wenn ich dates erfasse kann ich diese auch zu einer Verantstaltung machen, + hier kann ich die auswählen, zu denen ich "Ich bin dabei" gedrückt habe, das + Date wird dann auf den Standort und Zeitpunkt festgelegt. fragen? diff --git a/src/main/java/de/oaa/xxx/config/SecurityConfig.java b/src/main/java/de/oaa/xxx/config/SecurityConfig.java index e73b6cf..5f45d91 100644 --- a/src/main/java/de/oaa/xxx/config/SecurityConfig.java +++ b/src/main/java/de/oaa/xxx/config/SecurityConfig.java @@ -71,11 +71,15 @@ public class SecurityConfig { .requestMatchers("/games/chastity/joinlock.html").authenticated() .requestMatchers("/community/benachrichtigungen.html").authenticated() .requestMatchers("/community/abonnements.html").authenticated() + .requestMatchers("/community/locations.html").authenticated() + .requestMatchers("/community/location-detail.html").authenticated() + .requestMatchers("/community/events.html").authenticated() + .requestMatchers("/community/event-detail.html").authenticated() .requestMatchers("/gruppen/**").authenticated() .requestMatchers("/feed/**").authenticated() .requestMatchers("/notifications/**").authenticated() .requestMatchers("/events/**").authenticated() - .requestMatchers("/*.html").permitAll() + .requestMatchers("/*.html").permitAll() .requestMatchers("/**/*.html").permitAll() .requestMatchers("/help/*.html").permitAll() .requestMatchers("/css/**").permitAll() diff --git a/src/main/java/de/oaa/xxx/location/LocationController.java b/src/main/java/de/oaa/xxx/location/LocationController.java new file mode 100644 index 0000000..ac861a2 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/LocationController.java @@ -0,0 +1,425 @@ +package de.oaa.xxx.location; + +import de.oaa.xxx.location.entity.*; +import de.oaa.xxx.location.repository.*; +import de.oaa.xxx.user.UserService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.security.Principal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/locations") +public class LocationController { + + private static final Logger LOGGER = LoggerFactory.getLogger(LocationController.class); + private static final int MAX_GALLERY_IMAGES = 20; + private static final int MAX_BATCH_SIZE = 50; + + private final LocationRepository locationRepo; + private final LocationImageRepository imageRepo; + private final LocationOpeningHoursRepository hoursRepo; + private final LocationEventRepository eventRepo; + private final LocationEventAttendeeRepository attendeeRepo; + private final LocationFollowRepository followRepo; + private final UserService userService; + + public LocationController(LocationRepository locationRepo, + LocationImageRepository imageRepo, + LocationOpeningHoursRepository hoursRepo, + LocationEventRepository eventRepo, + LocationEventAttendeeRepository attendeeRepo, + LocationFollowRepository followRepo, + UserService userService) { + this.locationRepo = locationRepo; + this.imageRepo = imageRepo; + this.hoursRepo = hoursRepo; + this.eventRepo = eventRepo; + this.attendeeRepo = attendeeRepo; + this.followRepo = followRepo; + this.userService = userService; + } + + // ── DTOs ───────────────────────────────────────────────────────────────── + + record IdsResult(List ids, int total) {} + + record LocationPreviewDto(UUID locationId, String name, String profilePictureLq, double distanzKm) {} + + record OpeningHourDto(int dayOfWeek, String openTime, String closeTime, boolean closed) {} + + record GalleryImageDto(UUID imageId, String imageData) {} + + record LocationDetailDto( + UUID locationId, + UUID ownerId, + String name, + String description, + String profilePictureHq, + String profilePictureLq, + Double lat, + Double lon, + String street, + String city, + boolean ownershipConfirmed, + LocalDateTime createdAt, + List gallery, + List openingHours, + boolean following + ) {} + + record CreateRequest( + String name, + String description, + String profilePictureLq, + String profilePictureHq, + Double lat, + Double lon, + String street, + String city, + boolean ownershipConfirmed + ) {} + + record UpdateRequest( + String name, + String description, + String profilePictureLq, + String profilePictureHq, + Double lat, + Double lon, + String street, + String city + ) {} + + record GalleryUploadRequest(String imageData) {} + + // ── Suche / IDs ────────────────────────────────────────────────────────── + + /** + * Gibt alle Location-IDs zurück, sortiert nach Entfernung vom angegebenen Punkt. + */ + @GetMapping("/ids") + public ResponseEntity getIds( + @RequestParam double lat, + @RequestParam double lon, + @RequestParam(defaultValue = "50") int maxDistanceKm, + Principal principal) { + + userService.requireUser(principal); + + List sorted = locationRepo.findByLatIsNotNullAndLonIsNotNull().stream() + .filter(l -> haversineKm(lat, lon, l.getLat(), l.getLon()) <= maxDistanceKm) + .sorted(Comparator.comparingDouble(l -> haversineKm(lat, lon, l.getLat(), l.getLon()))) + .map(LocationEntity::getLocationId) + .collect(Collectors.toList()); + + return ResponseEntity.ok(new IdsResult(sorted, sorted.size())); + } + + /** + * Batch-Laden von Location-Previews (Name + LQ-Bild + Distanz). + * Benötigt lat/lon für die Distanzberechnung. + */ + @PostMapping("/batch") + public ResponseEntity> getBatch( + @RequestBody BatchRequest request, + Principal principal) { + + userService.requireUser(principal); + if (request.ids() == null || request.ids().isEmpty()) return ResponseEntity.ok(List.of()); + + List ids = request.ids().stream().filter(Objects::nonNull).limit(MAX_BATCH_SIZE).toList(); + Map byId = locationRepo.findAllById(ids).stream() + .collect(Collectors.toMap(LocationEntity::getLocationId, l -> l)); + + double refLat = request.lat() != null ? request.lat() : 0; + double refLon = request.lon() != null ? request.lon() : 0; + + List result = ids.stream() + .map(byId::get) + .filter(Objects::nonNull) + .map(l -> new LocationPreviewDto( + l.getLocationId(), + l.getName(), + l.getProfilePictureLq(), + l.getLat() != null && l.getLon() != null + ? Math.round(haversineKm(refLat, refLon, l.getLat(), l.getLon()) * 10.0) / 10.0 + : -1)) + .toList(); + + return ResponseEntity.ok(result); + } + + record BatchRequest(List ids, Double lat, Double lon) {} + + /** + * Meine eigenen Locations (IDs, neueste zuerst). + */ + @GetMapping("/mine") + public ResponseEntity getMine(Principal principal) { + UUID myId = userService.requireUser(principal).getUserId(); + List ids = locationRepo.findByOwnerIdOrderByCreatedAtDesc(myId).stream() + .map(LocationEntity::getLocationId) + .toList(); + return ResponseEntity.ok(new IdsResult(ids, ids.size())); + } + + // ── Detail ─────────────────────────────────────────────────────────────── + + @GetMapping("/{locationId}") + public ResponseEntity getDetail( + @PathVariable UUID locationId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + return locationRepo.findById(locationId) + .map(l -> ResponseEntity.ok(toDetail(l, myId))) + .orElse(ResponseEntity.notFound().build()); + } + + // ── CRUD ───────────────────────────────────────────────────────────────── + + @PostMapping + public ResponseEntity create( + @RequestBody CreateRequest req, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + + if (req.name() == null || req.name().isBlank()) return ResponseEntity.badRequest().build(); + + LocationEntity loc = new LocationEntity(); + loc.setLocationId(UUID.randomUUID()); + loc.setOwnerId(myId); + loc.setName(req.name().trim()); + loc.setDescription(req.description() != null ? req.description().trim() : null); + loc.setProfilePictureLq(req.profilePictureLq()); + loc.setProfilePictureHq(req.profilePictureHq()); + loc.setLat(req.lat()); + loc.setLon(req.lon()); + loc.setStreet(req.street()); + loc.setCity(req.city()); + loc.setOwnershipConfirmed(req.ownershipConfirmed()); + loc.setCreatedAt(LocalDateTime.now()); + locationRepo.save(loc); + + LOGGER.info("User {} hat Location {} angelegt", myId, loc.getLocationId()); + return ResponseEntity.status(201).body(toDetail(loc, myId)); + } + + @PutMapping("/{locationId}") + public ResponseEntity update( + @PathVariable UUID locationId, + @RequestBody UpdateRequest req, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var opt = locationRepo.findById(locationId); + if (opt.isEmpty()) return ResponseEntity.notFound().build(); + LocationEntity loc = opt.get(); + if (!loc.getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + + if (req.name() != null && !req.name().isBlank()) loc.setName(req.name().trim()); + if (req.description() != null) loc.setDescription(req.description().trim()); + if (req.profilePictureLq() != null) loc.setProfilePictureLq(req.profilePictureLq()); + if (req.profilePictureHq() != null) loc.setProfilePictureHq(req.profilePictureHq()); + if (req.lat() != null) loc.setLat(req.lat()); + if (req.lon() != null) loc.setLon(req.lon()); + if (req.street() != null) loc.setStreet(req.street()); + if (req.city() != null) loc.setCity(req.city()); + locationRepo.save(loc); + + return ResponseEntity.ok(toDetail(loc, myId)); + } + + @Transactional + @DeleteMapping("/{locationId}") + public ResponseEntity delete( + @PathVariable UUID locationId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var opt = locationRepo.findById(locationId); + if (opt.isEmpty()) return ResponseEntity.notFound().build(); + if (!opt.get().getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + + // Kaskade: Events + Attendees + Bilder + Öffnungszeiten + Follows löschen + eventRepo.findByLocationIdOrderByStartAtAsc(locationId).forEach(e -> { + attendeeRepo.deleteByEventId(e.getEventId()); + }); + eventRepo.deleteByLocationId(locationId); + imageRepo.deleteByLocationId(locationId); + hoursRepo.deleteByLocationId(locationId); + followRepo.deleteByLocationId(locationId); + locationRepo.deleteById(locationId); + + LOGGER.info("User {} hat Location {} gelöscht", myId, locationId); + return ResponseEntity.noContent().build(); + } + + // ── Galerie ─────────────────────────────────────────────────────────────── + + @PostMapping("/{locationId}/gallery") + public ResponseEntity uploadGalleryImage( + @PathVariable UUID locationId, + @RequestBody GalleryUploadRequest req, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var opt = locationRepo.findById(locationId); + if (opt.isEmpty()) return ResponseEntity.notFound().build(); + if (!opt.get().getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + if (req.imageData() == null || req.imageData().isBlank()) return ResponseEntity.badRequest().build(); + if (imageRepo.countByLocationId(locationId) >= MAX_GALLERY_IMAGES) return ResponseEntity.status(422).build(); + + LocationImageEntity img = new LocationImageEntity(); + img.setImageId(UUID.randomUUID()); + img.setLocationId(locationId); + img.setImageData(req.imageData()); + img.setUploadedAt(LocalDateTime.now()); + imageRepo.save(img); + + return ResponseEntity.status(201).body(new GalleryImageDto(img.getImageId(), img.getImageData())); + } + + @Transactional + @DeleteMapping("/{locationId}/gallery/{imageId}") + public ResponseEntity deleteGalleryImage( + @PathVariable UUID locationId, + @PathVariable UUID imageId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + if (!locOpt.get().getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + + var imgOpt = imageRepo.findById(imageId); + if (imgOpt.isEmpty()) return ResponseEntity.notFound().build(); + if (!imgOpt.get().getLocationId().equals(locationId)) return ResponseEntity.status(400).build(); + + imageRepo.delete(imgOpt.get()); + return ResponseEntity.noContent().build(); + } + + // ── Öffnungszeiten ──────────────────────────────────────────────────────── + + @GetMapping("/{locationId}/opening-hours") + public ResponseEntity> getOpeningHours( + @PathVariable UUID locationId, + Principal principal) { + + userService.requireUser(principal); + if (!locationRepo.existsById(locationId)) return ResponseEntity.notFound().build(); + + List dtos = hoursRepo.findByLocationIdOrderByDayOfWeek(locationId).stream() + .map(h -> new OpeningHourDto(h.getDayOfWeek(), h.getOpenTime(), h.getCloseTime(), h.isClosed())) + .toList(); + return ResponseEntity.ok(dtos); + } + + /** + * Setzt die Öffnungszeiten einer Location vollständig neu (kompletter Ersatz). + */ + @Transactional + @PutMapping("/{locationId}/opening-hours") + public ResponseEntity> setOpeningHours( + @PathVariable UUID locationId, + @RequestBody List hours, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var opt = locationRepo.findById(locationId); + if (opt.isEmpty()) return ResponseEntity.notFound().build(); + if (!opt.get().getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + + hoursRepo.deleteByLocationId(locationId); + + List saved = new ArrayList<>(); + for (OpeningHourDto dto : hours) { + if (dto.dayOfWeek() < 1 || dto.dayOfWeek() > 7) continue; + LocationOpeningHoursEntity e = new LocationOpeningHoursEntity(); + e.setHoursId(UUID.randomUUID()); + e.setLocationId(locationId); + e.setDayOfWeek(dto.dayOfWeek()); + e.setOpenTime(dto.openTime()); + e.setCloseTime(dto.closeTime()); + e.setClosed(dto.closed()); + saved.add(hoursRepo.save(e)); + } + + return ResponseEntity.ok(saved.stream() + .map(h -> new OpeningHourDto(h.getDayOfWeek(), h.getOpenTime(), h.getCloseTime(), h.isClosed())) + .toList()); + } + + // ── Follow ──────────────────────────────────────────────────────────────── + + @PostMapping("/{locationId}/follow") + public ResponseEntity> toggleFollow( + @PathVariable UUID locationId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + if (!locationRepo.existsById(locationId)) return ResponseEntity.notFound().build(); + + var existing = followRepo.findByUserIdAndLocationId(myId, locationId); + boolean following; + if (existing.isPresent()) { + followRepo.delete(existing.get()); + following = false; + } else { + var f = new de.oaa.xxx.location.entity.LocationFollowEntity(); + f.setFollowId(UUID.randomUUID()); + f.setLocationId(locationId); + f.setUserId(myId); + f.setFollowedAt(LocalDateTime.now()); + followRepo.save(f); + following = true; + } + return ResponseEntity.ok(Map.of("following", following)); + } + + @GetMapping("/followed") + public ResponseEntity getFollowed(Principal principal) { + UUID myId = userService.requireUser(principal).getUserId(); + List ids = followRepo.findByUserId(myId).stream() + .map(de.oaa.xxx.location.entity.LocationFollowEntity::getLocationId) + .toList(); + return ResponseEntity.ok(new IdsResult(ids, ids.size())); + } + + // ── Helpers ─────────────────────────────────────────────────────────────── + + private LocationDetailDto toDetail(LocationEntity l, UUID myId) { + List gallery = imageRepo.findByLocationIdOrderByUploadedAtAsc(l.getLocationId()).stream() + .map(i -> new GalleryImageDto(i.getImageId(), i.getImageData())) + .toList(); + List hours = hoursRepo.findByLocationIdOrderByDayOfWeek(l.getLocationId()).stream() + .map(h -> new OpeningHourDto(h.getDayOfWeek(), h.getOpenTime(), h.getCloseTime(), h.isClosed())) + .toList(); + boolean following = followRepo.findByUserIdAndLocationId(myId, l.getLocationId()).isPresent(); + return new LocationDetailDto( + l.getLocationId(), l.getOwnerId(), l.getName(), l.getDescription(), + l.getProfilePictureHq(), l.getProfilePictureLq(), + l.getLat(), l.getLon(), l.getStreet(), l.getCity(), + l.isOwnershipConfirmed(), l.getCreatedAt(), + gallery, hours, following); + } + + static double haversineKm(double lat1, double lon1, double lat2, double lon2) { + final double R = 6371.0; + double dLat = Math.toRadians(lat2 - lat1); + double dLon = Math.toRadians(lon2 - lon1); + double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) + * Math.sin(dLon / 2) * Math.sin(dLon / 2); + return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + } +} diff --git a/src/main/java/de/oaa/xxx/location/LocationEventController.java b/src/main/java/de/oaa/xxx/location/LocationEventController.java new file mode 100644 index 0000000..0dadea7 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/LocationEventController.java @@ -0,0 +1,384 @@ +package de.oaa.xxx.location; + +import java.security.Principal; +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import de.oaa.xxx.location.entity.LocationEventAttendeeEntity; +import de.oaa.xxx.location.entity.LocationEventEntity; +import de.oaa.xxx.location.entity.LocationFollowEntity; +import de.oaa.xxx.location.repository.LocationEventAttendeeRepository; +import de.oaa.xxx.location.repository.LocationEventRepository; +import de.oaa.xxx.location.repository.LocationFollowRepository; +import de.oaa.xxx.location.repository.LocationRepository; +import de.oaa.xxx.user.UserEntity; +import de.oaa.xxx.user.UserRepository; +import de.oaa.xxx.user.UserService; +import jakarta.transaction.Transactional; + +@RestController +public class LocationEventController { + + private static final Logger LOGGER = LoggerFactory.getLogger(LocationEventController.class); + private static final int MAX_BATCH_SIZE = 50; + + private final LocationRepository locationRepo; + private final LocationEventRepository eventRepo; + private final LocationEventAttendeeRepository attendeeRepo; + private final LocationFollowRepository followRepo; + private final UserRepository userRepo; + private final UserService userService; + + public LocationEventController(LocationRepository locationRepo, + LocationEventRepository eventRepo, + LocationEventAttendeeRepository attendeeRepo, + LocationFollowRepository followRepo, + UserRepository userRepo, + UserService userService) { + this.locationRepo = locationRepo; + this.eventRepo = eventRepo; + this.attendeeRepo = attendeeRepo; + this.followRepo = followRepo; + this.userRepo = userRepo; + this.userService = userService; + } + + // ── DTOs ───────────────────────────────────────────────────────────────── + + record IdsResult(List ids, int total) {} + + record EventPreviewDto( + UUID eventId, + UUID locationId, + String locationName, + String title, + String imageData, + LocalDateTime startAt, + double distanzKm, + long attendeeCount, + boolean attendingMe + ) {} + + record AttendeeDto(UUID userId, String name, String profilePictureLq, String geschlecht) {} + + record EventDetailDto( + UUID eventId, + UUID locationId, + String locationName, + String title, + String description, + String imageData, + LocalDateTime startAt, + LocalDateTime createdAt, + boolean attendingMe, + List attendees + ) {} + + record CreateEventRequest(String title, String description, String imageData, LocalDateTime startAt) {} + + record UpdateEventRequest(String title, String description, String imageData, LocalDateTime startAt) {} + + record BatchRequest(List ids, Double lat, Double lon) {} + + // ── Events einer Location ───────────────────────────────────────────────── + + @GetMapping("/locations/{locationId}/events") + public ResponseEntity> getEventsForLocation( + @PathVariable UUID locationId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + if (!locationRepo.existsById(locationId)) return ResponseEntity.notFound().build(); + + var location = locationRepo.findById(locationId).orElseThrow(); + double refLat = location.getLat() != null ? location.getLat() : 0; + double refLon = location.getLon() != null ? location.getLon() : 0; + + List dtos = eventRepo.findByLocationIdOrderByStartAtAsc(locationId).stream() + .map(e -> toPreview(e, location.getName(), refLat, refLon, myId)) + .toList(); + return ResponseEntity.ok(dtos); + } + + @PostMapping("/locations/{locationId}/events") + public ResponseEntity createEvent( + @PathVariable UUID locationId, + @RequestBody CreateEventRequest req, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + if (!locOpt.get().getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + if (req.title() == null || req.title().isBlank()) return ResponseEntity.badRequest().build(); + if (req.startAt() == null) return ResponseEntity.badRequest().build(); + + LocationEventEntity event = new LocationEventEntity(); + event.setEventId(UUID.randomUUID()); + event.setLocationId(locationId); + event.setTitle(req.title().trim()); + event.setDescription(req.description() != null ? req.description().trim() : null); + event.setImageData(req.imageData()); + event.setStartAt(req.startAt()); + event.setCreatedAt(LocalDateTime.now()); + eventRepo.save(event); + + LOGGER.info("Location {} hat Event {} angelegt", locationId, event.getEventId()); + return ResponseEntity.status(201).body(toDetail(event, locOpt.get().getName(), myId)); + } + + @PutMapping("/locations/{locationId}/events/{eventId}") + public ResponseEntity updateEvent( + @PathVariable UUID locationId, + @PathVariable UUID eventId, + @RequestBody UpdateEventRequest req, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + if (!locOpt.get().getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + + var evtOpt = eventRepo.findById(eventId); + if (evtOpt.isEmpty()) return ResponseEntity.notFound().build(); + if (!evtOpt.get().getLocationId().equals(locationId)) return ResponseEntity.status(400).build(); + + LocationEventEntity event = evtOpt.get(); + if (req.title() != null && !req.title().isBlank()) event.setTitle(req.title().trim()); + if (req.description() != null) event.setDescription(req.description().trim()); + if (req.imageData() != null) event.setImageData(req.imageData()); + if (req.startAt() != null) event.setStartAt(req.startAt()); + eventRepo.save(event); + + return ResponseEntity.ok(toDetail(event, locOpt.get().getName(), myId)); + } + + @Transactional + @DeleteMapping("/locations/{locationId}/events/{eventId}") + public ResponseEntity deleteEvent( + @PathVariable UUID locationId, + @PathVariable UUID eventId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + if (!locOpt.get().getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + + var evtOpt = eventRepo.findById(eventId); + if (evtOpt.isEmpty()) return ResponseEntity.notFound().build(); + if (!evtOpt.get().getLocationId().equals(locationId)) return ResponseEntity.status(400).build(); + + attendeeRepo.deleteByEventId(eventId); + eventRepo.delete(evtOpt.get()); + return ResponseEntity.noContent().build(); + } + + // ── Event-Detail und Teilnahme ──────────────────────────────────────────── + + @GetMapping("/location-events/{eventId}") + public ResponseEntity getEvent( + @PathVariable UUID eventId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var evtOpt = eventRepo.findById(eventId); + if (evtOpt.isEmpty()) return ResponseEntity.notFound().build(); + + String locationName = locationRepo.findById(evtOpt.get().getLocationId()) + .map(l -> l.getName()).orElse(""); + return ResponseEntity.ok(toDetail(evtOpt.get(), locationName, myId)); + } + + @PostMapping("/location-events/{eventId}/attend") + public ResponseEntity> toggleAttend( + @PathVariable UUID eventId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + if (!eventRepo.existsById(eventId)) return ResponseEntity.notFound().build(); + + var existing = attendeeRepo.findByEventIdAndUserId(eventId, myId); + boolean attending; + if (existing.isPresent()) { + attendeeRepo.delete(existing.get()); + attending = false; + } else { + LocationEventAttendeeEntity a = new LocationEventAttendeeEntity(); + a.setAttendeeId(UUID.randomUUID()); + a.setEventId(eventId); + a.setUserId(myId); + a.setRegisteredAt(LocalDateTime.now()); + attendeeRepo.save(a); + attending = true; + } + long count = attendeeRepo.countByEventId(eventId); + return ResponseEntity.ok(Map.of("attending", attending, "attendeeCount", count)); + } + + // ── Event-Suche (IDs + Batch) ───────────────────────────────────────────── + + /** + * Liefert Event-IDs sortiert nach Datum (nächste zuerst). + * Immer enthalten: Events von abonnierten Locations. + * Optional: Events im Umkreis von lat/lon (wenn angegeben). + */ + @GetMapping("/location-events/ids") + public ResponseEntity searchIds( + @RequestParam(required = false) Double lat, + @RequestParam(required = false) Double lon, + @RequestParam(defaultValue = "50") int maxDistanceKm, + @RequestParam(required = false) String from, + @RequestParam(required = false) String to, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + + LocalDateTime fromDt = from != null ? LocalDateTime.parse(from) : LocalDateTime.now(); + LocalDateTime toDt = to != null ? LocalDateTime.parse(to) : fromDt.plusMonths(3); + + // Abonnierte Locations – deren Events werden immer eingeschlossen + Set followedLocationIds = followRepo.findByUserId(myId).stream() + .map(LocationFollowEntity::getLocationId) + .collect(Collectors.toSet()); + + Map locationCoords = new HashMap<>(); + List sorted = eventRepo.findInTimeRange(fromDt, toDt).stream() + .filter(e -> { + // Immer einschließen wenn Location abonniert + if (followedLocationIds.contains(e.getLocationId())) return true; + // Ohne Koordinaten kein Umkreis-Filter + if (lat == null || lon == null) return false; + double[] coords = locationCoords.computeIfAbsent(e.getLocationId(), locId -> + locationRepo.findById(locId) + .filter(l -> l.getLat() != null && l.getLon() != null) + .map(l -> new double[]{l.getLat(), l.getLon()}) + .orElse(null)); + if (coords == null) return false; + return LocationController.haversineKm(lat, lon, coords[0], coords[1]) <= maxDistanceKm; + }) + .sorted(Comparator.comparing(LocationEventEntity::getStartAt)) + .map(LocationEventEntity::getEventId) + .collect(Collectors.toList()); + + return ResponseEntity.ok(new IdsResult(sorted, sorted.size())); + } + + /** + * Batch-Laden von Event-Previews. + */ + @PostMapping("/location-events/batch") + public ResponseEntity> getBatch( + @RequestBody BatchRequest request, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + if (request.ids() == null || request.ids().isEmpty()) return ResponseEntity.ok(List.of()); + + List ids = request.ids().stream().filter(Objects::nonNull).limit(MAX_BATCH_SIZE).toList(); + Map byId = eventRepo.findAllById(ids).stream() + .collect(Collectors.toMap(LocationEventEntity::getEventId, Function.identity())); + + double refLat = request.lat() != null ? request.lat() : 0; + double refLon = request.lon() != null ? request.lon() : 0; + + // Locations für Namens-Lookup und Distanzberechnung + Set locationIds = byId.values().stream() + .map(LocationEventEntity::getLocationId).collect(Collectors.toSet()); + Map locationById = + locationRepo.findAllById(locationIds).stream() + .collect(Collectors.toMap( + de.oaa.xxx.location.entity.LocationEntity::getLocationId, Function.identity())); + + List result = ids.stream() + .map(byId::get) + .filter(Objects::nonNull) + .map(e -> { + var loc = locationById.get(e.getLocationId()); + String locName = loc != null ? loc.getName() : ""; + double dist = (loc != null && loc.getLat() != null && loc.getLon() != null) + ? Math.round(LocationController.haversineKm(refLat, refLon, loc.getLat(), loc.getLon()) * 10.0) / 10.0 + : -1; + return toPreview(e, locName, refLat, refLon, myId); + }) + .toList(); + + return ResponseEntity.ok(result); + } + + // ── Helpers ─────────────────────────────────────────────────────────────── + + private EventPreviewDto toPreview(LocationEventEntity e, String locationName, + double refLat, double refLon, UUID myId) { + var loc = locationRepo.findById(e.getLocationId()).orElse(null); + double dist = (loc != null && loc.getLat() != null && loc.getLon() != null) + ? Math.round(LocationController.haversineKm(refLat, refLon, loc.getLat(), loc.getLon()) * 10.0) / 10.0 + : -1; + long count = attendeeRepo.countByEventId(e.getEventId()); + boolean mine = attendeeRepo.findByEventIdAndUserId(e.getEventId(), myId).isPresent(); + return new EventPreviewDto(e.getEventId(), e.getLocationId(), locationName, + e.getTitle(), e.getImageData(), e.getStartAt(), dist, count, mine); + } + + private EventDetailDto toDetail(LocationEventEntity e, String locationName, UUID myId) { + List attendeeEntities = + attendeeRepo.findByEventIdOrderByRegisteredAtAsc(e.getEventId()); + + Set attendeeUserIds = attendeeEntities.stream() + .map(LocationEventAttendeeEntity::getUserId).collect(Collectors.toSet()); + Map userById = attendeeUserIds.isEmpty() + ? Map.of() + : userRepo.findAllById(attendeeUserIds).stream() + .collect(Collectors.toMap(UserEntity::getUserId, Function.identity())); + + // Sortierung: Alphabetisch nach Geschlecht-Name, dann nach Registrierungszeit + List attendees = attendeeEntities.stream() + .map(a -> { + UserEntity u = userById.get(a.getUserId()); + if (u == null) return null; + String geschlecht = u.getGeschlecht() != null ? u.getGeschlecht().name() : "UNBEKANNT"; + return new AttendeeDto(u.getUserId(), u.getName(), u.getProfilePicture(), geschlecht); + }) + .filter(Objects::nonNull) + .sorted(Comparator + .comparing((AttendeeDto a) -> { + // Sortierreihenfolge: WEIBLICH → MAENNLICH → DIVERS → rest + return switch (a.geschlecht()) { + case "WEIBLICH" -> 0; + case "MAENNLICH" -> 1; + case "DIVERS" -> 2; + default -> 3; + }; + }) + .thenComparing(AttendeeDto::name)) + .toList(); + + boolean attendingMe = attendeeRepo.findByEventIdAndUserId(e.getEventId(), myId).isPresent(); + + return new EventDetailDto( + e.getEventId(), e.getLocationId(), locationName, + e.getTitle(), e.getDescription(), e.getImageData(), + e.getStartAt(), e.getCreatedAt(), + attendingMe, attendees); + } +} diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationEntity.java new file mode 100644 index 0000000..6bcaae4 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/entity/LocationEntity.java @@ -0,0 +1,55 @@ +package de.oaa.xxx.location.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@Setter +@Entity +@Table(name = "location") +public class LocationEntity { + + @Id + @Column + private UUID locationId; + + @Column(nullable = false) + private UUID ownerId; + + @Column(nullable = false, length = 200) + private String name; + + @Column(columnDefinition = "TEXT") + private String description; + + /** LQ-Profilbild (klein, für Listenansicht) – base64 */ + @Column(columnDefinition = "TEXT") + private String profilePictureLq; + + /** HQ-Profilbild (max 1024×1024) – base64 */ + @Column(columnDefinition = "MEDIUMTEXT") + private String profilePictureHq; + + @Column + private Double lat; + + @Column + private Double lon; + + @Column(length = 200) + private String street; + + @Column(length = 200) + private String city; + + /** Eigentümerschaft wurde vom Anleger bestätigt */ + @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0") + private boolean ownershipConfirmed = false; + + @Column(nullable = false) + private LocalDateTime createdAt; +} diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationEventAttendeeEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationEventAttendeeEntity.java new file mode 100644 index 0000000..e9bc234 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/entity/LocationEventAttendeeEntity.java @@ -0,0 +1,29 @@ +package de.oaa.xxx.location.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@Setter +@Entity +@Table(name = "location_event_attendee", + uniqueConstraints = @UniqueConstraint(columnNames = {"event_id", "user_id"})) +public class LocationEventAttendeeEntity { + + @Id + @Column + private UUID attendeeId; + + @Column(nullable = false, name = "event_id") + private UUID eventId; + + @Column(nullable = false, name = "user_id") + private UUID userId; + + @Column(nullable = false) + private LocalDateTime registeredAt; +} diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationEventEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationEventEntity.java new file mode 100644 index 0000000..79545ee --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/entity/LocationEventEntity.java @@ -0,0 +1,38 @@ +package de.oaa.xxx.location.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@Setter +@Entity +@Table(name = "location_event") +public class LocationEventEntity { + + @Id + @Column + private UUID eventId; + + @Column(nullable = false) + private UUID locationId; + + @Column(nullable = false, length = 200) + private String title; + + @Column(columnDefinition = "TEXT") + private String description; + + /** base64-Profilbild der Veranstaltung, max 1024px */ + @Column(columnDefinition = "MEDIUMTEXT") + private String imageData; + + @Column(nullable = false) + private LocalDateTime startAt; + + @Column(nullable = false) + private LocalDateTime createdAt; +} diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationFollowEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationFollowEntity.java new file mode 100644 index 0000000..55d9ada --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/entity/LocationFollowEntity.java @@ -0,0 +1,31 @@ +package de.oaa.xxx.location.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.time.LocalDateTime; +import java.util.UUID; + +@Getter +@Setter +@Entity +@Table(name = "location_follow") +public class LocationFollowEntity { + + @Id + @Column + private UUID followId; + + @Column(nullable = false) + private UUID locationId; + + @Column(nullable = false) + private UUID userId; + + @Column(nullable = false) + private LocalDateTime followedAt; +} diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationImageEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationImageEntity.java new file mode 100644 index 0000000..14ca89e --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/entity/LocationImageEntity.java @@ -0,0 +1,29 @@ +package de.oaa.xxx.location.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@Setter +@Entity +@Table(name = "location_image") +public class LocationImageEntity { + + @Id + @Column + private UUID imageId; + + @Column(nullable = false) + private UUID locationId; + + /** base64-kodiertes Bild, max 1024px */ + @Column(nullable = false, columnDefinition = "MEDIUMTEXT") + private String imageData; + + @Column(nullable = false) + private LocalDateTime uploadedAt; +} diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationOpeningHoursEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationOpeningHoursEntity.java new file mode 100644 index 0000000..bf6f237 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/entity/LocationOpeningHoursEntity.java @@ -0,0 +1,40 @@ +package de.oaa.xxx.location.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +@Entity +@Table(name = "location_opening_hours", + uniqueConstraints = @UniqueConstraint(columnNames = {"location_id", "day_of_week"})) +public class LocationOpeningHoursEntity { + + @Id + @Column + private UUID hoursId; + + @Column(nullable = false, name = "location_id") + private UUID locationId; + + /** + * Wochentag: 1 = Montag, 2 = Dienstag, ..., 7 = Sonntag + */ + @Column(nullable = false, name = "day_of_week") + private int dayOfWeek; + + /** Öffnungszeit als "HH:mm"-String, null = kein Eintrag */ + @Column(length = 5) + private String openTime; + + /** Schließzeit als "HH:mm"-String, null = kein Eintrag */ + @Column(length = 5) + private String closeTime; + + /** true = an diesem Tag geschlossen */ + @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0") + private boolean closed = false; +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.java new file mode 100644 index 0000000..c559fdf --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.java @@ -0,0 +1,21 @@ +package de.oaa.xxx.location.repository; + +import de.oaa.xxx.location.entity.LocationEventAttendeeEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface LocationEventAttendeeRepository extends JpaRepository { + + List findByEventIdOrderByRegisteredAtAsc(UUID eventId); + + Optional findByEventIdAndUserId(UUID eventId, UUID userId); + + long countByEventId(UUID eventId); + + void deleteByEventId(UUID eventId); + + void deleteByUserId(UUID userId); +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationEventRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationEventRepository.java new file mode 100644 index 0000000..c0e4beb --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/repository/LocationEventRepository.java @@ -0,0 +1,24 @@ +package de.oaa.xxx.location.repository; + +import de.oaa.xxx.location.entity.LocationEventEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +public interface LocationEventRepository extends JpaRepository { + + List findByLocationIdOrderByStartAtAsc(UUID locationId); + + /** Alle zukünftigen Events mit Koordinaten ihrer Location (für Umkreis-Suche) */ + @Query(""" + SELECT e FROM LocationEventEntity e + WHERE e.startAt >= :from + AND e.startAt <= :to + """) + List findInTimeRange(LocalDateTime from, LocalDateTime to); + + void deleteByLocationId(UUID locationId); +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationFollowRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationFollowRepository.java new file mode 100644 index 0000000..a2f0c54 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/repository/LocationFollowRepository.java @@ -0,0 +1,14 @@ +package de.oaa.xxx.location.repository; + +import de.oaa.xxx.location.entity.LocationFollowEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface LocationFollowRepository extends JpaRepository { + Optional findByUserIdAndLocationId(UUID userId, UUID locationId); + List findByUserId(UUID userId); + void deleteByLocationId(UUID locationId); +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationImageRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationImageRepository.java new file mode 100644 index 0000000..45800e5 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/repository/LocationImageRepository.java @@ -0,0 +1,16 @@ +package de.oaa.xxx.location.repository; + +import de.oaa.xxx.location.entity.LocationImageEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.UUID; + +public interface LocationImageRepository extends JpaRepository { + + List findByLocationIdOrderByUploadedAtAsc(UUID locationId); + + long countByLocationId(UUID locationId); + + void deleteByLocationId(UUID locationId); +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationOpeningHoursRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationOpeningHoursRepository.java new file mode 100644 index 0000000..303feb1 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/repository/LocationOpeningHoursRepository.java @@ -0,0 +1,14 @@ +package de.oaa.xxx.location.repository; + +import de.oaa.xxx.location.entity.LocationOpeningHoursEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.UUID; + +public interface LocationOpeningHoursRepository extends JpaRepository { + + List findByLocationIdOrderByDayOfWeek(UUID locationId); + + void deleteByLocationId(UUID locationId); +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationRepository.java new file mode 100644 index 0000000..a22b9f4 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/repository/LocationRepository.java @@ -0,0 +1,15 @@ +package de.oaa.xxx.location.repository; + +import de.oaa.xxx.location.entity.LocationEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.UUID; + +public interface LocationRepository extends JpaRepository { + + List findByOwnerIdOrderByCreatedAtDesc(UUID ownerId); + + /** Alle Locations mit gesetzten Koordinaten (für Umkreissuche) */ + List findByLatIsNotNullAndLonIsNotNull(); +} diff --git a/src/main/java/de/oaa/xxx/user/User.java b/src/main/java/de/oaa/xxx/user/User.java index 823af36..e03dccf 100644 --- a/src/main/java/de/oaa/xxx/user/User.java +++ b/src/main/java/de/oaa/xxx/user/User.java @@ -33,6 +33,10 @@ public class User { private Integer datingMaxDistanzKm; private Integer datingMinAlter; private Integer datingMaxAlter; + private String filterCity; + private Double filterLat; + private Double filterLon; + private Integer filterMaxDistKm; public Integer getAlter() { return geburtsdatum != null ? Period.between(geburtsdatum, LocalDate.now()).getYears() : null; diff --git a/src/main/java/de/oaa/xxx/user/UserController.java b/src/main/java/de/oaa/xxx/user/UserController.java index 87d96e7..153e221 100644 --- a/src/main/java/de/oaa/xxx/user/UserController.java +++ b/src/main/java/de/oaa/xxx/user/UserController.java @@ -500,4 +500,17 @@ public class UserController { return ResponseEntity.internalServerError().build(); } } + + record LocationFilterRequest(String filterCity, Double filterLat, Double filterLon, Integer filterMaxDistKm) {} + + @PutMapping("/me/location-filter") + public ResponseEntity updateLocationFilter(@RequestBody LocationFilterRequest request, Principal principal) { + var user = userService.requireUser(principal); + if (request.filterCity() != null) user.setFilterCity(request.filterCity()); + if (request.filterLat() != null) user.setFilterLat(request.filterLat()); + if (request.filterLon() != null) user.setFilterLon(request.filterLon()); + if (request.filterMaxDistKm() != null) user.setFilterMaxDistKm(Math.max(1, Math.min(500, request.filterMaxDistKm()))); + userRepository.save(user); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/de/oaa/xxx/user/UserEntity.java b/src/main/java/de/oaa/xxx/user/UserEntity.java index 9f60d2b..6dea4c9 100644 --- a/src/main/java/de/oaa/xxx/user/UserEntity.java +++ b/src/main/java/de/oaa/xxx/user/UserEntity.java @@ -134,6 +134,19 @@ public class UserEntity { @Column private Integer datingMaxAlter; + // ── Locations/Events-Filter ── + @Column(length = 200) + private String filterCity; + + @Column + private Double filterLat; + + @Column + private Double filterLon; + + @Column + private Integer filterMaxDistKm; + public Integer getAlter() { return geburtsdatum != null ? Period.between(geburtsdatum, LocalDate.now()).getYears() : null; } @@ -167,6 +180,10 @@ public class UserEntity { user.setDatingMaxDistanzKm(datingMaxDistanzKm); user.setDatingMinAlter(datingMinAlter); user.setDatingMaxAlter(datingMaxAlter); + user.setFilterCity(filterCity); + user.setFilterLat(filterLat); + user.setFilterLon(filterLon); + user.setFilterMaxDistKm(filterMaxDistKm); return user; } } diff --git a/src/main/resources/static/community/event-detail.html b/src/main/resources/static/community/event-detail.html new file mode 100644 index 0000000..5ccece3 --- /dev/null +++ b/src/main/resources/static/community/event-detail.html @@ -0,0 +1,177 @@ + + + + + + + Veranstaltung – xXx Sphere + + + + + +
    + ← Veranstaltungen + +
    +

    Wird geladen…

    +
    +
    + + + + + + diff --git a/src/main/resources/static/community/events.html b/src/main/resources/static/community/events.html new file mode 100644 index 0000000..efe6967 --- /dev/null +++ b/src/main/resources/static/community/events.html @@ -0,0 +1,582 @@ + + + + + + + Veranstaltungen – xXx Sphere + + + + + + + + + + +
    +
    +
    +

    Filter

    + +
    +
    +
    + Veranstaltungen von abonnierten Locations werden immer angezeigt, unabhängig vom Umkreis. +
    + +
    + +
    + + +
    +
    + +
    + + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    +
    + + + + + + diff --git a/src/main/resources/static/community/location-detail.html b/src/main/resources/static/community/location-detail.html new file mode 100644 index 0000000..aa3ebf8 --- /dev/null +++ b/src/main/resources/static/community/location-detail.html @@ -0,0 +1,628 @@ + + + + + + + Location – xXx Sphere + + + + + +
    + ← Locations + +
    +

    Wird geladen…

    +
    +
    + + + + + + + + + + + + + + + diff --git a/src/main/resources/static/community/locations.html b/src/main/resources/static/community/locations.html new file mode 100644 index 0000000..4b2b6d8 --- /dev/null +++ b/src/main/resources/static/community/locations.html @@ -0,0 +1,647 @@ + + + + + + + Locations – xXx Sphere + + + + + + + + + + +
    +
    +
    +

    Filter

    + +
    +
    +
    + +
    + + +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    + + +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + + + diff --git a/src/main/resources/static/js/sidebar.js b/src/main/resources/static/js/sidebar.js index 68d4b8b..fed0e99 100644 --- a/src/main/resources/static/js/sidebar.js +++ b/src/main/resources/static/js/sidebar.js @@ -52,6 +52,8 @@ { href: '/community/nachrichten.html', icon: I('MESSAGES'), label: 'Nachrichten', badgeId: null }, { href: '/community/benachrichtigungen.html', icon: I('NOTIFICATIONS'), label: 'Benachrichtigungen', badgeId: null }, { href: '/community/gruppen.html', icon: I('GROUPS'), label: 'Gruppen', badgeId: 'socialGruppenBadge'}, + { href: '/community/locations.html', icon: I('LOCATION') || '📍', label: 'Locations', badgeId: null }, + { href: '/community/events.html', icon: I('EVENT') || '🗓', label: 'Veranstaltungen', badgeId: null }, { href: '/games/common/einladungen.html', icon: I('INVITATIONS'), label: 'Einladungen', badgeId: null }, ]; const socialNav = socialLinks.map(({ href, icon, label, badgeId }) => {