From fecfd5472824b5adae708db95d351e4ad65ee87b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karol=20S=C3=B3jko?= Date: Wed, 5 Jul 2023 10:03:01 +0200 Subject: [PATCH] feat(auth): add notifications model (#638) --- packages/auth/database.sqlite | Bin 0 -> 352256 bytes .../mysql/1688540448427-add-notifications.ts | 16 ++++++++ .../sqlite/1688540623272-add-notifications.ts | 17 ++++++++ packages/auth/src/Bootstrap/DataSource.ts | 18 ++++++--- .../src/Bootstrap/MigrationsDataSource.ts | 7 ++++ .../Domain/Notifications/Notification.spec.ts | 18 +++++++++ .../src/Domain/Notifications/Notification.ts | 17 ++++++++ .../Domain/Notifications/NotificationProps.ts | 9 +++++ .../Notifications/NotificationType.spec.ts | 16 ++++++++ .../Domain/Notifications/NotificationType.ts | 27 +++++++++++++ .../Notifications/NotificationTypeProps.ts | 3 ++ .../src/Infra/TypeORM/TypeORMNotification.ts | 38 ++++++++++++++++++ 12 files changed, 180 insertions(+), 6 deletions(-) create mode 100644 packages/auth/database.sqlite create mode 100644 packages/auth/migrations/mysql/1688540448427-add-notifications.ts create mode 100644 packages/auth/migrations/sqlite/1688540623272-add-notifications.ts create mode 100644 packages/auth/src/Bootstrap/MigrationsDataSource.ts create mode 100644 packages/auth/src/Domain/Notifications/Notification.spec.ts create mode 100644 packages/auth/src/Domain/Notifications/Notification.ts create mode 100644 packages/auth/src/Domain/Notifications/NotificationProps.ts create mode 100644 packages/auth/src/Domain/Notifications/NotificationType.spec.ts create mode 100644 packages/auth/src/Domain/Notifications/NotificationType.ts create mode 100644 packages/auth/src/Domain/Notifications/NotificationTypeProps.ts create mode 100644 packages/auth/src/Infra/TypeORM/TypeORMNotification.ts diff --git a/packages/auth/database.sqlite b/packages/auth/database.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..3761bb74789f2a7c6090ffc78692108e775b8c3e GIT binary patch literal 352256 zcmeIbdw5*Ob>P{JM!#R;ORX2hCM1e%iC4Ps2PH~@NRXnN1SycPL`hVu?!9%v7J+W4 zyFrmuCjOw8vwzr@XY);DC4bD=N@l(BBTl}J?U~GM;y50!AG^u;^J8Y#W6Rmui67s5 zJ8N5;i4%Fxt!@C_Km$Cq<%!AfkTwO}d-_z}U!6LqPE~c?lMf%QcX&Byw&qx;tVOPi zM5B>kDVHOW$O!!Zo$&vqKMZ~tUHS$78}0jfy&p#+cL(2%!`)c%zlJi0ia#m7S^Tfr zAorfkm(r&)zm@t%>R{s6lK(CK<n#w`=vr z`Fe+S>di)bqkG#9OihfRnkb(dfAHu;d2A!mvGSg=g@w95RzA;K-dWZvpO`vwY<%i; zxjJ#WJbC<7d2;&b(Y@udnHFnwnyuP^@E*;qtP$dTW1%)Y!9shvz|}hVh534mw`;63 zR`ywkcj|MzzYMR%;i|vx{e}7PQ|sKXJhClOIybRiV{AmKrfhWg`lq)fOFNb5Vo@~f zN+rUEt+f~2w%4l9iyL2PYmakFAJ~m5)!t?`u9F+GypeD&-fpZc3IECHm4y zVJ2%ovG&U5L6cZ3fHs8rS=OjE*c@MJLDet@%z!uiZu`0QnR=tMUhA#B+s|U{-4<`~ zXL~K%y$g2fv4+QIXE|7Kr{1{OUtIa%#G&!&qo>MyBmGY%5M0lvuj&-WE!h5MIxyw~$j<6 zzP{o#d&A*9;n=3~Kr#`w-#SD1)fj5Z>MN;p@noqq9$oAPbw0=Hv&|rwtv6t-yk@+Y z7;J1I-EGeGKNF(w3PPhcV#(6@c=W{?(WvWxX#G2*gAKjDAiBwWPtlKcdE^Am@eenu z{P_ovm6M~1(#-gJ=CMA!nzH`AFgHzwndXU+MCq=(qNlqqyPH0?`7;X;>3J`kT>3RO z&}yr0?g`!VUJ$J;jzu9?*%^JlJGhyvLvANBla-%F1~iSW+z8vdZ|ppfEsjs0I(}pl zK6z|n67t5C+%ZhyAnTi(9~&}+Sc)3(sPb|6=O!Kgxp7Ax{*4#+MT*}n{x8K>iXQw( ze~17PAOb{y2oM1xKm>>Y5g-CYfCvzQWdgh7qmlUG=>Ks0H*Uv-!TG06VZ2n@{7BE;x_BEyan?*9e$8?SSY6} zhGm$RW9*EA+`Z9v|G{5PzOUY>cTS3FjZj3>G~Lh~(+czdXz~Av!2jqE5g-CYfCvx) zB0vO)01+SpM1Tko0U~gX5GX`rJEJT64B}z_51an!4-p^&M1Tko0U|&IhyW2F0z`la z5CI}^4HL+O&qn$GHQd7VXheVr5CI}U1c(3;AOb{y2oM1xKm;NY%Kym>Y5g-CYfCvx)B0vO)Kwtj96=)QQ z2oWFxM1Tko0U|&IhyW2F0z`la5CI}^?Gd2!|E|3@r6(c+M1Tko0U|&IhyW2F0z`la z5CI~vnn2(B|LR-xI}soPM1Tko0U|&IhyW2F0z`la5CI}^jS!&x{~BpXdJG~!1c(3; zAOb{y2oM1xKm>>Y5g-B^5TO148^EDkM1Tko0U|&IhyW2F0z`la5CI}U1g;SRwElmM zG$cI+5g-CYfCvx)B0vO)01+SpM1Tkofei>y{=Wenx6HPVpu7({>w5CI}U1c(3;AOb{y2oM1xKm;}*K;Qr001n+E0z`la5CI}U z1c(3;AOb{y2oM1xaE%b4_5W+6A?Y!Q01+SpM1Tko0U|&IhyW2F0z`laY(RkW{|(^K zEh0b!hyW2F0z`la5CI}U1c(3;AOhD2fxi9!o3D{aqQ@WtM1Tko0U|&IhyW2F0z`la z5CI}U1XdB~%l}v1pEG597ZRe#aT#=TJ9SkzAW;k{qa35GaOYD9RbMHb?e+t~s6*=p5>% zSWIGEH6+CV20T!FTeY7+Ycsj&xU%6$hNkM0F58ymGRK#o2`n&HRkt25o^MIkM$TzGLfJz--GeWTAQwNMG3WWz$NJ#GbGp7z@=E=7Ce<3+~e;=YtwwqRJjQz0X|C7T@QK|(=17G z6q_+i35>v;#%pu9%Ur{hWEol#+R>2g01U=us^J?7n6PY~LTghz-|%(tmY!=^z|E7P z6>L>fWLYWfY}??@l+cFpy_mWkM{6?> z7IGM^4b!HF(ApGTwKZ^Sk_j;d?2VfeGc^}HIkyaOnY!NB0G4!14M)NVp+(->zE0yqSB8T?zILUguVNAhh`1=Y~q0`ojto9qS5 zgRmt*d;*W8sy_HP4iD~fSz!*-nBsTDI0P&c#u_G$I;p>h*I2Eba1u-L}yKdag-*j5(g)) znb1=W-Fz0UP4O<@>$jq{*{aVV04w0%OcVSYb0p>kCO9a?fbkP^G*8)r)~0$K)Yv)< z6~ee+a4y-Fr$~Naxw@`{cT?QWXl=Fw-BIy0$#xl7uMI;_I{hod%I^`O_w5M}JZVUndOfeoP+%95`GZIdW%E(=T_+`nYW9QuM0C=&P- zFSIupQfN$5m7s`zQW&7Y7y-s_FunwCHdN4d4PWAc3BAV~sk7?nb{0v!{A4U8N-*MyO(A%`B-F)bKsf=f-H>n1zC>{+%g znHmg6bQsdZIK&Ag!{(l@!GIdF#yDD=8u$UXAj+uRgUkqqfDmP1%nDu1;S4;1YqC+a zHq*QOC_0AMhR7F2jzYGZ#*DZy<6c_-U!IeoABX@EAOb{y2oM1xKm>>Y5g-CYfCyZ( z1nB(#Yqn|W!H576AOb{y2oM1xKm>>Y5g-CYfCwxT$d48y#fTm$K3+`cU(FxLeJ%RA z=x;^ujp(`G%Z;agJH@k~P5<@M-;|!xBVTxa^u}bVREoYZ(_!u`Z#8FmTl{m&fvJh{ zQxoM=;}0I4D36J2W92<#3k!9BtbCreytAxTJ~4IV*!a}xa&_W#dGh$F^5pc0w7(RMh>x_NnXPwt zjV*MV{VEjksT*EAbiHViUq2^WL|hdAlm=U5xeQc`EHm%5oM;q4)~(=DdoEp_f40_W zHoR4B7>YN%*2VddF+3sYtexW*2OAoMdbfJA(9*T#(mVCW#r_6gX;3+Az;pApUi+_6 z3b&fA`b@pSI>L5VJqOg-Yqr5=Ks%q|El>uRpmw!({SrLKz~wfZ1$kx%gjQBlmVUa; z*q$gIxoy1<%=6Y`#89^up;K$4Dp#i#z)|Y+pYJ z$D^T%_g&iAYwqdEBM(ncln2J9ePTKkG|N=vDTMd z|IX-OpI%=O?I?!~{FmbfG}S*`O#S)8XXV65qIB0?(bHY`*v+=u{Fwz9?($ypwe)Lj z0PL!pdqTtA3!;_9v1qcib7%DVqR=^4hcToWf35s9GN5T}feZhSoXC9wEb^ORA zeDWA1v;F+Tv=@e;bMs^6wZjh4pOzf&@~0~K{0}4BqMIVc|091X_g41v*>`8Ym5!%= zHr&m==H-F%Z7`QVXc!-0n(raf?tc;>DhQ7WRsA`=S zgJ!aNID0*LK(gyz2IWJ_gF=<^VnR)p94O5ar47_+*}wW1_ z$1Cf(mBAV;kF|OrjOPtGS*lc`FYf9O_r1G=pVbF#aPTJDH4GU5tjc~ui2);Alk%>E zV##Rtn0lD+Z#W)Xy1!%}-OP8{+~M|yNmykubq|EI{n15DwEjY)4j!NzGs59AOuw9k zIA8Zzm@vX@77W=NGrXM%Hoae1YD{O&}_+rM7>ucxJ^tanFU zY)Z+}{{7MCpAj~(p4@uZl|egMPwZ{9m}S1}4;VKzhRVHrH|jzIPXOu4;P3amFm{*d zLNC2*Ew1*U?A;rn5mS1Dsn$9ZpqKAL@U(tter#4`e&JxV-?aN~&o8*Mb+0?q=FT?V z0kI}b3h~ykAknA6=jZDluMMV=nmUk1_KCZ!JKYq$zK2wY+^CmaY~CP0NYFX9!%yt-(ipbmhc_PrS) z2rIW#x-sy`K!jY8zDyB&hgWpv^S$`8aU@-*qG9#+tgT+F?_n-ey}O20umAH`SiOOd zR?25~CrZy$*Yky!sT%~xjj7!E!XtMiOVw)hvphIQ(MY}mM2bn39=Zk4kU|95_?vgH%?90=vNmPHu+L^yOcvdaC@S3Qd-Zz zS8G_w9G5D%`+4m)7`RB$7jG2NYV{{p|9;1yk*>atw#v(7gd30d&a>GCn4|2?nZVE| zTpaotR)BtX^SCsYEKO{WF7D{Fj@|%ROm(i9*3#8o!z^LxW;kE6@{yj)>rICWr2TW~ z&+bfyv#5(VuUGccSa3=E?UyZj=@UarUcOZ+L%#NxS1^6MxWnnDv1wshVw56gSyq19 zKWI%WH^f6P7ro>I`dwA1X>d`c?{5D<309Gp6+vKK`CO&4c(V>DA!U0+pj?&{{aF~t zQaaE>*~^3MUbR<^+Lwx1`|$y;Jtc#W2sIlh5SDSzY01)mx9s(br{-z@e>i_Ze~17P zAOb{y2oM1xKm>>Y5g-CYfCyaM1oFlIIg-f#TBLA)@p$3Kh1c@mfnVqk5g-CYfCvx) zB0vO)01+SpM1Tmq%>>*;Vp>USniJT*swtYpZ6DsnWHWfDkOD8El2y}`6<_xKKtD2h zYGP_~{Alge#Q3q=^vQ`SRaW6OSC%9jW!c&%oBLFFb=aCqkHr(yJEEF~d285#<5Lqt z^~exKLoPiQ?drB|8Q#zWFWqt-cyEgC!V9w;6JGEIuhUTBeIkYjFI!pG9UG!($feVx zpc~l0`TB5>y=uZcW^B-{!`pNm-!dgtab?>vbXRtRW!*#c47v1ZEHS+uRAUa&KQVRu z3Sgfe=~mhg-zTH!x@4(3yZ}LmcOTgBJ`Z@&oMr2lCA;uMCyq{^yaLr=dhgs8RvN(? zZyn+Kf1;R;6!qfE#cvd|#WTf^zs*KY>WBalAOb{y2oM1xKm>>Y5g-CYfC&6D5!e%( zj$$Ta5}_bwHYFYkVx})fLqW`BL@X4<%q@)Uj=?(u5i@uwMw8gs-&Z9w|gXtqdTI}<*g1Q z@dEswUj97>zou7ikLE|Wr=v@|7rHl>cN~lWx^z0+B@l<7qQ#$tC?78Vr0`r}d;VYN z-FzbVPjmNWzmlEJyp?%>W>@;p({Adg@HT+^lm9OHuH?4FhZFb5|1v&1`qtw$3G!Ylft&sxLV*_ocw)vcen& z8%})g*WsA9eat@}p04am-dXOQo2|DyL$-trxpZbve7d4(ieYfmkrhezx+S@=l|$Dg z&v888bG^XOeKtS8FMuP}+mg#WY>2KQm-z1Zv;*5YTvrV&3!cH&eMt|v0$XPk3wDYa zp0BF9srXLsLFQQNoZo!5A)T+c7uf6&okK49cf_YH*!?40y00m!WZ5q4qA@hst0T*{ zq}g0iHC0tjPlkgp-~^U^?fOhZsy8GCuXgCPho~HK>8V}u>3cNIvMk^5EFJdhguqlo zlbB&LNi}^#*0{=CSFnPYIJ7zv5QB5bkR_bCz1td|Z}>Vqhvym=G>Iom%&}ETk!9WB zfumZsELx-KEwrV%rq74ecF3hCZi`Rv)-*%271eWG$?-I34NnUsQ0YnrZ04~Xu5gXX za0K8S-{)V1!)@x`5LH7iJ+)KdQFPVTbXAs2Xjw_uU@H?dH5c%3%P>q?_dU~V&doO) zaLU`hpgHTK@vw4yS^;YcG#|D}K|fF|s6Wh7N;U_(g67aQFec9ntiBRLlVt%Ck+&m0 z4R&J$hURIyBWVE#tK~)jE#MgvvpmLN*OTkWY_-A8vCi2cScY7hy){04SkrXV^qFkJ zRxd|m5?HP-xfX0KvusmyjDV@O!FuM}?RT@yXQejub~uMw>cHV^LsSpBG`n4tX2NDW zgSkMBXOeX(zdTd zN!)c61v;Y=^d8BFmqA>Vz~=l`{XB;!_s%WM579j2QvIg*^f+u^^q}KwI)l&3u-h%L zVCSD}x)K;TS8PRbbi*AeZ05>~diuur^Z`u+=VEBOtV&#g0`x%9!5gcJ1hyhG8Tyam z4;JOOn)7b+!WBK%*&9TR;jV0022&x%!1hDk;m}Y9__aWV?&@1U_%dzavBYUuS5(rY zrTFv?00@5HlbJ19h7Eob!i~gq@M;d61MWGR9EP6d7&D|DhFtQtb&XB+nV~2EDC|wT z&K!w(feG$YF(4)|NAr{whv3aN7kmlM$v!tkqv%Yn~JN*df){;?c%_A z={#GQMaFoxSrh@0){w(!Wvd?a7MU4Pgu^6DQvw@SaG(M(xDcZW4?>F6{dowGA(z-D zQH09^*Z`_pk|py17zK(1vA_$55vJope^r&`r(o@KS5(B4*Ttvr(ljlwWF7p81f2w$ z!G=e%UBj1nV1iq5HQ!Oy(26>2Mry!G(eOftA@v<{>FJ{Adyee+96Gxc=p3A~0^OW( z*y^i5pR;+O__k{I`a`4H;nG=fV$Ie?Nt401T|~zDbA_(|GCkMS3{P?m1}<4~AQZ@f zCTS4R;b~lWSZ8Qirf~&@&E|#w_rM=I%!N+kTQH~qSdyba^E(SaUxE79Zo|HH!(m|Hstj>V zheDM=QC$-T=(e?lY#!e3HKe*jE5pOJ@>dPz?O)+=tc8q%kB`KscR@dZG!aG&5SU=34MD`V zpszWQcA79e0w}tzc|A-EorM-MO*|77O$=XwP+&yoN*wwYqz(|FTwjB9&H`Xy`v&)V zO*~ik8}*s9mk)rDpr5FO`~NHHdD#D-doJ^-%>K;#a$hcnHHH?mqL$Y!!n z6kjgP6hEGx&uq=To_#6zX8QY?H}bFLri$6@*RvnX|5;&M;nVqt@;}H$@;eIODZG-a zq(Acu%Ku3%5g-CYfCvx)B0vPLG6LZSP75+;Zo|wKvmm3@VNwfb>B1>37>H`7A83Yd z-W3XJj5A0*ILy+^kXZ#V&*fM!^Wnpk7fc)4mL8aQhJt~sXx#E)eo8Yz5LP~5-W_H! zVUo;{J(yzf1AlKQh*@peE$WDv$=?+UDu@aB+e1Oj)cS3qAZDrJ4pB5>I(=s-h?x~H zi#j6aws(YrnEB~jLqW{c@^(>2#H{cwp&({v_vTO#Gb?*jD2SO;y)hKTOo-kfibl+5 zmO??yGF~MVv=Q@|+d@IiT;x`v5izZ}B^1O=4sH$wF;je-LP5+#-F2ZLX2z`;3NplW zSs@g}Om*c$LCh>wE)>MfGi5_T%sf#h6vRySq(vPO^EIhZ5HtCb3%A{``F2$T@}A3jd<;A9CljKPmiu_8Y~I zTSM;L9(y3#Ten}kg|@OYc6jO2-5q$V_rz_# zDdsGFetF%$yK{B-jWKKK!-Km`@7NZ*CmQZi8Q3AZYjdn3u8Q?#v8(g;O|jk4?rLgp zC+2PWJ0mxC&Mu2CZ^zve>Rj35)Z13M^ZJ<5f3>$2vV23#SX1k8`{E8ThHQ`MnrC0V z`|#FK%dkCsx0GWOOHV#@-`&l(#>NK)2KLI`)YoX;&kyczyD@CEUM;)#`}d^XkdN)? zatxogRElX!kJ?_C=dIqJqq|zyht*#pwz4a1TS&cU6WyI$TSJV!D}B4Kw)9=@+cCAd z?{a5lm(!*#vAaaQ`gSH=*Y~6Yn{Il$iHdzB2k-ZG02TULX+U6k*G@jP(BV66a<|0x zFFn?>@h8GND>Y5g-CYfCvx)B0vO)01+Sp zS2Y33|F7!iqskKjB0vO)01+SpM1Tko0U|&IhyW2l5up4Zg^7fS01+SpM1Tko0U|&I zhyW2F0z`laT-5~V`~O#U^HJrA01+SpM1Tko0U|&IhyW2F0z`lapa{_VKME5G5dk7V z1c(3;AOb{y2oM1xKm>>Y5xA-eQ2u{aHy>4=2oM1xKm>>Y5g-CYfCvx)B0vO)0Ez(Z z|3_gWAtFEohyW2F0z`la5CI}U1c(3;AOcr40b2jRs+*50PXven5g-CYfCvx)B0vO) z01+SpL;yvA@_!U25+VXbfCvx)B0vO)01+SpM1Tko0U~f!6QKP6s%}22JP{xQM1Tko z0U|&IhyW2F0z`la5CIec%KuTANQej!0U|&IhyW2F0z`la5CI}U1c<;@O@Pk-yQ-Uy zDo+H601+SpM1Tko0U|&IhyW2F0z?2sfY$#}m`I2S5CI}U1c(3;AOb{y2oM1xKm>@u zRZSpV|1U-#iWE*1iur}??_@ifzsdNiL&={c-;r1togTd|_ImW8=zoL1PbdC;WPc(a ze?9(s?~&tMqEe}5MHf%j8$Q1v{;9PWT(8}#&v)w0My<^|oqA)YU4x$&=6%-TevNfN zr0uO1DIA!Z7(X>pJ~DZ5;?eRLTG?3n_+)u(sLHYOp0Slu$13IcmdLM8Y>zJP=&$ea zD)z2shSqBBM_xRAJXxBUi2l0KVeTyFbG$Xf8{Wkl^E}>e*XoV)^$rV}v^To9rB~dk z@duAil*cv_6%V&i_s7cTS<5@iTICZ{M~;n8oi0}=PM0T-pDIsIA3eIaJT}u}jZU*w zTj&?wqnVX8LY!|b)P^TmXfGGIS_i){UvKd?H1JqCZ0b&Zj`x@0wRq0}hTrdNs$ri$ zaD4LQsj2ZJlcxrssTQ0YD<3*OHF4zdqG&~YF8+Qj}msb<-XM3JZP;eqTNoi_5*8r$bn;t(j!VVB8qB1Gh6TQ8e8Zz zyWMfEf||1STI$8^N0TK*iN2eQ&ahTu?Uk*AhQC%|xydeP?(?&(QERX{zGA1UVGI~M zZ}?p+b?Y~llcRbO>icc>M$Z-+rIPF0horWJiYyN(|Yo3F+ier=5%2nRJlYAM7N2W`J=uuC_? z_;VShmx&|7qM#{;*9aWR;@$5^URA;H$dN?pjI~}@AIi9<486SR#hV{WmMkm!?rG8C zhYAh7c->&PA1Z_H`5Slo^K5nj`b~#l=!89rx6Xt2gb>}j*d40CuWbm=m+hwgQEaUb z*w{m~d81wL)X#_Y*w`7YV`j_FZzaC3>eS3v9oh1^YD0InT|-lXK-DzW3ACY|dH{JZ zCa#W`gF$AwJ&?h(vbgDRvNR3DuKlR)9#&$h-)66@Q+FMo7!US_Xkldsx^C|gFCBv6 z+Am}zD26|)tI%f_mGV6kiPC}X>vp`Q!KJbUA^*a$gUQnN?a`O#y4|ZMv2;JTsuT4+ zdKbuL28h>OzZrb$b-RkH=#06tCu_FMZ6$CGMRqj9F}z=N{3{(umQG61#e4fYM2nwq zo`cat8`6a^O%N$lIKm5`X7$bFuzs;xXh1_ZysZ`yeR-)62x1RBm)V&mGQ}vYMRkp1+644bdlmcvS~6YdEIql5Vb48^$50>uuP$4rZxw(4@taSiS< zZVdI>JukM}QD1RlQ=$F;SM~G_Rh|eC0U|&IhyW2F0z`la5CI}U1c(5N0PX)rVIm>Y5g-CYfCvx)B0vO)01+SpS2Y33|F7!iqskKjB0vO)01+SpM1Tko0U|&IhyW2l z5upA5C`=?o1c(3;AOb{y2oM1xKm>>Y5g-CY;HoA->;G4E^HJrA01+SpM1Tko0U|&I zhyW2F0z`lapa@X@kHSPkM1Tko0U|&IhyW2F0z`la5CI}U1g>fVl>cAV%}13d0z`la z5CI}U1c(3;AOb{y2oM1xfFeNoKME5G5dk7V1c(3;AOb{y2oM1xKm>>Y5xA-eQ2u{a zHy>4=2oM1xKm>>Y5g-CYfCvx)B0vO)0Ez(R|0ql(LK>7bw-F#GeB0vO)01+SpM1Tko0U|&IhyW2F0w@CcQ0h9AC>Y5g-CY;0g#({(l9q zNR$W=0U|&IhyW2F0z`la5CI}U1c<;@N`UhJtF+;$+C+c|5CI}U1c(3;AOb{y2oM1x zKm@LUKpbR8if@LWm@NLJ_-5f<1vUSl@~`Hrxwmqk$oaWa_6ym6l$A4omH8)`Bk8|O ze?0A`x1~OxdM&^-WlU2%NB5Y-G((ki#$3s5(!iTaI#nBD7DkGJ7mTqXetV&z~6?&lPfI?Ly z*)(M)`<`j|ZuK6dGVaQTWiVATxoS$f!-1J0D^j3x%kVAV^_f<^8>!6E1MbPpmMp_o zB;9mmiRrc~Ih^^Pqsh9b8C40XOz}+BfhtHr0PJ-eG`fD^NS0^IexTX5!JX<}q%vFe znV~2E2`GX2Fh^ouU`n2=7^-YBNAr~GT}WlB$3cs&OG=>ml5TJ=*_NkBeqgz}u3NUO zxYaw6$~<2+WYy3lTlK)sWM)Wq;4sP3l)!dT#ace80{XUGA*!V9eR-j1_zI6L-lOe@FgCY(3xD#cT}~y8>x($o@;7`C%FdW zlCC(W8!-1}<8omKA1KF(Jj#OrPT(dMakOI?%1~9oTIS!~bfutjA(9W(} zy$z|1D@^lbN0Bt$a=@S2zU1nDAekojOwS1v%~PvmNM)|$+t7)aWH^jTx+;SU(m}Tp zD5`7faL+QUJCVwK*VefUreUa-1`Pn+()IzIVal3ka%ifQ}A! z0?fd_`?lwpmKhkn&Z|3+%4ElvAtcz6se$Xz!4|-4IDur?+|xCeIm{2Lw<48+&4%VF zO9qo=XwAR?qqQKQIJT|@%(e{Gu5QOFl?DAX})GzUiBuVGE@-05vdFngl|A9Lj~ayQW+`; zUyoFV3c}lv%1}XgD^eLM2ya0uLj~c@NM)!Xya}nyb|B0u9t2?*MlZS@fbj<|bXCtb z6<3kNHJP zm1+*D3>DF{NM)#qo3ek$W@u<=pGJ=WiL%VsifWImO7Una=x z&umS9KmD2X2h#KD!>J#qzLfe<>Qd_A)Sl!|lV3}IG~OKj;ONEC6QjFhkA>BTgeD3D zHF#)9VNKQcU=+_`5b0Z{q$;j#JBIGcZooo8RdWN|hP>Y89CB0!*%1s0Wy!T5Rkgs4 zab`V*6|7+epTr8D!3sWs6?_~k_!w63G*<9Ytl%S9!FOT>r?G;ku!1K;L5!I_913FQ zt4@T1m;w56Y|)cg!DCp#qoE+?VZvzzl;AtCf=94|4~2plj)$>=hp>VZp&-U64upaj zjt^ps9uEaE-fRk6#|N;2_hSY3V+HTS3f_wq+=mr(u!1&L(83CuSV1Ec#8{7x71XeT zDppXz3d&f)d$59cV+AFw;NDOW<5CV{HQtF8tY8KAU#M~ z+=&$|V+D6$1#iU)ZpRAV5(;AM@n)>xO<2Jjv4S^X1xr}L>#>5{u!38$f?KeHo3VnM zu!7fN1&dh00#-1O70h7;vsl3lRxphfOko9+SiuBVFpd=*#R|qSf{+V~@jAv)xPAG5 zwfL3Mi?O$IUrv1~abNsTV=u%Wiz%^Gen;_4;r`6l1Rwbp+qHWy|x`xEbtez*AX>=Vhyqkj_l zLhjAfkF#G-el7n{`qt48#=jT+&D`s$4;8bSH*%HKo?ImP)AVNw+tS}pY>74spU%85 z@$KkD{;$~F|(K=|HsT}iTvLP49(MYN74eAKhwDpNX+pJ ziCG?ll_l;vG86f~q1lQWE>$^RxLWRM0qmi$T*-j#9G1fst}$8U|Lad$t*mK@{2x}N zOqH9!114-F-Gwb4F4HVnKU8eSEF~}kQ{?}ciC~fcE1nOljEV~T0SuVS_B`0Q;K0TO zMV4WCKY;q$vdI52f+GLN2#Wk4BPjBJ3`ddwWAKRlU(r?A9iYmR>8r5y05+pY%+y@y zGvTfSSh9w_B*LFyiWd1lrf8A>V~Q5}zYSX~U`7wtCKXtC)gj-NY!2HIpqJ~gj%s>d zV2S)6Q%8~iW9lgKe@q=k{*UPjBLBw-iu@lVDDr>I`kcuBF)pQ>|0DKRi2NT@w8;N4 zy-?);7$+t2e~b_B=KqLI45i{2$X@MgEWJt|I@( zjHJ5xKVtup$p0}bks|-ctTKxHAL9T-{*Q40BLBxY0FnP=_UUxWt}iDSZZ+H<=KmwbC&C2!c=2P!CvyKh`>%?BnEW@zQtrn^p0QHf zGG9smRzXUABIV^y=ii@g=CY}uW_RYll|PU^mU!Ptb>u&f{>#{3CNCzw8BZtg8u>uv z+34RV#-m#ze?GcnbT0lou@|B&X2gFOe+H zHjK}d(b_PM^&Ye~jQ718tqtR%CA2owKn|@9?hKcn_v^GqvPoTA7VtpK~4V93iwQV$VfK2zGP=wjD zhv}kwK;zpS7BVR}B1JbxqEE&2(b>YK!ruIU%)gRUMze*_I&!U)32qErrt{ZJ`~ma6MZT&iQ36%yRI5o7A!5>;kSRz-q z%us3{S{r64<)F1;hEg_K+eQP7rPBv2yf(ztgo)OMnVK+)*GImGiuIVJ7(Zo=u@L;k z8m3LVQ(>665V(rQEgufq(M&iW#OFS2Q-t#t;3ywM_TZQnKkzS!R&WB_S2YE0**=^- zVKdm|rofg!S%qVM6kqoJK*wmiD70bXg6sv%gL6ILC?E}nU8?HCce$a0fy-qD4$jb+ z;x7nowk@l^2?wsY4(vbCUD%rFm~gZRd}m$-Ph@x?ifPj}x^9@Edke1(ae&V}`bjaK zyouI^@#GDm4HE$|xy5X^Zis_IFl~y@QZW4#pA=*IDL##Td#7~X-YLYlc@hS3WE6h7 z2@_B8Qxlk;)tw;1_&3a`W*4NX$ov$sIqV_PvoLkT^m_clC}!GZ2c7@FG$%p-B?3f% z2oM1xKm>>Y5g-CYfCvx)B5>^z$mf0-*&O-RNba@FuVtL{E2+Or9!-`K|6`&!YQ%mN z^GE*ok?W#gjQnc!m167drttixTC%izck~6;VeTw%G&}X6?y*k2*=P^^a_Yd;#Q3R+ z@~QC$k4}`w2JVfO_lzwp)cvvYdDimIvR3)T)RAN3Q>V+-iPPoDYMZI;%t*aF&%!P)Bh>2#aV~@HP)$h>T|r^VRQ3iWw$<4 zZw$yS%=?#@t2j?3O2>9bBlU*QFSMVTt#^2hEp(dV_u9ad*OY-@rw=@tC_SRA_fb%C zw&pSKEU)oKr&Z_enzHuV$;ErmBuk1CeSW8CleH3SuS^ZL&RPL<6P@E1*YZ8jW*4AY zR%7QE=IbqZ2-X=ZhhRhYmBlSjBuhu6=;D6C>&U@JYk^}Muw(*fUaOYxb6W{q-I6`U zQCrPfUYqBwxq7=Dn%slE=QuKXaN^PO*v20oD<7XMkF8b_KIw|auC-Oli}}a9wNjRA zWx3q+UCT9`z%^Ak#=wKOI50)kz11qm*VbzN53gSSu`@r$Zlc%P}k4&B_ zj~%Mk)<WbnC9Y`gnQCP*`Y4#{ z&gkNG~h*8tKZ12iqUIOZ1V| zb%3|6z;X5pSK&<^zNN{&tk|}r`HZiq*}t|9>wj!m9aaKFrL4U(Q98VHy)Lp+XiZu9 z`GFUt>11i=&gjd#gzsFrv+~n@gI!_ehA^}>5vsovY}iFs+1>gN9;~)IQH7pk=r{lH z`W4&Ss%orn1J>$ltUTSI;S2M+(q1@d@+(gWCf`?1WpUFfFf=8)Xsj4JoJqqRM-Goc zabz_xOvg7(ID02(2ElB-!D}l`wr{P$$?JZ+YjA6otTFyOPIl{5TdtGmE3TuMjux1l zJF0I4@J1r8!mh}*>YTN8TL0r4)oDO=d%_KY9dWYE~x75=$9 z;<|RZCJyy=ke@#s4tB(KAFpdut9s`nClaM|6YIHPKF3=#yy0D}G0)@eHguQs^-ec; zs3{xWJq%xXephK?BKqrwFuILoH@dfF&=5BgUG`tgrqvH-We_tq(_)QI^D=3Q5aQs8 z`m>(Z=?bJFodqzPUQ)FB_OQ`&f3R6eYF0+q{r6XrnW6Xl`%C{b)q-=Y9e@ArvBB;DGKksLP);182vc0r4ZLan|LvaDAbmuD2oM1xKm>>Y5g-CY zfCvx)B0vOw`3U4=n<96Pd^S@2!(vdpvGAqBy9#RlKjmM|S95RWK9TctrR*27|0pYG z{wniNGDp&Xm;QL#O>awmKJ{Gc?&NPI4=4UM@zKOn@Gig4#V^M9j(%(OACFGN{wDT& zu_s49JM!$vozZVbUx^-wyczkh`1`X1h;16Vc^dO23e1^ARTW;Lh*5_5CUR9lD#Lso zyecD=c@~^spv!9br9pW2bD-#wZL07dR`_Bdli|#EcuPR_9;7nNSGuZqBb8x}BdSVB zWtgwTRQDp4VGbioz7aWwG7ZdGMAbWyHN$+s*QD#Lt1vO0!ThWTb*bth68=F67VGEy1l{FCYq zq%zD`->SDFm0`YtU)_#XhWG-0^%kTu%=hmh;vSpEd?_7sGGO&4s2N5XDhS_*RE7$| zHz1Xvf^Z3`3>Ad0M=C=F;cZA|s35!*sSFi_w;+{af^c;+QW+`;Z$c`=oCjFF4ygDE6 zNM)#q9!DxeMf6dmGR!$5)fiG4YIrb$RfZWJM3Krc!-G7G4=S<#=mIWhh_yBvKj5i))|^V`r$rH_d>-A)=P8 zTbAsq95zhLhGj4nj=fS%Nq0CL&Sk(mL<1Gxg6La5yf;*PduPBNL7E2UxXkK1k;*V3 zp*oFJhBi~Xe>8d`_SKO;%KusV z1IfpW-^jj{d~xJGiEod7adda=BO`wN)p#?0Xyo2xy7+QdOR6KA3p1JhiT6goTl{$U zZ}c~Fuctm#%x2!mRZ@F$k>pR)pDAohe?PG$+9-TF^S;ElqZ9ep()0Nrocm%?d<=$}L?m~4@aelYST#?YSv!7pR%t_FgyW32s2 z5PS~fm(GCT6vi7q0fH6Giyj|`_1-APS3K4ggb=5ivSctBjvY1wINDc+H?RAStuGxq zeL57x#F9sapk^zo=eUyNY49QkPYWamzLX{zT+uBDzS^rX`H@f%(*xca3S!0)(?SrD zS)2+5F~jMTSiy&}f+w(o$3sEPP;4?3#Nat5iq=(I(^XkA;e{Gf_{CR=nVKu9CS<;b zDeJJ8T&PhuO`pNOD9Ld&2FI;yy5w4LWVvOVnqve^wGH;PC>jn5F_;U7oih#QAS^hN z9S-G?CEGV-OM@N-pQ?B3czOS5g@Ty1wpmd}INm@B{UdkaA6;VxG@%A>s^8GPI!ibe#@U7;YRyWXCCBJw(B$aNbC zK8G1ejfF*H#%4P~V+FGkSq?Q~RvCA6pZf9+;MVNNaAULWp+?NO=a$@?(H)q5IydLu zjJ%0i2Dm9K8neIV#@y?`(SrfDrZe!0a=7Qzf|otGu=^Co3|z4lIAzIjZwNJF_QjM! zLCm!K_3$ti%zl<_p+<~L*_wYSQo%TYEulut9+S=aA4HzR>>t@A@c61BtA-}Q!8$PH zlEK;Afx{$AQ{ZqNKOA?-*MUZqrznORF`lAOcqKB0*{_i=d>V?Db!M5C4DTp`mx1Wa zg)xNVJYC6(e!#V1lHidr#Kc%$&C z!uygRN$pO)RR{|E3tRKw&wnQWf&6^_aQ@cZk8@wjeJFP+_i%1c_NUpeCBK^eX!gbI z<5@ME&U`!b$;^8*Jab=WOZt21KTW@yZl({Vx2JxT`eN#Xsf)=Mk|`*X{ty8oKm>>Y z5%@(B2;(K@{b-l4f)_(UOR*T7B&tiy3N%R8HBVx2I-&$8C0d#ZGcJa1Ucd@I8wz5^ z!R=5GGsb)-6vT|*nnELDzuZ}@;7llpnT7X4LCjO%gB8492r5kTWJi%Sm{o?U9vj}5 zr~83qn%pxzCr~s`eF`hM4=Z>ZRxlk3Vg{o%te}k*+=&%ThJvWM46NXFLJ;wNMHwq7 zaz|7u6KX`yw_pTCx`mmdcv2MY_%_VPGRbflOg*YHWXw94rvg)Wt_d%-wk^}a3W`Y& zOwl6e!8m|3qG&{>cRyB8Odes17P%vO-U>5Cp@wzD2;LY9V&*awte}|mK+iH^1VxgG zne@0@)Dhl{?#axSECc5Lb(krYm~N|*!5#j>Npcl;C_~1J+KMqj`#$Ji^36 zH>@K@kcEQy)n3FrftiUZk$WOPjKu#mmKyoi$RCZoXT%@5cVu()yU{<1{${ihorvBN z`C;)Juv-6e@k~)KW((gbe7f*TVWx0@VO#zO`9I6QmVYMyP<}`5&D@uBujii2P30=N zNcQXTSJSt`Zh{|;ei8N%z~AKKNi~^Hd^_>U#CsDwaUYx+@V)q<*jur$#y$d-_(Jxj z>=Rino5{S9`Bdh8nIN-2vo-zw^k>o^NYAGar+%FJQtCsgOR0xbd%}GR$&bdHqaPf- zIC=th8ax&bA3;Y2W>8?#12*uQstvEC)nP3Y4yraKRdHq8F?3gU0|61UwMmQ&$oMc?*x1x{!7bso%tU1VIGekitfNzxLE(k z2#WQ8jNs9*WiT5R#ri)+P^|xB1jYJ4Mz9-X5brM*>;D+whr*}E2u{EzswoUdvHp*F z7_t73DO#-mW6W$SeK@9L>L{W*MzA|3M0i}W{*Tcp*8eer_l7Nl5fmvLMzA{wM?8#3 zxG)+mY#mLkpjiLMSdSiR#0ZMf5k^pqtucaP$czybxgJJPOaNd6#Yh+sbl)e!1ubk(;f&xvHp)KdI$DlZp8|U^?yv!w}cuoQQ>B+U^nYQSh&cUF-411 z7$Yd=a4>>mVhDAxZmf@1w2BN)Tt5$pdLjp6$Lf%rrOR{1}Y zZYDOz|0MpK@riJKK5=jItKqJIa7Vz(et^|G0g}qvy#O2T1nAobkUEik3-$s$miVK@ zdlG*9yYa>^Y8i<15&O1J{+IkE}|#45h*`+ata1_#qJG%>RwN1B+~5RaIc!9)eI_=pjFICKCQ!C%l~ z52ok?*gDdZ!iFo-|By=x;rV~%#8Z*Nmxi40-#gVW@l@~a0Ph<9W`M*;3+gXuWKC*` z01+SpMBpkVP@RF3Z!i|8#6Ce0^T^7>5G}m<^jCEz39Hi@UIQ zF8rQ-`1Mp~m<-MVfzuB(t}@s4t8{ED9325$Yb`h-lruPY;qu$Nt7pJyF*|fHyQZs8 zAeCV@`c@xDD#L6!tv-fT=5fu^)IbVM7Y?v6xee!Xz>%MD(v0rN8rYqyR!^gqL85Y* zgNmvbKpAEZ0Q0q;>a(B>b@dsfGR&Uz>O4{z=0JgJ6UhwaH5y1|n8OpQmqKNTX=qdso&{x?xdzMu2h~SG z8OGCMPA#iG4azWH19Q4iwT@(lIozXq7FjdQkSbjNzd8B2NbwJfe)0Ok=L?q#d-MM> z`MLZn`3G}9N^Q;kZtl@sCi}>Y z5g-EB1c76t)3}W#n5^UiS{r6m{0v$fX7qm#UK`>hfZNd8FyGnViPnbtc0FDj=9~3s zZJ6)CSMb^p6C`7JZHRBG-+|VK`tmtmn+C^s>K=SeS~K8GHwFi>I<~LF7mc~=DhkY? zDS?XChWd6oUYiSb@I5$oz%k&95}q3#g$m!6fbT0hrUj=v!xt9Icx{L;o8OJrhWh?E zUK?T-`7B-=;(Oy7UK`>&<9pHCFw?ajS{r7DZ#!NaVv6tfE6{fNIlf!b+Az8QgLrL- zW6i5*ZJ4Qqr}5elM+)DPkKP=)Bl3wz@t+kB7QR(@uCP7-uk&s`k^85)`?6oj&Su`q zyg#!m{pV>n_0!aEr|wVwyX3o)+Y%p6+#mnT`0VIgqpytK75jWFfYSp$JaRbtM)VRW z`@}DBP<6HvpMF5oF!PSwuXmcQeat`48Xos0?=1Ju&DPr;RaW63OG}cCvTW^>&3!7Y zd91kv4^gXV8s_L>Hb1{FsL%4Y8L#j6fR7lLoPkFQ{cgzCGR!o=9>-P=z-t9~BNv|!%3h4~?xhg_=P6rUc~;Fuuj_?I~sdZ4hGD=+Hl8{^Xl;G{i7vNKSW z-)hdg%?nrbSZ8k#F$R;64wS{AnP#u3q(@8f=^X$NF{ECOF+x*OHXVSUK6vR)pH5$vz%jt3ft24X%3u+t$1)+whJd*>2?5L^A6yR z2Zm>ximS+a-~~PHo#r_X;gK!OB4a$;EQ-J+$12q{wc=OI9bTwJGehb-!PGV zrpYcMVoE5%^`q>T=LUm_=Vt69jqMKZs4ySQK8>z+=mJf*-kfQ%`Lh>?RCmZFFD9ZO=7oRVGTO~q)~a8EY|)2o zYly}nmmVL9Pw#?$fH-fjhiRd+&_bq(XQHBsF=zRAmCx1vMt$ZiG607A|6_$ejTC>Q zD8ql~4-p^&M1Tko0U|&IhyW2F0z`la5P@G#0&{!g(??)7&{Z^U`EanmX2Q3Md`RG# z0WXN<3hd$V;5D&+;P)og78vL z^SpIM)45OIDW+R7U;61iQhUK|d#(C>r`~Kx?Xxh0ft}h7^Z&?ozno1=wITvUfCvx) zB0vO)01+SpM1Tko0U|&I-W~$s_x~yXe|uPx79v0dhyW2F0z`la5CI}U1c(3;AOgRv z1Ze&Lm$hZ6UPOQh5CI}U1c(3;AOb{y2oM1xKm^`C0<`}B_OT>QM1Tko0U|&IhyW2F x0z`la5CI}U1b$fwQ2zhR+A>rxB0vO)01+SpM1Tko0U|&IhyW2F0&gFI{~sbJ>iqx! literal 0 HcmV?d00001 diff --git a/packages/auth/migrations/mysql/1688540448427-add-notifications.ts b/packages/auth/migrations/mysql/1688540448427-add-notifications.ts new file mode 100644 index 000000000..f79e707d8 --- /dev/null +++ b/packages/auth/migrations/mysql/1688540448427-add-notifications.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddNotifications1688540448427 implements MigrationInterface { + name = 'AddNotifications1688540448427' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + 'CREATE TABLE `notifications` (`uuid` varchar(36) NOT NULL, `user_uuid` varchar(36) NOT NULL, `type` varchar(36) NOT NULL, `payload` text NOT NULL, `created_at_timestamp` bigint NOT NULL, `updated_at_timestamp` bigint NOT NULL, INDEX `index_notifications_on_user_uuid` (`user_uuid`), PRIMARY KEY (`uuid`)) ENGINE=InnoDB', + ) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query('DROP INDEX `index_notifications_on_user_uuid` ON `notifications`') + await queryRunner.query('DROP TABLE `notifications`') + } +} diff --git a/packages/auth/migrations/sqlite/1688540623272-add-notifications.ts b/packages/auth/migrations/sqlite/1688540623272-add-notifications.ts new file mode 100644 index 000000000..5fa10601f --- /dev/null +++ b/packages/auth/migrations/sqlite/1688540623272-add-notifications.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddNotifications1688540623272 implements MigrationInterface { + name = 'AddNotifications1688540623272' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + 'CREATE TABLE "notifications" ("uuid" varchar PRIMARY KEY NOT NULL, "user_uuid" varchar(36) NOT NULL, "type" varchar(36) NOT NULL, "payload" text NOT NULL, "created_at_timestamp" bigint NOT NULL, "updated_at_timestamp" bigint NOT NULL)', + ) + await queryRunner.query('CREATE INDEX "index_notifications_on_user_uuid" ON "notifications" ("user_uuid") ') + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query('DROP INDEX "index_notifications_on_user_uuid"') + await queryRunner.query('DROP TABLE "notifications"') + } +} diff --git a/packages/auth/src/Bootstrap/DataSource.ts b/packages/auth/src/Bootstrap/DataSource.ts index 4ce9d5104..5cbb1dbb7 100644 --- a/packages/auth/src/Bootstrap/DataSource.ts +++ b/packages/auth/src/Bootstrap/DataSource.ts @@ -18,21 +18,26 @@ import { TypeORMEmergencyAccessInvitation } from '../Infra/TypeORM/TypeORMEmerge import { TypeORMSessionTrace } from '../Infra/TypeORM/TypeORMSessionTrace' import { Env } from './Env' import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions' +import { TypeORMNotification } from '../Infra/TypeORM/TypeORMNotification' export class AppDataSource { - private dataSource: DataSource | undefined + private _dataSource: DataSource | undefined constructor(private env: Env) {} getRepository(target: EntityTarget): Repository { - if (!this.dataSource) { + if (!this._dataSource) { throw new Error('DataSource not initialized') } - return this.dataSource.getRepository(target) + return this._dataSource.getRepository(target) } async initialize(): Promise { + await this.dataSource.initialize() + } + + get dataSource(): DataSource { this.env.load() const isConfiguredForMySQL = this.env.get('DB_TYPE') === 'mysql' @@ -60,6 +65,7 @@ export class AppDataSource { TypeORMAuthenticatorChallenge, TypeORMEmergencyAccessInvitation, TypeORMCacheEntry, + TypeORMNotification, ], migrations: [`${__dirname}/../../migrations/${isConfiguredForMySQL ? 'mysql' : 'sqlite'}/*.js`], migrationsRun: true, @@ -104,7 +110,7 @@ export class AppDataSource { database: inReplicaMode ? undefined : this.env.get('DB_DATABASE'), } - this.dataSource = new DataSource(mySQLDataSourceOptions) + this._dataSource = new DataSource(mySQLDataSourceOptions) } else { const sqliteDataSourceOptions: SqliteConnectionOptions = { ...commonDataSourceOptions, @@ -112,9 +118,9 @@ export class AppDataSource { database: this.env.get('DB_SQLITE_DATABASE_PATH'), } - this.dataSource = new DataSource(sqliteDataSourceOptions) + this._dataSource = new DataSource(sqliteDataSourceOptions) } - await this.dataSource.initialize() + return this._dataSource } } diff --git a/packages/auth/src/Bootstrap/MigrationsDataSource.ts b/packages/auth/src/Bootstrap/MigrationsDataSource.ts new file mode 100644 index 000000000..b69bd4497 --- /dev/null +++ b/packages/auth/src/Bootstrap/MigrationsDataSource.ts @@ -0,0 +1,7 @@ +import { AppDataSource } from './DataSource' +import { Env } from './Env' + +const env: Env = new Env() +env.load() + +export const MigrationsDataSource = new AppDataSource(env).dataSource diff --git a/packages/auth/src/Domain/Notifications/Notification.spec.ts b/packages/auth/src/Domain/Notifications/Notification.spec.ts new file mode 100644 index 000000000..d13419425 --- /dev/null +++ b/packages/auth/src/Domain/Notifications/Notification.spec.ts @@ -0,0 +1,18 @@ +import { Timestamps, Uuid } from '@standardnotes/domain-core' + +import { Notification } from './Notification' +import { NotificationType } from './NotificationType' + +describe('Notification', () => { + it('should create an entity', () => { + const entityOrError = Notification.create({ + timestamps: Timestamps.create(123456789, 123456789).getValue(), + userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(), + payload: 'payload', + type: NotificationType.create(NotificationType.TYPES.SharedVaultItemRemoved).getValue(), + }) + + expect(entityOrError.isFailed()).toBeFalsy() + expect(entityOrError.getValue().id).not.toBeNull() + }) +}) diff --git a/packages/auth/src/Domain/Notifications/Notification.ts b/packages/auth/src/Domain/Notifications/Notification.ts new file mode 100644 index 000000000..30ddd85ee --- /dev/null +++ b/packages/auth/src/Domain/Notifications/Notification.ts @@ -0,0 +1,17 @@ +import { Entity, Result, UniqueEntityId } from '@standardnotes/domain-core' + +import { NotificationProps } from './NotificationProps' + +export class Notification extends Entity { + get id(): UniqueEntityId { + return this._id + } + + private constructor(props: NotificationProps, id?: UniqueEntityId) { + super(props, id) + } + + static create(props: NotificationProps, id?: UniqueEntityId): Result { + return Result.ok(new Notification(props, id)) + } +} diff --git a/packages/auth/src/Domain/Notifications/NotificationProps.ts b/packages/auth/src/Domain/Notifications/NotificationProps.ts new file mode 100644 index 000000000..a30408418 --- /dev/null +++ b/packages/auth/src/Domain/Notifications/NotificationProps.ts @@ -0,0 +1,9 @@ +import { Timestamps, Uuid } from '@standardnotes/domain-core' +import { NotificationType } from './NotificationType' + +export interface NotificationProps { + userUuid: Uuid + type: NotificationType + payload: string + timestamps: Timestamps +} diff --git a/packages/auth/src/Domain/Notifications/NotificationType.spec.ts b/packages/auth/src/Domain/Notifications/NotificationType.spec.ts new file mode 100644 index 000000000..c8b9e4c09 --- /dev/null +++ b/packages/auth/src/Domain/Notifications/NotificationType.spec.ts @@ -0,0 +1,16 @@ +import { NotificationType } from './NotificationType' + +describe('NotificationType', () => { + it('should create a value object', () => { + const valueOrError = NotificationType.create(NotificationType.TYPES.SharedVaultItemRemoved) + + expect(valueOrError.isFailed()).toBeFalsy() + expect(valueOrError.getValue().value).toEqual('shared_vault_item_removed') + }) + + it('should not create an invalid value object', () => { + const valueOrError = NotificationType.create('TEST') + + expect(valueOrError.isFailed()).toBeTruthy() + }) +}) diff --git a/packages/auth/src/Domain/Notifications/NotificationType.ts b/packages/auth/src/Domain/Notifications/NotificationType.ts new file mode 100644 index 000000000..6533b0817 --- /dev/null +++ b/packages/auth/src/Domain/Notifications/NotificationType.ts @@ -0,0 +1,27 @@ +import { Result, ValueObject } from '@standardnotes/domain-core' + +import { NotificationTypeProps } from './NotificationTypeProps' + +export class NotificationType extends ValueObject { + static readonly TYPES = { + SharedVaultItemRemoved: 'shared_vault_item_removed', + RemovedFromSharedVault: 'removed_from_shared_vault', + } + + get value(): string { + return this.props.value + } + + private constructor(props: NotificationTypeProps) { + super(props) + } + + static create(notificationType: string): Result { + const isValidPermission = Object.values(this.TYPES).includes(notificationType) + if (!isValidPermission) { + return Result.fail(`Invalid shared vault user permission ${notificationType}`) + } else { + return Result.ok(new NotificationType({ value: notificationType })) + } + } +} diff --git a/packages/auth/src/Domain/Notifications/NotificationTypeProps.ts b/packages/auth/src/Domain/Notifications/NotificationTypeProps.ts new file mode 100644 index 000000000..38c16ebc1 --- /dev/null +++ b/packages/auth/src/Domain/Notifications/NotificationTypeProps.ts @@ -0,0 +1,3 @@ +export interface NotificationTypeProps { + value: string +} diff --git a/packages/auth/src/Infra/TypeORM/TypeORMNotification.ts b/packages/auth/src/Infra/TypeORM/TypeORMNotification.ts new file mode 100644 index 000000000..48c9a4d34 --- /dev/null +++ b/packages/auth/src/Infra/TypeORM/TypeORMNotification.ts @@ -0,0 +1,38 @@ +import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm' + +@Entity({ name: 'notifications' }) +export class TypeORMNotification { + @PrimaryGeneratedColumn('uuid') + declare uuid: string + + @Column({ + name: 'user_uuid', + length: 36, + }) + @Index('index_notifications_on_user_uuid') + declare userUuid: string + + @Column({ + name: 'type', + length: 36, + }) + declare type: string + + @Column({ + name: 'payload', + type: 'text', + }) + declare payload: string + + @Column({ + name: 'created_at_timestamp', + type: 'bigint', + }) + declare createdAtTimestamp: number + + @Column({ + name: 'updated_at_timestamp', + type: 'bigint', + }) + declare updatedAtTimestamp: number +}