From 21f2ff73b2b35f700d0f0b177385d9c303d109ee Mon Sep 17 00:00:00 2001 From: Ethan Niser Date: Thu, 21 Sep 2023 20:48:14 -0500 Subject: [PATCH] delete! --- bun.lockb | Bin 152412 -> 152795 bytes package.json | 1 + src/auth/index.ts | 6 + src/components/base.tsx | 5 +- src/components/tweets.tsx | 21 +++- src/config/index.ts | 18 ++- src/controllers/tweets.tsx | 47 ++++++++ src/db/schema/tweets.ts | 1 + src/pages/(auth)/*.ts | 6 +- src/pages/(auth)/signin.tsx | 225 +++++++++++++++++++++++++----------- src/pages/index.tsx | 2 +- 11 files changed, 252 insertions(+), 80 deletions(-) diff --git a/bun.lockb b/bun.lockb index bc1fc85bb6ef4060eb633276180e24735aaff6e8..d050b51ff340307c1b2a9267da2a56a32a8aa58b 100755 GIT binary patch delta 29657 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 z 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 delta 29474 zcmeHw30PHC*Z z%puKrM9VoVaYoA=GaF1RGaI#1|G(cE#J8{d_rA|p@AG_5=ka&fUTd#CthLu3E}nbN z$tC)!Mfy__jem&9Xw&qbix0h;HDgM^k*>$?E-8Gr)#BW!BW;$+jOiyD?7Q2c@tQU> zIjq;2$ArOXT3%Xi9+TsTl$f%%c1q-2F74${W@}M2cXxeR{kAwFIod8-1G{Q&I zDuNcwENaTsxs=Zn1X*u4!+~FD7L)gdlXo9U=!3VpLg#NJ$-mGC6-r?zauR%@| zMr4mm&Cb&DwRUKTwzxo9FdURN)wB4FF{$1ZRGi@*k~=y>)4qnG0mwfIS{?Kq&}yKY zL0R!iP#Tn$F)o({kE3<+hd^2Xc2JtX6uk@5lC^@hmco21BQ-mFq&H2|o(4~6&W6)z z$xO@nQ$X3lv6kF!C^bDLVcia>r$*j`Zf)9eOg@)PEP04d>;wY{dp@!$fv$ksMbhEXa1$lu*;N zqd*x-3*_oD&GVnS-SmGpD2AqB0w_D*9~AZ!B!aRJtw334Q&1W+CM!EN7Y2FjndLm7 zwIDxN$K;V2o|luBR=I&$f9BAv@S!PrDKYg;z8)x?DF^uk1r2Oy+7SRsKMWl+DkE)d zT26qR=@aJPvau;0m4YbOG;N{W;S-jBrIFcAdDO#xcW$a_a6^FrZwy{Dv(EcK$q&g% zNlin4-?QYw;igYBL7AVKmNPsJ6Uz_zw9lIxZp@i}5oSHtP(R~xSW0f*Xblr1Cv8lw zci1@XG!!^N<}^1u@;N9ScF`)3nvQrKnvydtH|_qkti0Tuw3MMky*Z&Y(iM7ajF)4Q6TncmGTd<2x8OUsQ3PaB)3^^moF8|F`f zl%`~+WoCQFr=^`wG_^heW!FnUY06um)Jspv8sSCPn{+qxgF)HVyOOYj?Z}RyCPgx2NSs5eDjDp^vTmsrzd}B}sSXE1|fwJN+lgx@w zfO3T2w)j<`EdLTH^`?R{KJu*m`;2@J2@B|-O%{CxlnsXTwJZna9CU(Gt|yxf z=7Q2w>7X2wCsB@;PJ@@|v2iIm!*h`i>u>Q-Qrl+}DZ*!0I_%n#a`my#1c42C*~ zn9X|Rj`B6~2O^i+Sco3T%F(n5;Mu9Isb(jag0i&%LruLL@Vx9(3{DsZe;oNVE-QOz zT6oG3%%IHs(@g?H*0wALg}p#mLG>& z+3CZejG9%Tm{SGMf^s2`0A(qz!YLWKT5a%j)e9pvtpVsn&`{7Jpw!REH1#9FbF6;t zJlp3TG4u$I4h6qASON;{f1OdLUF}g}ZSel+0OcccG5qjIS($KKSpGq52JHS0PO#HFG(RR+W!8j>kwBH+DNmAncOl{>HJ+BBVS<%2A!BK_)!1xQSa#mU>gS z@R14lM8i!HaR}bFsIZJNpg~wYS$!F!(_Wd-%&o753|ke390odW)R23c#p`zmYFY~j zeWia>m;MyE*5Inio^@T0-GTD)@OU`CINU9=r5@qd-v}}X2X!FgD$2qLH+zK7ho#=! z?L3OTyAy|3uZhXWsx(;wcis)It=x~nex51FovcAW2abI*23wEDM2$4c^bB!{A+k8q zt*?VD7BbUOmqKJ>RJkzb9ghzq@OERpNAAJLN4a>8E_1ta>h(; z9BzahX6pS&v1gDYI9JKyc(?uuWE^uR8`kT<3@)MwUwCZ@IM!pVJI*=a+%hRF*70?O zEZ;6(uiM;SaXGsE!F4v2OAxoOfup5@v(0g}xh&s4UUwsQ-G)lfIG1=x7Pfag4oAv8 z$SNOY50L+e*1ljmLC;vW^~WsESbO!8;1bPdurAk!Z>@1f?+1cofMM#OL+^s?U}(}O z0hq*`CdQcSJ;6~Ebq2c}@3fGKo#LJ0@L-~`;6A_n)$2vn|G%eK# zwEUZ?kC4hWWPRYd;YMmRQf5H@h*VcY7VolClacbu>8;xOAkmYVx*JAt{NOG$_$atU zxgR5T04au#xmR$J?rc=n8L3`I>UpF*M(Sgv5||Qq$b$UO=1 z!XfoUx84$-K#ZVT4*Fnl964i|))#_f2$<{7WpE4+V?EQGBO1t=b0iZSoo{L`1jlk% zQQ_`$mZoNK_3-6}W;o@{p{;$v^Z;WlSh^GSu}Tzc;nF)IX*SM|jRVI9%#mLWjv-|% z&(6!tGX|?MLW**;J})?0ZFo$d56+AMcIs1b=oh<>1*tp!;C{k|2|J7yjU2bPzG~CuW(7Y@Ydb*t-fp;02jXPoq zHa3CLNSRLaZ|@SX%7nYIML=c*j~b=~$A38#xpml5kJ!D}ox8sv8 za!;>#5h3;7SaZ9Y3W(hVmvad@Hsv_mRqp8>FKS4=k6Z7G9l-JuYEiPVkK1{QGGk8; zka}OY-Y>yy9W7xjo&kpifDu~L<=B}Z_wL<+%cxxZ&WvnHHrvG;8UhsCtO zUzYU6Q1;g}OoM{z#$aTCiv)*LU2~T{8ytre1J&N8``%*?Vp%z}S!*9M#$obtq|hUV zH>TQ$;5bEn4X)Mzd+Fz1nhwsIlyNTS3UKCfa1JTP3d(Sj-)lO^*z)vY;8-7)5Y(_5 z9L+M9ifiE7g2T3raBnlvEC(*erRRdfTtuB*zrb(?noHs(aHemtZipyZINYsg-)Gug zPR<hcFIdE=S3IGBG_~l#_+&ZcN`|e7-DouUo$~$W+4sq5ax}%@)gX|8%B- z!$w~#R-bFhVI7WW--2VbmowZwGsSeUd3-AY*V1T~-l{ajv<{s>eaYaA?^?P-iaUW1 z*J;O_L*$;3@%oPt(p)Uw7^&D)dvBs+vcb_!#wx7u1=j(bxvTmOHCJ|Xd%$0ztX&*c zJC}oN#?yoTiKS(@T|`Sg%dHPiGY7^zYtE5{kbMFf4S;dI;E-YFfS7d;0N2XwMKhOk zCb({NkMD7$xVOmmL6J`*$cEpH5v)O(;5cwtpBlKF>%p0e@HM2cAaQMiR@Zd%#BG{1 z7aX!p|A>2J;b?TsYihs%9HSzop5w+6nvmmmUK)Y$mwq|1j_o7mo*aHP&~x1)Q6}WN zof|VW?OvIL%xal3F(=+RA(Pts(_r4ZeM!9njQXSbD z5g-#Da67w=HV)k=@fA`Whq63*>dkU)_7OYQeKKJz4zG}5-9>Nwd%GN;<;Xqh@y-Uh znwDbtVr#BpZa|)<4PXn-(MY8+rB@ka_692iR;BLXT5(Uum!-n-Zc$AZ<1@fn{8OhWbLYUp1=$wgTfK6>`hO8gk!6UmN+f4Qn(1 zk@FJ!BIg37T(HB73z)Jx2=K#D&$sHEw3k<1A z$u9)h&|-idSPt;Il~QkoAvG!al>pmYO&9W74N$Nar~qsQsJIQ__3zLC=)VWBo(}=m z`w_s4l>8@Ta5;^HyqI4jpLSd@guhMMozJa&QdaXNz!Cl0qThk?B4vF)lEL*S=-oFJ z+0Ye(GbtT=4Pb*eEIBFl_(3Wx>M(@RC6(_Lgc$)|*2*ns<&v^C-IABLgEI%5i`5Mn9TvJ^<^r`i@z%48i zqK%mgzKO**17$7EDf|_sJlfK02}+e1d{EvRv@B>mg}WE2Znt zLC&ntto(n6vi#>LM|#n!=PS@C)^&*=zoHa0Pwn%vd3KkHr&mkJjnARW%+;iAm8WK z0&L*VoaCWq=rNRUJ;+o3&w>7*1N}b-dd>vxp98(Il>Kv{AIudS7wJC-dU}Efdu~_% z9O#XMJx>Au9O(Z!(ElGe(3>aafBQhc_Ubdcs>|w2J<@lnpUhn95$)xsrOCKA&VO05 z=qSDT>?C*Kv$G6Zo-6~G`^kyRJ))~D2Dckr_zI6mkmFV)%dso`(zeprPUtMOI`qX9$eBI4{m#! zwI*3Uzs65q1D7ll)+WntYyIT%wI2LG`&DpPzztmI5d-9sb;)w^IzQ>R-XjLe{_B%v zzx94{3%Eg2-;gYQH^8d=DbD8GQG%8?gy79gEqpxjj(T{2mi%g z3~o2L@J$}!mE$(SzD=+X+(_B@b=dbh?0emVTi1?*I|eT94G(THD|`d?y#f2cjh1aT z!@kY1Z?i|_$_wDmgG<`t5o6@6EwFD3>;w0JOxOzhw!*%x9x+Z{1$PD9z-=BeK`z+_ z`?kTp?H(~v_TLWsw!=Pf`BL8j`*y&-9Ud`BZUVOvTpi9JdSh?Sg&arpd-{!M?X(-&-CrT^$~N!7zIR~XJ02nB1#suVCGGZzXXUKjux~f)1Bd^7D~5f=u&>yI8_BMMy8>?D z9*=lYF4+V7_Q1Zq9`TawzZdrHg?-@WN_`*f+XwshdBi-qX-KxZLK$=b)*XO#2Ryh-qZr(7aN!3%Vu>7g5Y`=pb>NoD#)n|tAy{|FBbLkK;EsWd zEAfbxvakf!mB2c1t7V(Rui1l*T5mRJL(ZzWdEbE?kKDSw@vEr!@Boj-TNM~Lv8}M5nSjo zk9bphkHNlUun*i@GUzz$I}ZDfd&E1k7~F1f;U_$}*>>Cs*mnZ>3AH%+nVIR0pWzZ+E?-SVfiAQ`Ui^1&%7yhY7T#(~Fg?*pGK5$>i z#^+$)IoNm3BQDD0;EsWd`^+OQ$->WI-)FE7+-2G3JnTCU`_6mBxAFqG^Wc&$c*OT| z)&ah@a(>FJRvnu2qKce}&#LkQ zKC8+0-zAIcauz-Vi$FOKpF#5K_b}#r81sWi1j{8qz?dIk%#R)sD*OKk zV}67&;KHPS1%q`3wp{Uu+Hw=Pjo?DBdPH66y^6uQiopU`Uk3ez!TJe<^^-?5l*Qn7 zgA4!JgWHkE{fxo-8G{9`scifU2J06L)-N6rE{}sd1}^TJM>Lm(*DzSuFj(NCWSi?4 ztm_!8>mJcUUI2F?kS#i1A}z~g9Xm@Y=TIBwwv&KcDe9~HqTxKcSTfG_X&|G zV$~8MlGS1%{FI*q`Ejbh1A=}I2)0n*R(cr-e9J(PSq6gkY7+$;DG2p}pri8oK#=YO z!F~!ls~{%?flde}Iw9z)iYeGlL3mjR64bb|5R5Gg!D$LSs&P388kK`!dN~M^)Nu-q zQ4r?~!JVqm7lNt25L~37r)r}^&{~J!B^`oZ>H-DlDM%_0K_4}%JOs~|hu|6o$ts}& zKDt$aV0i@y`m3uHT%lm#Z4eAlOKyW;@ofW&liV*l#gdnpb z1Sx701sf>{tpq`;@>YT%y%GfbDM(X6l_3bM48g?85DZtv6zrxT+#dq38s`teSbqpk zQ!r9Bt^z@$DiBPs0zsxaPQft>;;KTBtqQ9`FtsWK7bzI6+Ejy}bu|cHss=%>xF-OtN`l6#lZEq-U7j@OyhFD|=si;Q( zkbhk8KcgUjP!scKs@#&Z+L?1=ENEry0ucSxGIJI9GYuOZG=EO6J>9|l^(bZblNH{z zWbE{xmyI+Z%kW2q`QOyMNN?5qwTzt^m6Mj2=S|DG*4gwRWeUJ8X$75CN^?;)zjGJk zu8IO?owU-m@PDqh!~bHL>F~d}kpkHEJH}zz#XThjf1}0!+L`>n&(+2d+m9D0mt;nP zdOk|rCd#RqQCN`w&yni3nVc*($|?VrhOvJS$+!E!8D>990FNFp4!IEh)iVB1%U|Be zAGBf3uz%NLdh6rC<~n45C15N6wk+TJKJgzF{$D6-+=27wd##4y$DjG{r380thR63Di zK*!NhY;Y}_T&Jm=X`+GOHl()$JApUV!fC=4dKgLmK4u}X2v`7cmpAffM}o!V z0L}m(0%w7b0N&=lAK-mDMM|G8dgXUO|2qPm090(;v%ePEPXG*)Cjmwkeo?5UfDQpt zfiz$kFdX1>3%$SyfWLyc2Z#Y$0jE&zG_V}t^q2}f4)DfO+-B?0BGlRGSR;6^GjAwP z2fV;wAO(m=9kqZkAOzse+q~gB5a1o+)dAjF&Y9u^@W%FUfb+lwfH%;80vrN(cYY$; zWe7858KTbs&k8)hh_TK&&C@?`Ky2u;4m;3m<7B5ECdz-uL6sK8>qA@Xc@o+z_tUp3i94|KZ}p1fXf^2!{@ITD&N9) zMw-8$A@yY};W{?USn;@mXoDbPd@xQ{f~WQLLS29^9s$tZbUR}t2k-*JfnmU4U=T2{ zC~2lxDU3C!3wRpV9^gql9N;|WeC`1B1lTxrx&mCz5&(ucDVI3Thr0lKiL-X|8~q`> z8@Lnb1#rIh1$qO0xb!6>aSy-(_ks=p?z1oyG!;kzhNzxTV}7S0N!4_V(q8gTP#m$0 zErYuj2aSW51!Mr3fDbUz;y(fX5Euh&0Jy%K1o&gd^}rTjGw=pb1grzF8RTngkXQ|@ z0`dS3LN35g@OlmDSAmy-Cjm~%NdOxf4~zp?j=J}QQa%=V0Km-9CIAls6M+YT0^nhQ zdef-!I1+`xBfwOEAvhU$6qo`~PT6!|F2K3QaC{b+0dU253V0fjz%u|>lIMZhfIWv; zmeXSnun1te=h(vq01M0qUIFF-tZ*Sf8PiLE#a5b@E=PJPunb_wR#=oWTJ~$Kw`3d| z=54fS+UrPc0%$EWsK~Lg)1=z~yTC4_rvW>G9l&;g;q@l47kCSJ2Y4IU4HN@=RPE;w zYKM_L1RMbN1N(r3K#7Ippzj06fD-_l=7`#(ei~_eN{LjGE5qJb2P!os)9|YHyG~P#*Ph2+rog_!0iAx8t#tVCAnL2*K`3qHM9ik z0nGvKn%q6Pi#7xr0QG^UKog)5&=_DI(~&?Fe^F`+q9JGj@F;Qz5C_BqP%?Hp$_D`4 zSHjVM9$oqafk<=X>IZO-@dtkwC^s?gHJtz*GHz_tV?H-NZhF;tJnxD`2!u6(1l4{P z;*uL*6|md{?*zE1adTr^+~~NU^#yo@x))%7IR|--Mf!eV7%&tV3{anW45(D3hX5(S zNPxOy056aZ45w3Am<2gdX;zy22rJEkwoWe68NetY8^{E*fYCq>z{Z%L2e6LisFRDr z14whC*qxXJ{vlu@{}YgvvoYI(2a#rHCV-9y#sRnH(}DtkJ3lNi8l@-LAn`a*2s{cr z46ytoz*Jxg@E9-|U>JSCA)=!13;4iw=y=gbFNg{b`%4iP#~)^k)-@`l&HNb!$7;FO z&vJq+f-A}IKA6o!QbYld$q8j{)cHKW>= z5s^4osY!F8zEHhL(m{<}4pK`UoGXS0+mCsF z8fl{Dl3TCZ9}?Bn{+C5Bv)v?+?0KR^$Zu8@MaO;ZtG3P)f#Nmw{ydR{D(b%?S~#xg z>fSdYO;Wk9K)O=xcm?%uRwqG%?FX|@?|ftQw5Pwj=mRICE;!<(sx%)8_T$l;-~ZuL z`qA3UOBJ40MT^ki`Ra>BsBf*B33ahug}n-LNKIM>a$KF6FIohfPjS}@DtDZ^Y~P!& zR5MIRJJ?`V_yROC6GMILfL0bm;b0EkGL^CbHM|8DbGIO&lJ@jn4OWk?CgS6a3bfN| zC2EMd1cmBQC>V6_jB@i2)u#gL$K``{fH|*R$%^#ZT{E+qXky5*6R2x!ybcunpfJX} z;z-xdUA`$*XkHYxP?Qn4;Vfp6m?ZwR!RoPBMN9SWtD;A+{q*>NR%6CAoBY)%m>wAs z6A^=TR>dub`~K8$wB&GXTP%WF{myVe!Fry2!P<+n0%tG&zSw99Lm8=kT3uCKf&egD z3<|cN8~@Y~3txUcw9La$Y=JLhUHB!sR@V21LR19WxL3`9Ld@?d zpa%OP_&JH2zG`+Xd?|`XVa6fIo$B-wn46&dUqfI_R?9(xzsHzXgzFE*RO{XU)OY1L zYB8MTS{XG63NgRY*Jv&h(VG3#{As0kYa-h5eUSR) zHCXSXsxL((*-z20Huj<5dM|%C+aVsZdibPDT`H1-?Z@aZX!60dF$s+m4eJdP7OA~U z(RYiCQa8v=Q9;XK*V8JA0smX!FBYhS%S2NVu70LwxN5#!w9qeynE`Gt62VPxH)p`X z8Lxi#?xC$;T0Tbzn@dp4P%Jt%;HuU0YxgQ@8Fb1a?#JNLv#n6H8gg2E)q7akP9wRH zwlaO5s4ijw3hobu04O{<_iTeo+s5NYN-TDfT#ju z@AWrgiog*2arO~|A8YvY!&laoDt=H`RbC|mV?;gk0r*WaO@~JUQd09iXC6oQ$MW|(L$*3 z)#$SQN`mJ$c;@@McKryi!{>B+fJ%Xa<+5Pw6$k~(mL9mM6`oEiZ8b)%gdT20MdLwg z*D6s(JgUB5EoxguRpc5`Q&d)-HP8xBX=_A_s`g719-O)3o^so7f60NnRF|$1+4cZk zX{1`M6)#|UDp?DQ7AogD>0)y@M9Bga$;)&Qkft& z!px1q48W?hAyPfH0aJZfq}l~dvsXcmJyEJz5sb0lvG8EofiK2Au`mlA!@kR@V|M?J zNUm-6n-${kb8LS1k}vvUFJ1P#7k1|NIGcUujr)+pE}~(xyxLJDYUo?QbAl>$wg|?q zP!l&I3hdW13{FU`P^YlZ38QUeh8aE&3f_UHxjmh|zJEodmVVD$&BANupp=Q!%&P1W zv}W3G5o@hBuqU7d`rg6B9;Ay7#?E3)i5gC;`>RoQQHXmt65OSv_^E-I~Kq?*1N4!2+ZaI{C4 zSHGBXwj~reSQzX{Y6ld=baiqwqHva~v<2J()p!fed4trI{Uold5cmlg!yH z%B!whQR-i&u3ABb?yBU32nw;^aMJX>`8g#c*W8PCxvwB7Zdo4!w;?*~skCjV>So1j z!376(H2;fwbMiO)ho%l6ZWTwj|E0;0-(LvLAqxKe1<+i*)a>n|O1!;x6?HQAj$Z;C zeHIVdl~sE7*^3-(Q3YG(?TlX1`?c>%b3X5+zTA#!Rkky}AVTAGX8$iAd!%hjsYX*3 zwga1YJ17J}A?i}pzGgetJY1^KA34Fu@i~z(_U%vRW|ZdSsZ10NE`&l|DD0k9r}nOI z&kiV6Sf=Jd!LhHi+Pnjc?q{9V(H#gr`(+Prd=PMQ?79Vc@E-=9%g8G#ZYK(C>Z1DX z#2T@)i+X}|Zx^+FCqu4_s>svvde!jFTMo1xv3A}X|H zEBgf=+UXZtWR6Nb>=2l(#$~FD9%}VlBEX4oJ??tQ2W{W{0 zSoM4dVctZId`EPSyWZWLqV}scc9*+Lbvd88(>T<(j);!b%(rpi?MCs3nudh>zgn7; zr!JzVVEgqQbAlsZKXM`Uo>GOERPEhpYL$uw39(=Qu~Yl1Yl91pcBOhJlGLc(nB?{g zLry+2tV`5$Cw7!-@GqoQG5W78d1%B}zV#26=2TT%P4W_57+b0^AAR7dO2&R!cf|A; zrk3Uu^-xb1V-)Q-sqFrtAnd^fePpSI{jL>X|M;dG#WVX#bH47OPN8hDv#+^X^w_$_ zeSiM-#u#Uw!7<%KRHZ#IAYC=ygGEAD1HlE`uQYk|#`-xw2Uh0}#>EBdxoYMfF)4Uv zKlAulKB8KFw}f5~8Vaqs_s&+~dodjL%R@T9nVP!4;kP+ZKsFVM`l%s%#jqIrttKnI zOW)g9b!z}Ltc}=y@5v{pd%okn7;5f+M%k+B+FtZBOhxU(6g$;lb>D|GnEl?AW!X{d zGQLWkgPN@U_IiI+0F74m8&>WSvrl&UaW20V@z{^v7%yXi+plGaRio;3;(pl@69AT4 zWrOXvtn@kZWxes)mGRpkV{d@Q044UrbyZa`h{M#c?t_d4>P||&y;qIckF}!RAoE*C z!1X$vx2-(#q)|gO=g@Rj!WxWqgJ z0~n&%6!XO+AwNz&e6Rk?cqq_)SOXH(yaQO_2SS10b+(r8Ij~OC=GUOWZ-P)5sV*JB z9yCEEAA~a}t7!+(hXS>b+(31l#Hsuaff#=j;E8Ymxe029V4Vxv=!4^_{UU{6}8&Y}QLb=41pEK~_3 zQcWZ&t5zRI{r+k%NN{bh`Bk7&$1W!;#a(P|I0DXVjsIP|LA^Lt`#n)zMH~^e@NF;Y z2x@p%O*(>{Rq92MVEa`s?W-;I)?C?lg5@dnCQ==QLX7>2l`lq2cuc>e)m*cQ=!mEo z`z0(t&aQO!v5kAC+d0vZLsaOysM~%W%pIGi_5Qi~&^5L~jP`=+2?bGGjU+KTSwqc! zSF|$ImMAFLet}GfJNw+3G+k~jt-&Z0B+O3!jvv@bv+gocF+vr-2kQr@E$^Xg9ka{@ z<;i(#`dpiMun#Kc9LA!*L|ukni2b^tA*1WXwX0Bxo{frV!%;%uwmXVFYL)UF$8MB! z6uVI!HT~#KL(rH~JIJq4Cy!#}aptJ}K1x`f{e6#4QUl+I%kB5o^dG-q%lFkkSYcZo z9cjPOrt3!;otx|^+GOWM#h9-AU57=*M5r^U+w!$fRGWjNRkdTHljH1Yb6Was0rHra3Y^5(dkt_v=U=;a@p)?KZ2;;Di;8!O*j zJgm_*2d`FCjQxh4w?nF4f9XP{K)c2^+W9yHJFGYO-JJ^F?e*N^x`#9Yyi?m57!um;K_OqQJLK z9XfRV6Xb9i!JNK6M$I{aub1X|v)->;uPnUxo16RXC-B!aTrZzc6;BHON2=;^5(WL$ zq>~~{v{CawYPP|Sfxo^KEM9-)a$@Vmf ( - + +

+ Create BETH App +

{children} diff --git a/src/components/tweets.tsx b/src/components/tweets.tsx index 5d84323..766dac6 100644 --- a/src/components/tweets.tsx +++ b/src/components/tweets.tsx @@ -5,22 +5,39 @@ export function TweetCard({ author: { handle }, createdAt, content, + id, }: { createdAt: Date; content: string; author: { handle: string; }; + id: number; }) { return ( -
+

@{handle}

{content}

- {createdAt.toLocaleString()} +
+ {createdAt.toLocaleString()} +
+
); } diff --git a/src/config/index.ts b/src/config/index.ts index 3adcc71..7ba4803 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -1,18 +1,24 @@ import { createEnv } from "@t3-oss/env-core"; import { z } from "zod"; - const env = createEnv({ server: { LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]), DATABASE_CONNECTION_TYPE: z.enum(["local", "remote", "local-replica"]), DATABASE_URL: z.string().min(1), - DATABASE_AUTH_TOKEN: z.string().optional().refine((s) => { - // not needed for local only - const type = process.env.DATABASE_CONNECTION_TYPE; - return type === "remote" || type === "local-replica" ? s && s.length > 0 : true; - }), + DATABASE_AUTH_TOKEN: z + .string() + .optional() + .refine((s) => { + // not needed for local only + const type = process.env.DATABASE_CONNECTION_TYPE; + return type === "remote" || type === "local-replica" + ? s && s.length > 0 + : true; + }), NODE_ENV: z.enum(["development", "production"]), + GITHUB_CLIENT_ID: z.string().min(1), + GITHUB_CLIENT_SECRET: z.string().min(1), }, runtimeEnv: process.env, }); diff --git a/src/controllers/tweets.tsx b/src/controllers/tweets.tsx index 32e732f..163695c 100644 --- a/src/controllers/tweets.tsx +++ b/src/controllers/tweets.tsx @@ -1,3 +1,4 @@ +import { eq } from "drizzle-orm"; import { Elysia, t } from "elysia"; import { authed } from "../auth/middleware"; import { AdditionalTweetList, TweetCard } from "../components/tweets"; @@ -55,6 +56,7 @@ export const tweetsController = new Elysia({ content={tweet.content} createdAt={tweet.createdAt} author={{ handle: session.user.handle }} + id={tweet.id} /> ); }, @@ -66,4 +68,49 @@ export const tweetsController = new Elysia({ }), }), }, + ) + .delete( + "/:tweetId", + async ({ session, db, params: { tweetId }, set, log }) => { + if (!session) { + set.status = "Unauthorized"; + return ( +
+ Unauthorized +
+ ); + } + + const [tweet] = await db + .select() + .from(tweets) + .where(eq(tweets.id, tweetId)); + + log.debug(tweet); + + if (!tweet) { + set.status = "Not Found"; + return ( +
+ Tweet not found +
+ ); + } + + if (tweet.authorId !== session.user.userId) { + set.status = "Unauthorized"; + return ( +
+ Unauthorized +
+ ); + } + + await db.delete(tweets).where(eq(tweets.id, tweetId)); + }, + { + params: t.Object({ + tweetId: t.Numeric(), + }), + }, ); diff --git a/src/db/schema/tweets.ts b/src/db/schema/tweets.ts index 6026506..366597b 100644 --- a/src/db/schema/tweets.ts +++ b/src/db/schema/tweets.ts @@ -15,6 +15,7 @@ export const tweets = sqliteTable( (table) => { return { authorIdx: index("author_idx").on(table.authorId), + createdAtIdx: index("created_at_idx").on(table.createdAt), }; }, ); diff --git a/src/pages/(auth)/*.ts b/src/pages/(auth)/*.ts index 34c2b2e..fb77c53 100644 --- a/src/pages/(auth)/*.ts +++ b/src/pages/(auth)/*.ts @@ -1,6 +1,4 @@ import Elysia from "elysia"; -// import { signup } from "./signup"; +import { login } from "./signin"; -import { signin } from "./signin"; - -export const authGroup = new Elysia().use(signin); +export const authGroup = new Elysia().use(login); diff --git a/src/pages/(auth)/signin.tsx b/src/pages/(auth)/signin.tsx index 01f5f78..4da0da0 100644 --- a/src/pages/(auth)/signin.tsx +++ b/src/pages/(auth)/signin.tsx @@ -1,74 +1,167 @@ +import { OAuthRequestError } from "@lucia-auth/oauth"; import Elysia from "elysia"; +import { parseCookie, serializeCookie } from "lucia/utils"; +import { githubAuth } from "../../auth"; import { BaseHtml } from "../../components/base"; +import { config } from "../../config"; import { ctx } from "../../context"; -export const signin = new Elysia().use(ctx).get("/signin", ({ html }) => - html(() => ( - -
- -
{ + const authRequest = ctx.auth.handleRequest(ctx); + const session = await authRequest.validate(); + if (session) { + ctx.set.redirect = "/"; + return; + } + + return ctx.html(() => ( + +
- -
- - -
- - -
- -
-
- )), -); +
+ + +
+
+ + +
+
+ + + + Sign In with Github +
+ +
+
+ +
+ + )); + }) + .get("/login/github", async ({ set }) => { + const [url, state] = await githubAuth.getAuthorizationUrl(); + + const stateCookie = serializeCookie("github_oauth_state", state, { + maxAge: 60 * 60, + secure: config.env.NODE_ENV === "production", + httpOnly: true, + path: "/", + }); + + set.headers["Set-Cookie"] = stateCookie; + set.redirect = url.toString(); + }) + .get( + "/login/github/callback", + async ({ request, log, path, query, set, auth }) => { + const { code, state } = query; + + const cookies = parseCookie(request.headers.get("Cookie") ?? ""); + const storedState = cookies.github_oauth_state; + + if (!storedState || !state || storedState !== state || !code) { + set.status = 400; + return "Invalid state"; + } + + try { + const { getExistingUser, githubUser, createUser } = + await githubAuth.validateCallback(code); + + const getUser = async () => { + const existingUser = await getExistingUser(); + if (existingUser) return existingUser; + const user = await createUser({ + attributes: { + handle: githubUser.login, + }, + }); + return user; + }; + + const user = await getUser(); + const session = await auth.createSession({ + userId: user.userId, + attributes: {}, + }); + const sessionCookie = auth.createSessionCookie(session); + // redirect to profile page + return new Response(null, { + headers: { + Location: "/", + "Set-Cookie": sessionCookie.serialize(), // store session cookie + }, + status: 302, + }); + } catch (e) { + if (e instanceof OAuthRequestError) { + // invalid code + set.status = 400; + return e.message; + } + set.status = 500; + log.error(e); + return "Internal server error"; + } + }, + ); diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 13ca7cf..e1eab84 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -32,7 +32,7 @@ export const index = new Elysia() ) : ( Sign In