From b975fb655dd57b505c1804c414a6bf526c8afbaf Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 5 May 2021 14:43:16 +0200 Subject: [PATCH] Feature/global notifications (#1646) Add global notifications --- .../com/cloudogu/scm/JavaModulePlugin.groovy | 6 + docs/de/navigation.yml | 1 + docs/de/user/notification/assets/bell.png | Bin 0 -> 10740 bytes .../de/user/notification/assets/emptybell.png | Bin 0 -> 9163 bytes .../notification/assets/notifications.png | Bin 0 -> 134049 bytes docs/de/user/notification/assets/toast.png | Bin 0 -> 22979 bytes docs/de/user/notification/index.md | 36 ++ docs/en/navigation.yml | 1 + docs/en/user/notification/assets/bell.png | Bin 0 -> 2605 bytes .../en/user/notification/assets/emptybell.png | Bin 0 -> 2422 bytes .../notification/assets/notifications.png | Bin 0 -> 37756 bytes docs/en/user/notification/assets/toast.png | Bin 0 -> 8233 bytes docs/en/user/notification/index.md | 38 ++ gradle/changelog/global_notifications.yaml | 2 + gradle/dependencies.gradle | 1 + scm-core/build.gradle | 3 + .../sonia/scm/notifications/Notification.java | 55 +++ .../scm/notifications/NotificationSender.java | 50 +++ .../java/sonia/scm/notifications/Type.java | 51 +++ .../java/sonia/scm/security/SessionId.java | 4 +- .../src/main/java/sonia/scm/sse/Channel.java | 120 ++++++ .../sonia/scm/sse/ChannelCleanupTask.java | 43 +++ .../java/sonia/scm/sse/ChannelRegistry.java | 56 +++ .../src/main/java/sonia/scm/sse/Client.java | 100 +++++ .../src/main/java/sonia/scm/sse/Message.java | 54 +++ .../main/java/sonia/scm/sse/Registration.java | 46 +++ .../sonia/scm/sse/SseContextListener.java | 53 +++ .../java/sonia/scm/sse/SseEventAdapter.java | 47 +++ .../main/java/sonia/scm/web/VndMediaType.java | 2 + .../notifications/NotificationSenderTest.java | 61 +++ .../sonia/scm/sse/ChannelCleanupTaskTest.java | 51 +++ .../sonia/scm/sse/ChannelRegistryTest.java | 97 +++++ .../test/java/sonia/scm/sse/ChannelTest.java | 130 +++++++ .../test/java/sonia/scm/sse/ClientTest.java | 138 +++++++ scm-test/build.gradle | 6 +- .../scm/store/InMemoryByteDataStore.java | 88 +++++ .../store/InMemoryByteDataStoreFactory.java | 47 +++ .../sonia/scm/store/InMemoryDataStore.java | 4 +- .../scm/store/InMemoryDataStoreFactory.java | 5 +- scm-ui/ui-api/src/index.ts | 1 + scm-ui/ui-api/src/notifications.ts | 183 +++++++++ .../src/__snapshots__/storyshots.test.ts.snap | 2 + scm-ui/ui-components/src/devices.ts | 49 +++ scm-ui/ui-components/src/index.ts | 2 +- .../src/navigation/PrimaryNavigation.tsx | 2 +- scm-ui/ui-components/src/toast/ToastArea.tsx | 58 +++ .../src/toast/ToastNotification.tsx | 66 ++++ .../ui-components/src/toast/index.stories.tsx | 12 + scm-ui/ui-components/src/toast/index.ts | 3 + scm-ui/ui-components/src/toast/themes.ts | 4 +- scm-ui/ui-styles/src/scm.scss | 28 ++ scm-ui/ui-types/src/Notifications.ts | 38 ++ scm-ui/ui-types/src/index.ts | 1 + .../ui-webapp/public/locales/de/commons.json | 8 + .../ui-webapp/public/locales/en/commons.json | 8 + scm-ui/ui-webapp/src/containers/App.tsx | 11 +- .../src/containers/Notifications.tsx | 353 ++++++++++++++++++ .../scm/api/v2/resources/MeDtoFactory.java | 3 + .../scm/api/v2/resources/MeResource.java | 9 +- .../scm/api/v2/resources/NotificationDto.java | 50 +++ .../v2/resources/NotificationResource.java | 213 +++++++++++ .../resources/RepositoryExportResource.java | 17 +- .../scm/api/v2/resources/ResourceLinks.java | 6 + .../ExportNotificationHandler.java | 59 +++ .../sonia/scm/importexport/ExportService.java | 6 +- .../FullScmRepositoryExporter.java | 17 +- .../lifecycle/modules/ScmServletModule.java | 4 + .../DefaultNotificationSender.java | 58 +++ .../notifications/NotificationChannelId.java | 44 +++ .../scm/notifications/NotificationStore.java | 162 ++++++++ .../scm/notifications/StoredNotification.java | 57 +++ .../main/resources/locales/de/plugins.json | 4 + .../main/resources/locales/en/plugins.json | 4 + .../api/v2/resources/MeDtoFactoryTest.java | 9 + .../scm/api/v2/resources/MeResourceTest.java | 4 +- .../resources/NotificationResourceTest.java | 183 +++++++++ .../resources/RepositoryRootResourceTest.java | 5 +- .../ExportNotificationHandlerTest.java | 73 ++++ .../scm/importexport/ExportServiceTest.java | 7 + .../DefaultNotificationSenderTest.java | 84 +++++ .../notifications/NotificationStoreTest.java | 177 +++++++++ 81 files changed, 3450 insertions(+), 30 deletions(-) create mode 100644 docs/de/user/notification/assets/bell.png create mode 100644 docs/de/user/notification/assets/emptybell.png create mode 100644 docs/de/user/notification/assets/notifications.png create mode 100644 docs/de/user/notification/assets/toast.png create mode 100644 docs/de/user/notification/index.md create mode 100644 docs/en/user/notification/assets/bell.png create mode 100644 docs/en/user/notification/assets/emptybell.png create mode 100644 docs/en/user/notification/assets/notifications.png create mode 100644 docs/en/user/notification/assets/toast.png create mode 100644 docs/en/user/notification/index.md create mode 100644 gradle/changelog/global_notifications.yaml create mode 100644 scm-core/src/main/java/sonia/scm/notifications/Notification.java create mode 100644 scm-core/src/main/java/sonia/scm/notifications/NotificationSender.java create mode 100644 scm-core/src/main/java/sonia/scm/notifications/Type.java create mode 100644 scm-core/src/main/java/sonia/scm/sse/Channel.java create mode 100644 scm-core/src/main/java/sonia/scm/sse/ChannelCleanupTask.java create mode 100644 scm-core/src/main/java/sonia/scm/sse/ChannelRegistry.java create mode 100644 scm-core/src/main/java/sonia/scm/sse/Client.java create mode 100644 scm-core/src/main/java/sonia/scm/sse/Message.java create mode 100644 scm-core/src/main/java/sonia/scm/sse/Registration.java create mode 100644 scm-core/src/main/java/sonia/scm/sse/SseContextListener.java create mode 100644 scm-core/src/main/java/sonia/scm/sse/SseEventAdapter.java create mode 100644 scm-core/src/test/java/sonia/scm/notifications/NotificationSenderTest.java create mode 100644 scm-core/src/test/java/sonia/scm/sse/ChannelCleanupTaskTest.java create mode 100644 scm-core/src/test/java/sonia/scm/sse/ChannelRegistryTest.java create mode 100644 scm-core/src/test/java/sonia/scm/sse/ChannelTest.java create mode 100644 scm-core/src/test/java/sonia/scm/sse/ClientTest.java create mode 100644 scm-test/src/main/java/sonia/scm/store/InMemoryByteDataStore.java create mode 100644 scm-test/src/main/java/sonia/scm/store/InMemoryByteDataStoreFactory.java create mode 100644 scm-ui/ui-api/src/notifications.ts create mode 100644 scm-ui/ui-components/src/devices.ts create mode 100644 scm-ui/ui-components/src/toast/ToastArea.tsx create mode 100644 scm-ui/ui-components/src/toast/ToastNotification.tsx create mode 100644 scm-ui/ui-types/src/Notifications.ts create mode 100644 scm-ui/ui-webapp/src/containers/Notifications.tsx create mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/NotificationDto.java create mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/NotificationResource.java create mode 100644 scm-webapp/src/main/java/sonia/scm/importexport/ExportNotificationHandler.java create mode 100644 scm-webapp/src/main/java/sonia/scm/notifications/DefaultNotificationSender.java create mode 100644 scm-webapp/src/main/java/sonia/scm/notifications/NotificationChannelId.java create mode 100644 scm-webapp/src/main/java/sonia/scm/notifications/NotificationStore.java create mode 100644 scm-webapp/src/main/java/sonia/scm/notifications/StoredNotification.java create mode 100644 scm-webapp/src/test/java/sonia/scm/api/v2/resources/NotificationResourceTest.java create mode 100644 scm-webapp/src/test/java/sonia/scm/importexport/ExportNotificationHandlerTest.java create mode 100644 scm-webapp/src/test/java/sonia/scm/notifications/DefaultNotificationSenderTest.java create mode 100644 scm-webapp/src/test/java/sonia/scm/notifications/NotificationStoreTest.java diff --git a/build-plugins/src/main/groovy/com/cloudogu/scm/JavaModulePlugin.groovy b/build-plugins/src/main/groovy/com/cloudogu/scm/JavaModulePlugin.groovy index 62dd20c001..1978e26395 100644 --- a/build-plugins/src/main/groovy/com/cloudogu/scm/JavaModulePlugin.groovy +++ b/build-plugins/src/main/groovy/com/cloudogu/scm/JavaModulePlugin.groovy @@ -55,6 +55,12 @@ class JavaModulePlugin implements Plugin { failOnError false } + project.sonarqube { + properties { + property "sonar.java.source", "8" + } + } + project.afterEvaluate { if (project.isCI) { project.plugins.apply("jacoco") diff --git a/docs/de/navigation.yml b/docs/de/navigation.yml index 0e25b8ec53..da6e8e4144 100644 --- a/docs/de/navigation.yml +++ b/docs/de/navigation.yml @@ -5,3 +5,4 @@ - /user/group/ - /user/admin/ - /user/profile/ + - /user/notification/ diff --git a/docs/de/user/notification/assets/bell.png b/docs/de/user/notification/assets/bell.png new file mode 100644 index 0000000000000000000000000000000000000000..a2556a7bf7d87a914d0200344202c9b6995447a3 GIT binary patch literal 10740 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%0A{|*?&r%yfzt;*hft^bjdM`FzMXP8w0HD2 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 literal 0 HcmV?d00001 diff --git a/docs/de/user/notification/assets/toast.png b/docs/de/user/notification/assets/toast.png new file mode 100644 index 0000000000000000000000000000000000000000..642582c530dcd88a0e23b5a60445ccde78ffaf52 GIT binary patch literal 22979 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 literal 0 HcmV?d00001 diff --git a/docs/de/user/notification/index.md b/docs/de/user/notification/index.md new file mode 100644 index 0000000000..f65c4c9da8 --- /dev/null +++ b/docs/de/user/notification/index.md @@ -0,0 +1,36 @@ +--- +title: Benachrichtigungen +partiallyActive: true +--- + +Benachrichtigungen werden in SCM-Manager verwendet, um die Fertigstellung von langlaufenden Prozessen anzuzeigen +oder um den Benutzer auf Fehler hinzuweisen. + +Aktuelle Benachrichtigungen tauchen in Form einer Toast-Benachrichtigung am unteren rechten Rand auf. + +![Toast-Benachrichtigung](assets/toast.png) + +Die Farbe der Benachrichtigung gibt den Typ der Nachricht an: + +* Fehler (Rot): Ein Fehler ist aufgetreten +* Warnung (Gelb): Es ist ein Problem aufgetreten +* Erfolgreich (Grün): Eine Aktion wurde erfolgreich beendet +* Information (Blau): Zur Information + +Die Nachrichten verweisen auf eine Unterseite des SCM-Managers, die sich mit einem Klick auf den Text aufrufen lässt. +Nach dem Lesen der Nachricht, kann sie mit einem Klick auf das X in der oberen rechten Ecke geschlossen werden. +Nach dem Schließen der Nachricht ist sie immer noch über die Glocke am oberen rechten Rand zu finden. + +![Glockensymbol](assets/bell.png) + +Die Zahl neben der Glock gibt an wie viele Nachrichten eingegangen sind. +Mit einem Klick öffnet sich die Liste der Nachrichten. Neben den Informationen wie Typ der Nachricht (farbiger Rand) und Eingangsdatum, kann über einen Klick auf den Text zu einer SCM-Manager Unterseite navigiert werden. + +![Benachrichtigungen](assets/notifications.png) + +Über das Mülleimer-Symbol lässt sich eine einzelne Nachricht löschen. +Alle Nachrichten lassen sich über den "Alle löschen" Button löschen. + +Wenn keine Nachrichten mehr vorhanden sind, zeigt das Glocken-Symbol keinen Zähler mehr an. + +![Glockensymbol ohne Zähler](assets/emptybell.png) diff --git a/docs/en/navigation.yml b/docs/en/navigation.yml index 89a8367a9f..01cd136280 100644 --- a/docs/en/navigation.yml +++ b/docs/en/navigation.yml @@ -13,6 +13,7 @@ - /user/group/ - /user/admin/ - /user/profile/ + - /user/notification/ - section: Administration entries: diff --git a/docs/en/user/notification/assets/bell.png b/docs/en/user/notification/assets/bell.png new file mode 100644 index 0000000000000000000000000000000000000000..99dee39b49e1c18d7d4d064559e58be0a312f036 GIT binary patch literal 2605 zcmZWrc|4SR7awCRF|soh9zz*fW@H~rqp?klEz2m`hZ)QaV`8K-p>VJ6wcUxE%FR-i zMkz~DjZv1ehtMVBDxvG@wIs_O-QI4W_kBK}^PKN<&iS72bI$LdUxu5DgM^r}7zhNC zz&YA_@VzwbSD}1rH;*)F z9Saazh&ONPuShOe6^bq`QP2{cJ%lN|>gVRk<8t%Cp*oi?$+3o2Fm;a7z3!Nmy;2q` zym3&lmd&sOH{x(|;ko%em^uvI9^MOWRm9Y}$mB55GJ7JBqKoSdI;rca5c3O(jSVu< z$c`e-+UpQoi?@oN3dFMTJcJn-tL@cni1c-JXm01WXPpy}n~@s4Mq{<)xMvEgdjqZ9 zKm$Rc!}0ym5IT`ajU~|-Bm0l5 z@mmd$JqZi~-WeT2qv!{P(t?TlOiJ_)1!T!Y^C5-E2m+XtC~7R4X$AjMf#&0#FcJ=Y zDPcrf!3lUb086720TX?cJ_>Fv1^|F1Jv0pMVQc@D&i}H4lNgL>G!hvfAFm&8s86GZ zBMr>W&5@{s$b$#<_!WAw2~&>TH?nKdUWF|4n*OpA-uZOQ;ZERrqrTqUA z{|bIbBz#9S{hs(;;(v)=u|ztSM&S!Gtp7ciujKEOUx}8;ow>i;!#_*@66J5%TFesp z?Zm9b;Kt*!Adqk%&eq10B(!ksgtMQWob?0UBynAjVZB4wbpt<@2XCIkD1&W|6dMOG zT*fUoKM_$oeGtD+jWFtavcHuyK*}H|^jQzsmNwV9UhMOBBHuE0!;_B4-xf7t!><}9 z_Kb}rzWuN{@*oPI9~u|dUHF*RU05*EC2XRm>MLk^zCqA)R>SE$<@S25r{c>kyo%wT zT7iygW4u0OXrm@7BA}g=oYU`F2DL9+#wO38EU2YpX0An8@6MlQmkxx32}9UcoT3O< z9iwy2P=s7MqIbd{0Bc2nOAXLe&)ldFHXeDfB1k4H6zt+JnuMvztqH3?v#TgzVpwPu zz^8#L4$jC%n$|4^--h-XvCw8>9CvT!>e9=3YYlU%nof-rB1`l6#JxF;2x4Y2h4tAp znX{bk<)CemWzG!Wb{BAoZCv^|coB1*J$F4bwVSdF9wDGv$U`MqXtA@%u z(*8+n?l*OHDyIQZvlmI57@l(FmgUG;oq}j$ z?jx?J9~&lvkDRH(o{Vqln7bQ2-S4{Cv+!#1^ODT`p^qw0#C|NAh z5p^q5BMl?A+Wj!;@Vtr~4_HqMXHTD!%-ljt{ORn^nmzyN zNggCQ!Hc4Fl~YYggp5DfFzk$!_WG-wbZ+=Ynr+yc^uraBoPFYF^&f5oHPU5cqe$~Q z4VI?i<8?Jf?BaxGAQKAZl_i5=TkB5Q#ho+LK`asZu=JF{dp|NtZi@c2A~6iseES1d z-K_r*NPb_?%3w`tlSS{C1m%xE7Uw%?5Dd80IQwnh96|3MWF#TtR)y~K4d;-8Gb*ou zoNGOyuj)7ru-$PqpO5a4^5BH>DH|B4GHtA_E$5Yy0WoLL)|ru=Yu|R!&yp5ZfXwuH zDvs~6WcWx6a`$Ha-5*-Kgub)$9yk2pNH_uM>YZe!;%zz$H_C7vAOY zN0)GAb~##ODWTD$9ChMfH6Fes0g8W zapazEs;DS^uBXjyy0NMO{prwA9wH03xRmeh?4AP7>rKDgStSsLqCamXKUaM>dyez$ z!2Sg4Wdr2vg#{;EN(u6&_o~yJ4$CnH^(i}DGx^Br9*uoBv-3vtZrwpxs?lmD>DCV` zIlI^2|Jf&06)iPJ!Ocrc$k}z0ccm3RK6>T-fPh=ueI48~qIk~HL)|t(tFG9V(Z3lN zCcIJzOEcNfK5R|7(q6&r?&)cntu(CAmc=hKQ3kkF%zST~|B$mscEZaB$LXvCaDTmh zKO0pm>rT5!{CPp4Wiw%FNRQMUFb)x2FAMZSQ2M)$clh?^`lJh`_$;*>ZP|w))bN|Z zlD)uG8!9q;V{rr0EB2^?D8B!!l(h{@r042#OZZDPot@iinP+t)1vS>xIahM6)^SuR z9H@wV?#h~W7^3&@o<7w*rKX`vl~Qx9Uxt*_ly0r2F=GH`%uq3b4f@FTGM~}HU&%$A z9m1ENET`v~Z$85tJJ#?pBk=mBhj-;pm|!W5LRp{Y*T*GQg(Jf!cjvd!2-_MoEB*Xc z$5Tf6;&&vn?h}@yhJQ~FHSso9M4Q43e)Q_O(6tSUGIjWUe<$jXof`wr&c&8w@ zLW-1Jdr22`aSLy5ulAqntv>Jj`+d&uoZtDL?>Wyo&*$?zJP)^Rau78L005A4awL06 zw5ddlz#z%DMJp);0FZK^lSm#;Bof?%#SEoK(f|Pc>|hE-(aA`^B`AnOX=y_mKv=O} zM~`NDQ4Y5XTZJNFyRd{(yA51I*Iyo+kNVX~9I?EFw~ccAQe zEWY8zwUn|=ve6}%VS2!i);1R|`g{0@gu-*uA;`05m6LikYy^%99iBE{H_BURhz0>v zJ=@-G!U(&R3&~^ZHUb-#1EK@kwBAPGrkKMeD5^)G!BdM>$h5^Y8GQPo2UUvE=*NZH z{302$#prq;7_Btyl)kw%$-uYX6urxRTYZbLB`aArHZUl4$Q>7L69g4rg-U{(rBNqx2+n0hMzIN8OT_mGg2Y~NqY?1$A)I}d z2tQX3IEl%k!Oc)6C=-Mg1P+H2Ss|eWFS5f=y5!Fi5zgU66VT|`*jQAoDT>JoLu2rG zJlX_{#$t^n5ytGeC{7U9IEuabN0R^MA=B8wEP6DD&WwVu# zSCIgKY?%|;)+bzceAfWe$6ndGdQ33;Dsjw??vbaM(T!_Liy-BhdGK0+o??KeOJ?l? z`K|R(v95eECPMk`w%74fKq^%&(8ffEeD#tK1lJW2iKNlb!X8{?Ph6X@)>XRLXSB^oBicVsTYd=FiU4E1vl5x~sda0D&_|dL~!oj9&;CJ(~Zf5z-2u{1FHBU7w zc|W^P)>8^rbi7t_IUH;d(P_=gy7%Nw#`DK%!GE35Z{B5#M{6rSG@n(v8!PgB;*dkj zfq)?qNCjN>6tBg<(H_y*n0qOc(BptzOlx-pJ<7X=%Y@F6}%AGUI&dzLuxAuC!(oCs$fqlhQie@Yb$pW90qa9};gpFf+bc^H+3T~Z&IwUWy zmMNVKaNe`m5?aZe(E|0~?eN-@ny@A++O3~eYDZnD_(J}AGMEN4L)h(T(5HufRv&7s zwd$=asd+l?%ZYm5ulz7!|He|-h-EcgO5=D-ZGkt!{3;q@E13#x2SgbEX=5qE#NpynHFl)|>m}@kr3CqOTb~`G^uTIY6lUwE1cACstXITm%m(HmU{_3;Gd@AGC{!%5BG|suaDPnt{&@M zBV9F{9m2udNuL!}%SaK_KgB(Ga%}5(=ZonwCToB8f!KFJaPxx<*`f~{oGXr$B1BuO zK;699HK(svvhpe(mMujme1su6-Eo59{^vRq*;)vn@|;wm5+!6xa0OelR`vNDr$#?! zOQg0c50o>+NIHA*BJlhau79AnCDCp4VOMv4X-pRJap(?EXYxD~mJ2t6W zs~H+nOS%%~zeNa-u~sXIo2{MEPM)2QkBun~e!I6o9Q|fuG@a?XuE*suF?@U$ewk4qZN$S&^(X%LA)F? zXp<6~m~3Xu%Uo3$xg$%oS9oI_;)#{Z&&^Fy)Yzl z|4&9jTo1}oCua(yh-XO-urLfx%)fAlVM@q~d>2GS!g9-3+oRT=zm;lE23Jz?o86cp z`G!_u(w$A_uF_!jL3?aEegV`Zg`Yx_T?BdcseTA{`@A+a$N`HT&IFL#G)z_PlN**G^nLfvz(d;gbp04*KIIospnhG@-$D(s-Q+jK|LPUDseTy%EM1(b`uvlrCC X!@C1s9cfcoxq6-K-N?7>C@KE{geM9s literal 0 HcmV?d00001 diff --git a/docs/en/user/notification/assets/notifications.png b/docs/en/user/notification/assets/notifications.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2a1863fc56c62188e7d9e6bef7b73950397b34 GIT binary patch literal 37756 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 literal 0 HcmV?d00001 diff --git a/docs/en/user/notification/assets/toast.png b/docs/en/user/notification/assets/toast.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb5044d642fe2eb6941f54e5d9b5f8878c3bf52 GIT binary patch literal 8233 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 clients = new ArrayList<>(); + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + + private final Object channelId; + private final Function clientFactory; + + Channel(Object channelId) { + this(channelId, Client::new); + } + + Channel(Object channelId, Function clientFactory) { + this.channelId = channelId; + this.clientFactory = clientFactory; + } + + public void register(Registration registration) { + registration.validate(); + Client client = clientFactory.apply(registration); + + LOG.trace("registered new client {} to channel {}", client.getSessionId(), channelId); + lock.writeLock().lock(); + try { + clients.add(client); + } finally { + lock.writeLock().unlock(); + } + } + + public void broadcast(Message message) { + LOG.trace("broadcast message {} to clients of channel {}", message, channelId); + lock.readLock().lock(); + try { + clients.stream() + .filter(isNotSender(message)) + .forEach(client -> client.send(message)); + } finally { + lock.readLock().unlock(); + } + } + + private Predicate isNotSender(Message message) { + return client -> { + Optional senderSessionId = message.getSender(); + return senderSessionId + .map(sessionId -> !sessionId.equals(client.getSessionId())) + .orElse(true); + }; + } + + void removeClosedOrTimeoutClients() { + Instant timeoutLimit = Instant.now().minus(30, ChronoUnit.SECONDS); + lock.writeLock().lock(); + try { + int removeCounter = 0; + Iterator it = clients.iterator(); + while (it.hasNext()) { + Client client = it.next(); + if (client.isClosed()) { + LOG.trace("remove closed client with session {}", client.getSessionId()); + it.remove(); + removeCounter++; + } else if (client.getLastUsed().isBefore(timeoutLimit)) { + client.close(); + LOG.trace("remove client with session {}, because it has reached the timeout", client.getSessionId()); + it.remove(); + removeCounter++; + } + } + LOG.trace("removed {} closed clients from channel", removeCounter); + } finally { + lock.writeLock().unlock(); + } + } + +} diff --git a/scm-core/src/main/java/sonia/scm/sse/ChannelCleanupTask.java b/scm-core/src/main/java/sonia/scm/sse/ChannelCleanupTask.java new file mode 100644 index 0000000000..9f5170f515 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/sse/ChannelCleanupTask.java @@ -0,0 +1,43 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import javax.inject.Inject; + +public class ChannelCleanupTask implements Runnable { + + private final ChannelRegistry registry; + + @Inject + public ChannelCleanupTask(ChannelRegistry registry) { + this.registry = registry; + } + + @Override + public void run() { + registry.removeClosedClients(); + } + +} diff --git a/scm-core/src/main/java/sonia/scm/sse/ChannelRegistry.java b/scm-core/src/main/java/sonia/scm/sse/ChannelRegistry.java new file mode 100644 index 0000000000..8ded5162a8 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/sse/ChannelRegistry.java @@ -0,0 +1,56 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import com.google.common.annotations.VisibleForTesting; + +import javax.inject.Singleton; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +@Singleton +public class ChannelRegistry { + + private final Map channels = new ConcurrentHashMap<>(); + private final Function channelFactory; + + public ChannelRegistry() { + this(Channel::new); + } + + @VisibleForTesting + ChannelRegistry(Function channelFactory) { + this.channelFactory = channelFactory; + } + + public Channel channel(Object channelId) { + return channels.computeIfAbsent(channelId, channelFactory); + } + + void removeClosedClients() { + channels.values().forEach(Channel::removeClosedOrTimeoutClients); + } +} diff --git a/scm-core/src/main/java/sonia/scm/sse/Client.java b/scm-core/src/main/java/sonia/scm/sse/Client.java new file mode 100644 index 0000000000..af7da4d466 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/sse/Client.java @@ -0,0 +1,100 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.security.SessionId; + +import javax.ws.rs.sse.OutboundSseEvent; +import javax.ws.rs.sse.SseEventSink; +import java.io.Closeable; +import java.time.Instant; +import java.util.function.Function; + +class Client implements Closeable { + + private static final Logger LOG = LoggerFactory.getLogger(Client.class); + + private final SessionId sessionId; + private final SseEventAdapter adapter; + private final SseEventSink eventSink; + + private Instant lastUsed; + private boolean exceptionallyClosed = false; + + Client(Registration registration) { + this(registration, reg -> new SseEventAdapter(reg.getSse())); + } + + Client(Registration registration, Function adapterFactory) { + sessionId = registration.getSessionId(); + adapter = adapterFactory.apply(registration); + eventSink = registration.getEventSink(); + lastUsed = Instant.now(); + } + + Instant getLastUsed() { + return lastUsed; + } + + SessionId getSessionId() { + return sessionId; + } + + boolean isExceptionallyClosed() { + return exceptionallyClosed; + } + + void send(Message message) { + if (!isClosed()) { + OutboundSseEvent event = adapter.create(message); + LOG.debug("send message to client with session id {}", sessionId); + lastUsed = Instant.now(); + eventSink.send(event).exceptionally(e -> { + if (LOG.isTraceEnabled()) { + LOG.trace("failed to send event to client with session id {}:", sessionId, e); + } else { + LOG.debug("failed to send event to client with session id {}: {}", sessionId, e.getMessage()); + } + exceptionallyClosed = true; + close(); + return null; + }); + } else { + LOG.debug("client has closed the connection, before we could send the message"); + } + } + + boolean isClosed() { + return exceptionallyClosed || eventSink.isClosed(); + } + + @Override + public void close() { + LOG.trace("close sse session of client with session id: {}", sessionId); + eventSink.close(); + } +} diff --git a/scm-core/src/main/java/sonia/scm/sse/Message.java b/scm-core/src/main/java/sonia/scm/sse/Message.java new file mode 100644 index 0000000000..228741f376 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/sse/Message.java @@ -0,0 +1,54 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import lombok.Getter; +import sonia.scm.security.SessionId; + +import java.util.Optional; + +@Getter +public class Message { + + private final String name; + private final Class type; + private final Object data; + private final SessionId sender; + + public Message(String name, Class type, Object data) { + this(name, type, data, null); + } + + public Message(String name, Class type, Object data, SessionId sender) { + this.name = name; + this.type = type; + this.data = data; + this.sender = sender; + } + + public Optional getSender() { + return Optional.ofNullable(sender); + } +} diff --git a/scm-core/src/main/java/sonia/scm/sse/Registration.java b/scm-core/src/main/java/sonia/scm/sse/Registration.java new file mode 100644 index 0000000000..b558c8ffb2 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/sse/Registration.java @@ -0,0 +1,46 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import com.google.common.base.Preconditions; +import lombok.Value; +import sonia.scm.security.SessionId; + +import javax.ws.rs.sse.Sse; +import javax.ws.rs.sse.SseEventSink; + +@Value +public class Registration { + + SessionId sessionId; + Sse sse; + SseEventSink eventSink; + + void validate() { + Preconditions.checkNotNull(sessionId, "sessionId is required"); + Preconditions.checkNotNull(sse, "sse is required"); + Preconditions.checkNotNull(eventSink, "eventSink is required"); + } +} diff --git a/scm-core/src/main/java/sonia/scm/sse/SseContextListener.java b/scm-core/src/main/java/sonia/scm/sse/SseContextListener.java new file mode 100644 index 0000000000..85572f4229 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/sse/SseContextListener.java @@ -0,0 +1,53 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import sonia.scm.plugin.Extension; +import sonia.scm.schedule.Scheduler; + +import javax.inject.Inject; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +@Extension +public class SseContextListener implements ServletContextListener { + + private final Scheduler scheduler; + + @Inject + public SseContextListener(Scheduler scheduler) { + this.scheduler = scheduler; + } + + @Override + public void contextInitialized(ServletContextEvent servletContextEvent) { + this.scheduler.schedule("0/30 * * * * ?", ChannelCleanupTask.class); + } + + @Override + public void contextDestroyed(ServletContextEvent servletContextEvent) { + // we have nothing to destroy + } +} diff --git a/scm-core/src/main/java/sonia/scm/sse/SseEventAdapter.java b/scm-core/src/main/java/sonia/scm/sse/SseEventAdapter.java new file mode 100644 index 0000000000..28daeff9c2 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/sse/SseEventAdapter.java @@ -0,0 +1,47 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.sse.OutboundSseEvent; +import javax.ws.rs.sse.Sse; + +class SseEventAdapter { + + private final Sse sse; + + SseEventAdapter(Sse sse) { + this.sse = sse; + } + + OutboundSseEvent create(Message message) { + return sse.newEventBuilder() + .name(message.getName()) + .mediaType(MediaType.APPLICATION_JSON_TYPE) + .data(message.getType(), message.getData()) + .build(); + } + +} diff --git a/scm-core/src/main/java/sonia/scm/web/VndMediaType.java b/scm-core/src/main/java/sonia/scm/web/VndMediaType.java index 1a846d66ba..0fe8252b21 100644 --- a/scm-core/src/main/java/sonia/scm/web/VndMediaType.java +++ b/scm-core/src/main/java/sonia/scm/web/VndMediaType.java @@ -93,6 +93,8 @@ public class VndMediaType { public static final String REPOSITORY_EXPORT = PREFIX + "repositoryExport" + SUFFIX; public static final String REPOSITORY_EXPORT_INFO = PREFIX + "repositoryExportInfo" + SUFFIX; + public static final String NOTIFICATION_COLLECTION = PREFIX + "notificationCollection" + SUFFIX; + private VndMediaType() { } diff --git a/scm-core/src/test/java/sonia/scm/notifications/NotificationSenderTest.java b/scm-core/src/test/java/sonia/scm/notifications/NotificationSenderTest.java new file mode 100644 index 0000000000..b4ce56d92f --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/notifications/NotificationSenderTest.java @@ -0,0 +1,61 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.notifications; + +import org.github.sdorra.jse.ShiroExtension; +import org.github.sdorra.jse.SubjectAware; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(ShiroExtension.class) +class NotificationSenderTest { + + @Test + @SubjectAware("trillian") + void shouldUsePrincipal() { + CapturingNotificationSender sender = new CapturingNotificationSender(); + + Notification notification = new Notification(Type.INFO, "/tricia", "Hello trillian"); + sender.send(notification); + + assertThat(sender.notification).isSameAs(notification); + assertThat(sender.recipient).isEqualTo("trillian"); + } + + private static class CapturingNotificationSender implements NotificationSender { + + private Notification notification; + private String recipient; + + @Override + public void send(Notification notification, String recipient) { + this.notification = notification; + this.recipient = recipient; + } + } + +} diff --git a/scm-core/src/test/java/sonia/scm/sse/ChannelCleanupTaskTest.java b/scm-core/src/test/java/sonia/scm/sse/ChannelCleanupTaskTest.java new file mode 100644 index 0000000000..7ce3cb964a --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/sse/ChannelCleanupTaskTest.java @@ -0,0 +1,51 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class ChannelCleanupTaskTest { + + @Mock + private ChannelRegistry registry; + + @InjectMocks + private ChannelCleanupTask task; + + @Test + void shouldRunCleanupFromRegistry() { + task.run(); + + verify(registry).removeClosedClients(); + } + +} diff --git a/scm-core/src/test/java/sonia/scm/sse/ChannelRegistryTest.java b/scm-core/src/test/java/sonia/scm/sse/ChannelRegistryTest.java new file mode 100644 index 0000000000..55028816e5 --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/sse/ChannelRegistryTest.java @@ -0,0 +1,97 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +class ChannelRegistryTest { + + private ChannelRegistry registry; + + @Nested + class ChannelTests { + + @BeforeEach + void setUp() { + registry = new ChannelRegistry(); + } + + @Test + void shouldCreateNewChannel() { + Channel one = registry.channel("one"); + assertThat(one).isNotNull(); + } + + @Test + void shouldReturnSameChannelForSameId() { + Channel two = registry.channel("two"); + assertThat(two).isSameAs(registry.channel("two")); + } + + } + + @Nested + @ExtendWith(MockitoExtension.class) + class RemoveClosedClientsTests { + + private List channels; + + @BeforeEach + void setUp() { + channels = new ArrayList<>(); + registry = new ChannelRegistry(objectId -> { + Channel channel = mock(Channel.class); + channels.add(channel); + return channel; + }); + } + + @Test + void shouldCallRemoveClosedOrTimeoutClientsOnEachChannel() { + registry.channel("one"); + registry.channel("two"); + registry.channel("three"); + + registry.removeClosedClients(); + + assertThat(channels) + .hasSize(3) + .allSatisfy(channel -> verify(channel).removeClosedOrTimeoutClients()); + } + + } + +} diff --git a/scm-core/src/test/java/sonia/scm/sse/ChannelTest.java b/scm-core/src/test/java/sonia/scm/sse/ChannelTest.java new file mode 100644 index 0000000000..18731b2fa4 --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/sse/ChannelTest.java @@ -0,0 +1,130 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import sonia.scm.security.SessionId; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.Map; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +@ExtendWith(MockitoExtension.class) +class ChannelTest { + + private Map clients; + private Channel channel; + + @BeforeEach + void setUp() { + this.clients = new HashMap<>(); + channel = new Channel("one", registration -> clients.get(registration)); + } + + @Test + void shouldRegisterAndSend() { + Client client = register(); + + Message message = broadcast("Hello World"); + + verify(client).send(message); + } + + @Test + void shouldNotSendToSender() { + Client clientOne = register(); + SessionId sessionOne = SessionId.valueOf("one"); + when(clientOne.getSessionId()).thenReturn(sessionOne); + + Client clientTwo = register(); + when(clientTwo.getSessionId()).thenReturn(SessionId.valueOf("two")); + + Message message = broadcast("Hello Two", sessionOne); + + verify(clientOne, never()).send(message); + verify(clientTwo).send(message); + } + + @Test + void shouldRemoveClosedClients() { + Client closedClient = register(); + when(closedClient.isClosed()).thenReturn(true); + Client activeClient = register(); + when(activeClient.getLastUsed()).thenReturn(Instant.now()); + + channel.removeClosedOrTimeoutClients(); + + Message message = broadcast("Hello active ones"); + + verify(closedClient, never()).send(message); + verify(activeClient).send(message); + } + + @Test + void shouldRemoveClientsWhichAreNotUsedWithin30Seconds() { + Client timedOutClient = register(); + when(timedOutClient.getLastUsed()).thenReturn(Instant.now().minus(31L, ChronoUnit.SECONDS)); + Client activeClient = register(); + when(activeClient.getLastUsed()).thenReturn(Instant.now().minus(29L, ChronoUnit.SECONDS)); + + channel.removeClosedOrTimeoutClients(); + + Message message = broadcast("Hello active ones"); + verify(timedOutClient, never()).send(message); + verify(timedOutClient).close(); + verify(activeClient).send(message); + verify(activeClient, never()).close(); + } + + private Client register() { + Registration registration = mock(Registration.class); + Client client = mock(Client.class); + clients.put(registration, client); + channel.register(registration); + return client; + } + + private Message broadcast(String data) { + return broadcast(data, null); + } + + private Message broadcast(String data, SessionId sessionId) { + Message message = new Message("hello", String.class, data, sessionId); + channel.broadcast(message); + return message; + } + +} diff --git a/scm-core/src/test/java/sonia/scm/sse/ClientTest.java b/scm-core/src/test/java/sonia/scm/sse/ClientTest.java new file mode 100644 index 0000000000..caaf2782b2 --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/sse/ClientTest.java @@ -0,0 +1,138 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.sse; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import sonia.scm.security.SessionId; + +import javax.ws.rs.sse.OutboundSseEvent; +import javax.ws.rs.sse.Sse; +import javax.ws.rs.sse.SseEventSink; +import java.util.concurrent.CompletionStage; +import java.util.function.Function; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ClientTest { + + @Mock + private SseEventSink eventSink; + + @Mock + private SseEventAdapter adapter; + + @Mock + private Sse sse; + + @Mock + private OutboundSseEvent sseEvent; + + @Mock + @SuppressWarnings("rawtypes") + private CompletionStage completionStage; + + @Test + void shouldSetInitialLastUsed() { + Client client = client("one"); + + assertThat(client.getLastUsed()).isNotNull(); + } + + @Test + void shouldReturnSessionId() { + Client client = client("two"); + + assertThat(client.getSessionId()).isEqualTo(SessionId.valueOf("two")); + } + + @Test + void shouldNotSendToClosedEventSink() { + Client client = client("three"); + when(eventSink.isClosed()).thenReturn(true); + + client.send(message(42)); + + verify(eventSink, never()).send(any(OutboundSseEvent.class)); + } + + @Test + void shouldCloseEventSink() { + Client client = client("one"); + + client.close(); + + verify(eventSink).close(); + } + + @Test + @SuppressWarnings("unchecked") + void shouldSendMessage() { + Message message = message(21); + when(adapter.create(message)).thenReturn(sseEvent); + when(eventSink.send(sseEvent)).thenReturn(completionStage); + + Client client = client("one"); + client.send(message); + + verify(eventSink).send(sseEvent); + } + + @Test + @SuppressWarnings("unchecked") + void shouldMarkAsClosedOnException() { + Message message = message(21); + when(adapter.create(message)).thenReturn(sseEvent); + when(completionStage.exceptionally(any())).then(ic -> { + Function function = ic.getArgument(0); + function.apply(new IllegalStateException("failed")); + return null; + }); + when(eventSink.send(sseEvent)).thenReturn(completionStage); + + Client client = client("one"); + client.send(message); + + verify(eventSink).close(); + assertThat(client.isExceptionallyClosed()).isTrue(); + } + + private Message message(int i) { + return new Message("count", Integer.class, i); + } + + private Client client(String sessionId) { + Registration registration = new Registration(SessionId.valueOf(sessionId), sse, eventSink); + return new Client(registration, reg -> adapter); + } + +} diff --git a/scm-test/build.gradle b/scm-test/build.gradle index ec5119431c..ce936d8aad 100644 --- a/scm-test/build.gradle +++ b/scm-test/build.gradle @@ -35,8 +35,6 @@ dependencies { api libraries.junitJupiterApi api libraries.junitJupiterParams api libraries.junitJupiterEngine - api libraries.shiroUnit - api libraries.shiroExtension // junit 4 support api libraries.junitVintageEngine @@ -51,6 +49,10 @@ dependencies { api libraries.mockitoCore api libraries.mockitoJunitJupiter + // shiro + api libraries.shiroExtension + api libraries.shiroUnit + // test rest api's api libraries.resteasyCore api libraries.resteasyValidatorProvider diff --git a/scm-test/src/main/java/sonia/scm/store/InMemoryByteDataStore.java b/scm-test/src/main/java/sonia/scm/store/InMemoryByteDataStore.java new file mode 100644 index 0000000000..fa67ee0b2f --- /dev/null +++ b/scm-test/src/main/java/sonia/scm/store/InMemoryByteDataStore.java @@ -0,0 +1,88 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.store; + +import sonia.scm.security.KeyGenerator; +import sonia.scm.security.UUIDKeyGenerator; + +import javax.xml.bind.JAXB; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class InMemoryByteDataStore implements DataStore { + + private final Class type; + private final KeyGenerator generator = new UUIDKeyGenerator(); + private final Map store = new HashMap<>(); + + InMemoryByteDataStore(Class type) { + this.type = type; + } + + @Override + public String put(T item) { + String id = generator.createKey(); + put(id, item); + return id; + } + + @Override + public void put(String id, T item) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + JAXB.marshal(item, baos); + store.put(id, baos.toByteArray()); + } + + @Override + public Map getAll() { + Map all = new HashMap<>(); + for (String id : store.keySet()) { + all.put(id, get(id)); + } + return Collections.unmodifiableMap(all); + } + + @Override + public void clear() { + store.clear(); + } + + @Override + public void remove(String id) { + store.remove(id); + } + + @Override + public T get(String id) { + byte[] bytes = store.get(id); + if (bytes != null) { + return JAXB.unmarshal(new ByteArrayInputStream(bytes), type); + } + return null; + } +} diff --git a/scm-test/src/main/java/sonia/scm/store/InMemoryByteDataStoreFactory.java b/scm-test/src/main/java/sonia/scm/store/InMemoryByteDataStoreFactory.java new file mode 100644 index 0000000000..2cbbbf78fc --- /dev/null +++ b/scm-test/src/main/java/sonia/scm/store/InMemoryByteDataStoreFactory.java @@ -0,0 +1,47 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.store; + +import java.util.HashMap; +import java.util.Map; + +/** + * Stores data in memory but in contrast to {@link InMemoryDataStoreFactory} + * it uses jaxb to marshal and unmarshall the objects. + * + * @since 2.18.0 + */ +public class InMemoryByteDataStoreFactory implements DataStoreFactory { + + @SuppressWarnings("rawtypes") + private final Map stores = new HashMap<>(); + + @Override + @SuppressWarnings("unchecked") + public DataStore getStore(TypedStoreParameters storeParameters) { + String name = storeParameters.getName(); + return stores.computeIfAbsent(name, n -> new InMemoryByteDataStore(storeParameters.getType())); + } +} diff --git a/scm-test/src/main/java/sonia/scm/store/InMemoryDataStore.java b/scm-test/src/main/java/sonia/scm/store/InMemoryDataStore.java index 3e752ae081..beef74a863 100644 --- a/scm-test/src/main/java/sonia/scm/store/InMemoryDataStore.java +++ b/scm-test/src/main/java/sonia/scm/store/InMemoryDataStore.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.store; import sonia.scm.security.KeyGenerator; @@ -37,7 +37,9 @@ import java.util.Map; * @author Sebastian Sdorra * * @param type of stored object + * @deprecated use {@link InMemoryByteDataStore} instead. */ +@Deprecated public class InMemoryDataStore implements DataStore { private final Map store = new HashMap<>(); diff --git a/scm-test/src/main/java/sonia/scm/store/InMemoryDataStoreFactory.java b/scm-test/src/main/java/sonia/scm/store/InMemoryDataStoreFactory.java index fe6955f81f..abd0aa489e 100644 --- a/scm-test/src/main/java/sonia/scm/store/InMemoryDataStoreFactory.java +++ b/scm-test/src/main/java/sonia/scm/store/InMemoryDataStoreFactory.java @@ -21,14 +21,17 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.store; /** * In memory configuration store factory for testing purposes. * * @author Sebastian Sdorra + * @deprecated use {@link InMemoryByteDataStoreFactory} instead. */ +@Deprecated +@SuppressWarnings("java:S3740") public class InMemoryDataStoreFactory implements DataStoreFactory { private InMemoryDataStore store; diff --git a/scm-ui/ui-api/src/index.ts b/scm-ui/ui-api/src/index.ts index 2434d1a977..974bd58233 100644 --- a/scm-ui/ui-api/src/index.ts +++ b/scm-ui/ui-api/src/index.ts @@ -45,6 +45,7 @@ export * from "./permissions"; export * from "./sources"; export * from "./import"; export * from "./diff"; +export * from "./notifications"; export { default as ApiProvider } from "./ApiProvider"; export * from "./ApiProvider"; diff --git a/scm-ui/ui-api/src/notifications.ts b/scm-ui/ui-api/src/notifications.ts new file mode 100644 index 0000000000..e5ea5a9a4a --- /dev/null +++ b/scm-ui/ui-api/src/notifications.ts @@ -0,0 +1,183 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { useMe } from "./login"; +import { useMutation, useQuery, useQueryClient } from "react-query"; +import { Link, Notification, NotificationCollection } from "@scm-manager/ui-types"; +import { apiClient } from "./apiclient"; +import { useCallback, useEffect, useState } from "react"; +import { requiredLink } from "./links"; + +export const useNotifications = () => { + const { data: me } = useMe(); + const link = (me?._links["notifications"] as Link)?.href; + const { data, error, isLoading, refetch } = useQuery( + "notifications", + () => apiClient.get(link).then(response => response.json()), + { + enabled: !!link + } + ); + + const memoizedRefetch = useCallback(() => { + return refetch().then(r => r.data); + }, [refetch]); + + return { + data, + error, + isLoading, + refetch: memoizedRefetch + }; +}; + +export const useDismissNotification = (notification: Notification) => { + const queryClient = useQueryClient(); + const link = requiredLink(notification, "dismiss"); + const { data, isLoading, error, mutate } = useMutation(() => apiClient.delete(link), { + onSuccess: () => { + queryClient.invalidateQueries("notifications"); + } + }); + return { + isLoading, + error, + dismiss: () => mutate(), + isCleared: !!data + }; +}; + +export const useClearNotifications = (notificationCollection: NotificationCollection) => { + const queryClient = useQueryClient(); + const link = requiredLink(notificationCollection, "clear"); + const { data, isLoading, error, mutate } = useMutation(() => apiClient.delete(link), { + onSuccess: () => { + queryClient.invalidateQueries("notifications"); + } + }); + return { + isLoading, + error, + clear: () => mutate(), + isCleared: !!data + }; +}; + +const isEqual = (left: Notification, right: Notification) => { + return left === right || (left.message === right.message && left.createdAt === right.createdAt); +}; + +export const useNotificationSubscription = ( + refetch: () => Promise, + notificationCollection?: NotificationCollection +) => { + const [notifications, setNotifications] = useState([]); + const [disconnectedAt, setDisconnectedAt] = useState(); + const link = (notificationCollection?._links.subscribe as Link)?.href; + + const onVisible = useCallback(() => { + // we don't need to catch the error, + // because if the refetch throws an error the parent useNotifications should catch it + refetch().then(collection => { + if (collection) { + const newNotifications = collection._embedded.notifications.filter(n => { + return disconnectedAt && disconnectedAt < new Date(n.createdAt); + }); + if (newNotifications.length > 0) { + setNotifications(previous => [...previous, ...newNotifications]); + } + setDisconnectedAt(undefined); + } + }); + }, [disconnectedAt, refetch]); + + const onHide = useCallback(() => { + setDisconnectedAt(new Date()); + }, []); + + const received = useCallback( + (notification: Notification) => { + setNotifications(previous => [...previous, notification]); + refetch(); + }, + [refetch] + ); + + useEffect(() => { + if (link) { + let cancel: () => void; + + const disconnect = () => { + if (cancel) { + cancel(); + } + }; + + const connect = () => { + disconnect(); + cancel = apiClient.subscribe(link, { + notification: event => { + received(JSON.parse(event.data)); + } + }); + }; + + const handleVisibilityChange = () => { + if (document.visibilityState === "visible") { + onVisible(); + } else { + onHide(); + } + }; + + if (document.visibilityState === "visible") { + connect(); + } + + document.addEventListener("visibilitychange", handleVisibilityChange); + + return () => { + disconnect(); + document.removeEventListener("visibilitychange", handleVisibilityChange); + }; + } + }, [link, onVisible, onHide, received]); + + const remove = useCallback( + (notification: Notification) => { + setNotifications(oldNotifications => [...oldNotifications.filter(n => !isEqual(n, notification))]); + }, + [setNotifications] + ); + + const clear = useCallback(() => { + setNotifications([]); + }, [setNotifications]); + + return { + notifications, + remove, + clear + }; +}; diff --git a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap index 2f196db6b1..b6765931b0 100644 --- a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap +++ b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap @@ -77782,6 +77782,8 @@ exports[`Storyshots Toast Danger 1`] = `null`; exports[`Storyshots Toast Info 1`] = `null`; +exports[`Storyshots Toast Multiple 1`] = `null`; + exports[`Storyshots Toast Open/Close 1`] = `
{ const navigationItems = this.createNavigationItems(); return ( -