From 5ffb99c9b51ebb61c414ef05f033ec979dd8963e Mon Sep 17 00:00:00 2001 From: Mario Date: Mon, 6 Apr 2026 22:48:34 +0200 Subject: [PATCH] Weiter an den Locations gearbeitet --- .../xxx/feed/FeedController$FeedPage.class | Bin 1722 -> 1722 bytes .../xxx/feed/FeedController$VoteRequest.class | Bin 1401 -> 1401 bytes bin/main/de/oaa/xxx/feed/FeedController.class | Bin 23915 -> 23971 bytes .../de/oaa/xxx/feed/dto/FeedItemDto.class | Bin 4348 -> 4497 bytes .../oaa/xxx/feed/entity/FeedPostEntity.class | Bin 3429 -> 3674 bytes ...ationAdminController$AddAdminRequest.class | Bin 0 -> 1493 bytes .../LocationAdminController$AdminDto.class | Bin 0 -> 1868 bytes ...AdminController$TransferOwnerRequest.class | Bin 0 -> 1518 bytes .../location/LocationAdminController.class | Bin 0 -> 11106 bytes .../location/LocationChatCleanupService.class | Bin 0 -> 5793 bytes .../LocationController$AdminDto.class | Bin 0 -> 1838 bytes .../LocationController$BatchRequest.class | Bin 1927 -> 1927 bytes .../LocationController$CreateRequest.class | Bin 2534 -> 2534 bytes .../LocationController$GalleryImageDto.class | Bin 1625 -> 1625 bytes ...ationController$GalleryUploadRequest.class | Bin 1474 -> 1474 bytes .../LocationController$IdsResult.class | Bin 1706 -> 1706 bytes ...ationController$InboxConversationDto.class | Bin 0 -> 2129 bytes .../LocationController$InboxSummaryDto.class | Bin 0 -> 2220 bytes ...LocationController$LocationDetailDto.class | Bin 4364 -> 5056 bytes ...ocationController$LocationPreviewDto.class | Bin 1904 -> 1904 bytes ...ionController$LocationVirtualInfoDto.class | Bin 0 -> 2082 bytes .../LocationController$OpeningHourDto.class | Bin 1819 -> 1819 bytes .../LocationController$ReplyRequest.class | Bin 0 -> 1429 bytes .../LocationController$UpdateRequest.class | Bin 2392 -> 2392 bytes .../oaa/xxx/location/LocationController.class | Bin 24422 -> 38650 bytes .../LocationEventController$AttendeeDto.class | Bin 1900 -> 1900 bytes ...LocationEventController$BatchRequest.class | Bin 1957 -> 1957 bytes ...onEventController$CreateEventRequest.class | Bin 1954 -> 1954 bytes ...cationEventController$EventDetailDto.class | Bin 3323 -> 3434 bytes ...ationEventController$EventPreviewDto.class | Bin 2621 -> 2621 bytes .../LocationEventController$IdsResult.class | Bin 1736 -> 1736 bytes ...onEventController$UpdateEventRequest.class | Bin 1954 -> 1954 bytes .../location/LocationEventController.class | Bin 23622 -> 31704 bytes .../location/entity/LocationAdminEntity.class | Bin 0 -> 1726 bytes .../xxx/location/entity/LocationEntity.class | Bin 3914 -> 4185 bytes .../entity/LocationInboxLockEntity.class | Bin 0 -> 2170 bytes .../repository/LocationAdminRepository.class | Bin 0 -> 1059 bytes .../LocationEventAttendeeRepository.class | Bin 1021 -> 1063 bytes .../repository/LocationEventRepository.class | Bin 1107 -> 1864 bytes .../LocationInboxLockRepository.class | Bin 0 -> 667 bytes .../repository/LocationRepository.class | Bin 716 -> 955 bytes .../SocialController$FriendRequestBody.class | Bin 1455 -> 1455 bytes ...ocialController$FriendshipActionBody.class | Bin 1472 -> 1472 bytes .../SocialController$SendMessageBody.class | Bin 1599 -> 1599 bytes .../de/oaa/xxx/social/SocialController.class | Bin 29423 -> 32392 bytes .../oaa/xxx/social/SystemMessageService.class | Bin 7866 -> 8113 bytes .../oaa/xxx/social/entity/MessageCause.class | Bin 1392 -> 1521 bytes bin/main/static/community/event-detail.html | 227 ++++++- bin/main/static/community/feed.html | 14 +- .../static/community/location-detail.html | 630 ++++++++++++++++-- bin/main/static/community/locations.html | 15 +- bin/main/static/community/nachrichten.html | 63 +- bin/main/static/css/style.css | 11 + bin/main/static/js/sidebar.js | 48 +- bin/main/static/userhome.html | 109 ++- .../java/de/oaa/xxx/feed/FeedController.java | 11 +- .../java/de/oaa/xxx/feed/dto/FeedItemDto.java | 3 +- .../oaa/xxx/feed/entity/FeedPostEntity.java | 3 + .../xxx/location/LocationAdminController.java | 176 +++++ .../location/LocationChatCleanupService.java | 73 ++ .../oaa/xxx/location/LocationController.java | 301 ++++++++- .../xxx/location/LocationEventController.java | 172 ++++- .../location/entity/LocationAdminEntity.java | 31 + .../xxx/location/entity/LocationEntity.java | 4 + .../entity/LocationInboxLockEntity.java | 35 + .../repository/LocationAdminRepository.java | 17 + .../LocationEventAttendeeRepository.java | 2 + .../repository/LocationEventRepository.java | 8 + .../LocationInboxLockRepository.java | 12 + .../repository/LocationRepository.java | 5 + .../de/oaa/xxx/social/SocialController.java | 59 +- .../oaa/xxx/social/SystemMessageService.java | 19 +- .../oaa/xxx/social/entity/MessageCause.java | 4 +- .../static/community/event-detail.html | 227 ++++++- src/main/resources/static/community/feed.html | 14 +- .../static/community/location-detail.html | 630 ++++++++++++++++-- .../resources/static/community/locations.html | 15 +- .../static/community/nachrichten.html | 63 +- src/main/resources/static/css/style.css | 11 + src/main/resources/static/js/sidebar.js | 48 +- src/main/resources/static/userhome.html | 109 ++- 81 files changed, 2817 insertions(+), 352 deletions(-) create mode 100644 bin/main/de/oaa/xxx/location/LocationAdminController$AddAdminRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationAdminController$AdminDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationAdminController$TransferOwnerRequest.class create mode 100644 bin/main/de/oaa/xxx/location/LocationAdminController.class create mode 100644 bin/main/de/oaa/xxx/location/LocationChatCleanupService.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$AdminDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$InboxConversationDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$InboxSummaryDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$LocationVirtualInfoDto.class create mode 100644 bin/main/de/oaa/xxx/location/LocationController$ReplyRequest.class create mode 100644 bin/main/de/oaa/xxx/location/entity/LocationAdminEntity.class create mode 100644 bin/main/de/oaa/xxx/location/entity/LocationInboxLockEntity.class create mode 100644 bin/main/de/oaa/xxx/location/repository/LocationAdminRepository.class create mode 100644 bin/main/de/oaa/xxx/location/repository/LocationInboxLockRepository.class create mode 100644 src/main/java/de/oaa/xxx/location/LocationAdminController.java create mode 100644 src/main/java/de/oaa/xxx/location/LocationChatCleanupService.java create mode 100644 src/main/java/de/oaa/xxx/location/entity/LocationAdminEntity.java create mode 100644 src/main/java/de/oaa/xxx/location/entity/LocationInboxLockEntity.java create mode 100644 src/main/java/de/oaa/xxx/location/repository/LocationAdminRepository.java create mode 100644 src/main/java/de/oaa/xxx/location/repository/LocationInboxLockRepository.java diff --git a/bin/main/de/oaa/xxx/feed/FeedController$FeedPage.class b/bin/main/de/oaa/xxx/feed/FeedController$FeedPage.class index fa4406c2b497d1ca92792f1e1a39892d32752c9a..61b7dd59c49d74b11373c90c7eee8199e54c1926 100644 GIT binary patch delta 20 bcmdnRyNh>&0V`wHWJ6XX#;naLtYM4*LgfXx delta 20 bcmdnRyNh>&0V`wnWJ6XX#_Y{0tYM4*LiYu_ diff --git a/bin/main/de/oaa/xxx/feed/FeedController$VoteRequest.class b/bin/main/de/oaa/xxx/feed/FeedController$VoteRequest.class index 1e18477825a3a908570758f565714ce403c6b855..8bf8cb7117f83f2cd8f5a8af89f3f6916a60f6b7 100644 GIT binary patch delta 14 Vcmey#^^ diff --git a/bin/main/de/oaa/xxx/feed/FeedController.class b/bin/main/de/oaa/xxx/feed/FeedController.class index 26cd24d910b737b30425cc32ee7ea4c57a7eab7d..a360759cd7029d5f65f1e0e4c803dc329a037772 100644 GIT binary patch delta 3162 zcmZuz30##`7XP1f;eGJlCp_o6YL6KePL;x%tdvJ-Mo??wlRtyA?mJk6QXo; z(rCRYslN^y8Kt|843kk2mba+%=F$<1OKU1d6x7#M)l_7))Q=oOuC1JD@soOEa)fTq zvGm4NOE>iG7VqY*{FKd4-kp15}TjpYJzuR z?M*fH<8S?i=uVq=aWJ80c~wnWm%ZGYvZCd_x+!Hryqn;jJY!nX^!d}L6%-o7tv2s9 zhCSlo zI&EovRc(#2drm>pt%xwtpKe=UOfPV`c(tW0eSOBu!QJ?Rr9ucp1y8gdl^NmfCjO~z z{Jn?Y=1T@BrSy`GaD8XyURN*G+fp$)H*28kqx$OVtixf^UVP{Vss1*9%%6n1RGcmu zGk$QqpFPOtfAbMx5A^a8KW~`LC-|#SOARGV)$M6wKWnw=ecwwEdwBA>iTOS&z(g|a9TyQU)9Ui1#$?lyu z#;r*-50iv};zne3ON_CI1$pMvw z1l^w1CuDhiUTtmlO-n7ch|t%tv>w||>H4m5YjUR|0L2K#9E4yl!Z8ogC_z8mfCS9P z5Zs87C`B3;AR7xY0cDs1AEu!kMW~Pyl`Ye9_j1EBxKM{kEJqT4g$&$+9Ndb@xDC^> z60>o;C~UwY{2I%!3ctZ>Jcc{ah&!}M0gy3%!>{~HLcsXbi z>`$Qp+XT#Z@n#2>;8}sa4fWV5@OBHNJ-A2Kb$AXN1lBXMZpVvw6))i6IDkQNbTmFjE?Td$~ zADSo@JLxL4QoOj6fcIz+K9$%XrbL{eAvi-rae;;r({PHT5iQBnPf<#$SWXkm8R$=$ zNTw`gOPY#kEauZVR8cOL(|D|=36jQ%c$g-kktXZH8T$jTlau-Ss)Fp`lZY}fx- zaK2$kE3eb!TKq?7XfxeRA8Hk_)@uLuFRD>xsOZ=FP0xCuc&A}p?i&~n86(lt# z->Yc8_;n-JOPy?>1=u3rjpV~qRE}n8BtuaMg@O@*PU}Tq0iNc^g>uv5q9;;xID5P~sB=@#EBZR&QSm%P1lYXhA~Xg`txQC)Xe7sodo?8vp(ZQ7o=A-R^KVEG54Bs8BUw$kg5 zz%AtGPr@=Bb4iqQNnB1nHac;!9Xg5+^S?k2Knol;!NNMxExpsPdxWf}hyxQ_`Dn8- z$6ZwI=%Ol+kMVK9%cjffFXjxO7j^#Js5o;CSh&(z{W`M*juM?#;!weNS}&M0$YYXX zq@-6mXFoP)J)LKzTRPl}hTG7|m44~hSSr`XL?G^YK36O{&&#+d<2xy}G3L9C|Hs(N zmrX1>90-%!2YC##5$vAJcUsIy)Wr9cyW(+UYFy znsE&6OzV|~YKufFnwX+!JEJp$@oeWohgKEiRf_4z9CTt~id+6N#*mDRb5dz-wNe`O+p*AgD;jOb8(rFW2C)x)JXbawoYyt#fupEz<< zbF#s2=wk^99jkeZ$y>3SV3v3*hj>dX7ZjId&UEuOe%s);bX4LXdPh%740UYd9VYM8 zixWHcsw22YjLROMGc_kWH_ye@TyOHb7KvL(Ml5)yqQYx&G|;C8?~!{#^tr??&L)#G zcrPJQA8!{Mon28`I={TQEG2;7CpaFRvbYwy`2Zg@_ya=U)!ac}b%ZLD59!r?dpbYj z-x>U|Zy{WTiuF6$69hL+2;ff${i@d0?(n@e)J%5u$Zn|Bib7z}FovzHKPC&PeXl!X^C5#oxO5 zBYvQ(k}rv~!VJ|`m!))7;i{cpn{wXc3B*YkNOd&%1fOi>P!WW*Zo1ABs~b|=#6d5-gY(tNx}+!V!XV z#sY6~rFUjVWh;NxkC3XPoZM~~j{JGCm7^o)h{iO;p%{HI9Z8shG|a?Mc#(-&$VLgqW44?stzVR}hpQIA zfrap(620*(2I40eghd#E#mK>Pn1m`J{VC?)c|46JcnL4yHN1!#{0!S=)`*|u0+!+y zUdBBvqW~+- zcf_Ul#D({<0uQiS zHSUOimYmGiS-EM>3z9VwMcmhGa_>~_;Wf1~@sl(HevA$h-du!Gp4c!RNi+eOG)Zj8 zM=ni95fxw#6=FUWVG&J5mCT=~X<}0`*3fjUrx~c0c@53NHY!0a&BiV&6&vS>jdO8~ z%5Z_^;S!bO8qLQ|s;a;p*=*%jp*#xF3VD*~*57?zC$1z*qL$POj1XMpSNK&Zbipb9 zHUCD`PQpQcjW)__$V4r_E|`HVNu#f5jqv4S3$GW+MVo}jBOLY`Z)jfAtH$4`S|>)g zly$bg&9bK}pweWwDR_A7yU2=b;LVLZok0!kJ-}141RN<~O(Va_Nb+l*_Gsko3JvV) z?+|EAFxNiXRIZR@2r^2hyBc{nqlw>xY-|kX-!}9SPCT3Jd=I;mT~_CoZTohiW(!8k zp<$0W_A?quzJ{?)d|1a%3`wYw+dfo}z$X4ZL`t*v3?(GH_wwR=>s&A&vF;3WO21i; z%IgrnuYs4!b+LuSuv})|XBe z_0dTls@7jlijdwvKT-OM{9aBMTn5NsYt~<|t@%k+#~wvA&}Ee@QBfi)k!Se_LdD`! zu?=+SRk%d_Y%2^4v0j0)UxC9;x-GWNrY(o^-}vt!YA1UPaL`Z#D}`I?osTW!G3L{edmBTXJ zDysiq10`9iOld7dgW)nd8&ykN1N~xQViiABt>mD;3bdS|T1znmfr0Qf#omGtLYD?Wzoa$*yy;L8SXiI(70F`V@DQb{Px23^qs2XNV zPpOe=UZyRMQe#w>EoG~5D%Y0s)I>GOmhx4RnyRLW0txcLT_!)9ilrjlm2tX^v3y$1 j7#yZ%s#$8b)S)uWQl$Q)VIR}`Q(cS+5mx!-e diff --git a/bin/main/de/oaa/xxx/feed/dto/FeedItemDto.class b/bin/main/de/oaa/xxx/feed/dto/FeedItemDto.class index 1fc50ea5d9d62af0d43db61b669c219d7e41250b..afcc64ce3b3847107e4a4f20bdb0f7ab87a8116b 100644 GIT binary patch literal 4497 zcmdT{YjYIG6+I(_cC{KkkdR<`SOJ4A4Vc9Q6YNpImIOwM1PVxsEk8%QjWlR?N1mO< zBJadW{C-vWXE;@HRi<3U2Uq25epD)_yJuIe*#Rg1<_~xKcK1E^_Tx^UyZ`>r!|wpR zgfDaGvM^o|rNHw_J3Bk2yFye-l_)4(r!p6b+H4f$&~0Jpo_F6XRlWK~>9!~bVZ}nv zcF>6Cs0=Nr$!6qNODijLv#y1_oLhddEi4S{Sp~flg?@cQ&ToXx?QJ2^1+CunYBbJ! z&1f?S)wovmc)#u}`Q@k?(yp*B{3!G`7{Wq#Bz7VTeYIva@@F;!zf6k}BkXh#RE1Y( z+@5v6S`p#iH81#$h;zMn{EfP&{hu;*M1D<_7J{-@ zo#o6jd(y7zZ;6?pS*M*fpY$u!4;HylYt6#IR#2;ndgO(PQ9js?{GcxC7GCIBig921 z?9`2|)b8>?#4QEnwYhSEgS7{%L6i*6RT>sfcDPGjo`mK7#!_>=>X*4xE^0$WD`Aya zIWcLVldJBY2`Zu&7M`-PA3cn@;Mc{?W^G-B%iemGTO3yBvFe4s>?eZ8cPOeFh>o(p3bNJHtd(3jd7*l@TkFHqOfh5N68)pEL2O<4w{BR5N zs2=6z5jL#^Hx{EZTK6+DbAD|;+qRu^?po&>CRZ)X`;nhX=9~V1oYRzj3hu=Ak2zJIrO)qAT%K}Rj<)72a<2>wN58y^gVA)@)QjApq|Hl z3;)vfirXqp+*S>eD6-OUTlGhx7-LE8;qF!*uBX(F0=LckN>hyQ?&W&7 z#q@59s@)a`yKM#@v~Zf@P|i}$QO;8?P%cs~Q7%(l%2moVU9ySlNOB}KB4p7e0a>&=J1(?CmwIgr&H$v6C23AJ`EW#Aa-Vy3u(xp0qM_#TueiT49Gwx;9LN2Ev!vdb=aG-T9(9L8)L z(nU?@+O@x@a&63j9Kp+N$ZmSx_&NnSWI&E(Mww4XIcz|V8^^HFaSV&;Jrxb;xB4V5BZa$~$Ks!h0ObVi6$teCiaus}Arh_Q!~hoNuw=oQZMTIUB=q zo{4eRDR##==M?wHIPVmDVq9>FxfmCnVm`(tr`Q|gvQsR?aGhdbjH^!3jxp_w^~bp8 zj1I=Q;fxK%n0Jc9F&3TTNQ@dMO1;AH}Bh zQwAu5lp%^N)8!@(Q;txMQI1o_DJLi=Dc#uOZx^blu|3bji}=c0XyRS$-~oP(-{80S z9e$5L;E(td{*3qV7yK1}!~6IEAL1jT3bg+ipW<^ez!&U)!WUn&kmexGK$?Fv`)Kab j%%gcnvrdb1b{S(d;Tz31nrk%E?B$ugETcI_G0cAfwZ*8B literal 4348 zcmdT`Yf~IW6g@+LU6uhh5J)yJOhkpjWQ{S2W)LM{;^HPG=Aq(q*qy+H-5oMJ8;S2{ zeEUnZN~@f*Dj)m-{wVcy_bfESBtE`bTX*|*_dWMc_r2YxfB)m|ZvbZST?QQnMyqbo zcbww-`g-xY>sE`^&@Y~)QVQMrTcw5_&ldyvDMaUk+MpYpy`&lzPFb(>Uw2!WBP|<4RTI zeX4WOtAwq9cDW_j3j=4FAq;ee?s{mTx8ACS-t3C+RcJA!g+1f@HP>k{ZugQ`tGdC~ zZ!UYykaInkz2%0Z{Eul%64O(fw|EiL0#XTFCv>Yb3|~+tp;vc{WxwLo<~VbOJz-b# zR^3^@)u5d*ANQ+gZlC9e8jA+{SN(e3ZG=t`8)f~q(DNH^!@%inpQ7bU?VZfn)%taA zh`S(xOq(q}aG-wsnjgl4rE1f_;ce~`$rG@w*Sy$Ts(BTrZ+t>S#Odvv^{Z|V3_N6_ z3*C%U_8RVmR(;70t~g6IE^AQk!8IrFL_Z$f)pn*=gYaXS$RI1UM@{sgTWCj3 zCVJJ_<0ecs_JoN(rJXd@bntBMQY;WkWG@;%co{5)e~ z5JLv`wIL~K7j|b%j9|Bc9pe-8qW_$UJt)ZjqUb+wVlVayZQjIwF*DWnsC~pgPPlM% z-oyd%X=5plwxwDCE}9s{kkDQ}UCE;?>#7lTpeB$4`Eb-8~H(O4PwL3hnN>K(_Si0d>LVIFSczn~uYk14R z$-noQ=7KS%yoMJ}8~8Jhv3Z+mfcWSq55#}B(6{PdUhZMjE^F;$WF4!1N8fDQvSS4maATL z0+L?n1}yE|Wxo|v+_RpzJM$X*9u;SnLrizrB;~CsY%_-%8X45d-||$;DhbFif`8Q6 zh%HU{AWQZvwLKX4SwBc#bw)0An-3}udTj#8qODGQWK2Fy~U;RbSV-DU<~l7%-bAZ0t-$;{wu0|)PK%8O8C zo{Db%GBUj6oOf6gTv~0=JvL#2$mJBUh^0REo&ax#3%a$BU@4KjX zV3_{Nm2#XMDO+-*Y{`tWC9!STAEZ5bYoq@F`(!WLjc}|Bhxz{?dk?WS*mhaJVC*L< z9e9}k-EuI8N8||D%V3=UNytPJ(yKvwQlm^JA*Ke&rA9fDg!E~U-qa|?B&1)1n5j{Y zB_RVEq%Re6JPFBbkp5K2i6msF1{p|&oJv9lHAo&$rR3#w5;CMg1~J7ntGar6TS}*s z&|MmI1ka{Kn@K{3HOL;!Za_Mysal)+F;QzH8e}idZa_B6^V|;!$Zid?KQ&4z8D)(K}k){zL4R-rS(5v$M@p=cGlBOJ2|nFzw)tI!kSlvT(@IBgYrBTQQb zGs28D(idUQ8Xkyn&Kk)_C|QNU2xY4<6k)*{-WB1}&x!ijT-h>b__pq1lcDrba+F?* zN$I2XQwAt`ig+`RQ1(#vQub30P(~?-D4kg0e+N9=V0)BXc9Y9D5FkVgx9~RBaU1X8 zUA%|)@c}->NB9_@;8T2t&vA#C9Id~=SNMik_qXidVN69IiaZo`DB@7Gp-4kfh9V3_ c7j3fGyy}NzqEIxUNJ3G>R)W|{50V`I0$&@9h5!Hn diff --git a/bin/main/de/oaa/xxx/feed/entity/FeedPostEntity.class b/bin/main/de/oaa/xxx/feed/entity/FeedPostEntity.class index 61dc8207673cbade30d16b0207c8d534394ed616..eeae38f6beae944f13fad8365c54ce7a328461b1 100644 GIT binary patch literal 3674 zcma)8X;<4;5FHt_7{n5`hMLgOgs`NIx~C+yJZhm_c16w#%|Cnj$)u^u)*uIrJcC9i{Mq<~r z>bkZtC5u*lCn(ugStIQb_gwY_M_&Pb6QKhu$0)dE(_X_)5i>;0_@-AC{=R1;=n^xz ztWn3@`~j{e=T<~7bsj*L_y$KJT12QT}kjc55Z~)Yue`y7COP`?*e?)P>6f`ifFGuRqhN zm)Ej)!)FNPmjzijUk-U0 zT%26GulP}-Y0%9bDMKkPEzG*PKVjA*R|zAOmRj$_mj%*yNIEu9NY^$7>okN7R0DoT zfRLh5i8z7L7>viu^p*^Ew@woT^S7}9{VSX-X7@0j67&w;mxeOdbe`VD7F4ecIirlk zhw|0hwd|nn<{QxVwGEl}2o}*3@%tWt4SY3xI~V?<_y3TQ4E%Cj!udYHuO1rEhx8F< z8huQkAjeOY)o1uN0{ux(f5&19*bz{FQ=l)}0xc#3TB0x8WVDQIEP-g?Ab zGQf4(Xp`AyGN3$t+Xm=)GN2jSY6G8qHUP;hLs#c6MeQ z3Q;kH<6Hh4V*}sYZrxv(!(K{iG;(a7nucvURpWW-Sd@K@dQM=Ht6(iJ7X#n2jlI3x z+GCBTcLMm<#J*LxO14;W9M?B}%XR7+-GKRP)ALQ^M0jzGqg8Z%#CtjUraP;N(OYtLN(gy48~2 zx)aodXZnH*(0yv!0fNo8HAN@^!=ByZPHt-xAGUC+{t=fUrO`kwuzf3gbkZtWfiUZc2KgdvPRkg@?7==M_)ntrb7o-j*)lEroD!hB1Rl>nXC6yqpr;2KGKnO zDEJnV?eg-3EeW-B!Phnbm2O#xxp4_zUeoI)I4i^{Tqqc~hq} z&1f_P=R#BmlMMoL3k@Z(%lA6nraQ8x2Rz==X`b$Cqyr**p^J0_poKEnZAYgC${-c> zi&~9mE|-dBGg1&ZLMq#)ho-q=E;2a}ltp3>nQ$@q+NZIN)c zPVKsZR~8!<_t|*!eQ}>}gLY?mc%`7N(x}eWTR`rfn~q!Z6<;tkhx+pA(nkqy8H{@Q ztih-c?|%Fe+%jr@0B=^rzyax4K!aRb7_QR@7NBxG$EEj#M4ZNW62?2WT zg8BRShOQM(8l#)|o)z=~-I9hf)?AK0#1ho344F~L4vJQDm)JqGtrkWxi6afqd*El_ zt>N9h^f!I99p_%cy%0^$Y53rM?F7VnxGBSH*KDk`@JeVTSBu&~{!v$F*MlMj+; zOnC4I_@j(xw~Jlnk{DigX1+P!xqNfZ{`|H71Hc@f8t7xFIl`8l+q=8FwkKO$yVAEC z$!5-JyZ*fNwUVAE)a0Dw#L%+%7>Ym}7+@IO;yc{-xW8d9iK$RNv5Y`DHy3foPgR(aDC#EWwB*12+{a{}hHT+zz) zHyB0^{KlDd(OQWL9W-$kLk#cAjZ>6bOR`RTXUJ{xU^B{{p}$jm^< z!o)bP#kH@~W4{)9Q#xy~usX6TxId%I&aIOO>89 zO$teftDibzK?E)3cC=J!%Dl&eAPpowJ{)$Ej{a9SB@bH6Vk(DBk?LSD>%K2k>|F!~ zW*Msg(Y!Q2hbHwt!&Fbk6BIG&^7ZOsLBK47F&Z_R?;z=w}^Isv`s3a?46|C>LYE{1>zjti3>vWTe y^oVr15u4q_B&{Z;P$lIUZsQJS2q}?U1{-%Ny?c0oN0iaym|^1ytvR}l75)v3Omlbu literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationAdminController$AdminDto.class b/bin/main/de/oaa/xxx/location/LocationAdminController$AdminDto.class new file mode 100644 index 0000000000000000000000000000000000000000..80836bc480313bc6554f08279aed02a3b1982e5d GIT binary patch literal 1868 zcmbVNTT>G;6#fD&+t!tCw6swcmQBs3i2un4osn^d z2Y-M+%JJ+4yWBb>580EPE3b;hN>B zGhN-X-J)=n6pq8?XfU2tLPLU~bHm!UOviFRns0eU$SOly-Q%)Eoz8MFSy#4WzI#`i zEifcpYl|~RW4EE?a9(z(wb9RxD}zRxG$|}ZM~d%)7}hOs-9K1BUh;Xa=orK>!=uykl;~dg zr@G~M4B1>P{flcGyrK&ERiEanjuBjAcy&sea{Yp&Ks^^GM-P>M@BR%S`mWrfd?gcvTKpx&FlBndtvgz}WMYGE8N zgFBeeaF=1Ip=eommA%EyFh|i!9rtjbA-%RAf#G{Rp|-m%Hn|zDp10hp!@be65S#T{ z;ppLFo(Q=7rN(EuSCMv22^ohJ9n16LjwogCj|Pde9}rn|-5qVXox&rA;jmZ>eq9z0 z7GNPNzYZ!*YCY7l)cP3ol1pV7Y=?Uqo-vI7hx$q2jVGkYFxE(TliX=|&M??~DM>9% zG*K*YPt6NYkuQ9haEpq#l|-IExBpg9uiLNnz*40LmMWZVidH6})AuZm#>g_VN#h6F zzfq?Jo%C%BoW1A@JfM+A0gpm@nnBXXLbA;u8Js_crSI#B8|$JcYJX$bX!HJAG-D4J zfWtiO-)Xw&y%~yl;-JgGVWv1}1fvlsM@%imlrqNmD1}W>pt{b}T0hs1$tKAT7(Zbc zo)LFQCDGgJ!xC0bHYQnp%ch5;y7F0+R&bUpd2r;O-t0 qSpk!Hf~SGsPs|kk5&JNMSy%0)mR-1*8{c@vf;cB4}t*!EmXGK26&Z7PdQec8d6)e2_$A z!h=7+A7wmy!LD*ijJ)j3esjKa`R1JY@pJDxfLS~;(8KVwDJ;pkwX?HhIkLgEEnTY` zZDyM-+ntlHR?=~Vnpjob_1+1!^uZNsS-kHEPaEiC=-=eq+;X_PZY_(3R859t#}leT zoBnEW*wMCQt*uq&%M7`E;UL&ICz~P-hKz{>k__3Z?TW=tt1i?kuRDTxeqv6IE8G8% zz?7CNTG{S8!_dCpAd?U+=cw9#6Q?o2P|H{Ux88D;dOQR}YJ+YJjW%Y`?7$nz#faDn0V34}Z>1|{*>c5VHHVK7Rf zd##092E753N^a>mqKsI<}0pvOK71e`^<{$sD^l9`xiQPM5j&rEkpEYQff~t z-VXhE8C*x+z!bxHx8qdD)pko*p%js&i2{lY>H5A0hTXVsw!1C2gcVvZaJT6QZ=x#Y zR;OK#l^*p_42g)VAKPMHcnxK@wN!D+oWngY4n#iQ9&{3q{zqR$x0+32GKEBz>R>P{ zE=^tFU3dm&7)t-p%QPH^PwyRu$*z{i$YS6g!=>X*sX;;wX(ATsaafR^CM`yrD60}dipl^!)CTV3pTKt0aXWI1O6n&EcI0`dBfB~B2GZAHqYeVL90nAlt?*-8@P#SLUQDm!NM&{?>6q@K4tVEU|4uaYl=<- Gg?|BImw#vg literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationAdminController.class b/bin/main/de/oaa/xxx/location/LocationAdminController.class new file mode 100644 index 0000000000000000000000000000000000000000..04aee2eeda77527b28d0ef0eca89c495e7a67f9d GIT binary patch literal 11106 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 literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationChatCleanupService.class b/bin/main/de/oaa/xxx/location/LocationChatCleanupService.class new file mode 100644 index 0000000000000000000000000000000000000000..cb13670c2a2988b9458e42b902a9bbad01cc3df3 GIT binary patch literal 5793 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 KrGx$xtNR~e>w9_t literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationController$AdminDto.class b/bin/main/de/oaa/xxx/location/LocationController$AdminDto.class new file mode 100644 index 0000000000000000000000000000000000000000..039d6ae2c80218403fd03dc4020930d06c77ede5 GIT binary patch literal 1838 zcmbVN*-{fh6g>?|CW#}EU<6S?S(8B>_bs@xNU9=QvOM6^khC%~Ovj!M;y?MIRZ>>* z;0O3omUkA+NH8Tn^xW>-eeUVLeQwW>pZnhdJV8Z67lT>nrm!q?cX!uxM9osRaLsDe znH8>*!g079e^TGJ-8m&RBpCYMSv!{LSngZ%6|V_dXGk?YE-TdOs|J%zWjp5TYGtm> zkZ`SS&X5mh0@$*Ww)>XmdKyx^u^s->uBoP^RhsR+_~3HMz}5*R5pFq8xjUz02cZiByX zT8_t1D8`chV&fgJsd8!EXPDG6hAD=H<1-u;k~n8<*H#Z1?nay~3B&-=#kYIbOKVwl zV_HWMmx4sBk(i!ywJGW^ElCPeT+)fM%c3c3e1SB>Fwm~lE57^)`BVtyDQPvr5MCD7 zaZ|$$hLM(fWz$vmHaEk}L@RaN!fl4k#z6#zFYz?m?vB{vX1IFMa_bKF#;ZbXH5=vj zbHzLnaOGoz&vCCN?S>LE4w-c<&x<>vY`ty|5@-KIRnaB)rf@BddkmvtVV3GO|hID|$Xt zrwe`bO$E+nKRB?7oc-3+xXwIr_4w+ki-z`t^aJHg%EC9*PR o@Bj}3zn_>#^v@f_Q_NujXYee*J;EZ{A(Blfnou&KU;?@P0yT7)P5=M^ literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationController$BatchRequest.class b/bin/main/de/oaa/xxx/location/LocationController$BatchRequest.class index 2a18645eb31d71ffaeba6e06cd175c3a24a96ef8..0c6c3c8ec8f15569bace708ef5db1d164e142d14 100644 GIT binary patch delta 26 ecmZqYZ|C2zla=xGtxy#N3J delta 20 ccmcb~bCYMoeHKQ`$q!hJ7%evov$`41iAnK diff --git a/bin/main/de/oaa/xxx/location/LocationController$IdsResult.class b/bin/main/de/oaa/xxx/location/LocationController$IdsResult.class index 7520eedd2759f1a814dd55c85dcbb510b88f4547..ebf028055fa3a939bbaec827bb16c7923562db8c 100644 GIT binary patch delta 20 bcmZ3*yNY*%0xP5UWJOjZM(@obtYM4*Jck7; delta 20 bcmZ3*yNY*%0xP5OWJOjZM&r#PtYM4*I@bjH diff --git a/bin/main/de/oaa/xxx/location/LocationController$InboxConversationDto.class b/bin/main/de/oaa/xxx/location/LocationController$InboxConversationDto.class new file mode 100644 index 0000000000000000000000000000000000000000..f7fcdebb6a59f3d1216940f455c78593428947ab GIT binary patch literal 2129 zcmbtW+fo}x5IrL#B*Z2l#l~QKNgOVcu)TKTIEh8DgNOsML=tfML4I0EQ?O>)QFccZ z{8Jv{s!*xoAs>(r$>k?fIeU>=go<*?53@7V)2B~QPj}b;@$bp+0KP^ei8Q4)ZRMKvcu`ZX_LSpDZ*IeFsYC7$r00i9Yg%QI7MOfx9ayGgxjW{TY%8xL zklUBOZ|z8*r}gl-r)|fq+rF*}jBVRHuBCgP6nHRjyj)MXCR*xDqY4kUn);_nzh#~ZETYI*4ElpT|Rdk;Uf%H%}|n>$%$Amu3{=Sku6lc*MGF^(_dzPQHij z9;iLZ8Vp=px7>~+{kghQd%bS;e2@~782J3CE7zpo_Ux`!UJ_DsEZRca(De z393jHDysaz2k;s29~5UVLTg*7Qhw-}o|!(=Jw2!U&woz;0I-3*G!g>$da~viM(yO} zq-Hr?Lz#|UYe!1Mv6bssmULHIcE>r{8}$2z`?9H=G-d?mpBXQVnq}CBwI{OcxIKZ4 zC+(heTU6)U!SO(uR_*E2R1YDgj_ zFxNJ1xijc@q`Pl)tRO<>!8$Np(_crMS4Wq{1NZN_t|5(#uaz}qL+yr!95MnoMxY51 z`-rzS>%sZ_W8^*b77@dneWoG>*-e%XqKcd;tauCy=rY4s=#@yO}p$ncK*WCZS8 zzNe~&HRuBM%X@0^x8zR)!}0{KRbpTLxbsYQRlWLy@93_Eb<_m5FYRd3&2)X=v`zJu zKsRzdW?>8vvF`PECj8!3^&p2U_(;S1_&CVm0ja+&)sfTNHC!@XNtZdu?KuOtD<7FY zv94b%u)BV-5c$w?l&4(dIK0Bk;S1bPgS@^ut~Qs{_NgD{GP2b0CHUfOXLN(Wt9ar~ z`-Ssd)FY{>x+8lwQ|0kCo%bAq^I(7vG2y`(y0d3Et1p zF`~s>3ZG}NA@KF6k<`aMBT}R0P>;0+|AdX99xMGhfdZvOS)eRZmMF^tTFbVj8w4%A zG}s{4Uay|mBQCVTZGqMC$4q$TD933$W}QzrC2_+KVO8!(Pi;CLTUaV=t|S=w#iB`} z=yxn?MZe<&Gy6?2v)cqSyGby!i*U{nnZz8&d9GGD3(iUXHxz!QlE9lBQ~sv-3s-|3 zs=WLf$McZVG)Q(LWMLX4HxaUU9`biAusq(H5ZKZ*$SiLD2T4#1pTGRex#y3)6xeJ> z&%ebK`H-}JiuZtXet0y>S%H1?R^%rRssKNq^>hZbj@uEaLQe@=X7u$_+?j>~`S1a4 z=V|?jyzu{hP5&Jq>gz)k^xH#}^gBZ==;fIq7WHy+h$X$08e;j?|3>l&Ps%A$g-@kq zDLG1>GD}I~9>)Ye#b=yL4EX`wvR3gB4K(o$1Nj!4JS);lpoQ z`4N5)k9|Cc5B>mul*jw}^<>`kjGRcmd2%ZCy87L!eoIx|`Rnide*!pypHpZua3C)- zp5tV0-@ctGcsVCMQoEm*f zY2IDrLT6onLGY`LX#*WOUpRrtAK~1z`nK^nD4rvkMYtl06 z(Wyom6J2WbqzMxpNqBsdBWZ5k-$?!H zFv`4BnwR%7I^GEx>qQe6@e+@DC9x)$Y~ltpg2^^8sB$5SJUMes|=Ux$nqoKi_Q#0hk{-iaQ)rtHPVr>6~WJ4mm7s}egq=5V%TaJEL(>?Bc37_v8P zk~Eua%;uJoi`kNiDR(tI%wA$(cFeJCo%PsDJjHe*mSV^3!mi;KJqET?c2X?LZptua z4`nZ9A7ww~AZ3Jdm@-N^P8p}1qMW8ol51-wk6miNmHGruX52fBL5Y)Vwn+YGuXhYT0;uo8rWVrc9AB7i!}LL zq{-eQP3{(Ha<)j5lSP_riP0Y6xCv>-Bg0p#GBj zF7?;c-{3p^z(W6H6zgOBMEw!JO|==-WK@e$4Mw#W)m&6-QH@2ll}b~Q$D$faZ9A!L PCaRUxHWJlFq9*bW0mql9 literal 4364 zcmds3>sAw26#fpkKo|@lXroqJuVF-^wOZQYA`q2e1S?2ew3i_nV06fY$wZ;G_uCWn zE&8Lb)vT`Nk3K*jrjO9o@61fdFiBl3`PUzN_RN{{?S0NZ`|SPw_0Nkx0ZiiO7+M5I z3P#%2_4L-(R@$=jx@+3SbS`+Awu`P~TbALRt_@`jS2wMUYsb(g(ECV#qNgprxR$8GbP7fH7(<=nRhFWF|*k)l;cpVrMtV$W$em|Wzbx!CCzk{UB@sur!8-~+nnkx zrMzyIxY1S9*)X^&u`JM)cMRP%3X`0h^q1$F8-^DbE5kpF{E~ZF(`9gID!kF0S$6re zYr$MA>Te-7)32Hz)z8 z6~rW9pk_9F;Bvw_1)b=UZ$k>={@Zy4-TvDJ1q!;N@Zf+Y=#qjS9FT8sDMw(Eq<1-bYQ2 zglf;08ZIki97iiYRIrGTyi2ph-g3uq*X_bx-C@6U4O#Q!3#|Ql<0gBez~S0$thein zvh5N%W!o;Bo?h}zl;ijmdJLZloTzthr&9FN!M{AgOa&{*vx%+LEC@Ug-!!xM#C~j~ z{n;~mv0xcxk_7v4r4(dNxD@yS@`_Mu(LyMA($UtsWBf-$fBs7MUJVKK!!Z){zLufnfK@0eS z7Vg;EPLECS7$~PGXDKO)N*Si4DVHf%C|4;X6pb=LnWAJ!1F}UDDKA<^IfgBPYp+Hs zV)&d3*c+A&KSD_a`fB+X;)Y*w*?Y5idiNy|IIw#lhHnMV)U)*^i5J870>@uImBri7 zQg){~qwLPuWsADP6@`q2Af2A|sF$-*$an}6Zwg68Arm1;cTA^(?A-b1z6fzZpB$`4lM}HU5P?6AxK|S$kiz1MhMc6cbe>Fp^CF=vaO1gnryE^Rg)c646Dgl6=^luS;b{F z*;U0AH5sqssyf(R#fX|zs?gMAPZbkt@<0_+>R_UZ%yZgrLA@5#_p!`BV+qy}28z;2 ziBq~M3Z;jVpvVRGQ6zC5pd6wcp&X;M;{l&7c!-awQw&Oha|H~nVI3wO;V~?1pa>f! zY{EeqE-HA!*(cG4r`X0942htAM*SuA*VNzOJN&@f_oHWh8$VH7T#a9O{krQ{UBBk~ f71yt~ezo;$tzT(tbyikQzsByau)FK4S6%-FMN#oV diff --git a/bin/main/de/oaa/xxx/location/LocationController$LocationPreviewDto.class b/bin/main/de/oaa/xxx/location/LocationController$LocationPreviewDto.class index c902301cbeae20ef8af43dd11bf549bcbf800d6e..3bf2b57537ac0831cbf86b41c65e05a4e4dd820d 100644 GIT binary patch delta 44 tcmeys_knN18b*(eYbP-?dTe%J(Pd=xot(#N1SA)N$txgoGdo)*BLG-f4Tb;! delta 44 tcmeys_knN18b+UuYbP-?`fPS!(Pd;bot(#N1SA)N$txgoGdo)*BLGv#4K4rx diff --git a/bin/main/de/oaa/xxx/location/LocationController$LocationVirtualInfoDto.class b/bin/main/de/oaa/xxx/location/LocationController$LocationVirtualInfoDto.class new file mode 100644 index 0000000000000000000000000000000000000000..858879c47146ac5796bbe95bd46feec4579db552 GIT binary patch literal 2082 zcmbtUS#Q%o5dOApnlv>%0-=PnKnsZrnEMJ>4@v^z5IrQ|$xRk&aJ}hzQND$q-xl1*?TP(lt^NLVeGBFWm~T8y|JG2s*p8?bW2s49%Ge2prIVs zT3IPC6dCqxg=$uOF15&jXK!$ZOeh(sT2j*S-jM8AU5eL^%bz(_)sVch`4_81tW3V} zx0!)?QR72k7&VZn^tPP$p za119I=5}qc%rM9|soFk6HXp0a)3vv}s)~h|+TLjcQ^+$c@77*71LVOi$8*#jh8K|s z?LO)(cuYamJ^#ZgtftYAGX@Gc8)R{n8tgGw>!S9|meiMuOG-d`Ni<}YFH$EmOti+K zJt60GlM`}I2<0nj*FzP48kcY-iOUSf+H)cso^m$06(%y0G;kHy7>3qb8W_IBv+j6X z;vKg_>5}c$T<+6cig%5Av1gzWaQS_mFL1vqow^b-4w-jt-;Xn*^u3Cy?PC3pmW+C0 zbPyL)xXEz0y#k7VOnXt!da-k;I~b+SQHBvZ89G@y6LfM6M%nYY4E*JO5_1fv{%@*i zVp}!qTw(VarrV|I5@##RNjzXU+FO(wHY^Fv<`eF#lJFJr!o`U5v@iN;W)jHgg+#ZE z-ZKHEbrMioCIO{YLR4><1PuD_q1QA~Ml@l5#mHy6^kIy?g8}mc#sd!MmFx=1^n#?Y zkAR(4vb`Ybu8@gN$j6vt!(Ab{e?!J;eYPAsP4VjRljaT%1DzoD+s-(xz{x0@IOsU= zsUvG~&{U9Moq{}B>LZ#mXLfL^7YejDOp?{8dqj0HC(Un|F=v_>G0!xSG0!%UHFE<^ zOqjVu6S*%W6R%v`hja8No1ltQkaSXX(sYLDBw*3Ek9z0=QJs?OB*Sn6Mcl$|+`(OP nKzEc*(k$k201H?|2|1Jlp|q^O{|%W0E=S?b^rhX delta 32 gcmbQuH=A#R1S_NYWJy*dAn5}p>p|q^O{|%W0ENQ{761SM diff --git a/bin/main/de/oaa/xxx/location/LocationController$ReplyRequest.class b/bin/main/de/oaa/xxx/location/LocationController$ReplyRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..251909f7cc7e33db14e0c61d6d42955a1d706fa3 GIT binary patch literal 1429 zcmbVLTTc@~6#fQicUu<=$khvY;nEgmRlJbYm?*?hQ_%q7L7%4W1QwQ^Iy)uhKlvbu z#)JodfWO7xU_8@Z?G}(2UUp{BobP<+eCM1WzmC5Hc!4DgJq(L=;Y!ZkR;%Uuvc|P1 z1Gf@imSv!o^nIbG*G0oWTo)gkBGeZ87zTFv0e5{KY`g2CCRLrGPm7jj7^-xhHnj4B z?GnRqzHpYgZ&}tw1`JsTDWn;46)zBL&HbuSo4o1^6OOX+x481me{8h1j6x4lEjb7M z7+@&pD;KDybY^1q4i9%satyusLfOy^I~c?W!_oz5$_!}|kozISNIs#)+v={U=~Cgn zVVQ6+imME-FUE3KSmJ%=1)hF>f;VnXVJnMXOggxRsdlwn)ZI5i@5uT)uK2#tLQ%@u z4cSyR@yatz89O~93#RLYd?}?4wc?E^M3}`4<}A!IOm*f$H3RMK3pXk~_H>X(fgw}< z6M^9zaPzPsRzz4+UPDWjge?0!43ma9 z#)s2ElI&fh6L&F}#*o!JW0?M;8QnK7ibh?F(^+=J>+Q@=Z`Ud z9tt$?*U8tERE$yC;y2tV&VNPb=$~vi=_O_KFuL4oyWPeeIvq-(NXjwH<1X%zWr)Hu aERdq(cz{Jb#sr?U5es-qr%kVIg?|G$$X~hu literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/LocationController$UpdateRequest.class b/bin/main/de/oaa/xxx/location/LocationController$UpdateRequest.class index 05556add8b4a822bb542f294197c507299c34c29..19cdbb7e318c4ef7407af177d0307c339228960e 100644 GIT binary patch delta 88 zcmca1bVF!^BO7lyg9rly0}~K4GO$l>WD}j7%qGZKF}ak@h_Q0=3LsfE`8JTOp3KK? d#8@-gk==;57D*2uSkF{;LB_hx%h@+F0swU(6afGL delta 88 zcmca1bVF!^BO7lNg9rly0}~K4GO$l>WD}j7%qGYfJ-L+4h%sjJ3LqIf`8JS@o6N^< d#27!>k==+l0Z9)ZSkF{;LB_<*%h@+F0su}a6Bz&i diff --git a/bin/main/de/oaa/xxx/location/LocationController.class b/bin/main/de/oaa/xxx/location/LocationController.class index 5d80846d8e6c8556c83ef4c630b53f6b83d92e73..7334dca138f39d0892600f3c7fdace524745d896 100644 GIT binary patch literal 38650 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 K1?pMx?EeE0Q63!t literal 24422 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 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|3vKukRPxb(k36raVWa8v?Kr(6aLm-(vS%kxgF=etl MkWAfN#c`Ms0BVO4ssI20 delta 62 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 H-2Hz5XC`-= literal 23622 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
  • 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 V-C`Vnz6BH?!^z>Q;mQxC zE2Q$(N4I6;hS&AwGqYEqJfq4XKjv=0<-Yr>eJDDLQGx3-O%KVI$tKDV+}+*g)&`@Q zHwi9x#hxGg?Lai743&8(W;BiCM?6y8{UD;)kCl)e;Wj;7o6SsZhC$MmNEdr@^{b;Y z2?7rI5NabvBS|bGoq#Y;cnwILNrh=4rm|p*E3tzJtdS?a^wm>FL-pl7M)}Rq6Ga-L ziw;%j0;7qRFU8BG+ZNG|euYt0n-lEu$k(ym%&P+*HLbV)&s1H^zEH+yt+`rX{@cWw zHL)p=GidY82yT&WMd&8lU z-c99L<7z!Q8P@4bb%)9{flKk38Yb)KOVGwvUI=v%darrJyF#JikcL~Q(jW+NDyT=a zGG;9?Lxn~c--b!l5!=4*&UBA>W^~u|T>fjS(&r%!0$stgHG66n>z|-6H1`RcIXVTEGC|k+g60PUUGEE8 z91L`mZuKc`X)w?-t)QdlJ$ejyPW!g9`jzI+yInRWO{FKS+qx6!M6BZ8Fhfv53vTzv z&ku@E2g~A%27jkNesNHII-V9^GWa!2T_1Cn2F0gCZt-Q{bF^-T@2>fVCJ^64d>^Jg Hi0R>PN;4%8 literal 0 HcmV?d00001 diff --git a/bin/main/de/oaa/xxx/location/entity/LocationEntity.class b/bin/main/de/oaa/xxx/location/entity/LocationEntity.class index d24031d5e406a6e4ae6448dc017dcef6ea27ef4b..8865e65dc9a7d8e4aad3aea9c1072f03e7561736 100644 GIT binary patch literal 4185 zcma);Sy$Ue6vwZOF`F=ir3o=@NLQ9NN=loygruRE#i>~uY#Qh)>;VL_1d>eYcj`lX zPIGcjANt(W57pEEof#KnT%-rE=H5F$-MQQ7?|=UIlZX~5?4p!GQ&nO4wr!oCpIfe9 zu_MR#Ea62?^s`me>m|ADqO?JSNA{U*xwdy;ZR{P1N@P%PV_TsLeNh_JBgeJMtOU*ppBb)K zBs(wm9nVpsbZO~D37V6@-*;TG=~SY6Ad06~M5_?>t}W#YZt_6jzo0zqaQeTPp%(!GU?i-hX6LCuNWuykSEX z42wT8sh7oF5U8EL$-xn9`xkxBiOH7EWN7=STzjQW=n;ze!--X_WIRR z*5^$cWqk(wi(D?3ozMltma8V+q+8n3_gM6$NnwV z%CT(331tXcY7Ci2m6^QZqM~w*aI~o@W`1qb9hyKJVB2Xx@iYUM1(1TY+<9$7LJ02%F(Fa-<%>QWMR>i8YBdQ)`YZ^a@S^HD}#TD zu4B)1X}}%Z14|WY^xM{HJ!m1amZv6J(FU4J> z<$d_&WcTfo2?csYD+Z+^r4$1N8iW>YqP2}}Lm>@Af&OT(Kx150yoMd<1Fc|Blvikk zD>Ae}3qbpVUTCktnA3_&M}Vhq;JqmKmTmgvDD@V_o4fQDTF&4RivRB-a`PY<9L?!h z^xkyGOPcyk#&ZV$voh*gO4BUPlco0|GnF-cK=-gR$fEloJis%*>_hxA)xtAVJEwoA z*kwQ{wmI@z0Xt)!nP{V-kN5ADp$Mcy*0y{B4OpjK^;##jB42jn7HELr2%f zK6mNzzP@YKCxyn3OZ+jp*Wxi0wv&3VzDYFxj>OmEhr&)$y!x`y_`ATT$djYkmtTeh OSf5~hidobjQt&T*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 diff --git a/bin/main/de/oaa/xxx/location/entity/LocationInboxLockEntity.class b/bin/main/de/oaa/xxx/location/entity/LocationInboxLockEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..116f2b8836a48ee4dee1b685be433b643b54da71 GIT binary patch literal 2170 zcmb7ET~pIQ6ul{*Z37fg1dAUaU;!nH_ywpSsMDE>jsg$z&`H}J2u(MdY#8`gI-}!^ z5B>mul;gRZ6vk4g^`S}bJ-cVm-g9q%{r>Tjh}LPnhY|)YR)po*wsm}bY`I?9R*okv zA(f*}tU?^;Wyw26P<^5EJ=AGX=FmQ}E!UR&)|=9yC@X`yvA>$H04r!PRE}%y?Bq9B z3>teEVsB0CI)PJi#k!Q9(q{z*jbeG#_LXgY6n@|YO31RX@)c|wZwhUAZdj9mQ+36B zYNxbo!k~0LS9FlBcky|ACfi^}tpoj_=GFiI3lC&dt{ zh%L&kRxrEqn;Ynk(=Fxunn&wQq)0XCS9Zvg9ZwY6kB1f zB>ZjGX3$UprFM61-{Ck;cB%shLOr+CI8Np}(L#+7xStV#KG4 zp)=+@(+PE_IaW6wpVUMgADMdZg??GQblBN(c9w^#VTcxZME=#_(VW4=Y}5YN{Q-0s z?Wnnn4o_$iVHNsA>3j;sh9?8%+m2MY@=Q~norZ;=Oqca+ZJ}5JO`y^|H(iuq*Aev~ zN+IgSJBeR{J&*GlypzbJ12U=a1NGw@#-B$sbri;*M~CVt435#XW`=Q0$^oVb&r1+s z;cejEHTRuHzi365@nl}Y=~+C@XaSAW6+{MIrE5@j9pAia0`I?xzS87pBolN-lxj*e z)skqsJ))Z}iE`}`&9x+&Z;$9UEwreS)gIAZT0{#q7JC`w2{vGE{u@m;+LqSU9*I`O zwy{}J3*N)NE&~Dg+fr-#>2~R(PLAnQn*M%k`dqv8(I~|91DgIpYx?7!YS=?69a zLweMz_Ex*}(J;pJ!=O*lV?89x`afX`@e1NqyfObz=;=3t&YfoL;lm;vzIOU>^eNQmA-4dinU%7b3HjxB(JrbtA_Q)@x zVrwziJ|B(+t2TneV=Iv8OXlE4qk3T$Lx9D6X(C9~S=%MDFDQchsR?J+e}<_mnT(jd z3^22-B+}!~=%O+=RCc(1OSCyjg^wT~ExqE}4WA1Ayc8=bWFh9M=IH?tM~QakN}S8z zQh!uzfeutt{qPh*R*t4u^oSs9Q%ChB%z+>mOD#SiD8!%6CZ{;kb>0_Edc_MsFlSk)+k70`#a r2J4g1Mi5FRbO3!CCMz%E-tzxq?}to`ZpjffJ~oiGhoO2S~FrGVn1lurM<4GYG(?1i@0AObpyW m6%c7524Mz9m=2&YP=^SED7ugsvJg-s&_r=CDFL;VQ4#?4)fI67 delta 144 zcmZ3^@t2+J)W2Q(7#J8F86-DyWid|fVLZytR$81|GhHWT2NO4FVeayGY@@BBP{^d#lQMf=M9_*@ zRf>pr-m~*yw5xxw|Fn z2s+!kK;U;&5yZYuDSbgq?vBWG3>7>>qye~Yn(@D_1e%4Sgr3EfawuMvH`F0seDS&; zg7WJW=!S?qI{`tDT)j5*K~z2rDDu|dc!{;b0qBxoP=T0}1K>w62x0h>Z0HBsaD$9G tQXbo|$2J0^;A^%v_Pw?7Pj#sb6RtXjNlEB5)gk9C4+Y}xKGh_d{s4^HpP2vv delta 105 zcmX@XcbS9h)W2Q(7#J8F8KgIIMKey8Ww|ujmnm%WdzMI6mb9Y$+{tdN-x--F+p#GD w$wW3OV;-PtP9_EsASKGcz{1EN#vsnX$N&;%Wn|z6QcMgIU{aES6HH410C_AC&;S4c diff --git a/bin/main/de/oaa/xxx/location/repository/LocationInboxLockRepository.class b/bin/main/de/oaa/xxx/location/repository/LocationInboxLockRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..cc0dadf6ec9289cb985b4888ea4dac6d8f134188 GIT binary patch literal 667 zcmbV~%}&EG49A`FQ98cHodZX>kP{pznluDRLq$VOyblK+fQLe) zVQdxb)I(y~v26c;@#ok32LQC;zz2`O1>;m9(xND6qK0UMl2r3lWx^;uqtQIpkpop& zXY#ms^I@GpbBt4@3Cfsu2V*`oK5P;=Q#z(us)dY48ejOU(i6(iARVVzEq|BdvLJ!O zk&x_awrI-Ql06AGN{10RKaO0x+=zts`7UXp&v%I$k$R=LGAvc722OCux8JO-7sRe!-p;KAh4bX4cN6d@L=1T9T(bj_x?Pg F`3)59)}#Oc 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 index f8942dd7d87a9348e0edfd3497dbe8673c11730f..a320d1a923d97a88d06a25aabfde8f7aed538b02 100644 GIT binary patch delta 198 zcmX@Zx|^Nr)W2Q(7#J8F86-Axon#ajPRqRtFEPiOks%n!=YsKVd?pHrOy0>TrOR7}s!axqVV=c)`6Yg(IXROrGVWz$ncUB$ xZOg*QAiyBVz{J1_bO{rK5Cad8W@Tg$W?%qHi7@anFhZsHfzqO2MPg79aR7XaF%kd( delta 48 zcmdnZeukCn)W2Q(7#J8F8H6`-on)LmooP2C)8t@gZ6O9G1_7W16N4ZFCzuuj0AD2v A2><{9 diff --git a/bin/main/de/oaa/xxx/social/SocialController$FriendRequestBody.class b/bin/main/de/oaa/xxx/social/SocialController$FriendRequestBody.class index 343fbe8c7980c5a61a00f23fdf49683a65270439..cb05d11786b1d9a4f8c0f9864e9e08ae2fe11395 100644 GIT binary patch delta 14 VcmZ3_y`FnRB@3g^<|-CbMgS$s1Xch5 delta 14 VcmZ3_y`FnRB@3hT<|-CbMgS$01Wf<{ diff --git a/bin/main/de/oaa/xxx/social/SocialController$FriendshipActionBody.class b/bin/main/de/oaa/xxx/social/SocialController$FriendshipActionBody.class index a7852b8e474572d9c23646c30f4510a0fe200a50..3dc7ddece203e005f4edae5634902c0fc0778e63 100644 GIT binary patch delta 14 VcmX@WeSmvI7Yn2B=57{KMgS;h1e*W= delta 14 VcmX@WeSmvI7Yn1y=57{KMgS-=1d;#% diff --git a/bin/main/de/oaa/xxx/social/SocialController$SendMessageBody.class b/bin/main/de/oaa/xxx/social/SocialController$SendMessageBody.class index 81c809c09cdfeae174aae9ae1e6693efdeca8bdc..235eb477309a4ac242c163438451a96dc6ad1ee5 100644 GIT binary patch delta 20 ccmdnbv!7?fQ5HtO$;ViX82vW?WN~8z08%aoGynhq delta 20 ccmdnbv!7?fQ5Htm$;ViX7+p92WN~8z08xwwA^-pY diff --git a/bin/main/de/oaa/xxx/social/SocialController.class b/bin/main/de/oaa/xxx/social/SocialController.class index caea8111c8c0ec5b9643c1ccd747369699dd0c18..16baf5179227fce317d3fdf1921ea2c8f6f62a29 100644 GIT binary patch literal 32392 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 B=M(?{ literal 29423 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 z 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 delta 2450 zcmZ`*dtBRB75^TR{C>au_yHjV(oiUCODQB!SnXp?S0JNlo0ivjl!ne>3O_Pv2$ev$ z>J;Z=v${^}b=J+ty3UGrS_{;amfAg3s&hIwU-L0HUvoY--P~H8>~U^@?c*Qjlk>ah zoO^%wob$ckdy?^*bDQ)>UO#sMK!7^O^%H8Ljs{$3;GMXhp!Ov~@xZ=)1WRdIr;2xp z7gXQUF8FkG!&K2j$n1~ok5rBf_r)sP+e4cT^dc(!TCvuJJ_G&OD|)q+{w@p{h+{7y zJz);Fn(-cUDAc2)3;PVbTlzED-(q%~eft+?5(b7bA}(sh%8fXn;wJH;R$zG#-YXpT z65jrO2HuZRQEjg%@4_txK8Ozy9CG^uiD7e~!Av9~QIlXT?JV0VLw&@+t+-7bu?LoQ z;h=$!VT54t3vH31s5#s|6idhLxI@Ju!m7iM79PGQ+h*Vs_@t=NS8KQ9Qw9V+EuwmT z&1d+<#-_H=mQY=wE!5Pg;j>)YNPNhQ^wbTG#D{gP)o;~2iA;y%XUZ7dri49szSS!_t}wtodDRD6|CAeyLvQ@S5t6Eo?- z#U~AXWB!_&6Mydu~a zk41V$;!zDxiQ+6DJwzZgEu7 z-^IAY?RY`P&6ffHY2Zb?B%XBmYhO0-3fc(vU_-EFYp}5{Z07}+4g6br^{s)1U{`Bf zpe-ofuNwHTbgQlH&CN|MZ7N<9@$6$tnn4zV$a5YcRh)F@XDZBG(#cRMosci?aOT?# z%Aic~inCZ#$YD@6Gj3^4-sT(wkK+lQ6v{OyPZC9wMCltgV{(T@26-rxBQkFqBLk)# zM2ijNz@<|m6{)m@uv}beUC#SoK}*GbIR`j+LZ@OXQE3HXF;BWgwJTj&$(fYai*aYJ zvazgFqcYL&s#bhdp;Eax=~`5^N(Rz7&^)8lsft#sbS0C0a41@ti1n`NXKF>G=8!?} zpf!`1T-l`5(lsgtL`L39OC4<%>+_x|t0A~b%j#1kOYyO3PruncywO2hbk09y;0;2S zLfb^GyP9^0QFne$gPdtL$V#>>m6`}erQ(otNv?xh_zHyLadW6H7D*(`gi1Tb({8VI zmt^13JojYrqC>QnsICGM^(dADBZ5*b{D4LnNi0v-URv$K;Z!Q^Y$|gb|?1YBEAQWL%Q*OJOVp@z%RL>YM4chiiTQx z4ckdY*Q=iq2(3Y^c3!R`G07@W>Ojv-?jqtAwk&fvKR zPVwrwV_e4Q0DY+9AE>olp&v2SU?6pbAq;Y@eW?S=OH~|x>wv;3+~;b^fL3KqeL^b! zwonzL=Fnsx<(wsI&%rX9O5dEo^Whm-PjyV;9~aK+JG^`WxJ-xA#MJL#>tAfWWi+v& zF3enF!?s|wvteB@{=In@-d4Y|L@_@W&fD3yM&RG+bCY&=oFEJ zJ}q^F=HmDl;yBV|YngxPaZX?5l{=?N37;X&uXq%`*SUZh%((f*> z@SdjpBo!oS89UeTC8p&aeExoA0>wF0>alv1O-b^erAjORI7%K>^FJNm|L~xdZ%7;W z?smp)Cxg|&Yj*LK4zp*ss48;zucdX&Xgk)@db)~}tb>y_ke@XPlO1W75m3pO11oKm rmD1J7<&kTpO^ir2>r5pI!a`eVJJqMOM!J?-sg37kk8P(83d8dz-M0`e diff --git a/bin/main/de/oaa/xxx/social/entity/MessageCause.class b/bin/main/de/oaa/xxx/social/entity/MessageCause.class index a315a68c92049c1dfe60d54d26a20e4568933382..14f292b3a8be1e043a01e16cfd4c859d4b95fa27 100644 GIT binary patch delta 762 zcmZ{hOHUI~6vzL!)6T26cC7Mhv0A}a2e9A+UntZvB3eq!G{#9xNJ$za0Ze?xRo%EX zA@dpBxsYK2v4NQA%Fp1|y?z1XIk%0joaD~AzkBaF=YP)mY5z*v-+q5O08qi5ExR+4 z_U?Q2#!9tPuX?qbH!tASmaCP<;&Odu$@Bfng17bMf!-(4kAbititQnZ1auRI1%Y7+ zgTZ7tE@3iQ3@0Tl2AkoOgw2p-I4zN6kPKrIk|D)#Rw4zRcasu_kQPYS9&fhlFE&RK@5n#@T+)|zlQ4uW=Qc`^JTNV-rRgt_Fq4H-rA73f!Xk0?5$pvn8SSd zJ+>{Z@SQf@$}LRU~wFk&beRZuh)lsat=cgE>Hbk*Is(|tMNnEQ0AMHuvhc!ZoEBqHSfK#x%H z10%wyAD9tJe&EoNONP!S{2i3HNofpI^e+H+Lu9xlyJCOk*>O$yV1p8NfwQ)(v#$p<=l2gxO=$y8RGwbtR*4f Pz2U&ORQLtlR(A0ZCS7eA delta 591 zcmZ{hO;1xn6o%jFv@`eK4p>?#_QRrlmRq2xSoxB#g&X6-+{ENAyC5b;Ap~M#T;Rq% z=#7|oKV*=Ca-dxZ6b&?k!|>R^VQ?9q7`O}`!>EDBkY<=LNJH_eYGBY8or{{t zMKZBdd4ZQ2^8%Sq&9BY+=jQgudhl&;f9s1u1FxdP#80(suz;1QBu|8n&g9%drpO}X zHc8d{@qlzQL@i=&-#ZXtc0isY+d|&Lqojp`g;L5w*+NBG7`E_KTNtr0=2#fdsNbX~ zW8{M{8KV$X!&HoN5ULo%L8xPl1fdgSJZNF^gz6_SMX>@MT_j5f629HzeR@!e?DZKW zbwK;I@+oR}X^JibI^rZ_*BaAMM0FZ&0yC68OT)z+sq}8%p#NdDe2mHPt@OL$3VVJh zOYL1epFXCeo~fR?xV7Zc%P!tn@@eMUURL;REd7DFKaahn1YZAO;Z-ZYhIKn{Tm!fs BPf-8> diff --git a/bin/main/static/community/event-detail.html b/bin/main/static/community/event-detail.html index 5ccece3..228ee31 100644 --- a/bin/main/static/community/event-detail.html +++ b/bin/main/static/community/event-detail.html @@ -20,7 +20,7 @@ .evt-date { font-size:0.88rem; color:var(--color-muted); margin-bottom:0.5rem; } .evt-desc { font-size:0.93rem; line-height:1.55; white-space:pre-wrap; word-break:break-word; margin-top:0.5rem; } - .attend-btn { display:inline-flex; align-items:center; gap:0.4rem; margin-top:0.75rem; } + .attend-btn { display:inline-flex; align-items:center; gap:0.4rem; margin-top:0.75rem; flex-wrap:wrap; } .section-title { font-size:1rem; font-weight:700; margin:1.5rem 0 0.75rem; } .gender-group { margin-bottom:1.25rem; } @@ -31,23 +31,92 @@ .attendee-avatar { width:28px; height:28px; border-radius:50%; background:var(--color-secondary); object-fit:cover; flex-shrink:0; overflow:hidden; display:flex; align-items:center; justify-content:center; font-size:0.8rem; } .attendee-avatar img { width:100%; height:100%; object-fit:cover; } .count-badge { background:var(--color-secondary); border-radius:12px; padding:0.15rem 0.6rem; font-size:0.78rem; color:var(--color-muted); margin-left:0.25rem; display:inline-block; } + + /* Modal */ + .modal-overlay { display:none; position:fixed; inset:0; background:rgba(0,0,0,.6); z-index:200; align-items:center; justify-content:center; } + .modal-overlay.open { display:flex; } + .modal { background:var(--color-card); border-radius:12px; width:min(520px,95vw); max-height:90vh; overflow-y:auto; padding:1.5rem; } + .modal h3 { margin:0 0 1rem; } + .modal-footer { display:flex; gap:0.75rem; justify-content:flex-end; margin-top:1.25rem; flex-wrap:wrap; } + .img-preview { width:80px; height:80px; border-radius:8px; object-fit:cover; background:var(--color-secondary); display:flex; align-items:center; justify-content:center; font-size:1.5rem; flex-shrink:0; overflow:hidden; border:1px solid var(--color-secondary); } + .img-preview img { width:100%; height:100%; object-fit:cover; } + .img-row { display:flex; gap:0.75rem; align-items:center; margin-bottom:0.5rem; } - -
    - ← Veranstaltungen + -
    -

    Wird geladen…

    + + + + + + + + + +
    +
    + ← Veranstaltungen +
    +

    Wird geladen…

    +
    - + + @@ -178,6 +182,8 @@ if (user) { document.getElementById('greeting').textContent = 'Willkommen zurück, ' + user.name + '!'; loadVisitors(); + loadMyEvents(); + loadLocEvents(); if (user.datingAktiv) { loadWhoLikesMe(); loadMatches(); @@ -257,6 +263,47 @@ return String(s).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } + function renderEventCards(events, listId, sectionId) { + if (!events.length) return; + const list = document.getElementById(listId); + list.innerHTML = events.map(e => { + const thumb = e.imageData + ? `` + : '🗓'; + const date = new Date(e.startAt); + const dateStr = date.toLocaleDateString('de-DE', { weekday:'short', day:'numeric', month:'short' }) + + ', ' + date.toLocaleTimeString('de-DE', { hour:'2-digit', minute:'2-digit' }) + ' Uhr'; + return ` + +
    ${thumb}
    +
    +
    ${esc(e.locationName)}
    +
    ${esc(e.title)}
    +
    ${dateStr}
    +
    +
    `; + }).join(''); + document.getElementById(sectionId).style.display = ''; + } + + async function loadMyEvents() { + try { + const res = await fetch('/location-events/attending-next'); + if (!res.ok) return; + const events = await res.json(); + renderEventCards(events, 'myEventsList', 'myEventsSection'); + } catch (_) {} + } + + async function loadLocEvents() { + try { + const res = await fetch('/location-events/followed-next'); + if (!res.ok) return; + const events = await res.json(); + renderEventCards(events, 'locEventsList', 'locEventsSection'); + } catch (_) {} + } + async function loadVisitors() { try { const res = await fetch('/social/profile-visits/my-visitors'); diff --git a/src/main/java/de/oaa/xxx/feed/FeedController.java b/src/main/java/de/oaa/xxx/feed/FeedController.java index f4007e1..2a65fbe 100644 --- a/src/main/java/de/oaa/xxx/feed/FeedController.java +++ b/src/main/java/de/oaa/xxx/feed/FeedController.java @@ -8,6 +8,8 @@ import java.util.List; import java.util.UUID; import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; import org.springframework.http.ResponseEntity; @@ -47,9 +49,6 @@ import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - @RestController @RequestMapping("/feed") public class FeedController { @@ -365,7 +364,8 @@ public class FeedController { p.getCreatedAt(), likeCount, likedByMe, kommentarCount, optionen, myVoteOptionIds, - p.isPublic() + p.isPublic(), + p.getTargetUrl() ); } @@ -402,7 +402,8 @@ public class FeedController { b.getCreatedAt(), likeCount, likedByMe, kommentarCount, optionen, myVoteOptionIds, - false + false, + null ); } } diff --git a/src/main/java/de/oaa/xxx/feed/dto/FeedItemDto.java b/src/main/java/de/oaa/xxx/feed/dto/FeedItemDto.java index 67e1122..f2e1c7b 100644 --- a/src/main/java/de/oaa/xxx/feed/dto/FeedItemDto.java +++ b/src/main/java/de/oaa/xxx/feed/dto/FeedItemDto.java @@ -24,5 +24,6 @@ public record FeedItemDto( long kommentarCount, List optionen, List myVoteOptionIds, - boolean isPublic + boolean isPublic, + String targetUrl ) {} diff --git a/src/main/java/de/oaa/xxx/feed/entity/FeedPostEntity.java b/src/main/java/de/oaa/xxx/feed/entity/FeedPostEntity.java index cb682f8..fc0a6ec 100644 --- a/src/main/java/de/oaa/xxx/feed/entity/FeedPostEntity.java +++ b/src/main/java/de/oaa/xxx/feed/entity/FeedPostEntity.java @@ -42,4 +42,7 @@ public class FeedPostEntity { @Column(nullable = false) private LocalDateTime createdAt; + + @Column(columnDefinition = "TEXT") + private String targetUrl; } diff --git a/src/main/java/de/oaa/xxx/location/LocationAdminController.java b/src/main/java/de/oaa/xxx/location/LocationAdminController.java new file mode 100644 index 0000000..3ad47fc --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/LocationAdminController.java @@ -0,0 +1,176 @@ +package de.oaa.xxx.location; + +import de.oaa.xxx.location.entity.LocationAdminEntity; +import de.oaa.xxx.location.repository.LocationAdminRepository; +import de.oaa.xxx.location.repository.LocationRepository; +import de.oaa.xxx.user.UserRepository; +import de.oaa.xxx.user.UserService; +import jakarta.transaction.Transactional; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.security.Principal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@RestController +@RequestMapping("/locations/{locationId}/admins") +public class LocationAdminController { + + record AdminDto(UUID userId, String name, String profilePicture, boolean isOwner) {} + record AddAdminRequest(UUID userId) {} + record TransferOwnerRequest(UUID userId) {} + + private final LocationRepository locationRepo; + private final LocationAdminRepository adminRepo; + private final UserRepository userRepo; + private final UserService userService; + + public LocationAdminController(LocationRepository locationRepo, + LocationAdminRepository adminRepo, + UserRepository userRepo, + UserService userService) { + this.locationRepo = locationRepo; + this.adminRepo = adminRepo; + this.userRepo = userRepo; + this.userService = userService; + } + + // ── Hilfsmethoden ──────────────────────────────────────────────────────── + + private boolean isAdmin(UUID locationId, UUID userId, de.oaa.xxx.location.entity.LocationEntity loc) { + return loc.getOwnerId().equals(userId) + || adminRepo.existsByLocationIdAndUserId(locationId, userId); + } + + private AdminDto toDto(UUID userId, de.oaa.xxx.location.entity.LocationEntity loc) { + return userRepo.findById(userId).map(u -> new AdminDto( + u.getUserId(), u.getName(), u.getProfilePicture(), + u.getUserId().equals(loc.getOwnerId()))) + .orElse(null); + } + + // ── Admins auflisten ───────────────────────────────────────────────────── + + @GetMapping + public ResponseEntity> list( + @PathVariable UUID locationId, + Principal principal) { + + userService.requireUser(principal); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + var loc = locOpt.get(); + + // Inhaber ist immer erster Eintrag + List admins = new java.util.ArrayList<>(); + userRepo.findById(loc.getOwnerId()).ifPresent(owner -> + admins.add(new AdminDto(owner.getUserId(), owner.getName(), owner.getProfilePicture(), true))); + + adminRepo.findByLocationId(locationId).stream() + .filter(a -> !a.getUserId().equals(loc.getOwnerId())) // Inhaber nicht doppelt + .map(a -> toDto(a.getUserId(), loc)) + .filter(java.util.Objects::nonNull) + .forEach(admins::add); + + return ResponseEntity.ok(admins); + } + + // ── Admin hinzufügen ────────────────────────────────────────────────────── + + @PostMapping + public ResponseEntity add( + @PathVariable UUID locationId, + @RequestBody AddAdminRequest req, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + var loc = locOpt.get(); + + if (!isAdmin(locationId, myId, loc)) return ResponseEntity.status(403).build(); + if (req.userId() == null || !userRepo.existsById(req.userId())) + return ResponseEntity.badRequest().build(); + + // Inhaber muss nicht eingetragen werden + if (req.userId().equals(loc.getOwnerId())) + return ResponseEntity.badRequest().build(); + + // Bereits Admin? + if (adminRepo.existsByLocationIdAndUserId(locationId, req.userId())) + return ResponseEntity.status(409).build(); + + LocationAdminEntity entity = new LocationAdminEntity(); + entity.setAdminId(UUID.randomUUID()); + entity.setLocationId(locationId); + entity.setUserId(req.userId()); + entity.setAddedAt(LocalDateTime.now()); + adminRepo.save(entity); + + return ResponseEntity.status(201).body(toDto(req.userId(), loc)); + } + + // ── Admin entfernen ─────────────────────────────────────────────────────── + + @Transactional + @DeleteMapping("/{userId}") + public ResponseEntity remove( + @PathVariable UUID locationId, + @PathVariable UUID userId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + var loc = locOpt.get(); + + if (!isAdmin(locationId, myId, loc)) return ResponseEntity.status(403).build(); + + // Inhaber darf nicht entfernt werden + if (userId.equals(loc.getOwnerId())) return ResponseEntity.status(403).build(); + + adminRepo.deleteByLocationIdAndUserId(locationId, userId); + return ResponseEntity.noContent().build(); + } + + // ── Inhaberwechsel ──────────────────────────────────────────────────────── + + @Transactional + @PutMapping("/transfer-owner") + public ResponseEntity> transferOwner( + @PathVariable UUID locationId, + @RequestBody TransferOwnerRequest req, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + var loc = locOpt.get(); + + // Nur der aktuelle Inhaber darf übertragen + if (!loc.getOwnerId().equals(myId)) return ResponseEntity.status(403).build(); + if (req.userId() == null || !userRepo.existsById(req.userId())) + return ResponseEntity.badRequest().build(); + if (req.userId().equals(myId)) return ResponseEntity.badRequest().build(); + + // Neuer Inhaber als Admin eintragen (falls noch nicht), alter Inhaber wird normaler Admin + if (!adminRepo.existsByLocationIdAndUserId(locationId, myId)) { + LocationAdminEntity a = new LocationAdminEntity(); + a.setAdminId(UUID.randomUUID()); + a.setLocationId(locationId); + a.setUserId(myId); + a.setAddedAt(LocalDateTime.now()); + adminRepo.save(a); + } + // Neuen Inhaber aus Admin-Liste entfernen (er ist jetzt Owner) + adminRepo.deleteByLocationIdAndUserId(locationId, req.userId()); + + loc.setOwnerId(req.userId()); + locationRepo.save(loc); + + return ResponseEntity.ok(Map.of("newOwnerId", req.userId())); + } +} diff --git a/src/main/java/de/oaa/xxx/location/LocationChatCleanupService.java b/src/main/java/de/oaa/xxx/location/LocationChatCleanupService.java new file mode 100644 index 0000000..96d5c32 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/LocationChatCleanupService.java @@ -0,0 +1,73 @@ +package de.oaa.xxx.location; + +import de.oaa.xxx.location.entity.LocationEntity; +import de.oaa.xxx.location.repository.LocationInboxLockRepository; +import de.oaa.xxx.location.repository.LocationRepository; +import de.oaa.xxx.social.entity.MessageEntity; +import de.oaa.xxx.social.repository.MessageRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; + +@Service +public class LocationChatCleanupService { + + private static final Logger LOGGER = LoggerFactory.getLogger(LocationChatCleanupService.class); + + private final LocationRepository locationRepo; + private final MessageRepository messageRepo; + private final LocationInboxLockRepository lockRepo; + + public LocationChatCleanupService(LocationRepository locationRepo, + MessageRepository messageRepo, + LocationInboxLockRepository lockRepo) { + this.locationRepo = locationRepo; + this.messageRepo = messageRepo; + this.lockRepo = lockRepo; + } + + /** Täglich um 03:00 Uhr: Location-Chats löschen, die seit mehr als einem Monat inaktiv sind. */ + @Scheduled(cron = "0 0 3 * * *") + @Transactional + public void cleanupInactiveChats() { + LocalDateTime cutoff = LocalDateTime.now().minusMonths(1); + List locations = locationRepo.findByVirtualUserIdIsNotNull(); + int deleted = 0; + + for (LocationEntity loc : locations) { + UUID virtualId = loc.getVirtualUserId(); + + // Alle Nachrichten dieser Location (in beide Richtungen) + List allMessages = messageRepo.findAllByUser(virtualId); + if (allMessages.isEmpty()) continue; + + // Neueste Nachricht pro Gesprächspartner (Besucher) + Map latestByVisitor = new HashMap<>(); + for (MessageEntity m : allMessages) { + UUID visitor = m.getSenderId().equals(virtualId) ? m.getReceiverId() : m.getSenderId(); + latestByVisitor.merge(visitor, m.getSentAt(), + (a, b) -> a.isAfter(b) ? a : b); + } + + for (Map.Entry entry : latestByVisitor.entrySet()) { + if (entry.getValue().isBefore(cutoff)) { + UUID visitorId = entry.getKey(); + messageRepo.deleteConversation(virtualId, visitorId); + lockRepo.findByLocationIdAndVisitorId(loc.getLocationId(), visitorId) + .ifPresent(lockRepo::delete); + deleted++; + LOGGER.info("Inaktiver Location-Chat gelöscht: location={} visitor={}", loc.getLocationId(), visitorId); + } + } + } + + if (deleted > 0) { + LOGGER.info("Location-Chat-Cleanup abgeschlossen: {} Konversation(en) gelöscht.", deleted); + } + } +} diff --git a/src/main/java/de/oaa/xxx/location/LocationController.java b/src/main/java/de/oaa/xxx/location/LocationController.java index ac861a2..518a535 100644 --- a/src/main/java/de/oaa/xxx/location/LocationController.java +++ b/src/main/java/de/oaa/xxx/location/LocationController.java @@ -1,7 +1,13 @@ package de.oaa.xxx.location; import de.oaa.xxx.location.entity.*; +import de.oaa.xxx.location.entity.LocationInboxLockEntity; import de.oaa.xxx.location.repository.*; +import de.oaa.xxx.location.repository.LocationInboxLockRepository; +import de.oaa.xxx.social.SseService; +import de.oaa.xxx.social.entity.MessageEntity; +import de.oaa.xxx.social.repository.MessageRepository; +import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserService; import jakarta.transaction.Transactional; import org.slf4j.Logger; @@ -12,6 +18,7 @@ import org.springframework.web.bind.annotation.*; import java.security.Principal; import java.time.LocalDateTime; import java.util.*; +import java.util.Collections; import java.util.stream.Collectors; @RestController @@ -22,13 +29,20 @@ public class LocationController { 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 static final int LOCK_TIMEOUT_MINUTES = 60; + + private final LocationRepository locationRepo; + private final LocationImageRepository imageRepo; private final LocationOpeningHoursRepository hoursRepo; - private final LocationEventRepository eventRepo; + private final LocationEventRepository eventRepo; private final LocationEventAttendeeRepository attendeeRepo; - private final LocationFollowRepository followRepo; - private final UserService userService; + private final LocationFollowRepository followRepo; + private final LocationAdminRepository adminRepo; + private final UserRepository userRepo; + private final UserService userService; + private final MessageRepository messageRepo; + private final SseService sseService; + private final LocationInboxLockRepository lockRepo; public LocationController(LocationRepository locationRepo, LocationImageRepository imageRepo, @@ -36,26 +50,38 @@ public class LocationController { LocationEventRepository eventRepo, LocationEventAttendeeRepository attendeeRepo, LocationFollowRepository followRepo, - UserService userService) { + LocationAdminRepository adminRepo, + UserRepository userRepo, + UserService userService, + MessageRepository messageRepo, + SseService sseService, + LocationInboxLockRepository lockRepo) { this.locationRepo = locationRepo; this.imageRepo = imageRepo; this.hoursRepo = hoursRepo; this.eventRepo = eventRepo; this.attendeeRepo = attendeeRepo; this.followRepo = followRepo; + this.adminRepo = adminRepo; + this.userRepo = userRepo; this.userService = userService; + this.messageRepo = messageRepo; + this.sseService = sseService; + this.lockRepo = lockRepo; } // ── DTOs ───────────────────────────────────────────────────────────────── record IdsResult(List ids, int total) {} - record LocationPreviewDto(UUID locationId, String name, String profilePictureLq, double distanzKm) {} + record LocationPreviewDto(UUID locationId, String name, String profilePictureHq, double distanzKm) {} record OpeningHourDto(int dayOfWeek, String openTime, String closeTime, boolean closed) {} record GalleryImageDto(UUID imageId, String imageData) {} + record AdminDto(UUID userId, String name, String profilePicture, boolean isOwner) {} + record LocationDetailDto( UUID locationId, UUID ownerId, @@ -71,7 +97,10 @@ public class LocationController { LocalDateTime createdAt, List gallery, List openingHours, - boolean following + boolean following, + List admins, + boolean isAdmin, + UUID virtualUserId ) {} record CreateRequest( @@ -99,6 +128,21 @@ public class LocationController { record GalleryUploadRequest(String imageData) {} + record LocationVirtualInfoDto(UUID locationId, UUID virtualUserId, String name, + String profilePictureLq, String profilePictureHq) {} + + /** Löst eine virtuelle Benutzer-ID zur Location-Info auf (für Nachrichtenfenster) */ + @GetMapping("/virtual/{virtualUserId}") + public ResponseEntity getByVirtualUserId( + @PathVariable UUID virtualUserId, Principal principal) { + userService.requireUser(principal); + return locationRepo.findByVirtualUserId(virtualUserId) + .map(l -> ResponseEntity.ok(new LocationVirtualInfoDto( + l.getLocationId(), l.getVirtualUserId(), l.getName(), + l.getProfilePictureLq(), l.getProfilePictureHq()))) + .orElse(ResponseEntity.notFound().build()); + } + // ── Suche / IDs ────────────────────────────────────────────────────────── /** @@ -147,7 +191,7 @@ public class LocationController { .map(l -> new LocationPreviewDto( l.getLocationId(), l.getName(), - l.getProfilePictureLq(), + l.getProfilePictureHq(), l.getLat() != null && l.getLon() != null ? Math.round(haversineKm(refLat, refLon, l.getLat(), l.getLon()) * 10.0) / 10.0 : -1)) @@ -207,6 +251,7 @@ public class LocationController { loc.setCity(req.city()); loc.setOwnershipConfirmed(req.ownershipConfirmed()); loc.setCreatedAt(LocalDateTime.now()); + loc.setVirtualUserId(UUID.randomUUID()); locationRepo.save(loc); LOGGER.info("User {} hat Location {} angelegt", myId, loc.getLocationId()); @@ -257,6 +302,7 @@ public class LocationController { imageRepo.deleteByLocationId(locationId); hoursRepo.deleteByLocationId(locationId); followRepo.deleteByLocationId(locationId); + adminRepo.deleteByLocationId(locationId); locationRepo.deleteById(locationId); LOGGER.info("User {} hat Location {} gelöscht", myId, locationId); @@ -398,6 +444,12 @@ public class LocationController { // ── Helpers ─────────────────────────────────────────────────────────────── private LocationDetailDto toDetail(LocationEntity l, UUID myId) { + // Lazy-Init virtualUserId für Bestandsdaten ohne virtuelle ID + if (l.getVirtualUserId() == null) { + l.setVirtualUserId(UUID.randomUUID()); + locationRepo.save(l); + } + List gallery = imageRepo.findByLocationIdOrderByUploadedAtAsc(l.getLocationId()).stream() .map(i -> new GalleryImageDto(i.getImageId(), i.getImageData())) .toList(); @@ -405,12 +457,241 @@ public class LocationController { .map(h -> new OpeningHourDto(h.getDayOfWeek(), h.getOpenTime(), h.getCloseTime(), h.isClosed())) .toList(); boolean following = followRepo.findByUserIdAndLocationId(myId, l.getLocationId()).isPresent(); + boolean isAdmin = l.getOwnerId().equals(myId) + || adminRepo.existsByLocationIdAndUserId(l.getLocationId(), myId); + + // Inhaber zuerst, dann weitere Admins + List admins = new ArrayList<>(); + userRepo.findById(l.getOwnerId()).ifPresent(owner -> + admins.add(new AdminDto(owner.getUserId(), owner.getName(), owner.getProfilePicture(), true))); + adminRepo.findByLocationId(l.getLocationId()).stream() + .filter(a -> !a.getUserId().equals(l.getOwnerId())) + .forEach(a -> userRepo.findById(a.getUserId()).ifPresent(u -> + admins.add(new AdminDto(u.getUserId(), u.getName(), u.getProfilePicture(), false)))); + 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); + gallery, hours, following, admins, isAdmin, l.getVirtualUserId()); + } + + // ── Location-Posteingang (Admin) ───────────────────────────────────────────── + + record InboxSummaryDto(UUID senderId, String senderName, String senderPicture, + String lastMessage, LocalDateTime sentAt, long unreadCount) {} + + record InboxConversationDto( + List messages, + boolean canReply, + boolean lockedByMe, + String lockedByName // null wenn frei oder von mir gesperrt + ) {} + + record ReplyRequest(String text) {} + + /** Alle Konversationen, die Besucher mit dieser Location geführt haben */ + @GetMapping("/{locationId}/inbox") + public ResponseEntity> getInbox( + @PathVariable UUID locationId, Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + LocationEntity loc = locOpt.get(); + if (!loc.getOwnerId().equals(myId) && !adminRepo.existsByLocationIdAndUserId(locationId, myId)) { + return ResponseEntity.status(403).build(); + } + UUID virtualId = loc.getVirtualUserId(); + if (virtualId == null) return ResponseEntity.ok(List.of()); + + List allMessages = messageRepo.findAllByUser(virtualId); + + // Neueste Nachricht pro Gesprächspartner (Besucher) + Map latestByPartner = new LinkedHashMap<>(); + for (MessageEntity m : allMessages) { + UUID partnerId = m.getSenderId().equals(virtualId) ? m.getReceiverId() : m.getSenderId(); + latestByPartner.putIfAbsent(partnerId, m); + } + + List summaries = new ArrayList<>(); + for (Map.Entry entry : latestByPartner.entrySet()) { + UUID partnerId = entry.getKey(); + MessageEntity lastMsg = entry.getValue(); + var userOpt = userRepo.findById(partnerId); + if (userOpt.isEmpty()) continue; + var user = userOpt.get(); + long unread = allMessages.stream() + .filter(m -> m.getSenderId().equals(partnerId) + && m.getReceiverId().equals(virtualId) + && m.getReadAt() == null) + .count(); + String preview = lastMsg.getText().startsWith("data:image/") + ? "📷 Bild" + : lastMsg.getText().substring(0, Math.min(80, lastMsg.getText().length())); + summaries.add(new InboxSummaryDto(partnerId, user.getName(), user.getProfilePicture(), + preview, lastMsg.getSentAt(), unread)); + } + return ResponseEntity.ok(summaries); + } + + /** Konversation zwischen Location und einem Besucher inkl. Lock-Status (Admin-Sicht) */ + @GetMapping("/{locationId}/inbox/{userId}") + public ResponseEntity getInboxConversation( + @PathVariable UUID locationId, + @PathVariable UUID userId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + LocationEntity loc = locOpt.get(); + if (!loc.getOwnerId().equals(myId) && !adminRepo.existsByLocationIdAndUserId(locationId, myId)) { + return ResponseEntity.status(403).build(); + } + UUID virtualId = loc.getVirtualUserId(); + if (virtualId == null) return ResponseEntity.ok(new InboxConversationDto(List.of(), true, false, null)); + + List messages = new ArrayList<>( + messageRepo.findConversation(virtualId, userId, org.springframework.data.domain.PageRequest.of(0, 100))); + Collections.reverse(messages); + + messageRepo.markAsRead(virtualId, userId, LocalDateTime.now()); + + List dtos = messages.stream() + .map(m -> { + String senderName = userRepo.findById(m.getSenderId()) + .map(u -> u.getName()) + .orElse(loc.getName()); + return new de.oaa.xxx.social.dto.MessageDto( + m.getMessageId(), m.getSenderId(), senderName, + m.getReceiverId(), m.getText(), m.getSentAt(), m.getReadAt() != null); + }) + .toList(); + + // Lock-Status ermitteln + var lockInfo = resolveLockStatus(locationId, userId, myId); + + return ResponseEntity.ok(new InboxConversationDto(dtos, lockInfo[0].equals("true"), lockInfo[1].equals("true"), lockInfo[2])); + } + + /** Sperre für eine Konversation anfordern (Admin beginnt zu antworten) */ + @PostMapping("/{locationId}/inbox/{userId}/lock") + public ResponseEntity> acquireLock( + @PathVariable UUID locationId, + @PathVariable UUID userId, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + LocationEntity loc = locOpt.get(); + if (!loc.getOwnerId().equals(myId) && !adminRepo.existsByLocationIdAndUserId(locationId, myId)) { + return ResponseEntity.status(403).build(); + } + + var existingOpt = lockRepo.findByLocationIdAndVisitorId(locationId, userId); + LocalDateTime now = LocalDateTime.now(); + + if (existingOpt.isPresent()) { + LocationInboxLockEntity lock = existingOpt.get(); + boolean expired = lock.getLockedAt().isBefore(now.minusMinutes(LOCK_TIMEOUT_MINUTES)); + if (!expired && !lock.getLockedByUserId().equals(myId)) { + // Aktiv gesperrt durch einen anderen Admin + String lockerName = userRepo.findById(lock.getLockedByUserId()) + .map(u -> u.getName()).orElse("einem anderen Admin"); + return ResponseEntity.status(409).body(Map.of("lockedByName", lockerName)); + } + // Abgelaufen oder bereits meine Sperre → erneuern + lock.setLockedByUserId(myId); + lock.setLockedAt(now); + lockRepo.save(lock); + } else { + LocationInboxLockEntity lock = new LocationInboxLockEntity(); + lock.setLockId(UUID.randomUUID()); + lock.setLocationId(locationId); + lock.setVisitorId(userId); + lock.setLockedByUserId(myId); + lock.setLockedAt(now); + lockRepo.save(lock); + } + return ResponseEntity.ok(Map.of("acquired", true)); + } + + /** Antwort als Location an einen Besucher senden (mit Lock-Prüfung) */ + @PostMapping("/{locationId}/inbox/{userId}/reply") + public ResponseEntity> replyAsLocation( + @PathVariable UUID locationId, + @PathVariable UUID userId, + @RequestBody ReplyRequest req, + Principal principal) { + + UUID myId = userService.requireUser(principal).getUserId(); + var locOpt = locationRepo.findById(locationId); + if (locOpt.isEmpty()) return ResponseEntity.notFound().build(); + LocationEntity loc = locOpt.get(); + if (!loc.getOwnerId().equals(myId) && !adminRepo.existsByLocationIdAndUserId(locationId, myId)) { + return ResponseEntity.status(403).build(); + } + if (req.text() == null || req.text().isBlank()) return ResponseEntity.badRequest().build(); + UUID virtualId = loc.getVirtualUserId(); + if (virtualId == null) return ResponseEntity.badRequest().build(); + + // Lock prüfen + LocalDateTime now = LocalDateTime.now(); + var existingLockOpt = lockRepo.findByLocationIdAndVisitorId(locationId, userId); + if (existingLockOpt.isPresent()) { + LocationInboxLockEntity lock = existingLockOpt.get(); + boolean expired = lock.getLockedAt().isBefore(now.minusMinutes(LOCK_TIMEOUT_MINUTES)); + if (!expired && !lock.getLockedByUserId().equals(myId)) { + String lockerName = userRepo.findById(lock.getLockedByUserId()) + .map(u -> u.getName()).orElse("einem anderen Admin"); + return ResponseEntity.status(409).body(Map.of("lockedByName", lockerName)); + } + // Abgelaufen oder meine Sperre → erneuern + lock.setLockedByUserId(myId); + lock.setLockedAt(now); + lockRepo.save(lock); + } else { + // Noch keine Sperre → automatisch erwerben + LocationInboxLockEntity lock = new LocationInboxLockEntity(); + lock.setLockId(UUID.randomUUID()); + lock.setLocationId(locationId); + lock.setVisitorId(userId); + lock.setLockedByUserId(myId); + lock.setLockedAt(now); + lockRepo.save(lock); + } + + MessageEntity msg = new MessageEntity(); + msg.setMessageId(UUID.randomUUID()); + msg.setSenderId(virtualId); + msg.setReceiverId(userId); + msg.setText(req.text().trim()); + msg.setSentAt(now); + messageRepo.save(msg); + LOGGER.debug("Location {} hat Antwort an User {} gesendet", locationId, userId); + + long unread = messageRepo.countUnread(userId); + sseService.push(userId, "DM", Map.of("unreadCount", unread, "senderId", virtualId.toString())); + return ResponseEntity.status(201).build(); + } + + /** + * Ermittelt den Lock-Status für eine Konversation. + * Gibt ein String-Array zurück: [canReply, lockedByMe, lockedByName|null] + */ + private String[] resolveLockStatus(UUID locationId, UUID visitorId, UUID myId) { + var lockOpt = lockRepo.findByLocationIdAndVisitorId(locationId, visitorId); + if (lockOpt.isEmpty()) return new String[]{"true", "false", null}; + LocationInboxLockEntity lock = lockOpt.get(); + boolean expired = lock.getLockedAt().isBefore(LocalDateTime.now().minusMinutes(LOCK_TIMEOUT_MINUTES)); + if (expired) return new String[]{"true", "false", null}; + if (lock.getLockedByUserId().equals(myId)) return new String[]{"true", "true", null}; + String lockerName = userRepo.findById(lock.getLockedByUserId()) + .map(u -> u.getName()).orElse("einem anderen Admin"); + return new String[]{"false", "false", lockerName}; } static double haversineKm(double lat1, double lon1, double lat2, double lon2) { diff --git a/src/main/java/de/oaa/xxx/location/LocationEventController.java b/src/main/java/de/oaa/xxx/location/LocationEventController.java index 0dadea7..1255c32 100644 --- a/src/main/java/de/oaa/xxx/location/LocationEventController.java +++ b/src/main/java/de/oaa/xxx/location/LocationEventController.java @@ -27,10 +27,16 @@ 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.LocationAdminRepository; 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.feed.entity.FeedPostEntity; +import de.oaa.xxx.feed.repository.FeedPostRepository; +import de.oaa.xxx.gruppe.BeitragTyp; +import de.oaa.xxx.social.SystemMessageService; +import de.oaa.xxx.social.entity.MessageCause; import de.oaa.xxx.user.UserEntity; import de.oaa.xxx.user.UserRepository; import de.oaa.xxx.user.UserService; @@ -42,25 +48,41 @@ 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 LocationRepository locationRepo; + private final LocationEventRepository eventRepo; private final LocationEventAttendeeRepository attendeeRepo; - private final LocationFollowRepository followRepo; - private final UserRepository userRepo; - private final UserService userService; + private final LocationFollowRepository followRepo; + private final LocationAdminRepository adminRepo; + private final UserRepository userRepo; + private final UserService userService; + private final SystemMessageService systemMessageService; + private final FeedPostRepository feedPostRepo; public LocationEventController(LocationRepository locationRepo, LocationEventRepository eventRepo, LocationEventAttendeeRepository attendeeRepo, LocationFollowRepository followRepo, + LocationAdminRepository adminRepo, UserRepository userRepo, - UserService userService) { - this.locationRepo = locationRepo; - this.eventRepo = eventRepo; - this.attendeeRepo = attendeeRepo; - this.followRepo = followRepo; - this.userRepo = userRepo; - this.userService = userService; + UserService userService, + SystemMessageService systemMessageService, + FeedPostRepository feedPostRepo) { + this.locationRepo = locationRepo; + this.eventRepo = eventRepo; + this.attendeeRepo = attendeeRepo; + this.followRepo = followRepo; + this.adminRepo = adminRepo; + this.userRepo = userRepo; + this.userService = userService; + this.systemMessageService = systemMessageService; + this.feedPostRepo = feedPostRepo; + } + + private boolean isLocationAdmin(UUID locationId, UUID userId) { + return locationRepo.findById(locationId) + .map(l -> l.getOwnerId().equals(userId) + || adminRepo.existsByLocationIdAndUserId(locationId, userId)) + .orElse(false); } // ── DTOs ───────────────────────────────────────────────────────────────── @@ -91,6 +113,7 @@ public class LocationEventController { LocalDateTime startAt, LocalDateTime createdAt, boolean attendingMe, + boolean isAdmin, List attendees ) {} @@ -143,6 +166,25 @@ public class LocationEventController { event.setCreatedAt(LocalDateTime.now()); eventRepo.save(event); + // Feed-Post automatisch anlegen + try { + String locationName = locOpt.get().getName(); + String dateStr = event.getStartAt().format( + java.time.format.DateTimeFormatter.ofPattern("dd.MM.yyyy 'um' HH:mm 'Uhr'")); + FeedPostEntity feedPost = new FeedPostEntity(); + feedPost.setPostId(UUID.randomUUID()); + feedPost.setAuthorId(myId); + feedPost.setText("📍 Neue Veranstaltung bei " + locationName + ": \"" + event.getTitle() + "\" - " + dateStr); + feedPost.setBilder(event.getImageData() != null ? List.of(event.getImageData()) : List.of()); + feedPost.setBeitragTyp(BeitragTyp.TEXT); + feedPost.setPublic(true); + feedPost.setCreatedAt(LocalDateTime.now()); + feedPost.setTargetUrl("/community/event-detail.html?id=" + event.getEventId()); + feedPostRepo.save(feedPost); + } catch (Exception ex) { + LOGGER.warn("Feed-Post für Event {} konnte nicht angelegt werden: {}", event.getEventId(), ex.getMessage()); + } + LOGGER.info("Location {} hat Event {} angelegt", locationId, event.getEventId()); return ResponseEntity.status(201).body(toDetail(event, locOpt.get().getName(), myId)); } @@ -157,17 +199,23 @@ public class LocationEventController { 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 (!isLocationAdmin(locationId, 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(); + // Veranstaltungen in der Vergangenheit dürfen nicht bearbeitet werden + if (evtOpt.get().getStartAt().isBefore(LocalDateTime.now())) return ResponseEntity.status(422).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()); + if (req.startAt() != null) { + if (req.startAt().isBefore(LocalDateTime.now())) return ResponseEntity.status(422).build(); + event.setStartAt(req.startAt()); + } eventRepo.save(event); return ResponseEntity.ok(toDetail(event, locOpt.get().getName(), myId)); @@ -183,14 +231,27 @@ public class LocationEventController { 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 (!isLocationAdmin(locationId, 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(); + var evt = evtOpt.get(); + if (!evt.getLocationId().equals(locationId)) return ResponseEntity.status(400).build(); + + // Alle Teilnehmenden sammeln und benachrichtigen + List attendees = attendeeRepo.findByEventIdOrderByRegisteredAtAsc(eventId); + String locationName = locOpt.get().getName(); + String notifyText = "Die Veranstaltung \"" + evt.getTitle() + "\" bei " + locationName + " wurde abgesagt."; + String targetUrl = "/community/location-detail.html?id=" + locationId; attendeeRepo.deleteByEventId(eventId); - eventRepo.delete(evtOpt.get()); + eventRepo.delete(evt); + + attendees.stream() + .map(LocationEventAttendeeEntity::getUserId) + .filter(uid -> !uid.equals(myId)) + .forEach(uid -> systemMessageService.send(myId, uid, notifyText, targetUrl, MessageCause.EVENT_CANCELLED)); + return ResponseEntity.noContent().build(); } @@ -236,6 +297,78 @@ public class LocationEventController { return ResponseEntity.ok(Map.of("attending", attending, "attendeeCount", count)); } + // ── Meine angemeldeten Events (für Home) ───────────────────────────────── + + @GetMapping("/location-events/attending-next") + public ResponseEntity> getAttendingNext(Principal principal) { + UUID myId = userService.requireUser(principal).getUserId(); + + List myEventIds = attendeeRepo.findByUserId(myId).stream() + .map(LocationEventAttendeeEntity::getEventId) + .toList(); + + if (myEventIds.isEmpty()) return ResponseEntity.ok(List.of()); + + Map locationById = new java.util.HashMap<>(); + + List result = eventRepo + .findUpcomingByEventIds(myEventIds, LocalDateTime.now()) + .stream() + .map(e -> { + var loc = locationById.computeIfAbsent(e.getLocationId(), + id -> locationRepo.findById(id).orElse(null)); + String locName = loc != null ? loc.getName() : ""; + return toPreview(e, locName, 0, 0, myId); + }) + .toList(); + + return ResponseEntity.ok(result); + } + + // ── Nächste Events je abonnierter Location (für Home) ──────────────────── + + @GetMapping("/location-events/followed-next") + public ResponseEntity> getFollowedNext(Principal principal) { + UUID myId = userService.requireUser(principal).getUserId(); + + List followedIds = followRepo.findByUserId(myId).stream() + .map(LocationFollowEntity::getLocationId) + .toList(); + + if (followedIds.isEmpty()) return ResponseEntity.ok(List.of()); + + // Events ausschließen, bei denen der User bereits angemeldet ist + Set attendingEventIds = attendeeRepo.findByUserId(myId).stream() + .map(LocationEventAttendeeEntity::getEventId) + .collect(Collectors.toSet()); + + Map locationById = + locationRepo.findAllById(followedIds).stream() + .collect(Collectors.toMap( + de.oaa.xxx.location.entity.LocationEntity::getLocationId, + l -> l)); + + // Ein Event pro Location: je das nächste, das noch nicht begonnen hat und nicht attending + List result = eventRepo + .findUpcomingByLocationIds(followedIds, LocalDateTime.now()) + .stream() + .filter(e -> !attendingEventIds.contains(e.getEventId())) + .collect(Collectors.toMap( + LocationEventEntity::getLocationId, + e -> e, + (existing, replacement) -> existing)) + .values().stream() + .sorted(Comparator.comparing(LocationEventEntity::getStartAt)) + .map(e -> { + var loc = locationById.get(e.getLocationId()); + String locName = loc != null ? loc.getName() : ""; + return toPreview(e, locName, 0, 0, myId); + }) + .toList(); + + return ResponseEntity.ok(result); + } + // ── Event-Suche (IDs + Batch) ───────────────────────────────────────────── /** @@ -257,7 +390,7 @@ public class LocationEventController { 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 + // Abonnierte Locations - deren Events werden immer eingeschlossen Set followedLocationIds = followRepo.findByUserId(myId).stream() .map(LocationFollowEntity::getLocationId) .collect(Collectors.toSet()); @@ -374,11 +507,12 @@ public class LocationEventController { .toList(); boolean attendingMe = attendeeRepo.findByEventIdAndUserId(e.getEventId(), myId).isPresent(); + boolean isAdmin = isLocationAdmin(e.getLocationId(), myId); return new EventDetailDto( e.getEventId(), e.getLocationId(), locationName, e.getTitle(), e.getDescription(), e.getImageData(), e.getStartAt(), e.getCreatedAt(), - attendingMe, attendees); + attendingMe, isAdmin, attendees); } } diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationAdminEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationAdminEntity.java new file mode 100644 index 0000000..128c9c8 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/entity/LocationAdminEntity.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_admin") +public class LocationAdminEntity { + + @Id + @Column + private UUID adminId; + + @Column(nullable = false) + private UUID locationId; + + @Column(nullable = false) + private UUID userId; + + @Column(nullable = false) + private LocalDateTime addedAt; +} diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationEntity.java index 6bcaae4..2cad207 100644 --- a/src/main/java/de/oaa/xxx/location/entity/LocationEntity.java +++ b/src/main/java/de/oaa/xxx/location/entity/LocationEntity.java @@ -52,4 +52,8 @@ public class LocationEntity { @Column(nullable = false) private LocalDateTime createdAt; + + /** Virtuelle Benutzer-ID für das Nachrichtensystem (einmalig generiert, unveränderlich) */ + @Column(unique = true) + private UUID virtualUserId; } diff --git a/src/main/java/de/oaa/xxx/location/entity/LocationInboxLockEntity.java b/src/main/java/de/oaa/xxx/location/entity/LocationInboxLockEntity.java new file mode 100644 index 0000000..17899af --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/entity/LocationInboxLockEntity.java @@ -0,0 +1,35 @@ +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_inbox_lock", + uniqueConstraints = @UniqueConstraint(columnNames = {"location_id", "visitor_id"})) +public class LocationInboxLockEntity { + + @Id + @Column + private UUID lockId; + + @Column(name = "location_id", nullable = false) + private UUID locationId; + + /** Die kontaktierende Person */ + @Column(name = "visitor_id", nullable = false) + private UUID visitorId; + + /** Der Admin/Inhaber, der gerade antwortet */ + @Column(name = "locked_by_user_id", nullable = false) + private UUID lockedByUserId; + + /** Letzte Aktivität des Lock-Inhabers (wird bei jeder Antwort erneuert) */ + @Column(nullable = false) + private LocalDateTime lockedAt; +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationAdminRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationAdminRepository.java new file mode 100644 index 0000000..c049f68 --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/repository/LocationAdminRepository.java @@ -0,0 +1,17 @@ +package de.oaa.xxx.location.repository; + +import de.oaa.xxx.location.entity.LocationAdminEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface LocationAdminRepository extends JpaRepository { + + List findByLocationId(UUID locationId); + Optional findByLocationIdAndUserId(UUID locationId, UUID userId); + boolean existsByLocationIdAndUserId(UUID locationId, UUID userId); + void deleteByLocationId(UUID locationId); + void deleteByLocationIdAndUserId(UUID locationId, UUID userId); +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.java index c559fdf..6d407eb 100644 --- a/src/main/java/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.java +++ b/src/main/java/de/oaa/xxx/location/repository/LocationEventAttendeeRepository.java @@ -11,6 +11,8 @@ public interface LocationEventAttendeeRepository extends JpaRepository findByEventIdOrderByRegisteredAtAsc(UUID eventId); + List findByUserId(UUID userId); + Optional findByEventIdAndUserId(UUID eventId, UUID userId); long countByEventId(UUID eventId); diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationEventRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationEventRepository.java index c0e4beb..0158ed4 100644 --- a/src/main/java/de/oaa/xxx/location/repository/LocationEventRepository.java +++ b/src/main/java/de/oaa/xxx/location/repository/LocationEventRepository.java @@ -3,8 +3,10 @@ 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 org.springframework.data.repository.query.Param; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; import java.util.UUID; @@ -12,6 +14,12 @@ public interface LocationEventRepository extends JpaRepository findByLocationIdOrderByStartAtAsc(UUID locationId); + @Query("SELECT e FROM LocationEventEntity e WHERE e.locationId IN :locationIds AND e.startAt >= :from ORDER BY e.startAt ASC") + List findUpcomingByLocationIds(@Param("locationIds") Collection locationIds, @Param("from") LocalDateTime from); + + @Query("SELECT e FROM LocationEventEntity e WHERE e.eventId IN :eventIds AND e.startAt >= :from ORDER BY e.startAt ASC") + List findUpcomingByEventIds(@Param("eventIds") Collection eventIds, @Param("from") LocalDateTime from); + /** Alle zukünftigen Events mit Koordinaten ihrer Location (für Umkreis-Suche) */ @Query(""" SELECT e FROM LocationEventEntity e diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationInboxLockRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationInboxLockRepository.java new file mode 100644 index 0000000..091d45b --- /dev/null +++ b/src/main/java/de/oaa/xxx/location/repository/LocationInboxLockRepository.java @@ -0,0 +1,12 @@ +package de.oaa.xxx.location.repository; + +import de.oaa.xxx.location.entity.LocationInboxLockEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface LocationInboxLockRepository extends JpaRepository { + + Optional findByLocationIdAndVisitorId(UUID locationId, UUID visitorId); +} diff --git a/src/main/java/de/oaa/xxx/location/repository/LocationRepository.java b/src/main/java/de/oaa/xxx/location/repository/LocationRepository.java index a22b9f4..69fb8af 100644 --- a/src/main/java/de/oaa/xxx/location/repository/LocationRepository.java +++ b/src/main/java/de/oaa/xxx/location/repository/LocationRepository.java @@ -4,6 +4,7 @@ import de.oaa.xxx.location.entity.LocationEntity; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface LocationRepository extends JpaRepository { @@ -12,4 +13,8 @@ public interface LocationRepository extends JpaRepository /** Alle Locations mit gesetzten Koordinaten (für Umkreissuche) */ List findByLatIsNotNullAndLonIsNotNull(); + + Optional findByVirtualUserId(UUID virtualUserId); + + List findByVirtualUserIdIsNotNull(); } diff --git a/src/main/java/de/oaa/xxx/social/SocialController.java b/src/main/java/de/oaa/xxx/social/SocialController.java index f4f6558..afadf6a 100644 --- a/src/main/java/de/oaa/xxx/social/SocialController.java +++ b/src/main/java/de/oaa/xxx/social/SocialController.java @@ -1,6 +1,9 @@ package de.oaa.xxx.social; import de.oaa.xxx.dating.DatingMatchRepository; +import de.oaa.xxx.location.entity.LocationEntity; +import de.oaa.xxx.location.repository.LocationAdminRepository; +import de.oaa.xxx.location.repository.LocationRepository; import de.oaa.xxx.social.dto.ConversationSummary; import de.oaa.xxx.social.dto.FriendshipDto; import de.oaa.xxx.social.dto.MessageDto; @@ -43,6 +46,8 @@ public class SocialController { private final SseService sseService; private final SystemMessageService systemMessageService; private final UserService userService; + private final LocationRepository locationRepository; + private final LocationAdminRepository locationAdminRepository; public SocialController(UserRepository userRepository, FriendshipRepository friendshipRepository, @@ -52,7 +57,9 @@ public class SocialController { SubscriptionLimitService subscriptionLimitService, SseService sseService, SystemMessageService systemMessageService, - UserService userService) { + UserService userService, + LocationRepository locationRepository, + LocationAdminRepository locationAdminRepository) { this.userRepository = userRepository; this.friendshipRepository = friendshipRepository; this.messageRepository = messageRepository; @@ -62,6 +69,8 @@ public class SocialController { this.sseService = sseService; this.systemMessageService = systemMessageService; this.userService = userService; + this.locationRepository = locationRepository; + this.locationAdminRepository = locationAdminRepository; } record FriendRequestBody(UUID receiverId) {} @@ -216,7 +225,8 @@ public class SocialController { @PostMapping("/messages") public ResponseEntity> sendMessage(@RequestBody SendMessageBody body, Principal principal) { - UUID myId = userService.requireUser(principal).getUserId(); + var me = userService.requireUser(principal); + UUID myId = me.getUserId(); if (body.text() == null || body.text().isBlank()) return ResponseEntity.badRequest().build(); @@ -225,6 +235,31 @@ public class SocialController { return ResponseEntity.status(403).build(); } + // Location-Nachricht: keine Freundschafts-/Abo-Prüfung, alle Admins benachrichtigen + var locationOpt = locationRepository.findByVirtualUserId(body.receiverId()); + if (locationOpt.isPresent()) { + LocationEntity loc = locationOpt.get(); + MessageEntity msg = new MessageEntity(); + msg.setMessageId(UUID.randomUUID()); + msg.setSenderId(myId); + msg.setReceiverId(body.receiverId()); + msg.setText(body.text().trim()); + msg.setSentAt(LocalDateTime.now()); + messageRepository.save(msg); + LOGGER.debug("User {} hat Location {} (virtualId {}) kontaktiert", myId, loc.getLocationId(), body.receiverId()); + + // Alle Admins + Inhaber per Systembenachrichtigung informieren + Set adminIds = new java.util.LinkedHashSet<>(); + adminIds.add(loc.getOwnerId()); + locationAdminRepository.findByLocationId(loc.getLocationId()).forEach(a -> adminIds.add(a.getUserId())); + String notifText = me.getName() + " hat deine Location \"" + loc.getName() + "\" kontaktiert."; + String targetUrl = "/community/location-detail.html?id=" + loc.getLocationId() + "&chatWith=" + myId; + for (UUID adminId : adminIds) { + systemMessageService.send(myId, adminId, notifText, targetUrl, MessageCause.LOCATION_MESSAGE); + } + return ResponseEntity.status(201).build(); + } + // Blockiert? (in beide Richtungen) if (blockRepository.existsBlock(myId, body.receiverId())) { return ResponseEntity.status(403).body(Map.of("reason", "BLOCKED")); @@ -272,10 +307,20 @@ public class SocialController { for (Map.Entry entry : latestByPartner.entrySet()) { UUID partnerId = entry.getKey(); MessageEntity lastMsg = entry.getValue(); - var partnerOpt = userRepository.findById(partnerId); - if (partnerOpt.isEmpty()) continue; - UserProfile partnerProfile = toUserProfileWithStatus(partnerOpt.get(), myId); + UserProfile partnerProfile; + var userOpt = userRepository.findById(partnerId); + if (userOpt.isPresent()) { + partnerProfile = toUserProfileWithStatus(userOpt.get(), myId); + } else { + // Kein User → prüfen ob es eine Location-virtualUserId ist + var locOpt = locationRepository.findByVirtualUserId(partnerId); + if (locOpt.isEmpty()) continue; + LocationEntity loc = locOpt.get(); + partnerProfile = new UserProfile(partnerId, loc.getName(), + loc.getProfilePictureLq(), loc.getProfilePictureHq(), "LOCATION"); + } + MessageDto lastMsgDto = toMessageDto(lastMsg); long unreadCount = allMessages.stream() .filter(m -> m.getSenderId().equals(partnerId) @@ -433,7 +478,9 @@ public class SocialController { private MessageDto toMessageDto(MessageEntity m) { String senderName = userRepository.findById(m.getSenderId()) .map(UserEntity::getName) - .orElse("Unbekannt"); + .orElseGet(() -> locationRepository.findByVirtualUserId(m.getSenderId()) + .map(LocationEntity::getName) + .orElse("Unbekannt")); return new MessageDto( m.getMessageId(), m.getSenderId(), senderName, m.getReceiverId(), m.getText(), m.getSentAt(), m.getReadAt() != null); diff --git a/src/main/java/de/oaa/xxx/social/SystemMessageService.java b/src/main/java/de/oaa/xxx/social/SystemMessageService.java index d2cc71b..a07cbb1 100644 --- a/src/main/java/de/oaa/xxx/social/SystemMessageService.java +++ b/src/main/java/de/oaa/xxx/social/SystemMessageService.java @@ -57,9 +57,10 @@ public class SystemMessageService { .findByUserIdAndCause(receiverId, cause) .orElseGet(() -> NotificationPreferenceEntity.defaultFor(receiverId, cause)); - // FRIENDREQUEST, INVITATION und DATE_INTEREST sind immer nur in-app, kein E-Mail + // Diese Causes sind immer nur in-app, kein E-Mail boolean sendInApp = cause == MessageCause.FRIENDREQUEST || cause == MessageCause.INVITATION - || cause == MessageCause.DATE_INTEREST || pref.isInApp(); + || cause == MessageCause.DATE_INTEREST || cause == MessageCause.LOCATION_MESSAGE + || pref.isInApp(); if (sendInApp) { MessageEntity msg = new MessageEntity(); @@ -103,12 +104,14 @@ public class SystemMessageService { private String causeTitel(MessageCause cause) { return switch (cause) { - case INVITATION -> "XXX The Game – Neue Einladung"; - case GAME_STATE -> "XXX The Game – Spielstatus-Änderung"; - case EMERGENCY -> "XXX The Game – ⚠️ Notfall"; - case FRIENDREQUEST -> "XXX The Game – Neue Freundschaftsanfrage"; - case SUPPORT -> "xXx Sphere – Nachricht vom Support"; - case DATE_INTEREST -> "xXx Sphere – Interesse an deinem Date"; + case INVITATION -> "XXX The Game – Neue Einladung"; + case GAME_STATE -> "XXX The Game – Spielstatus-Änderung"; + case EMERGENCY -> "XXX The Game – ⚠️ Notfall"; + case FRIENDREQUEST -> "XXX The Game – Neue Freundschaftsanfrage"; + case SUPPORT -> "xXx Sphere – Nachricht vom Support"; + case DATE_INTEREST -> "xXx Sphere – Interesse an deinem Date"; + case EVENT_CANCELLED -> "xXx Sphere – Veranstaltung abgesagt"; + case LOCATION_MESSAGE -> "xXx Sphere – Neue Nachricht an deine Location"; }; } diff --git a/src/main/java/de/oaa/xxx/social/entity/MessageCause.java b/src/main/java/de/oaa/xxx/social/entity/MessageCause.java index 603ed30..99a22f8 100644 --- a/src/main/java/de/oaa/xxx/social/entity/MessageCause.java +++ b/src/main/java/de/oaa/xxx/social/entity/MessageCause.java @@ -6,5 +6,7 @@ public enum MessageCause { EMERGENCY, FRIENDREQUEST, SUPPORT, - DATE_INTEREST + DATE_INTEREST, + EVENT_CANCELLED, + LOCATION_MESSAGE } diff --git a/src/main/resources/static/community/event-detail.html b/src/main/resources/static/community/event-detail.html index 5ccece3..228ee31 100644 --- a/src/main/resources/static/community/event-detail.html +++ b/src/main/resources/static/community/event-detail.html @@ -20,7 +20,7 @@ .evt-date { font-size:0.88rem; color:var(--color-muted); margin-bottom:0.5rem; } .evt-desc { font-size:0.93rem; line-height:1.55; white-space:pre-wrap; word-break:break-word; margin-top:0.5rem; } - .attend-btn { display:inline-flex; align-items:center; gap:0.4rem; margin-top:0.75rem; } + .attend-btn { display:inline-flex; align-items:center; gap:0.4rem; margin-top:0.75rem; flex-wrap:wrap; } .section-title { font-size:1rem; font-weight:700; margin:1.5rem 0 0.75rem; } .gender-group { margin-bottom:1.25rem; } @@ -31,23 +31,92 @@ .attendee-avatar { width:28px; height:28px; border-radius:50%; background:var(--color-secondary); object-fit:cover; flex-shrink:0; overflow:hidden; display:flex; align-items:center; justify-content:center; font-size:0.8rem; } .attendee-avatar img { width:100%; height:100%; object-fit:cover; } .count-badge { background:var(--color-secondary); border-radius:12px; padding:0.15rem 0.6rem; font-size:0.78rem; color:var(--color-muted); margin-left:0.25rem; display:inline-block; } + + /* Modal */ + .modal-overlay { display:none; position:fixed; inset:0; background:rgba(0,0,0,.6); z-index:200; align-items:center; justify-content:center; } + .modal-overlay.open { display:flex; } + .modal { background:var(--color-card); border-radius:12px; width:min(520px,95vw); max-height:90vh; overflow-y:auto; padding:1.5rem; } + .modal h3 { margin:0 0 1rem; } + .modal-footer { display:flex; gap:0.75rem; justify-content:flex-end; margin-top:1.25rem; flex-wrap:wrap; } + .img-preview { width:80px; height:80px; border-radius:8px; object-fit:cover; background:var(--color-secondary); display:flex; align-items:center; justify-content:center; font-size:1.5rem; flex-shrink:0; overflow:hidden; border:1px solid var(--color-secondary); } + .img-preview img { width:100%; height:100%; object-fit:cover; } + .img-row { display:flex; gap:0.75rem; align-items:center; margin-bottom:0.5rem; } - -
    - ← Veranstaltungen + -
    -

    Wird geladen…

    + + + + + + + + + +
    +
    + ← Veranstaltungen +
    +

    Wird geladen…

    +
    - + + @@ -178,6 +182,8 @@ if (user) { document.getElementById('greeting').textContent = 'Willkommen zurück, ' + user.name + '!'; loadVisitors(); + loadMyEvents(); + loadLocEvents(); if (user.datingAktiv) { loadWhoLikesMe(); loadMatches(); @@ -257,6 +263,47 @@ return String(s).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } + function renderEventCards(events, listId, sectionId) { + if (!events.length) return; + const list = document.getElementById(listId); + list.innerHTML = events.map(e => { + const thumb = e.imageData + ? `` + : '🗓'; + const date = new Date(e.startAt); + const dateStr = date.toLocaleDateString('de-DE', { weekday:'short', day:'numeric', month:'short' }) + + ', ' + date.toLocaleTimeString('de-DE', { hour:'2-digit', minute:'2-digit' }) + ' Uhr'; + return ` + +
    ${thumb}
    +
    +
    ${esc(e.locationName)}
    +
    ${esc(e.title)}
    +
    ${dateStr}
    +
    +
    `; + }).join(''); + document.getElementById(sectionId).style.display = ''; + } + + async function loadMyEvents() { + try { + const res = await fetch('/location-events/attending-next'); + if (!res.ok) return; + const events = await res.json(); + renderEventCards(events, 'myEventsList', 'myEventsSection'); + } catch (_) {} + } + + async function loadLocEvents() { + try { + const res = await fetch('/location-events/followed-next'); + if (!res.ok) return; + const events = await res.json(); + renderEventCards(events, 'locEventsList', 'locEventsSection'); + } catch (_) {} + } + async function loadVisitors() { try { const res = await fetch('/social/profile-visits/my-visitors');