From 75c791e23cbe945d84360fed120cbc5ca83d402f Mon Sep 17 00:00:00 2001 From: EL HAJJIOUI Nabil <nabil.elhajjioui@smile.fr> Date: Sun, 27 Sep 2020 20:33:18 +0200 Subject: [PATCH] [VAS] Supervision des APIs --- .gitignore | 8 ++ .../dev-vitam/access-external-client.conf | 4 +- .../dev-vitam/ingest-external-client.conf | 4 +- .../config/dev-vitam/keystore_ihm-demo.p12 | Bin 4486 -> 4486 bytes .../config/dev-vitam/truststore_ihm-demo.jks | Bin 8514 -> 7912 bytes .../dev-vitam/access-external-client.conf | 8 +- .../dev-vitam/ingest-external-client.conf | 4 +- .../config/dev-vitam/keystore_ihm-demo.p12 | Bin 4486 -> 4486 bytes .../config/dev-vitam/truststore_ihm-demo.jks | Bin 7912 -> 7912 bytes .../commons/api/domain/ServicesData.java | 24 +++- .../mongod/1.0.0/101_iam_system_demo.js | 3 +- .../scripts/mongod/1.0.0/207_iam_ref.js.j2 | 32 ++++- .../mongod/1.0.0/208_application_ref.js.j2 | 20 ++- .../mongod/1.0.0/210_security_ref.js.j2 | 6 +- ui/package-lock.json | 3 + ui/ui-frontend-common/package-lock.json | 105 ++++++--------- .../src/app/modules/auth.service.ts | 22 +++ .../app/modules/logbook/logbook.service.ts | 23 +++- ui/ui-frontend/package-lock.json | 26 +--- .../referential/src/app/app-routing.module.ts | 9 ++ .../api-supervision-detail.component.html | 83 ++++++++++++ .../api-supervision-detail.component.scss | 43 ++++++ .../api-supervision-detail.component.spec.ts | 73 ++++++++++ .../api-supervision-detail.component.ts | 119 ++++++++++++++++ .../api-supervision-popup.component.ts | 68 ++++++++++ .../api-supervision-list.component.html | 81 +++++++++++ .../api-supervision-list.component.scss | 29 ++++ .../api-supervision-list.component.spec.ts | 72 ++++++++++ .../api-supervision-list.component.ts | 87 ++++++++++++ .../event-type-badge-class.pipe.spec.ts | 44 ++++++ .../event-type-badge-class.pipe.ts | 67 +++++++++ .../event-type-color-class.pipe.spec.ts | 44 ++++++ .../event-type-color-class.pipe.ts | 67 +++++++++ .../last-event.pipe.spec.ts | 44 ++++++ .../api-supervision-list/last-event.pipe.ts | 50 +++++++ .../api-supervision-routing.module.ts | 73 ++++++++++ .../api-supervision.component.html | 89 ++++++++++++ .../api-supervision.component.scss | 31 +++++ .../api-supervision.component.spec.ts | 83 ++++++++++++ .../api-supervision.component.ts | 127 ++++++++++++++++++ .../supervision-api/api-supervision.module.ts | 82 +++++++++++ .../supervision-api/event-filter.interface.ts | 41 ++++++ .../logbook-search.service.spec.ts | 58 ++++++++ .../supervision-api/logbook-search.service.ts | 114 ++++++++++++++++ .../src/assets/mini-logo-vitam.png | Bin 0 -> 43081 bytes .../projects/referential/src/sass/styles.scss | 4 +- .../ui/ui-frontend/package-lock.json | 3 + .../ui/ui-frontend/package-lock.json | 3 + .../ui/ui-frontend/package-lock.json | 3 + 49 files changed, 1871 insertions(+), 112 deletions(-) mode change 100644 => 100755 api/api-iam/iam-internal/src/main/config/dev-vitam/access-external-client.conf mode change 100644 => 100755 api/api-iam/iam-internal/src/main/config/dev-vitam/ingest-external-client.conf mode change 100755 => 100644 api/api-iam/iam-internal/src/main/config/dev-vitam/keystore_ihm-demo.p12 mode change 100755 => 100644 api/api-iam/iam-internal/src/main/config/dev-vitam/truststore_ihm-demo.jks mode change 100644 => 100755 api/api-referential/referential-internal/src/main/config/dev-vitam/access-external-client.conf mode change 100644 => 100755 api/api-referential/referential-internal/src/main/config/dev-vitam/ingest-external-client.conf create mode 100644 ui/package-lock.json create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.html create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.scss create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.spec.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-popup.component.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.html create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.scss create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.spec.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-badge-class.pipe.spec.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-badge-class.pipe.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-color-class.pipe.spec.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-color-class.pipe.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/last-event.pipe.spec.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/last-event.pipe.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-routing.module.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.html create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.scss create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.spec.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.module.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/event-filter.interface.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/logbook-search.service.spec.ts create mode 100644 ui/ui-frontend/projects/referential/src/app/supervision-api/logbook-search.service.ts create mode 100644 ui/ui-frontend/projects/referential/src/assets/mini-logo-vitam.png create mode 100644 ui/ui-identity/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json create mode 100644 ui/ui-portal/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json create mode 100644 ui/ui-referential/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json diff --git a/.gitignore b/.gitignore index 40ed268d..8080a1d9 100644 --- a/.gitignore +++ b/.gitignore @@ -227,6 +227,14 @@ deployment/playbooks/templates/vitamui/conf/*/*.jks # Imported vitamui app vitam truststore deployment/playbooks/templates/vitamui/conf/*/*.p12 +# Vitam development configuration + +################################### +# Vitam development configuration # +################################### +api/api-referential/referential-internal/src/main/config/dev-vitam/* +api/api-iam/iam-internal/src/main/config/dev-vitam/* + ########################################## # Mongo workspace entry-point # ########################################## diff --git a/api/api-iam/iam-internal/src/main/config/dev-vitam/access-external-client.conf b/api/api-iam/iam-internal/src/main/config/dev-vitam/access-external-client.conf old mode 100644 new mode 100755 index fd7adb31..ca4c9f08 --- a/api/api-iam/iam-internal/src/main/config/dev-vitam/access-external-client.conf +++ b/api/api-iam/iam-internal/src/main/config/dev-vitam/access-external-client.conf @@ -3,9 +3,9 @@ serverPort: 8444 secure: true sslConfiguration : keystore : - - keyPath: src/main/config/dev-vitam/keystore_ihm-demo.p12 + - keyPath: keystore_ihm-demo.p12 keyPassword: azerty4 truststore : - - keyPath: src/main/config/dev-vitam/truststore_ihm-demo.jks + - keyPath: truststore_ihm-demo.jks keyPassword: azerty10 hostnameVerification: true diff --git a/api/api-iam/iam-internal/src/main/config/dev-vitam/ingest-external-client.conf b/api/api-iam/iam-internal/src/main/config/dev-vitam/ingest-external-client.conf old mode 100644 new mode 100755 index 8bceab66..7663d517 --- a/api/api-iam/iam-internal/src/main/config/dev-vitam/ingest-external-client.conf +++ b/api/api-iam/iam-internal/src/main/config/dev-vitam/ingest-external-client.conf @@ -3,9 +3,9 @@ serverPort: 8443 secure: true sslConfiguration : keystore : - - keyPath: src/main/config/dev-vitam/keystore_ihm-demo.p12 + - keyPath: keystore_ihm-demo.p12 keyPassword: azerty4 truststore : - - keyPath: src/main/config/dev-vitam/truststore_ihm-demo.jks + - keyPath: truststore_ihm-demo.jks keyPassword: azerty10 hostnameVerification: true diff --git a/api/api-iam/iam-internal/src/main/config/dev-vitam/keystore_ihm-demo.p12 b/api/api-iam/iam-internal/src/main/config/dev-vitam/keystore_ihm-demo.p12 old mode 100755 new mode 100644 index 6307b111d22ae85d636ea1a7d9f2d1fd26727cdd..652b1b4c5a06351fd936695a604a0024eab3cd1d GIT binary patch delta 4341 zcmV<R5DM>xBZec8U4Kb+8mu<t2eJYJ2mpYB2LSv~`nfi$jj<jlEWUEj<6b%L^aiuM z({IQP1wBzs0jCk2KJU)N)u|#At?MDmVN-hjv&3PK_r2(+9W1g^H*eothrUDIb{<%u z2|1n{bKQpT`1OM`s!BwFEs8LT1N7hFO=UX|500oO{M-UjMt_9AwxHia=J?K3GxM@@ z3I3U*b^nYYcTP%FI$?Ok4vB*L9rHZmkAWr0>hy`3dlKZ=tfBuO+o}vHK3;xvW7E{f zY2bmfM3}xK{SPHtLGmUK<`tEzSMk^gu+F~!2|u6K{H$+#G1gSubWW<?#5|1SqGo;% z#qUk*aCM3)6Mv4cEP9|fgV1Djlkk>DQDw3y%a5jnfpzz^<R)Qnl3f@2hxnNMzuM<) zX!GDuwLzGo2UW{}&(5E8vxE}G9wx;ZoouJtSoII4xxsf?6-WeCI%3+`XGH&i|4tqa z%cjIupZK%HFE#mc7ipZ)z|%%5zqzTgSyUebT=FqT%71wgDx^iGEDXfynoo@f&qU~K zJU=O5jUp1Juc>I1PF3VMFIV2RQ|96fKshw2Z7(yf24KoN))p>$A1f(9wm9L2XSyP) zu6}q8@*%Xyh{SjIA_wr{Iso6U0eiW|o9kZg8TWi|Hch3<5_VJr%@mr`@#(^5^I|E2 zQIVlHpMR#^vSQ*3*X&a*@jy@cM#vgbl{oH}Boo^yxc5heq)BbS{-Z~B6@X6>Jecv! zJA>xl@1Wwg%Kl#wlbYt>ht;nK{G7v!B*nnG;{3~2tJMAk*rMeJ&meG)`Wf(Lt_w0K z3}W?|^;7gSgh2Z3r(ox9^O1<_|C0mqDRP?3h<^xkNsq8x?dP^^v~|>>pSldZfyC@V z!=YBC4bBQ8I)~uQo#tWI>V!E!SkROb7a?2QSwg5bU~<IGAx<L|?8d!(SQ=4%ljVcm zc10$nspr~S_K!wxBt8>gh$9zse@L{MCi<(p9N5Kq918KVtSt){(FvoRKNyK8(U|-= z?|&yLvO3Cd&_vM!sRXRdrz>F%eOETUP+q(p7BqT<g?6!!07LAb*lP!KjN2vN?=@l@ zVD8=I<?t>6tbJYdFOa&5{ZfzuF0hT<HhJ;sZ5D97U*HA&L@(NxH>VI71a*9P<=*)1 z@VJ1eT>XE46_m%B=`e^_^njQ;7H8J)c7M)>XLq-cRY0soN8Qw16J0g(Pmm}FC?V7b zGW!fAC~MjIA?0}(w?)*i9hKW%_7rKThwj&8>dl16hQ<_e8@#TN&{o%T%5qkjN1iL& zu94oShJ0ICSh<}px<g8N-~S!$`V07WmjbZ>GFg-Yzh;@-ZJHb+?O*t}seno=NPm?O zH4QFxm?$Wymz~-!^RIq*i|CHb>Z8RJFJ>R^6b^}z2xVuQk`RwgzUMiHyFmPE`UU5k zW~pF$?3BaNHwjx0<x|4$|NS!q2rjP~a`tA;GQ!P0*u#4=hd^OMNycFxfF4`9!H_{q zy+XPhWH;@@2XW^kKYCg&agvG~G=Bt=nEQ%si!#r&t<?GVK<0~KD#9k(z?`*9sOj>j znFf0F*HX0|mD^-ZqJXQKSNC#otxAcejLEMTs*Ed762x@c_oZHI#~BLZYIxaty7E{Y zKwORM`Nm(JsZrKUp`s-Y_tr~vdyuD`tcuOv1id|dsm@(C-<-I{S^q8Y&VMucQ9&3M z$B{e`R>Phi)uhLu<=`>`?QPuROnN7Dqjoes3)yeM_YZnE%OrA@#j{eO%hNrWFvE9~ zt&Pz<l=U%j3sLlDqbzMUv~Wus`bgzf4v1^!9=-9l(9LSPLB%TtPiVYpddpS$1F(|! zJQi1O7&f0TO5Z|COZ2mGW`EVawd+tIM&$_45`cjzqPN{qt1oS~T~=)5DO0>@DE`)n z61(^;qDU0r+wg*Sz$7HVm5d$NQ4T{_>AcRRIyQ}8EZBDXtZlR2+$xJJ^7QhibM0o< z;*5t#2$81C5NQQ%>?OJ#t(n;YBk61LY%!{YKcUQ0_V=+!t?rk|;eSRlXdm(r&*ChG zycXZXjBpOuf49miJPPY0M^E1Vy2FpPvXH{sFBMGWgnOh#A4e90nuL5C7%(v4`a#<% z<mU8G@J9tPhQPDkvgMy4yd5>lN7AAoN=~A7jH?M3XoDpU{%W-6WmutobGvE@q3ysV z#HJu=0lI?<p$pmXx_?BOT+UYLDBqWf-83(7rv4H;MjKClzQBn!zt^7?fRR7GL!-St zu9?*gV+sJE6JO<*^Bz(hS#dBy0J;I~4PlTVlKvLD6s?v0LDNBd<}T*aUk|bdz^gRr zH?Ra?<V!4tX|y2-g=osRh)&K{VRkh}MqBV;UJCiI@pLmb`5qaY3Yg(o&K7#XdL;;x zm7#+Su^T6WCr_}wbjgT9lWhk^e-PB^AfTVM&H@4m00e>wNJA%IEB;#!KIgj|o|kjl z)J^9Qpgo({BCOY)`yM`$N^xqLYgB6ybkge&?$;3_orW<s0bp?iWWbNL;Sys8Vye=> zjQI%aav!902(O5KW*RZe7C>VVd!SSTFnlb8>~qVQ3o(}VKM>q96Wk(Pe=PIIcD%Z# z4S7Bn&))68R#`)7ilC(PYfVEc_lczCV!jT^0XuFM#GM;}*ZI@&FyQ4e#m~m%BL>`d z^+xL`);Y8dYf(XFG1V$hl1>ImL}%lB%hPb;sCI62hW&87jx;!1z@ngK-d%~A6GuPI zM6v5!iW!GO{$`BY3h?IDf2HGHz$}h|*KdJ+5mk&}g4xCoZf>0@1(vGm$*UU*=o+jf zz5NTXzv~8=&Cokrn=*_|n^wX^$CGGCC5vz&<|^O&Hw@GUus+tf?YcJfpsMlYx;%*{ z1|LM$x2?V`aaN1WA!i-rAn8VA1`@QW)$qILN{v7GVm!Ds9#E1$fAYB3^-@=bjOTPS z$cn-h1?(Owr3J_1rOml0?xXYg^$qY@u-RPfXI8hWd%Z(Vz;uO#xCsQPiVR|P8B#pN zcKXMzB=krCTV!1wRk8zk|9M>}8Rfgwqb&G$e<KHyQ<7d%88^n5epZNy{6${?bs8al zEB5-J!NZ|^n=0MZe@OeEC?Qs&cHmkW<#;ttI3t%$HqZ?v7y{CAb`>{}XP}UxpkSv} z>3dHz4TMTeQJ8>MHG&NlvbS=5w+_?&1Z%?t{V&+s|DjYVwnqp!Ttk9NMbyGKG$*A3 zLNfSAg9+VQe+~^<&qT$BM!Rv}4?JwlByVW1ZB=07tn)kBe~|FwwPQhB4p*S)06f{< z_AbF^#N_^A^ylJb%l~2&Ei9Eu?Ya}0qr4i#T2v={fViXUG^B>b{o%Ect7jo%oPI%U zYGGh@p;)YEE}&5(9K-SIlwbVuE;QA*v|?;@e3!nIM{jV>XColj^+y?gUfL>I3~^H> zmwt?o>0>nTe>w&?MQg<@8H$FofsngKleb5<WUGJ@KiK03xyj}8!y2^4sC2?*EYggP z7#Sv_YFX&X;PJ6BY7hXO0U0iL9*|pZ8JXSg)upjsjzkLCrPO2;j7CXdzo{oiapBU6 z6Br@Sms$^|yj9bAGjERMF^V4x{Nu<-BfWQ0W1Yv6f7aNIA}ztz97oG2iNhaX6Uv^< zg!v|(7Fb6$NWX0Aw6mrG8Gf5vRSycJ+k37a!e>#zt5zEh>@SY3Gxj4^m6r5_q()W4 zqWFqfXs#wxI;6y2&0o2RP_pve*8TQk0v<fD*^XB`A6km_)Ff<RRoaH?Vf9ChD=lTb z2x~Xif9No&Yi>@T@YeKJ=GB@|z4pCyZ<gj~?tmS2p0#_hN?`pMNla|MKcLY!l$Zdi ze(Fj2jSC!dnl@M2fQ;3fNE@jSBZZJ<nO-trGpE1uRlRmkd7wG{Fnzaq`lK)j(vWBh zIXG9kA)J6?Nz4p`P#jt9%zyuY5~YTBKx&a&f9#Pa*osi@c>NmY62{xml`i}(=Oz3f zvs@PL%_8Hh6h)3BQZVf79&0@tFpfDqmR7KD!`dRev9w~&{v8F|fX-XN+}|o?OV?Jo zN12nbdU_|3k><s$(3yC8Mdbo_fD!S)P@2KEYFa!zStFj<$SzkiU?%U8pnKr2xL~4K ze}Kd+n+I0>PD}uzj&JVV;bbyNJVjT%sJRYDG0?c-!TliL-iC^IB!Cqw-2Xy+&HL4k z2YHwsES;K<znYmgQjJ1i01I!yoP_exml6WB<uP6C6cgk;pZ)On2KA&NZ93dkW%@`e z9dHyto^LrUJEsuB*6TqJ!H+?RpQQHbe~2VB{`2GPQI$(h>>_6+b(==an7}{da$Q)h z0o5e*ur2%(K4X`^GUP2iAf~$B&^nyr4t^p@d~KSF;<j({qQs*Or6I=j7{-~ev0g}X zwv@fNt%n3ffj*f3Ue+=+nZ0iS?5H?}2mL$B=4N^eavNT#ko^OM$HFdJ=9NL^f6#Z0 zzeKb=TthXw49CA}8{)MC%#RaMfZ>R|2)>IH4G!7%0a4ewDp?(9$wOc6!dY+8f<k3* zpnItUj|>VjSvKT=bgHsK=^)eZk@R(QUhMH1?IZ6okzS3T4bkSx?L4y)l=~*y=#KIM z=uJba&!C<|0v!bLJSUJ+93B6>f6hgmHnj(U5<G~x(iV5dO<KNA(G2zB?MeG=9cNlm zA}IWC6+b=;G{)BG?6%Fjse{X1oB999L{&~DtYY==z0jbp_imPn`~n7gMQGCQ(H|>F zeDbW-x|V~{zIwk)_B|&?3i(Q@XSS^?iX}lK78%m~P+iX^+pDAt*im4Ne}H28<t%!p zVL{Bt%Rwk*Aw+eVLj*yHVK<sXZ^-$Q79A*WV-QI1%nR{CYcp={zZXG_{(zRdfDVUQ zPT_p56D+i`G4=ekKy(GsY^Y!NscN4y4eCDjTTfhaCU{?9*+-{SWo1bI`D(*`7&B$K z)o_Vp)qBy~A{0@j4<YV>e{MB2SwTAiczd#|sc^O}$Ejm)eZez)I;UXeQ&ZA7-X-=B ze_vtg?x2QTdq=w1#ktB~2%N~p4g!nvWDyo03RZyfa^9&`T(DoI(-)NWa0re@;*+@E z$mVu?3j6Y@MPVY|+=f!Q(F7lfZoiPOS7L2Vd#US#1&<#)KPLrle{BHFb9fAshNE7B zVAo{`U{xU`SEw80L0J#%S-~e4qtclcDxs@FD>ddXg{qnLH_pwodJY7vj7@5_cRO0k z2WzE6p)J~g*&Z@9u~|3{`y6M^3dxWzLa^k$ZQvP&AK$@U7C=h1CBN+GduYccAsA&x zycJyUySIgsDII@6f3ricN7fSOFbwWS>KxWlph9jlR_iY4;$t)V={|4J8_MyfVN?AC zv}_ZgJfZHPw6%&J+2k&B$QO@uCM$%v>P)B#eGMj+_BzwKWioN=N;VZBK-tXB9r5Pg z@|?n{A=M9axg5SD`83Lkg#>_aV+Q7HxVS;8agyNuiwRV{e-)}0jeJ6-ownC+pJ84H zFcFancv*O#%CiXGo2Z;nnC?e`yjk62BBNJc03gTWH;;gnleu;T$Y(%SCXU*%D#I)C zjHz?tFi6i3&B_<vzH>2rY|m>!7oHNv-|49`lHW;|Vy*~0H4o=8Mlc@+2`Yw2hW8Bt z2^29B9uNR&lOPcvM_8s)g=F&uW&!HY^mxF6dlLP+^Dr?mAutIB1uG5%0vZJX1Qboj j(6kvB$QAY4qNsdrCdw5IqjUrax&OukD)H!R0s;sC_Bv!O delta 4341 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 diff --git a/api/api-iam/iam-internal/src/main/config/dev-vitam/truststore_ihm-demo.jks b/api/api-iam/iam-internal/src/main/config/dev-vitam/truststore_ihm-demo.jks old mode 100755 new mode 100644 index cc137286b97dfba8fa84a03aaed764c9c5b7e7dc..d533f7cfe83e4a29c67eff203fecb23f9e409137 GIT binary patch literal 7912 zcmd6scTiMYw#K{ZrjeYH93&}0P9um2C_!?RoCL`<IW$28geHSz$-yQ_kPH$O6hU$j zkc@zU<eanc&^z~DuW#y2&8vAc?~kt2YoA@GSDjk>`>k*F+1l9}2n52o_+b9HlA0J9 zx*!oY2xlXtnTwP2brUBf2n03{3wSsN!qmRb4+w%l&?Nu`odZx9-Dn5~7y|<g2Jm6n z9Dy={2l!wxE+z=zhT{U*Fo*^eMv5V&3MT;Yz6V&Om?}n22<P8p98ye8S#>c*fc`Q* zTmTTb0f*lNZUTVrWqe-Xr|_SB917#g&k2DsK@b!MA?PAu91Ii&7!+Sq(%xG^aIorL z#50BI?meLOqSvf#gCuK+XP=CTSB`1x)?*JULpW^r9WFF5byh>5lc{T-v?Y1JwibD- z(y~W5>DdJNQ<nJy5TpD37;{7BmR)!b*Q5%W^{5K5X(sDL@JGIm=$sPc(p@s~coOnR zWwtz51>4?e-%ySbM^~y1d|n-L?663jnXM778DZV9+v1Sw+eCeR_E~%dGn#_4W@hTi zaCbV6eeoFH0P3OpBw1PZ!Jov*v5e+ZDf%1~9#~Fj@6u|z_Dm*+@WiQwj^xD<`-{JY z-KihWurAHXtb4*TtfX!HX(Wy`ebkz#&%#jb_0U3V3n#165)-}7&4k@g({HB5T2;`; z#e3m#{N1^&-B!eBW=@^nQm(0I$vfq=)szulKtmA?iDjDQ2Y6KK;0yG*wOqqp+m}>% z=WHg^&D=Dq!9gDCVU5=Zn%6Ky*8?B6@W1&Mg>$6t@>E=Duh8^!q+?Y{O;Rq>ykPNN z=uFB<!~}fnYdc7?NX72{a+~#0qF6<&P@waJ6Z)lO6>Tj{N&HnYNvR^h*>kl{lgr;g z)Ur~Z?<iVBHLhR3#8DC1gyWamoJ;wb08MbzjKDa>$0Au6p&l~U+YM0;vCZjp&VF{@ zCS>r%@rVGs{vLxSp>2kjo8#BcW;|>Id<8>T2?gHM>_~bY3<wwm&LRSSD@!_3C?)^_ zgU^4inTsO6s2MQGT#p*0T{7x0=pSq*P|wh`jHw|VPHMcMFkp}xU-#-kwqaP{AiE-t zJT*Fh&{oa^1nfxkXhSK-$t$T(@X*86wq0%dcmRV&Qv}j@%K_pb6Z=XYIp_*ctFS&U ztlCIjlmlBS*)=q<UpMyySjrr7H|zEy%fvTXtq4_c_q7b4ye*%8ml!mTMZ)9gFq?eu zSg~qy=&Z!_7X9&EAAa9>r0iYKwo*Azs=#9#qI7|ph5M~#WsGbbn074iFNFl|E$77N z^TAVQvYQ_5E+K;|3klCXlfg@lFNBu}hMD9zsVZt{Kjp}ZqH4AaF3TU3PltghRAZ8^ z*Tt1<ze(i5$nU*jaIIKiq_UjG>QSPW{GF-g_g7GJb4ZlLmn0&yv-ug8pv!p3?#d5B z`!sCLG?y6$CU4rhi*s0rbH0y!Dvi7BbI#P~y#CVaQCVQ>77iYLqB|c%jdH@T)+k4p zpczw#eH#XG2*FCOsf2cds|Rjmgm#lrd{ZCB6$!$#(~z5}6nm_(*B)(C&Vz4FqcOmH zh4bX9W=odMV{2obxuG1&^7f+a<EhR!$~T&Z3bWoY<P<mGJ3r~~GtD<lTd+Ex`5-d& zLIufW&`ew?!2hgVtCCP@<O7aS1!aQac;bg(9qpI}L6!b2c8QkjWU;O7k*IH^h0pr* z#?*C^@$dW)MG|K-Cs#8kZWAMJCwqJ3pPHz+@rNd2&H^aRDF6j&`%M!uz|ddn39$M} z6wRIBcmU3KQM`l)L71BVE{Rxpm=1rDNIXne1k%VBP6m*C-;IlhYvh8ow0A-v5oXTt z%K-WJRR|uzg>HY(&G5HWe<<oLH~<#}ZruR*Z+=(Q@8QkAh5y!E{*fFfHI7#fZQWdF zDPEJ?9$&r{*+{!pO7G@r-HfPz-%CQbG>6Gvv%JD389_{8)0hI$!ti%E_jIS}n=K}i zsiyBDbIqi*>{x$TQx~;0$qbW9&kvUm4=FCZ%Ifi@og-y^N61mNiou&O$~s%uh>>_> ze`YYqK_TT@216v*be5X*ka4jprHt1A$&t$Ow@vWDc13G`ucw-bdl#11R)O$MMxL6f zKC~=8h1<1C1Ft|Kkl;>|!<rqD5~s?%X7QjGe1Hg5nHR&Vgf*6@IL)4+9nxgRP5UNK zK-6_kivSW7v^$O6C;hER;B@ujx?N6D@+(=T4;gyAL3r{?VvbqY?Lp7quEJct&NQPK z#(VMWHr{d(hFBE4(7iUi+e232(mO?XWlNfLY%!`dX7v8Y)3U~^UOi_mz{u_c6Q|1A zxnUqE1~HMc>MS=U^+dY;xLu=~c3AnPmW!92(c`hbL=!E~1?y?B0Z^`-_i`$sF!VNz zixv@n0y(_vsagC0Z1e3<h_=t!?~9uR)HWb<(p82AKN@^yQ{YOMK9D&3VQ<7Z+t=u^ zC`;JjvTOPjcNl96Y9tjy=2-<3%Ofc-Neb3<CIS5_RH3&1EP|c!z4p?Zhuv8yZ<Ir1 za;V!g@voc2D@U*2^kL1*ZX0~^YnuZHML--$(g&zQ=d_ZuPJWYP-$=msDL?_kei$eN z4m=bG<3q72uq4D7RWHgKpt~q@IszyKl<b=jw)Lo&Wy_o4sm=G6Bb3LbZCn7u_uI@+ zN`S)W?{D~ic<4wkL>_txfL&a^_bj;I*9f7|iyj6B5dZnZ;O|QqzaHNoIKZzu%G4`e z*F}$eDqVH{s!4Z0ir3`oiu@8+1;*RH_lUt&4X39en=!}a1+hKe1w9xZ8Rw=XM1Ew1 zjAP>}1D_&DQrlsUwRPL;Nf<odV$|0}3@FPV5ll9s4U~qwJLL#>$D;DN(6<Ilg{k{i zoR=T%E1?w$+F=ecWS#AECX)u$`|TTP1u*(tdXJ#F4VqxFhvpCY2J#$)#r@R<7O|AI z15)(yD%v$6g2>vt&)5o7O|c)3y0y7@E~+o)lDQtxJ3~yi!NHVUOzo6LRj&6PO@{sU zT(5z$qh3om$Q3PE$;ezvnBFx`^J47e_9R3*_M^*r#S(p}^eOKUi#*gGo#3t`4_PD2 zYHxndIae|D&S*X#9ESI@dw%D=hl+BFLY31*m)J3FSp9Oi&DE7Qc889zc!#(aW53#d zV0$!8f**Luxc4G;^6|R@7I}8n0w;sU*PcG4dW^aoVPD66K-V9jhvdUrLp+=OJR|A6 zLZj0%AIe?`^saeklB11F8XCKmJ$%+$R@LdiAzM_;<BNIxEPRH1>@fdQ-g}loiRZ}( z9Jtsqn-1l22=M%K0p(}$Z+!g08p*Z97P|OFO!?`TJ?o@e;vceVP|_}7aUFH_3UuIi z2oBnir^JjDU)nfAZeGKQ`FJI#Kag`bnELg*CUNwj0v@5$u+I9<4;(O?*dWa8klbeO zNHZrpBb)DBK-gV;w>2|GT(r%9@<Bo44?e(R0Te9qqHlKloeylk^1=CE&j&_;{-Ve) z_;C4mKKzpVFQ5?oD<}kYfye*)q^<&Nza_<Rk<`yG&hXdd{t-FQ1jHJln;e^T75AvS z&TW&;?|pnx6kf|>>Wlw8lmHUT$?I=SGWh;g=#^<ZTLh*H*=AjL)oo6qkOx-$Y3^I{ z5369x_vBXGbQmg|OATF^W2f}oUG*0i;h)B1Ok2NPev0oRB&xeG;_={R1itTiBfSqH zgo=fLL9$^pO?CTQ&ca{`JoCP?1Ee6nCgiEVKHo+LpC9Z%T1R7SP+hevXdCX}%Cz&S zi?o(tVC_;PoxK;G7v9d;?S+;ZWr?~|QtwnsGvkr9d63{_xYdN1TJ_UtA>t;-`FG** z2t33%>z6&_ic~fuLtFoG#dx7M(wWA#4q9|cO!odgw5NcIt-I3m6r#%<?P+y8)hExk zoXv1xTh215*l27HzvoN=;&(;V;8#NY^hRi-c?kOPgGUvvlpE+CP2jgZPbH6b)?6~< zq%_PeD|lkt+QCfE?&nBx<i+Vrot)4eAuXgNj-8D?_d4^=$YJwfr*6qkXP26IB1=%2 z^vm}N5<*wJr%Z0%t3IvQMktqOdG-{m@y1E8yr1`jhOxeZINy%tVF8W_eE3_%xzy3y z9lamv^bS%3aIg8N2zi`VKh&aMmGH_&a+gX_KMND+>}-mZ2uf{ZR8C!~Xs|6jbEzV$ z+%1hyQ{|5MBtkRHk}C(RqPJ;RRa}ay#}!TlwCJCks7d}t4iuOfK!F)9O8qBx5K|Cd zutWBzWBC(9+J%MNUL5tt9uCfU-}GpSUgLON2>7Od=K(X+Hy-ef^&w*iJUreMI}M2` zEE7v+cR2ED>bPaNWxD|XiDP<UMOc3{fPZBe=!eOsBY|Q7p#KfdOwd73Q`m^QKchQ{ zc%IEjP27rE53(@|Jv`4q<#p%f2}?u!p@E^{LgOXKmt$A%k(c9>m{~kBjBNjQhf<8p za&5;rJY)(@RsUqwc4;-bM9GN^iMosTSSVA0CImt27tzgEt+nC$5tVo&=lC+4-!=RP zgO5&K6kew6&?+B(p73U!TeEo6XS^ZN&$NR&p!7H3BPod|`K;!q;d|Yzr;-8CI&#eS zYcc6~f2y!*QBoJJc*=t&VH#^#2d9${>K>qG*OhbI3O@<I6hkPbv@9}lzRbETdFnge zN-H9KJzwSB==8Bn@f;vGI)k^<Vx6#`qpa=8Eba8XSH+ND&}{*#jCrZ{h^0oEc}}{1 zDQJk{=C~M#8*2^~xQ*5Pu%qK%kur!ETdkwnFiO!4dg-eG0h=NYK8o|rid<?BlQ~Bc zRf2GY+!^%Ct??(TscnNJQ4LhD^k7+sgTzqH^6-WDD<J@k#y#aM8xQMt4f5z@Ir$Y6 z*Wt8tcGq*ASZ~tg+Ab_;oU3D1;}bg4714W-iV+>@obqba?M-<dAw3XA+CEA}r)Em- zkhcsy`!}bG)!MJ>%j<_8H^DgussaY^2l&)Y)B+yGw34;A62J&^x|E}-e6RbjdCNVw zu+)raU$WR6^obT&gspj9ceM=cuEw!dPerh<v}72pBl3RWjOG{B{qHtMVfqh@VeVhp zob3ynGxj^iSpOel?ABi~c1!m^a%eB+P5<*8>a}>Eq#WSZ{jTgldBb|Yv97KKNw>(o z@MZr<R=Rfi0X<_e78VNK`!<5^oKP@ZIQEkm5!AhqASuTXrKI|>3Zp}$y8r{%L4<h+ zeP5aUY5CWDZ5kTu!bM(Zcc$ZdkC`WV!FC2+)B5xBAHN)kb^CoevuG$v0X3c{!_Oz= zhrMO$$SKQuT?1#lqMjIV@8xBdY1z_C-1yXTRdUjFw5PcThpG<zp;c@?yBVYYjp$;5 z%~tA%ozbx3{5v3yHI@0=It&dlFr)ac<3bSMLOTgo57)a6xB6g-{;a4Kh@m!*gGfhe zyOfmmrt)O47>;1_9miVFLQfqkB~np}dZ|+<-Ljs9GZqLA@lA`W#>iyF$r8V9<;y*c zQGO=tI4kI@ED3Z>{uw#y8wcqi%9H0<%WvJHEOFD@kh6T)sC3otne)t&$9i%?WY0hQ zbsmUVje0eYE&J-pS*%0mgT&J=-NHW4#Y@*Tm?^w0ei#P?2#Xsu&?ofa>t{HuaSN|+ z$L70LHycoNBs4rAq9mot3Sn4aHjY2h9*2+RIwa<@y<o5VLWN(sD)S2R+NxoT)!F;X zgN}%MjMZQD_pl;wFKgQoEfssr^|H2aa7{S&>7m+Nl23{lO4Zo+=&T<zu0N_cyF_a7 ztYcD|>9UVKv)Fij#pHF5w#_s0q&@nHf6n;)Js|zX`25`s|03g~)pK_VQDrW@5GNy) zYhCjREyU4FI^{RQ4S)ObBg>X-hJ9%A@!9J{krJD{5&Po&ki=eY1W0G*>LXUhk1?T3 z>2zva&$RaHvE_1;gf|K#NO{-VS;OsBXAPhU{Gsh{RRQKX(A6`nuQaPMc-cJZ7B)mB zpB805THyu+$A5+1o$`7pTb)4|eNf+F?k0U>L!;p)>G^_jln3^(N7`MjE%+s!<Gf?A zHIiQy&j{vxl0#q0^HwZlE7e}jOL1!z*DGcG-V7nNJ?7^WUxnIj!9BYJ>x|)ytmQq- zvr5ykeucfxTT*rSs>qbap;z;)NpYh}y1j&BmUj}9TN*hAU{PPTJ{sl8WCA(LuXup; zNXuzR%6fI}ic|3@)?#(=*!Zp|Y3K+y$;KnqJ6}5qa<bH#q%IjKx%yWp#)f{A&TSEK z*-D=|d~vf>o-rnTy|k+sHSI00ZZU*uSaf^L?6Wq8QHv(e4%^~Rb=Wv;w;wZ`*l0{2 zq^MYW<A~W_{N+wUws0;3#l312*+^)Z<SWusgV*VRl$Z@|r9n1IIXX?Xj(wsg!Y58P zUyO7r;LR4Z<M0_dPl>YQUBU<wh~Sp8$17Zo;#JIJhG((kyaxznpMEvtDde@yS!obl zR7~rH^7HJdn&ZIY{m%;8iYB$j@26g6iIDMxHP^KIO&I?m1@)hEu%FxZKmCrP)gPdM zxnKAl<b~hS{~Z*Vzk=dFHxCo|D<1@O0jGbx&0+Y_a9(&XieGKc-)40G2oKBiDaA<( zSvUqCZ!~S3?vC=y);T{Dm6SFES$ypSb<veY<MY-YbjCG5yPJgc(TdzIjxtr9mBysA z{j82-9}?B7?a$gE_OyDv5!_hmvB4|9WZn=+$dq=c;kJFg1z%cdPxa2m1geQoWqE=9 zbid>@;02NYhGl}@w2H{rURx|i&(L~}?DAvE?#exQlS$o@8v*??jIKot<+;wJHeV!q zBs;ZX2ruc6p%~=;B)GKJ)u~52r_Po#JLPy2DlC=0E_3YU--VYu*D4tmQh&n7`<&?B zj!9Xhot64yZT}RcZ;w6(sbc+>jI4Izqx&&@0XJHdg-s3|HFhxkj38_;&jqfm15ceV z<xB51M}=+ROY{V~t`u5+%zO}FG%wCzX1VM1mE0h4cnsaQhWjDu2K}tG0pC)}VH`iR z)oW{07hbnsSFjRJE~RpuWl)%r*kSiX=7FVD!+k|1d4gQk_AZ}vLXddAh(UnuWiIR3 z;;BJ(PN%s<QJ?#V41N}x<l6#vhS4RT?>8YiRVKWR@XSkSg})uk;>`=}Y;$`h43H|| zzWBx@mpzqxRz$8YpSx1mqCubjq|kKHavHm?O)>viIWHh>9w)RgK9wfzbWhtAJ9Oes z)-@cCL%UPXjD`n{wL1N>QSeWY>GklEe%lF6N6bFl&i7|$m9J0WE5ExN>I-*6@lUv$ z2+5Au2HT-W=-co0-5XEm7VWN$0={v7b2s6DZ|L72l4aOs+x$BR!xyFo`hQ?*$Zwr@ zxkOF5f&=7+Wxmk)O_Jm<wdoGMqjX(VIQPgb__j$x=UIop{UJ8Rga4jZ&NkU3Mw<Kb z3mFQudQQ2LJjd{yYdoT#4tI*MOfUKDJqsheSY?OUsJza^jM=5WP~A$TFvV?I!WMJR z(&HNWx-{|iJt7`z7h}GFxFb5x3>rcDz;Y=ji=Z9J01B>2$L$<+<C-BgY=sPSZ5W|* zs-y1VTUWNJd7JcV+>5!}QO;1MSHf#PMyrgG&{BgKQ`_)an&Ot*ePxq@XTc^+iBm+~ zjaT<(YwL=~WCnTdUTJsN=z`R*Ng~(dVvH1S$6jZT_iw}{WU|k>KYYOSI+~1WF6hhk zGbE+EF#CSXHrXjR1#CaZziZiR7s||va7+7a4_WNi^B*@h%Ri&4k<=r6L*PF^5#W%c zt<xpS*mI<q%%HMRac;^Ul8`NyrKdH}hKY#xvRpB4s<nZ{g;Q_D1!=mHn$nf3;j+9Y zU^6E(;x+4)8Y9}CeNqF>y<~3W1v#h9?C32x%B(9w<4-jApxV3=?%<8%38B-g8Cp=} zHK$5+(zrSsLqcD_d29rb^uFUiWMwb&2=h77xq4NHsxZ?BVe(cc!Cp00Kjwhb>fKxG z2l>7B0TC_%uQtXTTXY`3i>ORGZ{#YSEK?U9w1(MR<*^RmHC_Ew6n#765>J-(#UD{t QWb9ikN)n~+J;IXz1;$^T+5i9m literal 8514 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 diff --git a/api/api-referential/referential-internal/src/main/config/dev-vitam/access-external-client.conf b/api/api-referential/referential-internal/src/main/config/dev-vitam/access-external-client.conf old mode 100644 new mode 100755 index 6e4a8935..ca4c9f08 --- a/api/api-referential/referential-internal/src/main/config/dev-vitam/access-external-client.conf +++ b/api/api-referential/referential-internal/src/main/config/dev-vitam/access-external-client.conf @@ -3,9 +3,9 @@ serverPort: 8444 secure: true sslConfiguration : keystore : - - keyPath: src/main/config/dev-vitam/keystore_ihm-demo.p12 - keyPassword: FaKzJrnQFxFe3D2d + - keyPath: keystore_ihm-demo.p12 + keyPassword: azerty4 truststore : - - keyPath: src/main/config/dev-vitam/truststore_ihm-demo.jks - keyPassword: K8GeuGNjfbFB66JG + - keyPath: truststore_ihm-demo.jks + keyPassword: azerty10 hostnameVerification: true diff --git a/api/api-referential/referential-internal/src/main/config/dev-vitam/ingest-external-client.conf b/api/api-referential/referential-internal/src/main/config/dev-vitam/ingest-external-client.conf old mode 100644 new mode 100755 index 8bceab66..7663d517 --- a/api/api-referential/referential-internal/src/main/config/dev-vitam/ingest-external-client.conf +++ b/api/api-referential/referential-internal/src/main/config/dev-vitam/ingest-external-client.conf @@ -3,9 +3,9 @@ serverPort: 8443 secure: true sslConfiguration : keystore : - - keyPath: src/main/config/dev-vitam/keystore_ihm-demo.p12 + - keyPath: keystore_ihm-demo.p12 keyPassword: azerty4 truststore : - - keyPath: src/main/config/dev-vitam/truststore_ihm-demo.jks + - keyPath: truststore_ihm-demo.jks keyPassword: azerty10 hostnameVerification: true diff --git a/api/api-referential/referential-internal/src/main/config/dev-vitam/keystore_ihm-demo.p12 b/api/api-referential/referential-internal/src/main/config/dev-vitam/keystore_ihm-demo.p12 index fde3f6dab2b74420967a4a04d49eea423af9c22e..652b1b4c5a06351fd936695a604a0024eab3cd1d 100644 GIT binary patch delta 4341 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 delta 4341 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 diff --git a/api/api-referential/referential-internal/src/main/config/dev-vitam/truststore_ihm-demo.jks b/api/api-referential/referential-internal/src/main/config/dev-vitam/truststore_ihm-demo.jks index 9142cc15aa1057072d6ca3fe886d41aa29c15fa5..d533f7cfe83e4a29c67eff203fecb23f9e409137 100644 GIT binary patch delta 4680 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 H<y8Iy1d{3N delta 4680 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 JrqI$4{sS%R)qVf~ diff --git a/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/domain/ServicesData.java b/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/domain/ServicesData.java index 51580f99..827cf362 100644 --- a/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/domain/ServicesData.java +++ b/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/domain/ServicesData.java @@ -310,8 +310,8 @@ public class ServicesData { public static final String ROLE_RUN_AUDITS = ROLE_PREFIX + "RUN_" + SERVICE_AUDITS; - //------------------------------------- PROBATIVE_VALUE -------------------------------------------- - + //------------------------------------- PROBATIVE_VALUE -------------------------------------------- + public static final String SERVICE_PROBATIVE_VALUE = "PROBATIVE_VALUE"; public static final String ROLE_RUN_PROBATIVE_VALUE = "ROLE_RUN_" + SERVICE_PROBATIVE_VALUE; @@ -326,6 +326,14 @@ public class ServicesData { public static final String ROLE_GET_ARCHIVE_PROFILES = ROLE_PREFIX + "GET_ARCHIVE_PROFILES"; + //------------------------------------ API SUPERVISION ----------------------------------------- + + public static final String SERVICE_API_SUPERVISION_ROLE = "SUPERVISION_API"; + + public static final String ROLE_CREATE_SUPERVISION_ROLE = CREATE_ROLE_PREFIX + SERVICE_API_SUPERVISION_ROLE; + public static final String ROLE_GET_SUPERVISION_ROLE = GET_ROLE_PREFIX + SERVICE_API_SUPERVISION_ROLE; + public static final String ROLE_GET_ALL_SUPERVISION_ROLE = GET_ROLE_PREFIX + "ALL_" + SERVICE_API_SUPERVISION_ROLE; + //@formatter:off /** @@ -404,7 +412,11 @@ public class ServicesData { ROLE_RUN_AUDITS, ROLE_GET_OPERATIONS, - ROLE_RUN_PROBATIVE_VALUE + ROLE_RUN_PROBATIVE_VALUE, + + ROLE_CREATE_SUPERVISION_ROLE, + ROLE_GET_SUPERVISION_ROLE, + ROLE_GET_ALL_SUPERVISION_ROLE ); @@ -507,7 +519,11 @@ public class ServicesData { ROLE_DELETE_ONTOLOGIES, ROLE_RUN_AUDITS, - ROLE_RUN_PROBATIVE_VALUE + ROLE_RUN_PROBATIVE_VALUE, + + ROLE_CREATE_SUPERVISION_ROLE, + ROLE_GET_SUPERVISION_ROLE, + ROLE_GET_ALL_SUPERVISION_ROLE ); //@formatter:on diff --git a/deployment/scripts/mongod/1.0.0/101_iam_system_demo.js b/deployment/scripts/mongod/1.0.0/101_iam_system_demo.js index e84c2d00..850f4e85 100644 --- a/deployment/scripts/mongod/1.0.0/101_iam_system_demo.js +++ b/deployment/scripts/mongod/1.0.0/101_iam_system_demo.js @@ -199,7 +199,8 @@ db.groups.insert({ "system_audit", "system_secure", "system_dsl", - "system_probative_value" + "system_probative_value", + "system_supervision_api_profile" ], "readonly": false, "level": "", diff --git a/deployment/scripts/mongod/1.0.0/207_iam_ref.js.j2 b/deployment/scripts/mongod/1.0.0/207_iam_ref.js.j2 index c4a5a518..0f9a3c06 100644 --- a/deployment/scripts/mongod/1.0.0/207_iam_ref.js.j2 +++ b/deployment/scripts/mongod/1.0.0/207_iam_ref.js.j2 @@ -407,6 +407,33 @@ db.profiles.insert({ ] }); +db.profiles.insert({ + "_id": "system_supervision_api_profile", + "identifier" : NumberInt(maxIdProfile++), + "name": "Supervision API Profile", + "description": "Supervision Profile api", + "tenantIdentifier": NumberInt({{ vitamui_platform_informations.proof_tenant }}), + "applicationName": "SUPERVISION_API_APP", + "level": "", + "enabled": true, + "readonly": false, + "customerId": "system_customer", + "roles": [ + { + "name": "ROLE_CREATE_SUPERVISION_API" + }, + { + "name": "ROLE_GET_SUPERVISION_API" + }, + { + "name": "ROLE_GET_ALL_SUPERVISION_API" + }, + { + "name": "ROLE_LOGBOOKS" + } + ] +}); + db.sequences.updateOne({ "_id": "profile_identifier" }, { @@ -436,10 +463,11 @@ db.groups.updateOne( { "system_audit", "system_secure", "system_dsl", - "system_probative_value" + "system_probative_value", + "system_supervision_api_profile" ] } } }); -print("END 207_iam_ref.js"); \ No newline at end of file +print("END 207_iam_ref.js"); diff --git a/deployment/scripts/mongod/1.0.0/208_application_ref.js.j2 b/deployment/scripts/mongod/1.0.0/208_application_ref.js.j2 index 43afea90..03bba5a2 100644 --- a/deployment/scripts/mongod/1.0.0/208_application_ref.js.j2 +++ b/deployment/scripts/mongod/1.0.0/208_application_ref.js.j2 @@ -202,4 +202,22 @@ db.applications.insert({ "target" : "_self" }); -print("END 208_application_ref.js"); \ No newline at end of file +db.applications.insert({ + "identifier" : "SUPERVISION_API_APP", +{% if vitamui.referential.base_url is defined %} + "url": "{{ vitamui.referential.base_url }}/supervision-api", +{% else %} + "url": "{{ url_prefix }}/referential/supervision-api", +{% endif %} + "icon": "vitamui-icon vitamui-icon-api-supervision", + "name": "Supervision des APIs", + "category": "referential", + "position": NumberInt(16), + "hasCustomerList": false, + "hasTenantList": false, + "hasHighlight": false, + "tooltip": "Consultation des journaux des opérations d'entrées, de bases, d'éliminations", + "target": "_self" +}); + +print("END 208_application_ref.js"); diff --git a/deployment/scripts/mongod/1.0.0/210_security_ref.js.j2 b/deployment/scripts/mongod/1.0.0/210_security_ref.js.j2 index 59e6a1fc..10e7c5fd 100644 --- a/deployment/scripts/mongod/1.0.0/210_security_ref.js.j2 +++ b/deployment/scripts/mongod/1.0.0/210_security_ref.js.j2 @@ -24,8 +24,10 @@ db.contexts.insert({ "ROLE_GET_FILE_FORMATS", "ROLE_UPDATE_FILE_FORMATS", "ROLE_CREATE_FILE_FORMATS", "ROLE_DELETE_FILE_FORMATS", "ROLE_GET_CONTEXTS", "ROLE_UPDATE_CONTEXTS", "ROLE_CREATE_CONTEXTS", "ROLE_GET_SECURITY_PROFILES", "ROLE_UPDATE_SECURITY_PROFILES", "ROLE_CREATE_SECURITY_PROFILES", "ROLE_DELETE_SECURITY_PROFILES", - "ROLE_GET_OPERATIONS", "ROLE_RUN_AUDITS", "ROLE_RUN_PROBATIVE_VALUE" + "ROLE_GET_OPERATIONS", "ROLE_RUN_AUDITS", "ROLE_RUN_PROBATIVE_VALUE", + "ROLE_CREATE_SUPERVISION_API", "ROLE_GET_SUPERVISION_API", "ROLE_GET_ALL_SUPERVISION_API", "ROLE_LOGBOOKS" + ] }); -print("END 210_security_ref.js"); \ No newline at end of file +print("END 210_security_ref.js"); diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 00000000..48e341a0 --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} diff --git a/ui/ui-frontend-common/package-lock.json b/ui/ui-frontend-common/package-lock.json index 9c5e065d..158cf6b7 100644 --- a/ui/ui-frontend-common/package-lock.json +++ b/ui/ui-frontend-common/package-lock.json @@ -5431,9 +5431,43 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://nexus.teamdlab.com/repository/npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://nexus.teamdlab.com/repository/npm/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://nexus.teamdlab.com/repository/npm/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://nexus.teamdlab.com/repository/npm/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, "qs": { "version": "6.7.0", - "resolved": "https://nexus.teamdlab.com/repository/npm/qs/-/qs-6.7.0.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true } @@ -5501,56 +5535,10 @@ "requires": { "is-descriptor": "^1.0.0" } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://nexus.teamdlab.com/repository/npm/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://nexus.teamdlab.com/repository/npm/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://nexus.teamdlab.com/repository/npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -5559,7 +5547,7 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://nexus.teamdlab.com/repository/npm/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { @@ -5568,7 +5556,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://nexus.teamdlab.com/repository/npm/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { @@ -5577,7 +5565,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://nexus.teamdlab.com/repository/npm/is-descriptor/-/is-descriptor-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { @@ -7105,8 +7093,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://nexus.teamdlab.com/repository/npm/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "2.1.1", @@ -8064,8 +8051,7 @@ "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "latest-version": { "version": "5.1.0", @@ -8960,15 +8946,6 @@ "universalify": "^0.1.0" } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", diff --git a/ui/ui-frontend-common/src/app/modules/auth.service.ts b/ui/ui-frontend-common/src/app/modules/auth.service.ts index 8d68a152..7226f8cc 100644 --- a/ui/ui-frontend-common/src/app/modules/auth.service.ts +++ b/ui/ui-frontend-common/src/app/modules/auth.service.ts @@ -37,6 +37,7 @@ import { Inject, Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; +import { ApplicationId } from './application-id.enum'; import { WINDOW_LOCATION } from './injection-tokens'; import { AuthUser, Tenant } from './models'; @@ -111,4 +112,25 @@ export class AuthService { return tenant; } + getTenantByAppAndIdentifier(appId: ApplicationId, tenantIdentifier: number): Tenant { + if (!this._user) { + console.error(`AuthService Error: user is null`); + + return null; + } + + const app = this._user.tenantsByApp.find((appTenants) => appTenants.name === appId); + if (!app) { + console.error(`AuthService Error: can\'t find application with id "${appId}"`); + return null; + } + + const tenant = app.tenants.find((t) => t.identifier === tenantIdentifier); + if (!tenant) { + console.error(`AuthService Error: can\'t find tenant with id "${tenantIdentifier}"`); + return null; + } + return tenant; + } + } diff --git a/ui/ui-frontend-common/src/app/modules/logbook/logbook.service.ts b/ui/ui-frontend-common/src/app/modules/logbook/logbook.service.ts index 0d57674e..f9133326 100644 --- a/ui/ui-frontend-common/src/app/modules/logbook/logbook.service.ts +++ b/ui/ui-frontend-common/src/app/modules/logbook/logbook.service.ts @@ -36,8 +36,8 @@ */ import { HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { forkJoin, Observable, of } from 'rxjs'; -import { catchError, map } from 'rxjs/operators'; +import { forkJoin, Observable, of, throwError } from 'rxjs'; +import { catchError, map, switchMap } from 'rxjs/operators'; import { LogbookApiService } from '../api/logbook-api.service'; import { Logger } from '../logger/logger'; @@ -131,6 +131,25 @@ export class LogbookService { ); } + getOperationById(id: string, tenantIdentifier: number, accessContractId: string): Observable<Event> { + const headers = new HttpHeaders({ + 'X-Tenant-Id': tenantIdentifier.toString(), + 'X-Access-Contract-Id': accessContractId + }); + + return this.logbookApi.findOperationById(id, headers).pipe( + switchMap((response) => { + if (!response || !response.$results || response.$results.length === 0) { + return throwError(`getOperationById error: no result for operation with id ${id}`); + } + + return of(response); + }), + map((response) => response.$results.length === 1 ? LogbookApiService.toEvent(response.$results[0]) : null) + ); + } + + } function flattenChildEvents(acc: Event[], current: Event): Event[] { diff --git a/ui/ui-frontend/package-lock.json b/ui/ui-frontend/package-lock.json index 70e1bfb3..2b551c33 100644 --- a/ui/ui-frontend/package-lock.json +++ b/ui/ui-frontend/package-lock.json @@ -643,7 +643,6 @@ "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -844,7 +843,7 @@ }, "@angular/material-moment-adapter": { "version": "8.2.3", - "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/@angular/material-moment-adapter/-/material-moment-adapter-8.2.3.tgz", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-8.2.3.tgz", "integrity": "sha512-x0WE9MyQajqzGPYKm8eHcDmWWlwiobOX9rZ+V5uqY80fsvm2czk6TYnc1drFYcPAHIaIcx7je7NYOULPF1rTpw==", "requires": { "tslib": "^1.7.1" @@ -2958,16 +2957,6 @@ "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "blob": { "version": "0.0.5", "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/blob/-/blob-0.0.5.tgz", @@ -5719,13 +5708,6 @@ } } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fileset": { "version": "2.0.3", "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/fileset/-/fileset-2.0.3.tgz", @@ -12982,6 +12964,7 @@ }, "ui-frontend-common": { "version": "file:../ui-frontend-common/ui-frontend-common-0.1.0.tgz", + "integrity": "sha512-RluantRkfYcd+qFzfD/DYQ9huDtpU+mCjAi3ugR9csL+q30ssKDjeR1yK7c11n85Sbd9hVMg1R9m0oarN/P0RA==", "requires": { "@angular/animations": "8.2.14", "@angular/cdk": "^8.2.3", @@ -13511,7 +13494,6 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -13536,7 +13518,6 @@ "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -13555,7 +13536,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, - "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -13565,7 +13545,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, - "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -13924,7 +13903,6 @@ "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1" } }, diff --git a/ui/ui-frontend/projects/referential/src/app/app-routing.module.ts b/ui/ui-frontend/projects/referential/src/app/app-routing.module.ts index c2d22edd..b1ac9e59 100644 --- a/ui/ui-frontend/projects/referential/src/app/app-routing.module.ts +++ b/ui/ui-frontend/projects/referential/src/app/app-routing.module.ts @@ -111,6 +111,15 @@ const routes: Routes = [ data: {appId: 'PROBATIVE_VALUE_APP'} }, // ===================================================== + // SUPERVISION API + // ===================================================== + { + path: 'supervision-api', + loadChildren: () => import('./supervision-api/api-supervision.module').then(m => m.ApiSupervisionModule), + canActivate: [AuthGuard, AppGuard], + data: { appId: 'SUPERVISION_API_APP' } + }, + // ===================================================== // DSL // ===================================================== { diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.html b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.html new file mode 100644 index 00000000..4ea07567 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.html @@ -0,0 +1,83 @@ +<div class="vitamui-sidepanel"> + <div class="vitamui-sidepanel-header"> + <ng-container *ngIf="!isPopup"> + <button class="btn-popup" role="button" (click)="openPopup()"><i class="vitamui-icon vitamui-icon-pin"></i></button> + </ng-container> + <button class="btn-close" role="button" (click)="emitClose()"><i class="material-icons">close</i></button> + + <div class="header-container"> + <div class="title"> + <div class="status-badge-mini" [ngClass]="event | eventTypeBadgeClass"> + <i class="vitamui-icon vitamui-icon-box-hand no-margin"></i> + </div> + <h2>{{ event?.id }}</h2> + </div> + </div> + </div> + <div class="vitamui-sidepanel-body"> + <mat-tab-group class="preview-tab-group"> + <mat-tab label="Informations" i18n-label="Information tab@@eventDetailTabInformation"> + + <div class="read-only-field"> + <label>Catégorie d'opération</label> + <div class="word-break">{{ event?.typeProc }}</div> + </div> + + <div class="panel-row"> + <div class="read-only-field"> + <label>Identifiants des agents externes</label> + <div class="word-break">{{ event?.agIdExt }}</div> + </div> + <div class="read-only-field"> + <label>Contrat associé</label> + <div class="word-break">{{ event?.rightsStatementIdentifier }}</div> + </div> + </div> + + <div class="panel-row"> + <div class="read-only-field"> + <label>Identification de l'application</label> + <div class="word-break">{{ event?.agIdApp }}</div> + </div> + <div class="read-only-field"> + <label>Numéro de transaction</label> + <div class="word-break">{{ event?.idRequest }}</div> + </div> + </div> + + <div class="panel-row"> + <div class="read-only-field"> + <label>Identification de l'opération</label> + <div class="word-break">{{ event?.objectId }}</div> + </div> + <div class="read-only-field"> + <label>Acteur(s) interne(s)</label> + <div class="word-break">{{ event?.agId }}</div> + </div> + </div> + + <div class="read-only-field"> + <label>Rapport</label> + <div>-</div> + </div> + + <div class="read-only-field"> + <label>Informations complémentaires sur l'opération</label> + <div class="word-break">{{ event?.data }}</div> + </div> + + <div class="read-only-field"> + <label>Message</label> + <div>{{ (event | lastEvent)?.outMessage }}</div> + </div> + + </mat-tab> + <mat-tab label="Historique" i18n-label="History tab@@eventDetailTabInformation"> + <vitamui-common-history-events [events]="event?.events"></vitamui-common-history-events> + </mat-tab> + </mat-tab-group> + </div> + <div class="vitamui-sidepanel-loading-overlay" *ngIf="loading" @fadeInOut> + <mat-spinner color="accent" diameter="40"></mat-spinner> + </div> +</div> diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.scss b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.scss new file mode 100644 index 00000000..51a2cb70 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.scss @@ -0,0 +1,43 @@ +.title { + max-width: 504px; + + h2 { + word-break: break-all; + } + + .vitamui-icon.no-margin { + margin-right: 0; + } + + .status-badge-mini { + margin-right: 10px; + + &:after { + margin-left: -11px; + margin-top: -11px; + width: 9px; + height: 9px; + } + } +} + +.panel-row { + display: flex; +} + +.word-break { + word-break: break-all; +} + +.vitamui-sidepanel-loading-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.5); + z-index: 1; + display: flex; + align-items: center; + justify-content: center; +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.spec.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.spec.ts new file mode 100644 index 00000000..99694f35 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.spec.ts @@ -0,0 +1,73 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { AuthService, LogbookService } from 'ui-frontend-common'; + +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; + +import { EventTypeBadgeClassPipe } from '../api-supervision-list/event-type-badge-class.pipe'; +import { LastEventPipe } from '../api-supervision-list/last-event.pipe'; +import { ApiSupervisionDetailComponent } from './api-supervision-detail.component'; + +describe('ApiSupervisionDetailComponent', () => { + let component: ApiSupervisionDetailComponent; + let fixture: ComponentFixture<ApiSupervisionDetailComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ApiSupervisionDetailComponent, EventTypeBadgeClassPipe, LastEventPipe ], + providers: [ + { provide: LogbookService, useValue: {} }, + { provide: AuthService, useValue: {} }, + { provide: ActivatedRoute, useValue: {} }, + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ApiSupervisionDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.ts new file mode 100644 index 00000000..8c21b4dc --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-detail.component.ts @@ -0,0 +1,119 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { trigger, style, transition, animate } from '@angular/animations'; +import { AuthService, Event, LogbookService } from 'ui-frontend-common'; + + +@Component({ + selector: 'app-api-supervision-detail', + templateUrl: './api-supervision-detail.component.html', + styleUrls: ['./api-supervision-detail.component.scss'], + animations: [ + trigger('fadeInOut', [ + transition(':enter', [ + style({ opacity: 0 }), + animate('200ms', style({ opacity: 1 })), + ]), + transition(':leave', [ + style({ opacity: 1 }), + animate('200ms', style({ opacity: 0 })), + ]), + ]) + ] +}) +export class ApiSupervisionDetailComponent implements OnInit, OnChanges { + + @Input() eventId: string; + + @Input() tenantIdentifier: number; + @Input() isPopup: boolean; + + @Output() closePanel = new EventEmitter(); + + event: Event; + loading: boolean; + + constructor(private logbookService: LogbookService, private authService: AuthService, private route: ActivatedRoute) { + } + + ngOnInit() { + } + + ngOnChanges(changes: SimpleChanges) { + if (changes.eventId || changes.tenantIdentifier) { + this.refreshEvents(); + } + } + + openPopup() { + window.open('/api-supervision/tenant/' + this.tenantIdentifier + '/event/' + this.event.id, + 'detailPopup', 'width=584, height=713, resizable=no, location=no'); + this.emitClose(); + } + + closePopup() { + window.close(); + } + + emitClose() { + this.closePanel.emit(); + } + + private refreshEvents() { + if (!this.tenantIdentifier || !this.eventId) { + return; + } + + const tenant = this.authService.getTenantByAppAndIdentifier(this.route.snapshot.data.appId, this.tenantIdentifier); + + if (!tenant) { + return; + } + + const accessContractLogbookIdentifier = tenant.accessContractLogbookIdentifier || ''; + + this.loading = true; + this.logbookService.getOperationById(this.eventId, this.tenantIdentifier, accessContractLogbookIdentifier) + .subscribe((event) => { + this.event = event; + this.loading = false; + }); + } + +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-popup.component.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-popup.component.ts new file mode 100644 index 00000000..57c281ed --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-detail/api-supervision-popup.component.ts @@ -0,0 +1,68 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-api-supervision-popup', + template: ` + <app-api-supervision-detail + (closePanel)="closePopup()" + [eventId]="eventId" + [tenantIdentifier]="tenantIdentifier" + [isPopup]="true" + ></app-api-supervision-detail> + ` +}) +export class ApiSupervisionPopupComponent implements OnInit { + + eventId: string; + tenantIdentifier: number; + + constructor(private route: ActivatedRoute) { + } + + ngOnInit() { + this.eventId = this.route.snapshot.paramMap.get('id'); + this.tenantIdentifier = +this.route.snapshot.paramMap.get('tenantIdentifier'); + } + + closePopup() { + window.close(); + } + +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.html b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.html new file mode 100644 index 00000000..008526d3 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.html @@ -0,0 +1,81 @@ +<table class="vitamui-table" vitamuiCommonInfiniteScroll (vitamuiScroll)="onScroll()"> + <thead> + <tr> + <th style="width: 60px;" class="no-first-cell-padding"> + <i class="vitamui-icon vitamui-row-icon"></i> + </th> + + <th> + <div class="vitamui-table-header"> + <span i18n="@@apiSupervisionListIdentifiantHeader">Identifiant</span> + </div> + </th> + + <th> + <div class="vitamui-table-header"> + <span i18n="@@apiSupervisionListOperationHeader">Opération</span> + </div> + </th> + + <th> + <div class="vitamui-table-header"> + <span i18n="@@apiSupervisionListStartDateHeader">Date de création</span> + </div> + </th> + + <th> + <div class="vitamui-table-header"> + <span i18n="@@apiSupervisionListEndDateHeader">Fin d'exécution</span> + </div> + </th> + + <th> + <div class="vitamui-table-header"> + <span i18n="@@apiSupervisionListStatusHeader">Statut</span> + </div> + </th> + + <th> + <div class="vitamui-table-header"> + <span i18n="@@apiSupervisionListStepHeader">Etape</span> + </div> + </th> + + </tr> + </thead> + <tbody> + <tr *ngFor="let event of dataSource; let index = index" (click)="selectEvent(event)" class="vitamui-table-row"> + <td style="width:60px;" class="no-first-cell-padding"> + <div class="vitamui-cell-icon aligned"> + <div class="status-badge" [ngClass]="event | eventTypeBadgeClass"> + <i class="vitamui-icon vitamui-icon-ingest vitamui-row-icon status-badge"></i> + </div> + </div> + </td> + <td><div class="vitamui-cell-content break-content" [title]="event.id">{{ event.id }}</div></td> + <td><div class="vitamui-cell-content" [ngClass]="event | eventTypeColorClass"><vitamui-common-event-type-label [key]="event.type"></vitamui-common-event-type-label></div></td> + <td> + <div class="vitamui-cell-content">{{ event.dateTime | date:'dd/MM/yyyy' }}</div> + <div class="vitamui-cell-sub-content cell-content-bold"> + <span>{{ event.dateTime | date:'hh:mm:ss' }}</span> + </div> + </td> + <td> + <div class="vitamui-cell-content">{{ (event | lastEvent).dateTime | date:'dd/MM/yyyy' }}</div> + <div class="vitamui-cell-sub-content cell-content-bold"> + <span>{{ (event | lastEvent).dateTime | date:'hh:mm:ss' }}</span> + </div> + </td> + <td><div class="vitamui-cell-content" [ngClass]="event | eventTypeColorClass">{{ (event | lastEvent).outcome }}</div></td> + <td><div class="vitamui-cell-content cell-content-bold break-content" [ngClass]="event | eventTypeColorClass">{{ (event | lastEvent).type }}</div></td> + </tr> + </tbody> +</table> + +<div class="vitamui-table-footer"> + <mat-spinner *ngIf="pending" diameter="50" color="accent"></mat-spinner> + <button *ngIf="!pending && infiniteScrollDisabled && logbookSearchService.canLoadMore" (click)="loadMore()" class="btn" + i18n="Show more results@@tableMoreResultButton"> + Afficher plus de résultats... + </button> +</div> diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.scss b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.scss new file mode 100644 index 00000000..6de9e2a2 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.scss @@ -0,0 +1,29 @@ +@import "~ui-frontend-common/sass/variables/colors"; + +.cell-content-bold { + color: $charcoal-grey; + font-size: 15px; + font-weight: bold; +} + +.vitamui-cell-content { + &.success { + color: #74C31C; + } + + &.warning { + color: $mustard-yellow; + } + + &.error { + color: $red; + } +} + +.break-content { + word-break: break-all; +} + +.fixed-layout { + table-layout: auto; +} \ No newline at end of file diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.spec.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.spec.ts new file mode 100644 index 00000000..10d14148 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.spec.ts @@ -0,0 +1,72 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { EMPTY } from 'rxjs'; + +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LogbookSearchService } from '../logbook-search.service'; +import { ApiSupervisionListComponent } from './api-supervision-list.component'; +import { EventTypeBadgeClassPipe } from './event-type-badge-class.pipe'; +import { EventTypeColorClassPipe } from './event-type-color-class.pipe'; +import { LastEventPipe } from './last-event.pipe'; + +describe('ApiSupervisionListComponent', () => { + let component: ApiSupervisionListComponent; + let fixture: ComponentFixture<ApiSupervisionListComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ApiSupervisionListComponent, LastEventPipe, EventTypeColorClassPipe, EventTypeBadgeClassPipe ], + providers: [ + { provide: LogbookSearchService, useValue: { search: () => EMPTY } }, + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ApiSupervisionListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.ts new file mode 100644 index 00000000..199a7e3c --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/api-supervision-list.component.ts @@ -0,0 +1,87 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { DEFAULT_PAGE_SIZE, Direction, Event, InfiniteScrollTable, PageRequest } from 'ui-frontend-common'; + +import { + Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges +} from '@angular/core'; + +import { EventFilter } from '../event-filter.interface'; +import { LogbookSearchService } from '../logbook-search.service'; + +@Component({ + selector: 'app-api-supervision-list', + templateUrl: './api-supervision-list.component.html', + styleUrls: ['./api-supervision-list.component.scss'] +}) +export class ApiSupervisionListComponent extends InfiniteScrollTable<Event> implements OnInit, OnChanges { + + @Input() tenantIdentifier: number; + @Input() filters: Readonly<EventFilter>; + + @Output() eventClick = new EventEmitter<Event>(); + + orderBy = 'name'; + direction = Direction.ASCENDANT; + + constructor(public logbookSearchService: LogbookSearchService) { + super(logbookSearchService); + } + + ngOnInit() { + this.refreshList(); + } + + ngOnChanges(changes: SimpleChanges) { + if (changes.tenantIdentifier || changes.filters) { + this.refreshList(); + } + } + + refreshList() { + const pageRequest = new PageRequest(0, DEFAULT_PAGE_SIZE, this.orderBy, this.direction); + + const query = JSON.stringify(LogbookSearchService.buildVitamQuery(pageRequest, this.filters)); + + this.search(new PageRequest(0, DEFAULT_PAGE_SIZE, this.orderBy, this.direction, query)); + } + + selectEvent(event: Event) { + this.eventClick.emit(event); + } + +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-badge-class.pipe.spec.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-badge-class.pipe.spec.ts new file mode 100644 index 00000000..a0bab9d4 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-badge-class.pipe.spec.ts @@ -0,0 +1,44 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { EventTypeBadgeClassPipe } from './event-type-badge-class.pipe'; + +describe('EventTypeBadgeClassPipe', () => { + it('create an instance', () => { + const pipe = new EventTypeBadgeClassPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-badge-class.pipe.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-badge-class.pipe.ts new file mode 100644 index 00000000..3ee25f52 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-badge-class.pipe.ts @@ -0,0 +1,67 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { Event } from 'ui-frontend-common'; + +import { Pipe, PipeTransform } from '@angular/core'; + +const classMap: { [key: string]: string } = { + OK: 'status-badge-green', + WARNING: 'status-badge-orange', + KO: 'status-badge-red', + FATAL: 'status-badge-red' +}; + +@Pipe({ + name: 'eventTypeBadgeClass' +}) +export class EventTypeBadgeClassPipe implements PipeTransform { + + transform(event: Event): string { + if (!event || !event.events || event.events.length <= 0) { + return 'status-badge-grey'; + } + + const lastEvent = event.events[event.events.length - 1]; + + if (lastEvent.outcome === 'OK' && event.type === lastEvent.type) { + return 'status-badge-green'; + } + + return classMap[lastEvent.outcome] || 'status-badge-grey'; + } + +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-color-class.pipe.spec.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-color-class.pipe.spec.ts new file mode 100644 index 00000000..74c71da8 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-color-class.pipe.spec.ts @@ -0,0 +1,44 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { EventTypeColorClassPipe } from './event-type-color-class.pipe'; + +describe('EventTypeClassColorPipe', () => { + it('create an instance', () => { + const pipe = new EventTypeColorClassPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-color-class.pipe.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-color-class.pipe.ts new file mode 100644 index 00000000..00a4bafa --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/event-type-color-class.pipe.ts @@ -0,0 +1,67 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { Pipe, PipeTransform } from '@angular/core'; +import { Event } from 'ui-frontend-common'; + +const colorClassMap: { [key: string]: string } = { + OK: 'success', + WARNING: 'warning', + KO: 'error', + FATAL: 'error' +}; + +@Pipe({ + name: 'eventTypeColorClass' +}) +export class EventTypeColorClassPipe implements PipeTransform { + + transform(event: Event): string { + if (!event.events || event.events.length <= 0) { + console.error('EventTypeColorClassPipe Error: event has no child event'); + return ''; + } + + const lastEvent = event.events[event.events.length - 1]; + + if (lastEvent.outcome === 'OK' && event.type === lastEvent.type) { + return ''; + } + + return colorClassMap[lastEvent.outcome] || ''; + } + +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/last-event.pipe.spec.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/last-event.pipe.spec.ts new file mode 100644 index 00000000..466a1357 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/last-event.pipe.spec.ts @@ -0,0 +1,44 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { LastEventPipe } from './last-event.pipe'; + +describe('LastEventPipe', () => { + it('create an instance', () => { + const pipe = new LastEventPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/last-event.pipe.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/last-event.pipe.ts new file mode 100644 index 00000000..ce9c8fba --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-list/last-event.pipe.ts @@ -0,0 +1,50 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { Event } from 'ui-frontend-common'; + +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'lastEvent' +}) +export class LastEventPipe implements PipeTransform { + + transform(event: Event): Event { + return event && event.events ? event.events[event.events.length - 1] : null; + } + +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-routing.module.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-routing.module.ts new file mode 100644 index 00000000..899938a6 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision-routing.module.ts @@ -0,0 +1,73 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { VitamUITenantSelectComponent, TenantSelectionGuard, ActiveTenantGuard } from 'ui-frontend-common'; +import { ApiSupervisionComponent } from './api-supervision.component'; + +const routes: Route[] = [ + { + path: '', + redirectTo: 'tenant', + pathMatch: 'full' + }, + { + path: 'tenant', + component: VitamUITenantSelectComponent, + pathMatch: 'full', + canActivate: [TenantSelectionGuard] + }, + { + path: 'tenant/:tenantIdentifier', + component: ApiSupervisionComponent, + canActivate: [ActiveTenantGuard] + } +]; + + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + RouterModule.forChild(routes) + ], + exports: [ + RouterModule + ] +}) +export class ApiSupervisionRoutingModule { } diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.html b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.html new file mode 100644 index 00000000..b5773e24 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.html @@ -0,0 +1,89 @@ +<mat-sidenav-container [autosize]="true" [hasBackdrop]="false"> + + <mat-sidenav #panel mode="side" position="end" [fixedInViewport]="true"> + <app-api-supervision-detail *ngIf="openedItem" [tenantIdentifier]="tenantIdentifier" [eventId]="openedItem?.id" + (closePanel)="closePanel()"></app-api-supervision-detail> + + </mat-sidenav> + <mat-sidenav-content> + + <div class="vitamui-header"> + <div class="vitamui-container"> + <vitamui-common-navbar [appId]="appId" [hideTenantMenu]="false" [hideCustomerMenu]="true" (tenantSelect)="changeTenant($event)"></vitamui-common-navbar> + <div class="controls"> + <h2 i18n="@@apiSupervisionPageTitle"> + <img src="assets/mini-logo-vitam.png"> Supervision des <strong>API</strong>s + </h2> + + <div class="actions"> + + <button class="btn secondary" (click)="refreshList()"> + <i class="vitamui-icon vitamui-icon-refresh"></i> <span>Rafraîchir</span> + </button> + + <button class="btn more-actions" [matMenuTriggerFor]="moreMenu"> + <i class="material-icons">more_horiz</i> <span i18n="@@apiSupervisionMoreActionsButton">Autres actions</span> + </button> + + <mat-menu #moreMenu="matMenu" [overlapTrigger]="false" class="more-actions-menu" xPosition="before"> + <span mat-menu-item i18n="@@apiSupervisionComingSoon"> + Bientôt + </span> + + </mat-menu> + </div> + </div> + + <div class="filter-controls"> + + <form [formGroup]="dateRangeFilterForm" class="date-filter-container"> + <div class="date-filter-container"> + <div class="date-filter"> + <span *ngIf="!dateRangeFilterForm.get('startDate').value;else showStartDate" (click)="pickerStart.open()" + i18n="@@apiSupervisionStartDate">Date de début</span> + <ng-template #showStartDate> + <span (click)="pickerStart.open()">{{ dateRangeFilterForm.get('startDate').value | date:'dd/MM/yyyy' + }}</span> + <i class="material-icons clear-date-icon clickable" (click)="clearDate('startDate')">clear</i> + </ng-template> + <input class="hidden" size="0" [matDatepicker]="pickerStart" formControlName="startDate" [max]="dateRangeFilterForm.get('endDate').value"> + <mat-datepicker #pickerStart></mat-datepicker> + </div> + <div class="date-filter"> + <span *ngIf="!dateRangeFilterForm.get('endDate').value; else showEndDate" (click)="pickerEnd.open()" + i18n="@@apiSupervisionEndDate">Date de fin</span> + <ng-template #showEndDate><span (click)="pickerEnd.open()">{{ dateRangeFilterForm.get('endDate').value + | date:'dd/MM/yyyy' }} </span> <i class="material-icons clear-date-icon clickable" (click)="clearDate('endDate')">clear</i></ng-template> + <input class="hidden" size="0" [matDatepicker]="pickerEnd" formControlName="endDate" [min]="dateRangeFilterForm.get('startDate').value"> + <mat-datepicker #pickerEnd></mat-datepicker> + </div> + </div> + </form> + </div> + + <div class="custom-flex-controls"> + + <button class="btn" (click)="toggleTypeFilter('INGEST')" [class.active]="filters?.type === 'INGEST'"> + <i class="vitamui-icon" i18n="@@apiSupervisionFilterIngest"></i> <span>Entrées</span> + </button> + + <button class="btn" (click)="toggleTypeFilter('ELIMINATION')" [class.active]="filters?.type === 'ELIMINATION'"> + <i class="vitamui-icon" i18n="@@apiSupervisionFilterElimination"></i> <span>Eliminations</span> + </button> + + <button class="btn" (click)="toggleTypeFilter('MASTERDATA')" [class.active]="filters?.type === 'MASTERDATA'"> + <i class="vitamui-icon" i18n="@@apiSupervisionFilterMasterData"></i> <span>Données de base</span> + </button> + </div> + + </div> + </div> + + <div class="vitamui-body vitamui-container"> + <app-api-supervision-list [filters]="filters" [tenantIdentifier]="tenantIdentifier" (eventClick)="openPanel($event)"></app-api-supervision-list> + </div> + + </mat-sidenav-content> + + +</mat-sidenav-container> \ No newline at end of file diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.scss b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.scss new file mode 100644 index 00000000..6c1aeb44 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.scss @@ -0,0 +1,31 @@ +@import "~ui-frontend-common/sass/variables/colors"; + +.vitamui-header { + background-image: none; + + .controls { + margin-top: 57.5px; + + h2 { + font-weight: 300; + font-size: 28px; + + > img { + vertical-align: middle; + width: 37px; + margin-right: 17px; + } + } + } +} + +.filter-banner-container { + display: flex; + height: 70px; + margin-left: 10px; +} + +.custom-flex-controls{ + text-align: right; + justify-content: space-between; +} \ No newline at end of file diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.spec.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.spec.ts new file mode 100644 index 00000000..0d10fca2 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.spec.ts @@ -0,0 +1,83 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ + +import { GlobalEventService, ENVIRONMENT } from 'ui-frontend-common'; + +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatMenuModule } from '@angular/material'; +import { ActivatedRoute, Router } from '@angular/router'; + +import { ApiSupervisionComponent } from './api-supervision.component'; +import { EMPTY } from 'rxjs'; +import { LogbookSearchService } from './logbook-search.service'; +import { environment } from '../../environments/environment'; + +describe('ApiSupervisionComponent', () => { + let component: ApiSupervisionComponent; + let fixture: ComponentFixture<ApiSupervisionComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + MatMenuModule, + ReactiveFormsModule + ], + declarations: [ApiSupervisionComponent], + providers: [ + { provide: ActivatedRoute, useValue: { paramMap: EMPTY, data: EMPTY } }, + { provide: LogbookSearchService, useValue: { search: () => EMPTY } }, + { provide: Router, useValue: { navigate: () => { } } }, + { provide: GlobalEventService, useValue: { pageEvent: EMPTY, customerEvent: EMPTY, tenantEvent: EMPTY } }, + { provide: ENVIRONMENT, useValue: environment } + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ApiSupervisionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.ts new file mode 100644 index 00000000..da8b33f7 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.component.ts @@ -0,0 +1,127 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { GlobalEventService, SidenavPage } from 'ui-frontend-common'; + +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +import { ApiSupervisionListComponent } from './api-supervision-list/api-supervision-list.component'; +import { EventFilter } from './event-filter.interface'; + +@Component({ + selector: 'app-api-supervision', + templateUrl: './api-supervision.component.html', + styleUrls: ['./api-supervision.component.scss'] +}) +export class ApiSupervisionComponent extends SidenavPage<any> implements OnInit { + + dateRangeFilterForm: FormGroup; + tenantIdentifier: number; + filters: Readonly<EventFilter> = {}; + + @ViewChild(ApiSupervisionListComponent, { static: true }) list: ApiSupervisionListComponent; + + constructor( + private route: ActivatedRoute, + private router: Router, + private formBuilder: FormBuilder, + globalEventService: GlobalEventService + ) { + super(route, globalEventService); + + this.route.paramMap.subscribe((paramMap) => this.tenantIdentifier = + paramMap.get('tenantIdentifier')); + + this.dateRangeFilterForm = this.formBuilder.group({ + startDate: null, + endDate: null + }); + + this.dateRangeFilterForm.valueChanges.subscribe((value) => { + this.filters = { + type: this.filters.type, + status: this.filters.status, + dateRange: value + }; + }); + } + + ngOnInit() { + if (!this.list) { + console.error('ApiSupervisionComponent Error: no list in the template'); + } + } + + changeTenant(tenantIdentifier: number) { + this.router.navigate(['..', tenantIdentifier], { relativeTo: this.route }); + } + + clearDate(date: 'startDate' | 'endDate') { + if (date === 'startDate') { + this.dateRangeFilterForm.get(date).reset(null, { emitEvent: false }); + } else if (date === 'endDate') { + this.dateRangeFilterForm.get(date).reset(null, { emitEvent: false }); + } else { + console.error('clearDate() error: unknown date ' + date); + } + } + + refreshList() { + if (!this.list) { + return; + } + + this.list.refreshList(); + } + + toggleTypeFilter(type: 'INGEST' | 'ELIMINATION' | 'MASTERDATA') { + this.filters = { + type: (!this.filters.type || this.filters.type !== type) ? type : null, + status: this.filters.status, + dateRange: this.filters.dateRange + }; + } + + toggleStatusFilter(status: 'RUNNING' | 'ERROR' | 'DONE') { + this.filters = { + type: this.filters.type, + status: (!this.filters.status || this.filters.status !== status) ? status : null, + dateRange: this.filters.dateRange + }; + } + +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.module.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.module.ts new file mode 100644 index 00000000..8fa48390 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/api-supervision.module.ts @@ -0,0 +1,82 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { VitamUICommonModule } from 'ui-frontend-common'; + +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { + MatDatepickerModule, MatMenuModule, MatProgressSpinnerModule, MatSidenavModule, MatTabsModule, MatNativeDateModule +} from '@angular/material'; + +import { + ApiSupervisionDetailComponent +} from './api-supervision-detail/api-supervision-detail.component'; +import { + ApiSupervisionPopupComponent +} from './api-supervision-detail/api-supervision-popup.component'; +import { ApiSupervisionListComponent } from './api-supervision-list/api-supervision-list.component'; +import { EventTypeBadgeClassPipe } from './api-supervision-list/event-type-badge-class.pipe'; +import { EventTypeColorClassPipe } from './api-supervision-list/event-type-color-class.pipe'; +import { LastEventPipe } from './api-supervision-list/last-event.pipe'; +import { ApiSupervisionComponent } from './api-supervision.component'; +import { ApiSupervisionRoutingModule } from './api-supervision-routing.module'; + +@NgModule({ + declarations: [ + ApiSupervisionComponent, + ApiSupervisionListComponent, + ApiSupervisionDetailComponent, + ApiSupervisionPopupComponent, + LastEventPipe, + EventTypeColorClassPipe, + EventTypeBadgeClassPipe, + ], + imports: [ + CommonModule, + MatSidenavModule, + MatMenuModule, + MatDatepickerModule, + MatProgressSpinnerModule, + MatTabsModule, + ReactiveFormsModule, + VitamUICommonModule, + ApiSupervisionRoutingModule, + MatNativeDateModule + ] +}) +export class ApiSupervisionModule { } diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/event-filter.interface.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/event-filter.interface.ts new file mode 100644 index 00000000..7cabb0f1 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/event-filter.interface.ts @@ -0,0 +1,41 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +export interface EventFilter { + type?: 'INGEST' | 'ELIMINATION' | 'MASTERDATA'; + status?: 'RUNNING' | 'ERROR' | 'DONE'; + dateRange?: { startDate: Date, endDate: Date }; +} diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/logbook-search.service.spec.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/logbook-search.service.spec.ts new file mode 100644 index 00000000..be366cab --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/logbook-search.service.spec.ts @@ -0,0 +1,58 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ + +import { LogbookApiService, LogbookService } from 'ui-frontend-common'; + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; + +import { LogbookSearchService } from './logbook-search.service'; + +describe('LogbookSearchService', () => { + beforeEach(() => TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + { provide: LogbookService, useValue: {} }, + { provide: LogbookApiService, useValue: {} }, + ] + })); + + it('should be created', () => { + const service: LogbookSearchService = TestBed.get(LogbookSearchService); + expect(service).toBeTruthy(); + }); +}); diff --git a/ui/ui-frontend/projects/referential/src/app/supervision-api/logbook-search.service.ts b/ui/ui-frontend/projects/referential/src/app/supervision-api/logbook-search.service.ts new file mode 100644 index 00000000..8d33ebb6 --- /dev/null +++ b/ui/ui-frontend/projects/referential/src/app/supervision-api/logbook-search.service.ts @@ -0,0 +1,114 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * + * contact@programmevitam.fr + * + * This software is a computer program whose purpose is to implement + * implement a digital archiving front-office system for the secure and + * efficient high volumetry VITAM solution. + * + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +import { + Event, LogbookApiService, PageRequest, SearchService, VitamSelectOperator, VitamSelectQuery +} from 'ui-frontend-common'; +import * as moment from 'moment'; + +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; + +import { EventFilter } from './event-filter.interface'; + +@Injectable({ + providedIn: 'root' +}) +export class LogbookSearchService extends SearchService<Event> { + + constructor(http: HttpClient, logbookApi: LogbookApiService) { + super(http, logbookApi); + } + + static buildVitamQuery(pageRequest: PageRequest, filters: EventFilter): VitamSelectQuery { + const baseParameters: Partial<VitamSelectQuery> = { + $projection: {}, + $filter: { + $limit: pageRequest.size, + $offset: Math.max(0, pageRequest.page - 1) * pageRequest.size, + $orderby: { evDateTime: -1 } + } + }; + + if (!filters) { + return { + $query: {} as VitamSelectOperator, + ...baseParameters + }; + } + + const queryOperators = this.buildQueryOperators(filters); + + if (queryOperators.length === 0) { + return { + $query: {} as VitamSelectOperator, + ...baseParameters + }; + } + + return { + $query: { + $and: [ + ...this.buildQueryOperators(filters), + ] + }, + ...baseParameters + }; + } + + private static buildQueryOperators(filters: EventFilter): VitamSelectOperator[] { + const operators: VitamSelectOperator[] = []; + + if (filters.type) { + operators.push({ $eq: { evTypeProc: filters.type } }); + } + + if (filters.status === 'ERROR') { + operators.push({ $in: { 'events.outcome': ['KO', 'FATAL'] } }); + } + + if (filters.dateRange && filters.dateRange.startDate) { + operators.push({ $gte: { evDateTime: filters.dateRange.startDate } }); + } + + if (filters.dateRange && filters.dateRange.endDate) { + operators.push({ $lte: { evDateTime: moment(filters.dateRange.endDate).endOf('day') } }); + } + + return operators; + } + +} diff --git a/ui/ui-frontend/projects/referential/src/assets/mini-logo-vitam.png b/ui/ui-frontend/projects/referential/src/assets/mini-logo-vitam.png new file mode 100644 index 0000000000000000000000000000000000000000..a13d7317b3a456085352397e7933f2d2a39b076f GIT binary patch literal 43081 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 }F`8HT>lpw4BU@W5M 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 AVgLXD literal 0 HcmV?d00001 diff --git a/ui/ui-frontend/projects/referential/src/sass/styles.scss b/ui/ui-frontend/projects/referential/src/sass/styles.scss index 523304e3..de83712e 100644 --- a/ui/ui-frontend/projects/referential/src/sass/styles.scss +++ b/ui/ui-frontend/projects/referential/src/sass/styles.scss @@ -20,8 +20,8 @@ $grid-gutter-width: 20px; @import "tooltip"; @import "text"; -@import '../../../../dist/sass/icons/vitamui-icons.css'; -@import '../../../../dist/sass/styles'; +@import '../../../../dist/vitamui-library/src/sass/icons/vitamui-icons.css'; +@import '../../../../dist/vitamui-library/src/sass/styles'; vitamui-common-slide-toggle { diff --git a/ui/ui-identity/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json b/ui/ui-identity/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json new file mode 100644 index 00000000..48e341a0 --- /dev/null +++ b/ui/ui-identity/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} diff --git a/ui/ui-portal/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json b/ui/ui-portal/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json new file mode 100644 index 00000000..48e341a0 --- /dev/null +++ b/ui/ui-portal/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} diff --git a/ui/ui-referential/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json b/ui/ui-referential/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json new file mode 100644 index 00000000..48e341a0 --- /dev/null +++ b/ui/ui-referential/${maven.multiModuleProjectDirectory}/ui/ui-frontend/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} -- GitLab