From 1c5b37b24b018a9fb6c12d31943ba15818125632 Mon Sep 17 00:00:00 2001 From: Baobeld Date: Thu, 2 Jan 2025 20:11:27 -0500 Subject: [PATCH] 12 implement twilio sms (#37) * add twilio sdk * add twilio config use app version in config * remove default config * phone regex * bun update * create client * fix env var * create Textarea component * move TextInput * allow snippets on labels * update with label and error * move button * make button children snippet * add form props * allow region code * add twilio FROM number * rename to twilioClient * implement simple messaging * add twilio phone number as empty var * format * move twilio client to local on requests * fix story * on second thought, dont use locals since we are only using twilio in one place Don't want to init a twilio client on every request when its only used in on a single page * use i18n for page text * validate env with a script * remove Zod validation when loading env vars --- .env | 9 +- bun.lockb | Bin 325745 -> 332368 bytes messages/en.json | 6 +- package.json | 6 +- scripts/validate-env.ts | 19 ++++ src/app.d.ts | 1 + .../Button => Actions}/Button.stories.svelte | 14 ++- .../{common/Button => Actions}/Button.svelte | 10 +- src/lib/components/Actions/index.ts | 1 + .../TextInput.stories.svelte | 19 +++- src/lib/components/DataInput/TextInput.svelte | 99 ++++++++++++++++++ .../DataInput/Textarea.stories.svelte | 51 +++++++++ src/lib/components/DataInput/Textarea.svelte | 61 +++++++++++ src/lib/components/DataInput/index.ts | 2 + src/lib/components/common/Button/index.ts | 3 - .../common/TextInput/TextInput.svelte | 68 ------------ src/lib/components/common/TextInput/index.ts | 3 - src/lib/regex/index.ts | 1 + src/lib/regex/phone.ts | 1 + src/lib/server/config/index.ts | 24 ----- src/lib/server/pothos/schema/index.ts | 3 +- src/lib/server/twilio/client.ts | 4 + src/lib/server/twilio/index.ts | 1 + src/lib/server/yoga/context.ts | 3 +- src/routes/app/+page.svelte | 2 + src/routes/app/sms/+page.server.ts | 49 +++++++++ src/routes/app/sms/+page.svelte | 68 ++++++++++++ src/routes/login/+page.svelte | 6 +- svelte.config.js | 3 + 29 files changed, 418 insertions(+), 119 deletions(-) create mode 100644 scripts/validate-env.ts rename src/lib/components/{common/Button => Actions}/Button.stories.svelte (65%) rename src/lib/components/{common/Button => Actions}/Button.svelte (89%) create mode 100644 src/lib/components/Actions/index.ts rename src/lib/components/{common/TextInput => DataInput}/TextInput.stories.svelte (76%) create mode 100644 src/lib/components/DataInput/TextInput.svelte create mode 100644 src/lib/components/DataInput/Textarea.stories.svelte create mode 100644 src/lib/components/DataInput/Textarea.svelte create mode 100644 src/lib/components/DataInput/index.ts delete mode 100644 src/lib/components/common/Button/index.ts delete mode 100644 src/lib/components/common/TextInput/TextInput.svelte delete mode 100644 src/lib/components/common/TextInput/index.ts create mode 100644 src/lib/regex/index.ts create mode 100644 src/lib/regex/phone.ts delete mode 100644 src/lib/server/config/index.ts create mode 100644 src/lib/server/twilio/client.ts create mode 100644 src/lib/server/twilio/index.ts create mode 100644 src/routes/app/sms/+page.server.ts create mode 100644 src/routes/app/sms/+page.svelte diff --git a/.env b/.env index ac58967..a706777 100644 --- a/.env +++ b/.env @@ -1,2 +1,7 @@ -VITE_APP_VERSION=1.0.0-alpha -DATABASE_URL="postgres://hestia:test123@localhost:5432/hestia" +# TWILIO +TWILIO_ACCOUNT_SID= +TWILIO_AUTH_TOKEN= +TWILIO_PHONE_NUMBER= + +# PRISMA +DATABASE_URL="postgres://hestia:test123@localhost:5432/hestia" \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index c3221952534e40804646f95e622d766e0dda23de..4d06590e68297bf3e2a146430ddcdb089b31356c 100755 GIT binary patch delta 67788 zcmeFad3;UR-}k-GP7c}8Am*WJCTI}TIY~GXga|>5K@A~C5;Dm^q9vi#5|ngT7e$p; zYpAxWeuAo@)kaE*p{1>swu+)?t3?gZ=d;&3X?op#e%EzB&wX9b^GEl~H=p%=ueH}+ z^Im7#Zd|W^^wk{Rh-U#j89wQwX;t87DfOgtA)P;X8&$C3IEe-84Q0W)C~XPl`E{Uq3>XUB zM=4mcOn1sOcZQ}-o-V6;5TzlXJRQx0V-%`U9e#IcJ!pz*k$Si=3-Bzek1X@!-4n7C zkUl;xcQTX2Wxb zAZxNgm;5Ct3-$(@jRjf@Wj=l3umua@vq0(Dvg@j#IoJhhsT18Ohc-PUFD^Yj7k!R| zZ0gMP85pa$BP@n`F6T2ts=Xd~#$ zO7oS*K^ubiP}&Uo2>c34FCm`>@DC|{8~QN(yrl>rP5xZu%BIcAOir4Bl23!r3nxKY zgA{klB=+5&#iqFg{L8oF56^qKnJjQV6iM^PEA6hdF%$*P%hzQf|9e!A zCH_e11}ICsP-!}pB_0N4fkTuwg7U)2*%LW?wLe!l`vjC`NR+c+no8r!$#tJ2b$#f%-js`Qj#9#nR?P$RU>sWj5IvNr7A;)3Z~t&cwSbB3llTJ6+`YKR}tT7|J=aOL2ST zU*k7`iMT^vIXLz<>Wa!Kn{(GnVIg)iRc;l zZ0H+^=LN0Op`k~Bv%q~-`t-ESES#gAKu58FmBCrD)VS2Nq+}hZ| zSXMZxh9ba(y`hz%cVeWUo-_$lOVfUU&l&})44OdMlXajx@9UxRg5Jtc8YT-mAtP?0 z8(no4KGU@rF7wZUvLbg-Ar~Vqs+y&^GZNe#{v6}sBV-NrSlI$W${z)vO?^Jr+*q-N z@0TNGzV1=x7Zo4L+cR1gH$5o>^B_}8nZZhE+DnhgVrM0~Q(3d8m0t*Dd%cPC{GrzT zL;BdU^2QShWjp(hljnDX&+7ArmmZgy`5&fuUVbMeVEs0YmnXgiucU0j&r9Jyr6r zp}g8&=p)dT&}PslppBrh$`4WTwV}8{<=;%vv?kEcpbeqhl`e-epP5ixFE4+ris&Ih zeoH8;>CT*xos=A}P0o=^!w4uRP){hwaggE-lwT2A3;fsVGTpb(YVbdWGJO%0@vka> z5!9Nw(^W(~louGJ61bquptbUAK$(FJ%5+!I%xw2lP+nj^l<{vWeNDX0r4-B{JMOTKA`9ewj%b(~y;>Wu;}sC1cZ< zlEM9`rrl8qym2DuQf6E{sHUZ4SOZMEff}#{;@#8YlC#~~#I&?2Nl5WMxF7g4P!@c} zGx9>;p`fflW@21huKG!-iSCS~tV}FTX2*wW=AD=?Z=21bJpXKgY|$f7UcUo4^D9{( zTQ~teTYCCJ*`j-pjt%nwKGVOY{FP9a^FN;dF3xWRE}+<7Bvm z9W?D(^aNY>Db*uW(L*foq~$0u#z6iF1eno<7iCi)hccrDN^3z`;$2YIJO;{^*$idZ zOoX!FtCgPt<+9No%JXouN{YuVAGfxw+;q3r5u62T3C&}Z#Jl6&sacvf1|{Q#pIR-~ ziThAykOO79jBJb|jK#^BX{nu|c$I>@<227|nVp)RoSl%Ax_*spQO_9l#NWqQWWhdL zE4v1hCl9ZKv5kI3_W27?w!}p!o4Cz7*~ghl$aPYhb_%>IczPUeK`1~8e73+EC~K6Q zmW}#p+Ix!Mc}?pC;*yYFV}_Vdnzi|KPfc#WUY^hx%BEeQ zGMElE;J>p$a!!Aq?^!VA!uIEa=ULx8>z8Mp@~mGy^VACJSxG%Bre~$}EQp?k(6iuq z7CO($>{)p|3#n(J^sL~X72C5idluMgo|ST9+(cGHOMS(>Q?*4@>N|4Q4TG}FzTPTt zJuRUP;eQ0>SiFyT4vpUM8$o@coTc5s8GrK~bFzQiymi}Ud#Ts>8h6ILTI(Hhgsp?J zohPMb1iIrUCU)2<+kYiE+j|@Q>d@A^WVW@S9H~zuo^#3do}By-!{>mg2<0O3N0C*$ zy!;IJ#5j($6T4-C5~wc{a4(*e5~uBh&kLnzq+!REsiopXE(&9z9B~z)%=jKE!t>J7 z-KneqUTsXzL{(PrmFF*pGW|8AWBO(L$eS_aq)c2#dt|??=>aG&kOyT=rtCL=uGS^* z#K+RjD3c>*XP^@H5$kbD*qAhFTq0e=b|% zGL$?yEj}(Y5vyQgT=EnQg~7;(JsJpQfjx_iXL0f@a-PNLI?iE57knYdbar-9Jg$$$ z2~Hq9j{2lXU}RL?75%$$rk?1Vl0{aN42_)I9r z4%Y1Cq=dvQ&kIA(3q3h0@WL1Qa%_2C&>jD#jw~r=VFF%cWx7+RW+!F1GlI{XA+=iM z)kFo^@-O`$^G{6+#H@B}{Vzzq6r5e^jdbjRMi=E!s0HPDnQ0jl`AU4nC3)S~6-P0dUta#o%d*9vRyq~Ro)`yZ%VREB7Y@HF8)6oe1+vB< z;(UIR7k;4lb};trN+=tC_ceK*XE(YPJ_{~y(0Q8nib}8u%C66WvH+>bpb>PsdqR5L z#3@?qU*xQ63}pfK{4BfvA^1$6<;LrB)cnI=Wx<=?lr7-7Q@;t${6|AMM#FwXJg%Rw zAp>^VaR6#DBcPr)8y5a9XQAiKhDlg;1M!Z-AY{aJp0|nKy(Q1jic621kc@lif5`WD z6qp775z5(o7@F4r0rxZv@612nB$?1%Hql#1z%jZCS`GRnv>x=-U0I+Hpsab?J(+$p zeAe(Ld|sdcepBcaXhY~ol~1P!@`kqV0VYQP6CeV^H2dj!rE?sA`AdHaeh?hZKBvi8c~ zXZs!vs~Wzf*&SQ1x9!fo+Br{7N?G;GVZU0pMqOWccIG9&iA^(3kH6dER>r)(6-HKw z$nEjsu6+@HSKjKjrpC5m0eO*O3yk?uXOFH}UQ%yrN>QbXD+>=bee#F3_rhWh7A1=1 z&7&K?{9)Kv)$6Q&eEFjFLp!|lRt57!Q11ne{cfziU7^9UcVF1>@K?vi&GlsXLi1vG zcC{fNwC(zV`(nY6;huEUjx1Tzf8dGZKHX*}Ja_Q>cU~^tnO<5s)%NUjExY?P{<7WJ zmSY=VFuS*`6Y%Q0AD-Oy`Qpe|M*~WBcDh`! z^dU1gAaZNfdima4Uw)*$%{EQC*%qnLF#{Y%3cP`qR~qTCzX$Iz zs}6N4YucmW=;C1xqZd5Z2suPJjAiiHQWdNkoq*Q?o;L@IUZINVJHe%gR57Doa~UQk zYcIsv%)$?xK5*D6NEqSJTURxGUw7#VRn4f^UB*jQ%NjPxVf+kFo)&|S>4F=d6X$8x z1ycRZsP!&=yT9q%$z}Y3xG=skUHM}U{flqc(& zzM(F?X+1M4)MfX=qV6`MLqqL}2#vEsAD4w%;1(d+T!hA0vEP=3!XDAI(H48LEOZm0 zkro?(`;!d4j?f5;-A8B`L;BK2W`WD4f7Zw>f%r5weZyROpT=esWKmXbAH$zC(zM4n``v<%4FZO_>+a9HlSwp81RS!(Y6J7N}iW z%C&#-9>5!27B{M8d2buMkt)vV6Y!^li3V>(*=g^?8&>93Z<)gg3+!r|)WI7W8r% zm0EiSX5q6=Z#Z2|zn8lDFd&m+44r|;L65p)VApJ8mPEJ=f6Pb+U{x~)6FCwdhnbv| zXW)&3hh+k%JFp;g24Oh~a~O}q3x}tfF$qpvpc&Q2Wjxka)1qaHP7d9_omtYyrH^lC z`bN6!OWIira73tntesg9>C)@BH%lU2Mpk>dC}Js#bQu3qo;6SOTkXw)zAk-ukXZuR z8)W)Mxr{DY7`Uq0Osv>;0dEvn7yU*DvjovW9X$R|41 zee$)cl>jdop52HS%;+o|pd#m!{e5^&Gdd(x_v&I6 zL}M9nm?hCJBN9!_@?nJ!bLdN)X4C+eu@{gXVXZgzyYx&y3~Ohw={wM6WS{_?>xjmR zxgK6`)2~aY@e@K^-Y^p#4&4!A`VMj#FMz1Luy7uO$6k@^Of8h1Qy#a1J`VeEco|mX z6o;BoF)qUg=kZkB`>?k6LXh*^x~e{>tLZz~W&BG)xe)&fuWS*rcgM_evC76QhHz>H zs|nwO$AN_=9Ov|g)5VMq4mCO>h0LF~YlPS=KGqor;ISayW=y2hCrn-hwH%CEhM6Tp z(IkL884xS`+hJzZFqiS0N{QhS62r)aXm4}=@aL_mCUfj;?KfoJc z9_|!s?}XtRV)_jZ)eFN--w_xU0Ek7A(4U5156`WHr}cq1$f~M9hy_8fW7vNWkGD~| zkUM(H!D~$rdoDbuwRV4k5bs}dk8!We<1}iA-eMeXS=@2JWA5lM+OGFAdUW+lP+w%>w>Vh#v3B2g-gUAE`|hyFxw)Auo#{%&tG>M@u7 z4&p-1!(r%>K4r7^E2lS{Vb<{Yq>mXj#-&$_Gz-SKjQ;2+Iko*CbLfjAP2aIDy%cd6 z-4*)EHp3!-HX9F*!vl5M;PipRQ6LNd>7NPFoGqhp8k^IefDkrf5ux^X5DKvd$`ypT z236+R(3|!%3&y+bqx)%EUvtrzP<=-~(>Kngd-XS?;!wK&@;+u&)Yt)!3znBz*x#X7 zj5edNQ`it~7EHi=MZ|E#Rj^iyui^DFqjz`p!Q5v{$yIGUJZ6AFBoGmCb`pVnEY!ZM9 z9lF<8Gis{Ko;nt{B94D!KSEp)(eT5aKI3FQ7}XdhL&lj=87|`uKo+^8wN!i$F9e>! zMlv25?^%erRK&w$oSX)`#+wD1F5{kpKGvOWUtIa#`vYEAoPfE3)59l7PxkXncw85; zCM7$JZ{VSGSxhv0=ZUhMavA5>5O`T1(|@DW2M)8u@OYuj!3_dE(L7$}XpI0P6COvE z+?Q^L$I*ce0LIZx<)K{Ij&yX({H^xXQ`~03beF-2gXzO&MNm0uHct?5GEnh#IU>4-M3`e5u4on)nIL(9iXZw5&kGWfM zdjBM|WQNO_mn3^fF5P?KVIfcr+F-IQxNP1L@EB*!NBzWP)AtEefmw-x#vp>bBIOO_|J6d`%W&j`t~^vm|dZbV2juW8)8 zqXdQ|kF!hWc?;g3=kk_Ws4{Nas_yQ=J_tXKd*P|FLB*xmd|A& zygzGu3?2uQyxzmJ%I6sm@6W5h{g=2~@cz7B*F3qz;>P517$@MlkSFE@Hj35q&4PI@ zV`#q2TF%^+@Hnfjb>99Jybk8!2uA3MK1ehz$kOk`K~?) z@Jy`CXrPu)dlmrhTZX}tH+`;7ufXeqlvoZBcN!jZ#pR>0D||-29*|xnJQfXG9L(8u z@Z|NG=V=v(TzcWv)jTt532HXaGs$_+ngfqTk}v7sffoc11;mSz@8Gczs2bj%nJ-%j zuTb!Q%ESWCD-{0~P9HdfkWQ{Fy%xx^gg(Ji{VY5d&yTx*<19RmrCQe3<hxJ6 zbCRz_0t;nUDE|zn51fHWXN^?j7CeqH>vgTs;W=4R6kwXu2M#YOvp)(i8lF`jBhZv} zwO%>tsis-7%w@a_=tL51MNyv0&&&JyL)N{1F}xVW$*Z1)Co}Vpci01$VsdaZYhQp+ z5389DBg9FG&cXPo^n$z`ih^6vLU^%=lkYA54zCY9+yf^$beAv-UUKPA39|%pTA048 zT}I1gaN z+A7oc6_-A6l^OL4_P?v-5S2IE%d5nf|8T{OtjD*Ki(eHQ_x%_3*7jG6G0_*@N=f{0`a*lDf zbXp^)b|tH;)8GXoC0aDvVeEl793G}UW>U?y@;uz>QyfM=c%g`U$Si!-=>vz;5yeM~ z{jk<7*oY15D`v??mwni)T#62F3^i6GNP z5W?FBNP89`E3Li7zt~@V_bDAAIiq-Ad>bCe25vlSadUyk(ppc9`^dAHNtLCl9KEm9NJx&oasjzX)%T700*HeuOvFTr?@vh<&g8vhgmw2rE@g zn!~sak9P>*cEb8+aHpe9K_3%nmQymN|Xku!(UmMiZ}x z*9o4yeS8IvjViYuwf4#EeUH0^Q3 z*){7Udi<5gS4hunKqkhLy2fFA3y-D3 zo(4&}d}0=Sf)|9JNQm5v9L70#Y+MY2DNdh5vKZ(pyrnemkXdlZWt;`%I7NDFuv;89 zeGj|z_`_xtWYb}@;IPYR|EbIpnP9psg2$n3y-}tg_|%O06rWohF$*9gkC-KpWk*ck zBQE``BWBbQmr?bo94}Z8@d|L#QL_YaJz$iT3-9_r!wZFHO)Py?sabH;Wn3@^HUynplno@_~f>?eXh z^X%^Et%NriDbX!Xhw&41042tpYtBHXiZli1el%N@Na_G-Q(#uKR10NTzb$c z)Auu%k#Nd$!{hCLIlO*IX|;{};%t=%yFpIpATyVZkbe_h-REzVck0JAo{C zeaf=j1+Q z0mCbIyfx4KBe(dUlKpzh_mckojo#KDjY5UnMxa=~5f03&??!M1C zz2Tr!)`r@5AcT(!288POelZKKxb)m#%@W9GznZ>RT}IoRo*~P7LGn$r0PuA{-Yn5S zc*SrH-XM7LwQJOG@&q|H=fPv&$@dMvQJ(dR$7uMwCnfJ8W8k$zO6&))^H>dU06h7j z(p7l8f_y2|?Uo$V7`GVV+3>;;Cs*>l@OoLfFi-E>^6DrHMouqy9N}_TF+;`41z~5I zS9la#Gk9{<iqz>X$u`jXtH&>1K(=nEVQm__}FZ!X;B6v z79KlR#=ZO(?;C^#L#bO05XRwXCDO+CaL&?64k6QEAN^hDFCZ zs6MbEFs2_0*1`Cm_9 z#?vIWlm*L$*+ihtRy&W;Ptb+UR5}aFgUaNy>ENK!e+tI*b74HF^q;1KEQZSfC+GqvPSnkC==XQKGt#TLRgQjjIi)o@mSBSgUTRQFYBN(h_%W($}0=(r{XI! zp8d}NrF8Ii_6N}0h_f5ndEN@d^TIEwbbqJJXRS)NPNiG-s3!nr@HM5cEB+T1b{|_q(aXnH zRXpZn^RfDFvpV5TbwYV%6}Ku*W$<16VTu2xw1^M~mBAg#r!u%x`Bd%__A4JMZ)zVX zKxObl{NV*Yf>wkcCj1Y|raB7Fs8XfJRJy-YE(@nrJeB!>!M@}1g#urx1XKpkDE%7B z6V4JUWrjb%XF)EhbU&(iD*09Amsj%ZD*X+s{Q+*M6Mj`E{5xd^zpHdq7VNh2|0~M$ zf2j0%3^05bf7sVH#wsP(;Zwa7r!r{AA5OQ*&??XdN*{&RgdYy&@taPe`6`3|igM7+M|u{xK%GZraG~=5PWdX~1(j|YlO?9tep&fc*5noCQ(5!Zp+tQA7vtZcqm<`wRz8*fn^2;+@rUWR(xI}6nBjIP zn|zOopfb1*f4Ig^^bnNi9fh(cpR4%tO8&J<_pORAuS9v@tBCT-CcX;JsB8Gc z8eCU;gAm96j`IAUaUKi&8?+kKht0rE6$4CQDD{;Q8kIpm#VbQuqnc2bp*9r%G(PH$ zE!2pPQs&oK`G2R3Z(^NSThjs%AZVpdpz7jkWm`*jjuxo!-ziUPtKzBk;73Bq`zlUl zKK+zmUWo=MPG!15P@*ATYR89w)#b5JW;{~qD5k>18MNvV0-7YHx|KH-u26_f{+B|i(b_8}^s zKkdUm?MLNbrh|jZ^RFnq3S|MVL3zPnp*;So=zjv9cvB@Pugu_g#i>kp3rh5d^6%2Y zQC^wup5j#I^8m^UdGU`@Yjfrez_b;i{?Ixq0hK4#Q+|2nO_7hXWXl9XdBL_SJ)eom z{5nE;P#NC|O5{|WYK?yec%cv|6NW2hS_tKZmqFRHFF|=w znQpc6sT|XSkb30VTdr)S$o3ToH!d}JqL0iDT044uX zrTaT&K9^OxpP=-wL0N&D>b#qtCL~}?f2@<<;jvS*@p4{5%z3UU^;tIIFur=|U*aTLNYLbBddG40%Qf03Ls* ztmcdAgcT}Xd1d@dDt@(!|98p)tWoLK*fHb@UQvL`n(_g@JgBV6M&(oKZ&Lo>Df8Qm zcoyt!m5$0as0hmVolsW%{X7KlPy2v>lrrLD_)K_E=_gPYtQ5*y^jA=(I}2rj&Ov!l zdER$Q&#U+!piKWGlm)x0H19eBEZHpu{!n@!%8VaCc~I%I6uf}W()%=LRQliYQ4Bts`nR9eumJyj z6oW><@xOj#qi$G?_~)Y-Hqjye!SR1mxorINQ4BwlvDPmr*ExOyV{OD%Dd-3AI1FhQ4Gfcj`APLaH#Mj7#`GrK8j&W{2%+s=AVyZ{`n~8pO0ex z`6x!-lmGcBh9AjrW8$UWCjL8R{68PXM4^TL`6xy!|IrKw#y=m${Qu>n7%zMjBW854 zeUi7N@0P>I7YywD%b%UpNzTMuf0|wro)nrlgOIq<06Xn-k?^n66-seLvTZebGD_INT8~Dvxk^Odv_UV@D z^LM(tOgWnxRQq(jrxv|g*!ZDJT_1itLDapOG^FWs)3<&%^rw2G-X7iN=bH1JpS^Tt zN2*Pn>1eBy_sZ?U?n&JuKHhXc$oqr4Z-1K{@Kr=um*3jG{?Z?J>rZ~G)$X2c^MX!3 zU19x(Wc}>)q$%0)2QS=eUHNj*tSsAySB9KMv22~U&EYT}uLb&HR+dOzv=Pz8`CheRbB*dRJbkJ?g@cxbHtax_`lre`R~k-j&g@Pxzd~ zUX@Qi9d>tg>sf0y{8IYJ#S@N)Zs)bTo>G*+Zz+3<$B+3vhj;9+dmg!QGZ$V=O1^rnarcE| zR=hR7*(uSjGm1AfV1MUZ4{dpG`!+}7@uV-GJs$SB?-xII{P@M^&&|lKKA~Z&`d_Y0 zxHs@dYv-=nz3rF6DufIezIT6zIeYK7nH?~DM6Ytivp$KEUq@KtdY#S=AuvGuc65+ieMBgFbHHb1dD*Va$>(?ryD+i(%<0NH#Uq>3gc`~u?R zWSXBr{57$Yq==-!ueN^C>YMsj3BBVSvo71#bs2Ia>c?-dJ}Z9ytjn~dZKr!yy!>iX zK=Fie8?TrvYmc4QD5X#3?FXCmo0+FOF805?|LuWq|2%C_pz+JYVoWevZ&Q8mt=GEW zxfc9LU3ctr5%c$t>*|bovFpXS(=*P!Qfu^Ag^iX!_et%9>$95`JsJGXz&{3FN-OP9 zar*u{J@0&RtTZ5}T5H3wo(Z&$a0f zpB=PleZt}jb55>^^v?U&+B#pXXkYp3r=OWRt?lbOw=5j9dcnib+^&4{{khNNT=Mzi zt>Y_SSbz8R&&NMKoWB+Dj6HrKz;k$4sO5co{1>0t#-DCKeEiA1)vwu3cwZP$J$%E| zBR^!dJ=S@C_UKbz)c?Nj>y4(bzqEOoWAXg9dETA6?)82uc4DnwDLFrj-6&pkjV2#& ztNLKhj2`nEe>m^CPxqak8+N6m@AwZ3k7Qi=vd)2XIlJCYd1vOxT|VubB}Xos|IGaT z-QU=Ht51J%?r?$c);98k1UYl-YNEqF^ma}tdOOfW|JT<<0ZBktkgNMZ8fYS9KgcPP zRr^62YT`!_y^$t*d;o2%i5IC&H1RXFsU{}B18s)!_93*nCe~70XyOjk)>8PpZ6opm zJPiZ&&KjXT`~1;bzLh$*|JMk+tJ3uq{dN_$>pOf!)#3q@U%S$7SM8pwUUa?j+t?SE ziV&^G=TGlAn}2vtZoGJS;;M0z0{50{^H$~ajWE+YAB?#6U9|@veemS&dN2C@HofKY zx+^DC{=P$tglY@)p-tb)`Kb84S!XviyKtcLm2OL>*&@5QZnvY&a{pFeU-I9{U!Zt8 zv$fa}ZyRB2BXTo1ufowDV~(Od0yVMmC|W4C2Z&!ONIOl8Dh2WB39_3cNE5!tK#E9G zj)8QF_O|lY@zfNh7$$9*q23cVugqhI|!CV0W=5(=p&MX0V4YW946>1 z>V^Q^BA6Kh&`%sBSl=HYFcctKU7dco<})SWX!wZcs*xzTF{@i8Yil;x=WhhzW;`6B{66 z-Vj{GuLmv?Cr0)Fa1I67O)yayJpnEfr1S)EiyZ*ANy5JuBtaxWMC5QpAMSvcx$`wg~PEnI;M; z)5Rr-C?1VVMn~b2xng+~K+a#tJV1ki0MCe|fdG+l0EY?Yi@JjVZV}8J z1h7CHBv?NIATS1Ck;sh!h@A*j z1`eWmNdSJa0Bgj^SODi_fZYVI2xBC`MS_%(0PDmKf@M>mk5dpqQ?X55X;8{0*ez}o zoFW)A0bq~VFacm*7J%PGfPG@*L;zXL2;1a7C~SFz$YR%0bqR&z!`$WqE#Y5Y%ai}M1UjWG=a|yfNn_urDA>( zKoP-Jg5x51GC<O27uJq6%%v3v?ZF~L28)1q%OK+a5n&B*{?irWMM zvjE1V0GtsUQUFd7_@x4TBSxkI%*zAVO>j;aX#mcAfRr?V@5By*iv$hQ0nUr0bbw{E z0S*&f5Ot>lM9u-2IThfNI7o1dATR^qvM9A~5l;ei&IGtBW@jQr>{9^e39gBtEC8Rm z086s~ZisUPMFbJq0KbUBY=Fe40d5l96yehV>O2FmZW_Sv;s!x6!LaE7x5b+206Fsj z>^T5`h?pFJfcXI12<{0R_k^biYR&+7AmU~K%qsvm0HE7!qT1tFjhzcXvL6TWvWfj9 z7fG5w0b;j_j3+>rEd)79Qqd-w%mj&C1TuFfh+z}QNN$mIo&{3LCg#inS^q4^c@jUH z=#U2zyBK6?9!M3N_?E}Co>f40=6iC4HAnvC?8rZ};B&SGf&IM^`6BFiw z%v%a_fTS_n=V=h<3n1A~gEU3^kX$5b{tQTSw9hl#@YqBNwIy0-9yGuvW>8z9ZK$nn zqV;@e8?+4dQJeUJ8i;l&z?Pt`m|uYVL_2Yg(q05FfCPy`N(XU?(ouvjgmeVgqHAu)PQw zEk;rv6I&=_gs}oLR>V=pi5-;j!ha zWQiM;Y|-}>$TYErGF{xJ2(0-c7VeKPl~$h0WK2ETn{i;93)s)#JX+(ct+%I0EpZHaE4&MXtfdG z7Qv#801L!vg7rHAx@`hjB<61dh}{Knm0+<5egnYgJ%Ckj02GQ#1VseVn*mI*d^14e zZh(6POGV!|0qVRDu=z~@A#M{C6O4HaV7b`v7C_D(0Kc~ZR)~>r0|e{^*iEoX7+U~N z5u|JZSS@xC%-aXh;2nT9V&6Le&iw$*w*tH(rfvneNN|#1ooM_nz_Jej=DrK?x+o=x z{1Bk?Hh>Lc_BMc91m_7hiJ*T0tUmy-^j`p*#W{l5j{qXJ1H2^)w*&Zm3~-ZRiwG|Q zC?Z%_1h7@yAV@3*7`6jon^?00pw2-6`%ZxEB4#H*F~K&19m2K?Ag2Vty$fKM*g_ES z2|&&F0CtPG_W({293a>u{C5M)I|Puu8(^Q0WK1pBsd@%?*Ul$ zDZt!403VA|g2*EPo%aG96tnjN+#)zn@QH{y0I>cjz_tSbhlTAUfY?$1_eTIn#1;ad zV*oWj1}GJA9|IH-93VI@{EGn+j{{^E1Dq852vbAP81#n zxJYo5;JgU`6kyqDfOVe&To5-1BEJ9_b_C#(SaSs67J>aJz-5ti9AN#I0EdqQTorXs z0K|R;F!Kb!HF1!@=L|sLNq`$7_as0O!5M;IM61sL62Asm^clcSahjmcHvru}2l!pg z{~UF^CC*W9i{Mj`JED;Chqy$!E5c7h?uq4;`{D-Wf#~~%ZG?`WE3W+lHzAuY?of4I z4E_@8rHhSJZ(ZnLLG8L2MXjKVcc>M0;d=(^ql*btLl--#zPhOPHMEj0CQ~2M#eS-v zF6w;)t*na-Y873SP^;>q$yunsE@n`x>Eal*x-MFugVxZ+9BNHnd_k?Hiw@u7W?5Uz z{}#2VBhFFkis0`c^+X}1zPLnrScHEMX&{zU9uYSv4MpGckVaw+rLnk8X(D2NfHV~w zD9wcJ0;IVZ2@%V#p`~|UKufn2#zlb0>i{Vi0a}S21h)tpTmon#k}d(PzX5QVAW+o( z5g_(wfSEr6v=avje0~84ybKT|axViE5u73DC|X?sNcn*iOe0yxC{ zs{q9WR|$ee@J|3azX7cJ2_RHlA_({$Ao?0WH?jO0z$t=z1YzR#b%1%d0LI(^2p1b} z061?0`27sfQ;hr>;37fxuK*EZ->(46?f^8u3D8GOy$KNc2f#^!zM}DO0JjL{{sz!b zloG7J3()y@fM_xMcYxS?0Ott?ilAEnKKB8Z-U5gb=Lm`jB5nf=5rww_5+B$qi{EbB zqOc_hzhfJ*w2qF6cn1kah#T~a;Sc)*{z$Rr55OE7fc-AOXc2Q4AV3G$MleR$?g5-4 zaNh$MC$=Tww)zKCe z;GTq=BpTb`--0jZ+5o1AQiAmr0XpjdDPpz`5bFbQo*+#Gc>(ws08709riya}MFbJv z0GXoD8z9ja;3h$~2)6^&sRXdj4lrHZASfmnRskSatf>Hy^ALc&BEaJ!rXoOqAHX(( znZo7+aLP}wEGGHrQP@drA(&SgDQX%>F`T)&q0lY4z)&hup7~mwq2GO`Sz%7EgwE;GXQiAmj06NzJ*eqt(0f>DB;5@-w zBB(BaPeXvEbpf`Ba|A^M5%mDJio$vTiH!hm5^NLU^#STM23S`gV7s_MP)soFVSpWC z&BFjWO#ti-0CtI(1^@v~0k#qB7PdzKP7$~t0oWt95X@@^P_rSxJ`vXtz}Xz&0Ko^s zzY)Mig6u{B2gE*tWi0@jHwO4vOl=Gh*%II+!9mfu3BWCaxlI5*5v2s{0{}WV1vo5b zHwB1o1#q6=hzM#1;L{plX)}OQagLyfAcAx9xF~E6kk|&`Cc#M&-U6V`qX6q#0DLZP z5EK&(YYA{#tZ50569`}r0QgeG1ONoI1=vP#M%Y>boFZ_y0{BL3A(+<=pk`};b0V%a zfU`Zo0fO&@e;a^{1ler>&Wn8n%Yp!!KMHU`Onnp}vID?Lf=i-tAiynxxq$$eMJd7h zjsTt80$dfd+XBRP0ys}_O$4m_=agLyfAfi3MFQTwLKw=kwn*=vSco0Ax z2f(@@fZxRpf?|SU9RO~NH5~wQoB;NY0Dp*>jsO9{0NV)e30o(CQv~i#01w0#f_WhT zH9PBgkHJe!=&a*4bSTIH5-%@NtqaISlI$)Zb}zA?WLZ~`<_?gGULwN*64?#pB#GfA znm9pjk<4|1RPqwXNY>+j2Nj)zLHxYLoM4dHFp%>kRlG!p5D=g4AWK6~K!0&A1O+T2 z!2ep<&sJR&h5{sp1KcF2DZ;w~)ae1Rt}8%oaf6_kU|2VRx?)W?fSjHHb{9Z>5#s^~ z=moHipnT`REUU-MD)oXh;Ahs_XM~_Ft;Z_8&OKIzAr%MUI2k&b}xX~D1h?>?L<%nvT85p zQ-Z`fN(T|#8`4n}QaXuCl+Gf&52TA&PH~7E6sPDL2?-W!C?VoDB~--pg>)4gDBXlD z3gQwYDPdwul)hm5^-+4Pj{iW|Til(Z``Aa}x72>yZw%LkZF~2A`r8%l&F~Y(Dk5lz z&i|3uTkOrl#`3q$+uIJ&f79*r!tvWkMlNQg@0Om{FM#uR_1yl`aDA=KKDaNwCbAvz zcwg%6k$R-P2_B{C`)6*Cj?(k>aWUe}QF;rzH=Y(+iHU{I#NJ}%82vr_FJtg4Wzs%Y zG5sdvKf31!OOXjk&72afOYch5tp9WS(?sEl(^LCy$1^1HiD`Zb6hBJN=eIMKPLbi& zP&`e*V$+hc+{|uLGO|-FBP}^OI~_ke1*^hK=h=7-KX>MY?4;y)Z4`dPXchE=&h~r4 zs+;%rD+&5hFVQ|uw;LG~J9a>(qnB;}G+BSs=GSz!^(%E*8d3O^KEjv(l{SAJx;k3C zl%~I9Z~sd9ma$)iTV2e~(fjZckIDi}2gJwJ`BOHa0%FT3y?*1rEC1h=(_GRq!0Nxp zveC=q|AjVX+l5&Tz5R`BeW9#`D4wprtFPWGX65L^?O*Lf_x;(%=^5^Fx>XaTBL#wx7kbPvMj_JO$CZn(V?~t!vi3i$@!Bu#_*f z#h6<|D|73=Ot&&elh)XtUZCf%WDl*^d9g%aABPu9tu=FrJ1x8h1Yg3yL(^DamLm7~ z9FLC>;P?>^eV*Bb0LK+EyQNq4JU*z0QT%F0D{>rsNDs5*Z;m}bXy$`>$oL(L3F>Yry8JbQM%OenFv7rK_kIAMn=>Vf-t5ViCV7(1iep!7oTNA3j>Fn}U3V z5m{ZBFRzB95*UO0e)>a-`KfgE!BWuF?3&7oJ&f>l)%;ZyYXHWlSg>oVDwf9~vQ)r9rHScb;1VwM!g!zx`9gjXxpK(VG^+YsjQh+@qUPU5qQ z*hCEh*(}Xr@hZ$FVm>Wk^HhyF^vPPnW~$mb72}r-W`VKh!C*Xv13F)&3svb_gO#8n ztaw*GtB4u4fgMq`V>ggJ3OlY6x)cipJFU`%Db^P3Yn86MV(q}bQ7l}s_F&u9xjhsM z;;(m3;A)MbJr(4_{wl&vp}iFAh%lPVYM}@yTdNa{Q;WxADjgU6MT(74tP9u@#rU)* zR?Yz{1mpF!aSHO+^^4G4Y|8P91ta{dYQi|hLcqMi*lH6L3q_buLgB$jNbw?FVV-Ax zuv^Kx!A`5fxY_>o^o1$1x zu=f;8R;(B6&xfk9iBc4dKzJ<}nKJ@u$4z|!#l`azDE2hxRXt48&<*0K9fc=0{v3X~xbl3@L z8^PGRk1I9^Vg3|~t@{L+^&m++)m(d(Rl+e-B^-=!30OFEmSRH?=9A-icor@`2I4qa z4`{whHw@tq!FobxD>fWqKHicwpQG3aJ~iS3AZzrbg0To+RO~6mMuPF#c`WE$#YQ3g zDHsd&v|@uePjMvo7g24!T8ON+UWf8HP577%Z-1_8IJR z*eTd)*cUK9PvleB5m+3IcR+qaxgRVVHUKsdHV7629avr15TqRj8xD(w4TSNr zQaxZjd57zTKm@EetPhOOqUr{7!FWrp4yysH3FGawHmnYex6yjA`ml##4PcMJ8p0aE zn!uXEn!%dGTEJSu0${CRtzm6A!uY7!Kv-K?J6L;I5Uc~NBaBbsY5?Osx*@C)tTC(! ztSRgsy7fM6FKi@g{1|KuY%FXXYyxZ|Y&+tMU^`$lk?$;65(_W~#``+&*-yisfz5+0 zge`(S3tJ3Z0^^UL7Qz<6_;}KWF#a?w2-X4C5!MOT8OECwZ$P}^go@};ui8xl5#&=& zdFQSK?PQ0*vqgru(hyP z#Q7kvhIxw-TmpLz#^sQ!71wXBMqHn{9`oTbm0^5rEFUoA3*)Aa53%_f_6zJLY&n|v zMc7K%Pw@FPoR<)u2zA3I!4hDTVN+nq9M!1^q`{`bGGLjoELb*d8jQP-99S;wU1YWa zwh{I+jL+suf^kEU0!xLZ!E#|UU{Ani!t&5|Przou_|(wHVKY&OK^)aFNYED+1?vY} zfm*JD@f*Qm@Vmn@5uOa20*i-Dgz<}h<6z@qBVj{f!(hWZ92`_mSO|>IfNKqV9^nV*eGOq7Oox2{|0CGPuwvLj*e9?ko^D4S)@V4T8nM2E&HHhQfyFcoi`m0eps}#lqUc+QHhx zf?yqB9mSZ=UbXXr5e$Ka!n(q`!CbH~Sa%pVB;0?DhjD+w{RH<9!(e@3QLv`4=CBs9 zmarQ*FCR7=HV5_;Y%c6+*fTJ07yZ#DcnAspZxIA^*nM=&HQ067P1r5iW!Sf{?_tMa z$6@co_Gn^wd#?_|UPpL6Yy)f~Y!mDa*k;(9u(x1u!?wWQfo+Ao3tI+z9<~%V3x?6E z<-;C_O%a;#Ov*RyAI76A)`b%*_q4!p*F z_jUFp>?o`hb_{kLb^`V*60U3t(P2*$%4!JA|e@4Eq#z1SVj!VRK+vFz&HjurOG6 zSU8N&|9TV`-VA*Uwh^`r_AIObHU~Br#vgoLLaW7bugtx1GuUi||F7E41iYrJd-%z{ z*OU^WhKP%p6^SI`1~nC>NEM}2HIfj7NFoUdLSmlhVb@S%tf?p}W--EM@4fbL)*jADl83Mth08HVGiU^Vli^c%2KV4ToPuBB z49L=B6`OG1#} zPJ9JAqR<&0V$@@J0&QU^I+H-Q>;X^_*W=3{MUqUG;14Ae@g@R;Ln-lhsb}t-&6L1DH zK=zrJVLbGPK5&ve7emrQGLrp8Z;(AjJS0G0kbQ#e3uGT4%YIqrCqXjEvR#(xLtrS# zs#{jsBVZ(qg3%y`kHXLy7&s0lz))}ki}e33tZ?S$8CKnf&2WJ@;s2*$e`C~a`90mT zy_*lyFk&)@LEA7wwq#d{mtB+Wl4Msj7i7~T8=Bq5y~N4>L-rezhx|IuiiEex=MG4I z_uvNH1ktzigG`2Ulm1quB(Nv6D}EP9JM!;jXW6)vN|N=YtSkLNWn@CG89KF zPtX@2iz0DNP2e+-*|QSJY$vO-M3CoSc4_kb%cfeErex)Wx^|!<`f|Kb1ZYGj8dKbp zcGQ@cFc-K>t~t5L0Uv@0TtI{p|BpD;vNp$hjZm&ffTT@^AwZfWEuq{D2YZ3`%tjF>34%cqOT7Kw zt}~f9F)SFS!Z?@$5y@ZS42UrZtLGt?vR>K-t3+rG#Y=BhQ2wNd(2mhskSS#1NKm@{m*av&z7dQZi zKw9cBq{DHLnjM3qa01T3SrB8Tb);3KC9ZXF8iFP z+&qED@DT371Go>5Kr)c-kbfeRLjDHH>`xFk{fa;e7THU90ngzBcnubGM3#dvJID$! zm&_k7AiJ)-;0k#_ES1_6AasNLAUYpHL6A&DE+TfwcN{;D-wJqYqgE%!XMo6NbSI7z>hMDkzu^lVJjk2Fa);bOGtx zR)mE?{oc%6+4~eRau)`jp%a8c2n0h%2m(1+>ENuEH8ht?8p!nkNCa6q_k+HW0P!Fz z`m$zV@l z4|kAIMwIl+c&NzzI6`}Kjo~^8q-ms&ME-VjO(K3G$O>MXb_#q4$K`oE#>G)M0t;aQ z%!d@119M>>lqS=igp1)P*Z`@p9Das%uof19$VG28tb!jw^p?UB_yLwdZOYenf+7%B zf(Y%(axIBPCf94gZh(aA!Csi?NIHoVnXm&S-B#ERn_&}d1kp{B#M?j=>;-M%S`vxU z+m=iG+j^oSX(dy8+BB~1>FtK@CvF!=i%H?qQhNadlAQK%u^aZmFOUu^Kx!kIN+DvY z-TDJuAA};b+#$lla1!prb@(1m!C8=TaEe*0cBvZoV$k=gYwaV`1U_21UjbdnHW0U5RT2=9Ved1l&PhzQ{|Mf=~eD#Y}$4 z2X2rTT%jsdhDspwzAPI2x%L5B9U)KB)@X8GDrcy&T@*!0B+Xytt#~g(Ch;X<8RVuK zl|VAI>uxvFH6`92Cuu}S46^4VvRjm|6>5*HN1^}(HjqVu;$Fs*WG0k;NB zbORTt&wWG4%XMxePV^fPCpv=2B(4#0lDFg~c}v(FK8HYP1}%b76r_oy7OjbtV{JL! zZexUB6Mh3SYCeY`uD^v2Aoqg(UZ%_db+mywS5h!yK^m|m*>46Je38WUfbI|uVIZrq zy6DNOT^dS8K{w(>zbj!ExNXQJZWqYfb_b+^$RxfedJ#YtNs`ZNDOfTSVi8EMnklFk z*RuYIAxwaH=mWh$bezzU3?)7h`a@sn2O^g=13@}a{G}jmIF@h>j1wO?2%$`@EkRmA zYB&R0z&vC!gyz8aFbrnH6c`F}EFp2SCz(t*5yrt77zra_IE)4{XcXaCm;ip{KVB@G z1hZf!D3DC1!!(!*GBbQfI0Iy9CtCtBMjVS6AkIb%6=yS-(C(z1xK1(R#VMVKW$*(m z0IkAOW64A^Tnu8&B3K9#FEv>T@&GLXiIapf<;b;UCK(Un{utpQSPr5q59DY=Ps)*W z2Z>(`D`2&_mNi_ggdgE2J<@5F5u%`7i%hPMP;=SnNOMa+%HTTyCAqe5{nEH!#=UHM z_H(@t_QD>J{f+GQd@*FV#EENJNyG|}5xf&Jxt7h(CJ+a>owyB<3NnHNU^lGiejUhm zQjC$zf98H8$kuNYVJhKf!rFw}2*s_4-d3)+NId0h$MjM&dyT{cOD&9Tn`V#{x`Vh~ zAWz9Jgi?#m5-<87#vLX8Fi3Mt^QUtiO#Bfeld;0lLbbgc3aD|I& za8-}cLV0-PUJ{C;B)$*#;4a*O+c1;@rA{}wP9~ILDZ@_;k)e0Xh?o0QR6r^x1~?3) zHzd=CAP3x{RD{q9`Cte43CQHTH2Gfb1FrKB=7z^yOY6uta4t{<-CTq@K;C0KLG}oK z2fMCJWb&@#1#!>d5Ag<4_*0O={wDkr{(?ZLLjpsRm+WXQ@$k~q0G zk-0NCf%v{`gcg`-=;h>E@{lyUAW6Q=lUj(yQge4G3kfxyOLxkit>h4xc?#W71?N}RkL z5g#YtM99Yu^4hBs$h)_Xpd5&WaF~+t8$!F?Gjk89NnD7}BNZ_m2-Fv3b|<_Gg0c)H7OSWu7_rwKzX} ziNw#_S8|i8yO7&ogItc*b^Bx@65pyNwfy9bn-r9%(BJJJj?Ek(A_O)%$)cLC!%QEG zwxCM>v~T^Hn|FMgN7L}F>Rna)f=JBob7bPYz%NdoFw#<>e1znNq}<;zBb#LZI=dn9 z<+uPz0VKEbbSfQlHu!}hp<=s`h>`22FSTAc-f@^A$%e=fsVtFliy>Dy?GQ5)Lk5R&|u z>OQysjB!g^`xz42#;B$#Bbyqy*6gm5*O@&`ce1J3>&$-kNRytw$NA);U}H^ zPHJ7TUX}rdS(8*z~@dSce$u)64D) z>z)70T@H1773`sr++NutS@yE}_B-;1An-e?~lny>P!qhFi5Si{lC zM;<%PcNZ4)c)niCLvus@@~ds%Fs{3|H+xto8ER{~u1^i^S!tQ3ruokK`Bh4Lj9Wp5 z>E?pjXs;$8s%S}hmz1Ww1ys&&%w0@Iq^)aV?R+}<$b=uBoIJYiu4a<2^uT{L#TG+a zaYt3}x9*a?VUHQ44WPmdmElNa5dHe=!d-1wxE4Wzbt0KoSmo}3eaj20@e-yMR`nz_ z?6w{vrFf}26|a1FcgeHjnmt-dBZVy+<3;jr7<{k%glB`t%D|vly1#%SiQBt=P}fp7 z_lg9^k0jVbU7!?eKQxMxw%y~zCyNiHEV8`OnC79}zGXnJM#GB6cTv}l{xz)4E{Db; zB*l>Utce|a?8a|DIV86{RFI_2PS(ZIm{BwT-ohQmBsw(87?PhJJ^s04P~%PxN&TW~ z1!=7zXp|srg_|Gdz4@v8BZo$EQI#pVr=a19M)P`J=RK36$2&CA49T<-{ykm=e4EoD z$tsc0VETBfMA01PsqUhwRtA}yo3@u! zuY$~eR?pJbXP1R7P($ zzq7}Ki%pw1+#xAhMp>oG_0W)J>vgZn?0$b%)VfW#J-Cc&frc&F&?x#r!$lPr*2!?> zk%EMxlfAp%{B5D<`A-~@|8;{}?|r0Cve%XC$Ga1X$b)9My5}D$&k!sfQBj}unp(=- zifCW#Yu)3?@SRdoMWSKS!$8wlmDCnV(Xo==owGKK%;g;U(P;9l#$$#*iKwI=qG20| zhIr9k!&iK8J%5R5X!!6<*nFHOA(4l-#HB5u0sFJD^O4^NR6hx!+ zA5I5PM7mVfHSo?p=}34^lVd`U#MeE1?y^XjBUnmYtE9$;nk(jfjRrm{S*3)S3w~Tp zOqyOqw)9NMvHcWpAylTsz@nmsVEwJDCGb zW^XmI6Q*Tlyq{Cnd41@uGCG+nmht!2zN1L)8WR%TtyhFo(S|Y4I+aQ*=H|QEYIs+(pRGDe8hOZKx3pQl(vnF~ycHkw_2nOsu$C9eT$`%Z zjX}H=4H+u2fj!y;HyA8SSB9`GD>mCyG#a*jXozJseVeuR7<6d`8pfk@9f@?tlXImD z&RhChT`jG@wA3@3nmC&F%@M#aK4jz+2~g$2sb!e}J;nHWYudaVaHI_>jG3uA5~;(i z8D+M8KIMleNUH0WHVjbX!V?t~Gnx4gTuMDi#_exlDpmio#w((LXRN-{CFNA0O2 zd!4u-rr>DAl&mCbXr$R@I#pk7A-$<$19du*#t&(z-1boU2>h3}4cgVI)8X=u<>BI? zll+!7RCS_A@wB087exvN!dULDk)P^=>FmgIuj+g=G8ZXuTT-{dpQ%JkWo1Jo&5K43`c$3$-n?9!6HdiU4(G?AuQNMV) z>*p<&(3wVQSW2y1Y^E7+#qnexZLS6;;Tt@A;~S`Dt=>Euc8$5c%>nqc@J@w8mIuk?&9?fhCF&c199 z5?NUwN%%^wAg$H6tv)Wsbe{UtmUH_rX+>*mk5AgFOf_uq{1E%NAEkTl9@;(T`GAexru=qwTk&DZ~GE%TE1UjHxhC)6{A(yo0*S zpt4Ttp!Z{|QKwfHZ`afX4Vi0b#5o<5XMb}=mm6rvoMWU=5&g{`Hvb^q{4|fU**A9# z&Lmk?y~0~*3aMBL)0Lo>_wPp|k+lcYf9)W(r9VY}Mp`#Cisa89(YkcrlSW$HLAxOJ zP&A4d&DmmL#Fh&`t(D1C+yWXd9aWh`bHzH7JL-P+E7ovQ+QZ!gqG$hlNIRjDnc2tb zJrjvcPgKl4k<1C!t3GGhyECvQqNlXDy~1&L9FTGyYr zTc%%>8*6CF)qMCmB(nAKb@}~H#YP1x?DOfSE-F?7?WN=sM@xRA&6xeXxg@h>UrJm+`i4lT4}PBm3q^<`;bT- zRz&%(i@4uu4idu$G5=JiR@V2nh}Nn`y{!S{A$GKPo_)U2Uvs7Z#SYrt&@gQcRV&HM z7S`GDV|#6_ZZ~}@&R_33r_?aLr7piZyt0CSp6`$t&gD>;@?2#uWbt>p7N+K$;>yQq zUKizq8#C!K?kY41H=_GCKU0NpwI<0t)8y7&HBZLf|Il6aOE!C&cv5C3<7O)LP?7V^ zg{BWO7jOyafm6ZsZ+ocXgQ#pT?hA2W%5rMTc&}(T+3bkl;_YM)Rckh$v-=>5y4phx zAH>q@_a5s0ARay=OI3X^6S*ZqMGq#jV1!yYnDUE9sH20;?%C=_(A4VKese+7R}soG z#2i^*J5l09CRJ%auH4VHYZP#v7omm^G1oL5h)~6sP~5p86n8p8{W*jhv3i_5lsrBr|#{?_s1(HPWsvYx&ma=CBVP8mA3O^@shxaCIAT%pv)sr%EKPwQ!`qHT^qi z#z6ns2VOfgYDTKnl6yNe*uN%!yT8|`4Vw-)?$Ag?;)x`n{EyZBo*!-Gkj#!$uOw|6 z8nWVUow0r1h$n+Q92yx&WG_%RN6RiTBlmZ9NdAgcfy1$^K$Px21~;4A+Z4+4Gtl8U^B23p8vM z(U3fLI^Azv?v|;ZL!%Co{7Aw#)>`79z2|j@q(!`%BWXJuxzArZu>1X-Wod7_?eR#& z=H-pTzm2I|ezrq0E?(Ug%N82tR?J_as`HrN<~cMr#4FE{{D{qMce>ya- zAQ8)MOpkjsukN3l9g-*UDpJzsNYKmo%QxVw%bQw-Iy8zQk@`;g_-^U$<7SR@NPH92 z7SdW97#jQjOfHeQu+0>QM%x7SP;&2%hLmp$JhXn^)G#*eMoNXGdeh z_;1vTOQ<`1;nKmX@)(@Vk-;ihLL+Cje2h87lzWJB9czv>)f=h?jy3xgcs5iwJ#o^G z_Bql#zc)GG9jbPZHMh179idB(E^B(Vd%=hq;_tMbg46gB%6}XifmtI|wD>*Kc(cF# zeB4@Ols-#(Y&m*$;{2m8#9Pbcg8LQR+ULCN)Zpolc5%q!0&@UhH|dLMK{$ zMG9j^JUL3$nvi9wOh#f?G#a+qqxFYv-kMJiU#hfUmZnA?tB^>qxh3@aY4N8eK1E{e zv$l^`6BW64rF?l{qUPtSy8Vmga^N6q0|t)YDCIWETp+vD@5pGCdm>h6j#i%22oH== z^(Nx9uWUgQO@29>E-ja9kKyU?JS3vrFx$K z)e=YPy6pwCyR)7mCze(#iaj9lbX6sP>ET0xh%|Rd~Y<2 z3hK>d?_?vj$><;nwE^_;M731b>wr|OcQ%UK3>`0fqjA8PRT0WShtdhUoW_x-6yCG%IT9>gUMHi+{zKc{B`+D!iOrUI7yhwPFRksgyk1UG zb$GN*hEp)v`^Emqx0tG*4Q2banRDFyYI5c%n+~k7_gF_Xr1!u2YFo*RRgPFq&H>tS zG23h;vL?tFIH7s2lrzssi))j#vD1_*543IIG=1@%>SbP(_sA~&rJ`onzc(3y)AjS& z__3-3Y3&c|n_f3s<3Bu_p%Ybxl$v!v#8HNf*XtFRs};#ZhiPrD?J2KLSC!>eX4c;j zY>${e6NLn&d*)nGwf5d_IdikNE%mdp8S64b`OjpgFqXO|V?k>=IYZ4RrK!+NwSFcW z$nrDw91eT)lK`BnGcUtTmhv(J^5cZ!**Qf5)wn3<~H_h`;VQ|5^Zdt%eQemmVlCLnbE`NnOg zx{s!HGaAw;)6)n1-1R$tp(%N>+$FCQGu3$Vu-C+T!^rE|oM_j?Qa8<#mtLwdiM=Vc z5Smhh65pFL{qwK8K@HeWqa9$>z^*B+k~v3j9YWcAyrW^ux~~7-a=TsjQjAu4Q>wkS zjJ9|aZ`knvRQ5m1@-w;3Rn5;+Q?^Oob9v{RFjpT36$(8G3Uz6Fi#8JH>C3lcbJgm( zXug`O4$L(Ns_0SXLMr)!*$lfTk@u>dAGONqWWTQK$8D@rcWD`DhyX_C(I>b|6X!mdZUY@}sHw~qO0CTP13O`~msF3Fj%PNfabQx7>L>>+C{#j^MA z6t%P!<5e^owie`GfZWdy>C(t|`nesBJl?xg)6%BLt8J3@y?ZK6y|wElr+F7n*{wa;HJW7kj6901OV_d#n^ z;E&{Kf30QD`~B|PRKBrh zk8Dg+d)KNtSpQCXcT>h%b$6w?Vm2)wO{PpDd&jIEu4!-r z$hWXaWH_{2(cw|ah*olfEwd5k4&SIMuVDbp-l!U_Vg0lSP4U)Wc5*#kX?9SmQ3{%T z_O}vEtKTMlX8YjmlWFbNe;~_Y$%|5q4*?HlQ!hj@i;w&mbw6)XK5Nk^v|0BEr>tog zzFfC^p^+6D?|yH0*rL8$OZ!*ctPYXVWR&qHH1y@;Ll0A(Eh^<_+9Qivvpmb9mh=bh zaG$hUwF4SEwyIL=>5l_j^&Y!=cauk&=SxX zj)mP#J$9-Kl4sIR6|@0+_w3ZyE;Uv*Xy9fVi&L3G4BeKjA0)fKNol08Wt}2=w|)#d zG1HbBu*b*6F+ok)tyV~BKcG>9ytmHV>9@4?vL_CWy}MN=8n!z|9tTP#^?U3UKg6No zx<@}bnKP-)kDYp+ZRe1b-lM!XlC~Ba^4*i=Ttvd&t8*h98f}fVoo@6!?2@!*TL-C7KJz|Vr)S2tIY$l>yhu8G&4 zr~h!lA#vKPUTridyiXn2Y_4g2&zBYf>_r#>G5eI~7BuZ|q`%;`bk3U;DQ&FWw)43zJCYhs#wP$K zz95*tg#muCo<11g`vn2-wgcrAY@Mw*ulK!1W=+UH_vXrV8)ZixR28-{e9s(I9k}mq z|83b(-yO+2aAcsO#@HaAaBn)KySb{9JN4V~eaZln^N+;HdTB4AEU6o(1*!f8E6Jw> z@)2zSKaGS$oYnw8?-DydG?&uaPjheh^$aPWcf5a7zU|++-#x77{*+Mq;LgV(A^ZKB z%V!77^WOfxPI=N*@OJX>NLT%~QwQ=~$-V8}I=DFxP1jp&!Vx{}f4A%5k@@dnkLDq< z^u!VMg0%lyCE`3dx#Enm`t}Irlg7&#{bOU*F z*4f@wAFzJ0QGNWK)8J#O_)h9g9<2zi_FrIL&*gQCe&tRaF z&af#51|63V^!?;e%g^Z(B(kL`^s3aS+gF{C&l@^=IIiwX+F&$fsIA)h=T|-Vh}@fdulnrh0WEi}-2eW$jJ+q>kp%5w7#KbNpZ6}Ad+4vMcTC34$oiZu zp|tGTSCt+==-qURY!+!+`kt*>=w3<-I;U2%hqA_<)5p)#YbQNEIM<-NWBiOcr>^eB zFD*Ey+&PJ!2(h^1Yza zeq}|KeADc~-=;I?mogIf@tQI2oZ7ID{?#|mg^K$)SuX0MXJFkUy_#GPOwvXV4cKl0^SlzjPsZ{T4D^}jy{vA+W!gl`b1TP1JK&=Ql@-qzA; z(^~Zab%?aqi{zdgjY~5g`7KUbTn`Q7eNm$()6+4>{?VTOOFv_GV|&k6jI^8#yDk(e zedHIh_VIxu-MW&c@k;*IB{f^}WG-8AoKXL;%l$umf%p{j#IId?UN(K%p7nC5Bc;&n z`7>2)}X95?%CHCdx(G?jJQb$wFGJQCi~J9OSs z!%j5jTvwUL8Td=DtK7ILc>v0t;PDE)p+Zk^mR9JdK7OXOwNRSqwxXBkTKTLuSSoKClD{Glf+B-NjY`=g~Kn_bF^&c~gCMisy3H zEj{g){U^gNclD8vSf$(P72~T5Q_j>7KBI^I!R zM6=f&-F^Oe`-$7rVPhg4PI34h^$-oy>^sWkSGLpdI7MZ>g-dyUN6o>%y&JkbCtKP$ z*>0G9ZvW(-dO~I;THe!sMO*SfLOD<9@BZ<#@DZ)M6mZrgZ+WivXV{BorS7JylfmnI zYT_9T$$4L85UQPLcp!`$Yw!uZl$%RN=RJKod$h@U#C`oKH8kuEsQGF8Ld2HvKyRBX zg$Bm?UV9|(T8(da#vzfTm3&1?Z##3lT04hi!2`AOEZ%MH19e40`?=`W2g>Ih_8G6A zRp>c$WpT(8&!Keqf!ckJ%@)Gza&H{;$vaxg4|7CKT^dnFdBNG=}x`oJf2;@aGk{2+Q{Smvai#S zN2=8Y9_e=%j%eWL<(%UCM=FIpY^%sa9ALKx>mIc7kNXG>#yyXP)0(CFQny}8#Qq|G zNBp7XuK5uB@qKbPZGWWdWzb5D>slAF=P-E{Bd?D~&%fYT@~Qmbr=0iFF1H`4Xf$k| z6eZ7Q75iDCbv^## z(YmM8R->VPSK#AR^0CT|9oC9y$m0BmuzQmlo_!|o(#7ksU@|PVmbhxqr-p7~Nkl=!fc=c@#j4=O2dWQ?~?d@5fcla0r|KXr{0Wt()(RKLloiL^1j zZ~}?csocn2%Wog}^p+#7K4AvhKap2gGI<^&KUJ^zUfw$PFMU9MQ}mbh3DsW7#4Jvk zM$_M=nb!TS0xvTT_)&x|msx+jryPE|L=s?Q`ejDWTN^;@6@3KRt`N`2PP-AB997`>XL3d-zF&Uc1Ire8VquB z)^_+4dd%)v?%A#rnua`@PDTv^zDJ`JdCW@v;MWPhk1`w@+mRGT5>(rk@Vm9mDu?8> zle4OO)m+%b1MVu-zlW+!ZHZ&%jBE9x1g|k^D6JU7kT=yg?rm8cmUXd4Y4+|h{qH;B zf7~p#tgYZ1Wo>uwRbLA}85yryc z%{n4i(VY5U3p3S!y6SL)M?BS<%fT-u=Tvcb@GOs&or#E&d6U!;NKaGMfJF6 zuA3AW5*`sB9@)9^H^H7|CxXt_9sds#sI7B@KDt#gy}iQIq4{h}V)p+Vs+UmbgdY;`SF6b^_GqJ{atwv^z$IEvOoBEQf#r;vF|G6%%=C= zhJ4vlH$O0!H`msF4@MQQD*7+P@X~$>hId@oe%<2YqGP?HW1Y<{4AfPn1}r?EQWj>H(tI~Rm(+|(s|^!TOg6Z%TKkeY$;v5S1b{| zV!imbN)CT1FE+e$m{+H6A(4?`5vpYwi#6%32uc0ctrxQdQ#h%@V!gs*VxnSVqe8of zb&B%}kBp5b{D*QxcypvX|Qg3HSq3>o!lzLdtQnt)LD}>rVBcutc zs(d>wB~{uYOLk=LrCb!XHF>!sn^p5Nl7akSq70T19 zoEKO=QUTR0h1BNbmZHk*kR_)YP|Z?Pm0w_qRIZD;id$p}RG%%jOfTZ75r#N!ynI!1 ze@khxpj0WF(I1ALA#qVXV|#|gb$hD;J}G3emi%X&jDvS#)K7yfWlLlK+c}~3P7H-V zEJ)!a7h7!Vk9ro*^8e^m>2(tQE6$!Q*@^>u+}F}q&1-5Yp!}Yji>i87OAfW9sU?q^ z)6~)+b$ma|J!f^iyQOpL^h8T`XZ5(WrE>LuJs6bouQ;9~j!vXSv}eaFG$dA)tZuOu zd2<^^GRKXVO?y<-j?xxCHNo5BpW17LWq>L5@*{JmPil!WmS`8X%iB^{ecsekIMu6) zB}ewu)M}P<1yV0JwftT}E&kF{G}YF_GTBv~>`Qm94!7h;T`<6so=ZtZQy-18xD`=j jXIebev;~$F)nlQhx3Vs>xU2ewQ0J;$YQ|#Al$QSoX_73Z delta 63624 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 C`GgSw diff --git a/messages/en.json b/messages/en.json index c2a811e..0deea6c 100644 --- a/messages/en.json +++ b/messages/en.json @@ -13,5 +13,9 @@ "login_error_email_incorrect": "Email is incorrect", "login_error_password_incorrect": "Password is incorrect", "login_error_email_inuse": "Email is already in use", - "login_error_user_not_found": "The user could not be found" + "login_error_user_not_found": "The user could not be found", + "sms_prompt": "Send a Message", + "sms_label_phone": "Phone Number", + "sms_label_message": "Message", + "sms_button_submit": "Send Message" } diff --git a/package.json b/package.json index 8ce2687..307fe62 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "type": "module", "scripts": { - "dev": "bun database:up && bun prisma:push && vite dev", + "dev": "bun validate-env && bun database:up && bun prisma:push && vite dev", "build": "vite build", "build-storybook": "storybook build", "database:up": "docker compose -p hestia -f devops/docker-compose.dev.yml up -d && docker compose -p hestia -f devops/docker-compose.dev.yml -f devops/docker-compose.wait.yml run --rm wait -c hestia-database:5432", @@ -24,7 +24,8 @@ "prisma:reset": "prisma migrate reset --force", "prisma:studio": "prisma studio", "prisma:validate": "prisma validate", - "prepare": "husky" + "prepare": "husky", + "validate-env": "bun ./scripts/validate-env.ts" }, "devDependencies": { "@chromatic-com/storybook": "^3.2.2", @@ -80,6 +81,7 @@ "pino": "^9.5.0", "pino-pretty": "^13.0.0", "tailwind-merge": "^2.5.5", + "twilio": "^5.4.0", "zod": "^3.24.0" } } diff --git a/scripts/validate-env.ts b/scripts/validate-env.ts new file mode 100644 index 0000000..da28326 --- /dev/null +++ b/scripts/validate-env.ts @@ -0,0 +1,19 @@ +import { PhoneRegex } from '../src/lib/regex/phone'; +import { z } from 'zod'; + +const ValidateEnvironment = () => { + const { success, error } = z + .object({ + TWILIO_ACCOUNT_SID: z.string().min(1), + TWILIO_AUTH_TOKEN: z.string().min(1), + TWILIO_PHONE_NUMBER: z.string().regex(PhoneRegex), + }) + .safeParse(process.env); + + if (!success) { + console.error(error.message); + process.exit(1); + } +}; + +ValidateEnvironment(); diff --git a/src/app.d.ts b/src/app.d.ts index 7cce717..c8414b8 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,4 +1,5 @@ // See https://svelte.dev/docs/kit/types#app.d.ts + // for information about these interfaces declare global { namespace App { diff --git a/src/lib/components/common/Button/Button.stories.svelte b/src/lib/components/Actions/Button.stories.svelte similarity index 65% rename from src/lib/components/common/Button/Button.stories.svelte rename to src/lib/components/Actions/Button.stories.svelte index d182565..abd7504 100644 --- a/src/lib/components/common/Button/Button.stories.svelte +++ b/src/lib/components/Actions/Button.stories.svelte @@ -1,7 +1,8 @@ - +{#snippet template({ children: _, ...props }: Partial>)} + +{/snippet} + + diff --git a/src/lib/components/common/Button/Button.svelte b/src/lib/components/Actions/Button.svelte similarity index 89% rename from src/lib/components/common/Button/Button.svelte rename to src/lib/components/Actions/Button.svelte index e7c4391..f550841 100644 --- a/src/lib/components/common/Button/Button.svelte +++ b/src/lib/components/Actions/Button.svelte @@ -1,12 +1,14 @@ + + + + diff --git a/src/lib/components/DataInput/Textarea.stories.svelte b/src/lib/components/DataInput/Textarea.stories.svelte new file mode 100644 index 0000000..8aa4d9b --- /dev/null +++ b/src/lib/components/DataInput/Textarea.stories.svelte @@ -0,0 +1,51 @@ + + +{#snippet template(props: ComponentProps)} + + diff --git a/src/lib/components/DataInput/index.ts b/src/lib/components/DataInput/index.ts new file mode 100644 index 0000000..e678a3a --- /dev/null +++ b/src/lib/components/DataInput/index.ts @@ -0,0 +1,2 @@ +export { default as Textarea } from './Textarea.svelte'; +export { default as TextInput } from './TextInput.svelte'; diff --git a/src/lib/components/common/Button/index.ts b/src/lib/components/common/Button/index.ts deleted file mode 100644 index 14aed5d..0000000 --- a/src/lib/components/common/Button/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Button from './Button.svelte'; - -export default Button; diff --git a/src/lib/components/common/TextInput/TextInput.svelte b/src/lib/components/common/TextInput/TextInput.svelte deleted file mode 100644 index affbd2c..0000000 --- a/src/lib/components/common/TextInput/TextInput.svelte +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/src/lib/components/common/TextInput/index.ts b/src/lib/components/common/TextInput/index.ts deleted file mode 100644 index 89470e9..0000000 --- a/src/lib/components/common/TextInput/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import TextInput from './TextInput.svelte'; - -export default TextInput; diff --git a/src/lib/regex/index.ts b/src/lib/regex/index.ts new file mode 100644 index 0000000..c0158b2 --- /dev/null +++ b/src/lib/regex/index.ts @@ -0,0 +1 @@ +export * from './phone'; diff --git a/src/lib/regex/phone.ts b/src/lib/regex/phone.ts new file mode 100644 index 0000000..7491632 --- /dev/null +++ b/src/lib/regex/phone.ts @@ -0,0 +1 @@ +export const PhoneRegex = /^\+?\d?(\d{3}\d{3}\d{4}|\d{3}-\d{3}-\d{4})$/; diff --git a/src/lib/server/config/index.ts b/src/lib/server/config/index.ts deleted file mode 100644 index 0239640..0000000 --- a/src/lib/server/config/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { logger } from '$lib/server/logger'; -import { z } from 'zod'; - -export interface Configuration { - app_version: string; -} - -export const LoadConfig = (): Configuration => { - const { success, data, error } = z - .object({ - VITE_APP_VERSION: z.string().default('development'), - }) - .safeParse(import.meta.env); - - if (!success) { - logger.error(error.message); - } - - return { - app_version: data!.VITE_APP_VERSION, - }; -}; - -export const Config = LoadConfig(); diff --git a/src/lib/server/pothos/schema/index.ts b/src/lib/server/pothos/schema/index.ts index 84e199f..b0d89b6 100644 --- a/src/lib/server/pothos/schema/index.ts +++ b/src/lib/server/pothos/schema/index.ts @@ -1,3 +1,4 @@ +import { version } from '$app/environment'; import { builder } from '../builder'; builder.queryType({}); @@ -5,7 +6,7 @@ builder.queryType({}); builder.queryField('version', (t) => t.string({ description: 'Application version', - resolve: (parent, args, context) => context.config.app_version, + resolve: () => version, }) ); diff --git a/src/lib/server/twilio/client.ts b/src/lib/server/twilio/client.ts new file mode 100644 index 0000000..40bdee2 --- /dev/null +++ b/src/lib/server/twilio/client.ts @@ -0,0 +1,4 @@ +import { TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN } from '$env/static/private'; +import twilio from 'twilio'; + +export const TwilioClient = twilio(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN); diff --git a/src/lib/server/twilio/index.ts b/src/lib/server/twilio/index.ts new file mode 100644 index 0000000..4f1cce4 --- /dev/null +++ b/src/lib/server/twilio/index.ts @@ -0,0 +1 @@ +export * from './client'; diff --git a/src/lib/server/yoga/context.ts b/src/lib/server/yoga/context.ts index e7eff70..76bb9eb 100644 --- a/src/lib/server/yoga/context.ts +++ b/src/lib/server/yoga/context.ts @@ -1,7 +1,6 @@ -import { Config } from '$lib/server/config'; import type { YogaInitialContext } from 'graphql-yoga'; export const Context = (initialContext: YogaInitialContext) => ({ ...initialContext, - config: Config, + config: {}, }); diff --git a/src/routes/app/+page.svelte b/src/routes/app/+page.svelte index 0fbba99..e3cf09f 100644 --- a/src/routes/app/+page.svelte +++ b/src/routes/app/+page.svelte @@ -1,2 +1,4 @@ + +SMS diff --git a/src/routes/app/sms/+page.server.ts b/src/routes/app/sms/+page.server.ts new file mode 100644 index 0000000..b447710 --- /dev/null +++ b/src/routes/app/sms/+page.server.ts @@ -0,0 +1,49 @@ +import { TWILIO_PHONE_NUMBER } from '$env/static/private'; +import { PhoneRegex } from '$lib/regex'; +import { logger } from '$lib/server/logger'; +import { TwilioClient } from '$lib/server/twilio'; +import { fail, type Actions } from '@sveltejs/kit'; +import zod from 'zod'; + +export const actions = { + push: async (event) => { + const form = await event.request.formData(); + + if (!form.has('phone')) { + return fail(400, { error: 'phone_missing' }); + } + if (!form.get('message')) { + return fail(400, { error: 'message_missing' }); + } + + const { + success: phoneSuccess, + data: phone, + error: phoneError, + } = zod.string().regex(PhoneRegex).safeParse(form.get('phone')); + if (!phoneSuccess) { + logger.error(phoneError); + return fail(400, { error: 'invalid_phone' }); + } + + const message = form.get('message'); + if (typeof message !== 'string') { + return fail(400, { error: 'invalid_message' }); + } + + try { + const result = await TwilioClient.messages.create({ + to: phone, + body: message, + from: TWILIO_PHONE_NUMBER, + }); + logger.debug(result); + } catch (e) { + logger.error(e); + fail(500, { success: false }); + } + return { + success: true, + }; + }, +} satisfies Actions; diff --git a/src/routes/app/sms/+page.svelte b/src/routes/app/sms/+page.svelte new file mode 100644 index 0000000..16d4a90 --- /dev/null +++ b/src/routes/app/sms/+page.svelte @@ -0,0 +1,68 @@ + + +{#snippet PhoneLabel()} + {messages.sms_label_phone()} +{/snippet} + +{#snippet MessageLabel()} + {messages.sms_label_message()} +{/snippet} + +{#snippet alert(message: string)} + +{/snippet} + +
+
+
+

{messages.sms_prompt()}

+ {#if form?.error} + {@render alert(form.error)} + {/if} +
+
+
+ +