From 2b98daead9afeaa4b8ff1357284f768cc257f3c2 Mon Sep 17 00:00:00 2001 From: TZGyn Date: Tue, 27 Aug 2024 12:14:23 +0800 Subject: [PATCH] migrate to use node due to bun having too many issues (still using bun install) --- frontend/Dockerfile | 11 ++-- frontend/bun.lockb | Bin 213066 -> 220585 bytes frontend/package.json | 3 ++ frontend/src/lib/db/migrate.ts | 2 +- .../settings/security/+page.server.ts | 49 +++++++++++++++--- .../src/routes/(auth)/login/+page.server.ts | 4 +- .../src/routes/(auth)/signup/+page.server.ts | 3 +- 7 files changed, 56 insertions(+), 16 deletions(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 48b0429..2e48a2b 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.1.20 +FROM node:22 WORKDIR /app @@ -8,14 +8,15 @@ COPY ./bun.lockb ./ COPY . . # COPY ./.env.example ./.env -RUN bun install +RUN npm install ARG DATABASE_URL -RUN DATABASE_URL=$DATABASE_URL bun run db:migrate +RUN DATABASE_URL=$DATABASE_URL npm run db:migrate -RUN bun run build +RUN npm run build EXPOSE 3000 -ENTRYPOINT ["bun", "--bun", "run", "build"] +ENTRYPOINT ["node", "build"] + diff --git a/frontend/bun.lockb b/frontend/bun.lockb index d9aea3b68d839fb071e5724e84814111b761f869..755fb9a6221d128e3aea8ee1c891a0d2eae88f81 100755 GIT binary patch delta 39213 zcmeIbcUTqI+CIEzWGkbhA}AtQ5K-x!je=~kgQB2fZ*)+kTd=Uf4ptm>i5+`aEJ0&T z)Yvc@CC1*PiM=H;F&g!|pD93c$a&9uu5;esA7AF;-uHT*^{ifJ?b*!fY?I9gP3F7U z->dSb&a?NmV%|*oz1zLc_iGOAebMdtogZo#H!GYHnfTP(a!3^oUAp{!O-5dK<0V1< zsHf3nk57)4gqxg3Qv-7Pn3%+j7>&jmp{hgHf@^{=AfO5OjlwpHeidXZ=uIKl0Y{~$ zJ7=WD#B|KR+a&NYJZnK29g{jbB2lBc1DPU?h)PaNLb9JiwuC&Unnq&*&Vx*uYGf?S zSz;h(VQ3|2G_|2sv!*7k#{Lri6l+FAWMo8SVvH$difshSLs`#APfUnJYImTgEH;L+ zF8CZ|Q}7uSo%l9vq$(I4l@^g6qv?;Vn`<=UWzN)~Lk7q%BR(c6AvROfM3Ei9R4rX# zOL4>{CR0+H^GJx&N=}MGWok5I(;`w*GBui$P$Jpv6ELPSIUpmHcWW@!R6ExL3~7d^4KJe#trpI z87sjDRmLUAA(qXnuiA;r-ENDD}BuN^e9$MgpQUXcE$$ zr7G-TEgMEE5f1>9;i#CjxEK#qh@v-bB-e9nM0!RlVn~Y_olbfC271&;w%Azi1Gm9c z-<)C}oj8W_uj#2|G%7xMWJ0v~LzTKhy{2;BE{mLzg}ojI)R3Q}lTeOTj%+5&JHV9C z7BSGMNyLQ~8Vyp&E(W6n*-I5U2TUD30*vUhJAjd+Y#T5l$mYS+n)mEvJ`N`T4T_ux zrudS@BSsd6QfIjXe-4(?22(36QS?(4IaTo=rs%sVdT(%j*xM*_bujgjpPgj=T`g-FWI5K) zJIJZ+08?*Wsc;^c#@j-LBhp4@WTwOzG^cIlak0OXoZwb4B@i8vIU*fdS)=F|fGNVs z3MYf9#dje*#&Y&5FcotOm|Av2S9w^db8d|wrR#txBg?@xFwV2{U`SnJtdfzD3P*s+ za0Mr4C_N)BAteU=&`vJ#?QU|$Qz@6Y26UI@V_+Je#b7E(WQc4(04zY>0X^}0Vgno_ zd&niZ1I8?tJpfD@ic3zBR>U)qsqXI5W1V-vu2VBfW$9ImaxW8)K|;t@U}J;pE& zHL5uW51JF#^p~qFB_boBcCl8Pl7?qHekP?xe{^zwT4t7+f#|O#@?gvxV z7Y&m2Q^C}fg9pnT2AOK=*mCc~|x|nBp51 zGb)w_Oz)9W0SwuD;XyfG52gSGU@D;iZVG;k3ZVt*92jeKb`h8sq`6>>&}^zOvg@I+ zE12x-f@uMKjf@aq22;3$U~6z8xFL=I&Tvq|#b_T&fPpE(abSvQh@#hnDFSOSCH#A; zY#T(a6w>7*cD6@Ryvxj4y{%3s9L(r#>s6yZJgM!W@F1Z_)|p; z1XIn$CZ~-`Pl`zCDTdXw;97|ZHEj%W$w?j>P4FbSjrC?PDcz2ny0NW@ky8!{!I2u8ey>^@3_>WtoT zt2`^HGy9)s^yJ9Vs2+_*o!Q&Ko@NPkW_N@iC4ebP+Gc2W$o*;^Sb$yxn}WOUq>Ojh zWKV;l78Ge^;S=C>HO#MZ@q5pFW4Jq2Q)b#UehVzG89(mk!(~tSC1Lw5Z z*S58g?0@2M*wTX*&7Z3$a;!On<{nKlH~jZ#%5o_Of{9`~u_eeb>}la$xkFgY6ounouxj zQy-7_`mmDy@vPvY_2C=6_a5Wc?dfkBYSi@hppOmO{P6u@+e>*z3fD~>+u-2`mu~Y$ zpIF_cx%d>t5`1121$#X=L=3`bzL<;8w_*uCT|~h_FC?RDP#RUluvR)`Ki5Ie zy%0xDz;IX-e3>~-8vVu`b!YcC2edSNyeXYxVHsEnhK0_3<`>I51|R5eDT zDRKpSSJ*@623IPL}iuiguRfI#%Q4vo+=V2hS}?c=IG~2Zcy`)klG-eoSThekcVEVhp~xahPco+ z+yt@2L(dh9f~TJU-CV35t~bK)YA>E`<;NMs5>LHwA97jRT95k3u^3|KC&a=<`l^&e zZi`srr5El(N4b{cb`*oW^};ZWtR7Mx$Zoq>0^LpMC||r-iW;IA8_WT?ejUlzR(2#Kl{eG(O)3Mmv4B5}|OM<7u(R1r%D_!>dzDCM~WwmB35 z`ek#SFcXrT3$&y5C?qe@q`99!n=Z1dCS@TQ5|vXcNemK&sV3Fl4Y8!PUNEs%dkXru z5CVxp^V9=`Tu79Ws?tz7DVDU+b2g&jrx(H-$v#@K6g@>0bN%$(_hN~kUfZBC;uAw! z_;EeNAb-8E3UWKd!AV7X4ym&&p}oDDXf%2$wfr<+F{rJcD-?6vqK2WTK7u~#s1t0P zsy!wjc^afhRYX%4oghM@@}U}0`w)U9fojpirYw@SI$;DP7x-zZD8dp*fszDE4Am07 zUTEB`EGl%Z6fvlsUN{0>PuOY1QoW9^V=JC+7a+84uI9%SxhsW44XG8w{B>L#F*i`J zec3{z86?gL^wV~0i91=zwGOU9qDcpTBRG0Xs$Q*d(7F@B1=cXIIs34qW8xZv=-NzzT&8k%GpM7|o?y7GHTykOy;gaoc!X+ox z%tO_UgiDTZKU{K%k8pL9;tTdv?L@d_yE|n%drUuad`WQimHPjCxJIBo&?7L1#CdBp zh>Ql7w@xU4$!2F5Te)af=?&WB*ahq8m=yq z%U?(NA>A~%WZ%f%0eY=<2TXU;q&85@9iSJ^L8kdb?qqd3%F`I8D<5BDML@RwC4q7+NVEJg zc#(uj6LtDl6b8{QCJ3KL#N0u8;XM`$O4*odjnj+5V7-uz*^=^REOqDYkWg4k7oGK) zSON>TF7mu3FRvMp`bZWO$0;#)h@P_-ONQu$lU>#Mjas`=klfl>#9-G`%pFSGjgp~y z?KAiUNJ}V|z+rkJ70pCxN{fb2q)1X~+EhmliBorc`2@eJ8f=8cBh4HaOcsoxqqwEz-{c!ev|e(OMX7_M*lxOD z6hbSyiL0M53NG|3rJ1%uDsQy!%OotP+9v2XZN#%4e%dU!dWdt{`U!8~>Mw<+1t7Gi z277EN;laK}5ZuH$u727xaD|E{iGG50sNAQp2BQZ@L86w?h+)HY!gWYg$LRT(R06`} zB~4!Qr$V9qnWPooJF6KoC2s6Xw zB+;T6$NM39$-xoeDI}^^^yTI{-lwma7ZV^9_LU1P55Cus(3i*r!FwZm$}xr_rh$A# z!tMh(djpB46znD-IiUJwiDu@(kkFguA*9_2sXgs-w6Eau6-`?C@%976>hS^mtN~(h ze1LFbfLs^Vq{-(4B+8~-&AtQGxX|f^EJ#Wb;&sABNOIFr6IcwA{p9++u1Ip%ZaP@5 zRcTKs#43`sbJDJX)J{BW@252yLMsjJAqT=Gw-uFVi6Wt`TKXD8phTrU!MhF>t0x8s zBZsPKQ%$XhL~V%jK)S0)a@viC$(=~rT?r#0QH!FxVOz5k5~V6gllC)3s!DC4^&3vP z#NLZvG+Yc$3J^-5psIi|DyB+=JTq1oO$YiKLy)_sDOzzXq(B&=g`IW$(FidwIY9do zN`GnSIYr7L>q<8b6CruRSdz3mA)#t8K#im1)Z`hvJtTP^4r{05Cq;?DsR8_zC^0WJ zKxi5*HzvAJypHc5Emltp5I%*HDh*Q$%JMrT?A5WOb&HWZsJuC*Z(V$0g^3HbaS0OU zAcP^QX{@@0p}%Q+LBhR&ho7(zu8xuwwbT_wk|uAhbsX(iG5CdEa8b=7uAw?%KItK0 z33Jr(C*s85(E&pJczNW=$wfnID@Plt6FQE-F|8``*GGuKV*&)5k#deuP)D71Fr+q8 znHIxE^^G?T-~NA@n~1Wg?l{2{SK}e z$u)es8sdvGSK}FK*a>hA5JP798%Yid>O518WF}nwq)2YV)tg+rN3NJRD?po^OKHxT z<)=Lc7j6XMvdyDd$(0S4?0XR|+=)WxHcPs(gliF8a)_VHT)k(jVRykbKs1@>Z#0J- z6f_bpIg&$g;SLiz^SRPp>?}Va4le3+=+=HZp3N2W<^^bL&69%6^V254g=pY9TBd6> zUkVIe3S7uDTxa1*kX%0b(rqzx3@+LCXSi@%4BdbQQtsi}U*@t9Rl5whP&W8pfJ;u- zX`z(qd4Bwqg<_tFg$9cD$gwn>wZB8si6M*pjTT`{h$ajDv}57wES_ED&n*(GFV-6^ zRy~5?>MEJ!!_`@GT`u#rVybTxT-_z#on^XT;p!pjIxSIs^WjorflH3LNr9SL6kM`y zD_nAXzrrPlXuA|kpA_E=xMaI?aLIO7%T!$yTvD-wJ#fhr7mcuwklIP(gAP*WEteNk zX;RZ}SV3z#ZO2~1}fDe;~=$> z5}+AwD@>LLXm3O5E6(xr6D(HC!wgHKt&R_0E#|EV;1{nJPp=3NF2j#nNSZi#%R(`D zWq{D5P|Yw6`;CeuZ8o$IAhnma@E&Vujm0imn+R8Tan3S7e*YTr^r`@D<~mB7yo%uJ zLoVKVy_mN;fZw=YJiR(VFxwy}fji<^*!4r|D)kf0Pui`Jg2c0J{P>?Yh^Gq!1fPwv zHwxgS<7aFXgVzM`-)t1~)&vN>H=&sjRGQs|0!Xy8KwiDE+HVqr*9P#7H;Z{|1BA7k zF;=BSNTb&;ubM)T>$^}7V-4D0D<2s&q+8LrF{-0G;pGy zb}?MR(%$qATvUMwjnlzq+sJ~NGZrp4y1COXmUMJtcnvP<7Sb&pUw^w;-6eqUvt2yB zF+iBTUG5h0WNx)XUMg{*iS|7PiP~3MCxj1>f+3+cXx7{*mmd<^Y6T>DXJxt&w@->6 zPRy`owcAyeQ#)T{2vlwIf_X}jV7SWHxJW*VvlL4`biyP^)OnFMQac364U)WmJ%dE~ z!ciaErR8ohZ)+QayGBE2Q_@Au16Wb$8y4D#X{rDn0S@Q{&_zr#awKsVFkKay;=$4( zT@_giO%Fv6Hb@clR20M%ai}5_Q$)QKnV9500A;KnKo_wQFo* zQx#4_`qGuADAEk)(%Wwfr`I@9OQ0~531@AMeYHnAs$Vh|2;PRR}!E+$KZn|!8D}+6`49` zhNKs(?yhB^mL98^{WB($af;plhABuUKBxgEDd8)y+y^TtVD?8t8oHB}fEAfkQxrWh zIj1TzF%8z)iu~8CjDf#4KrBi`RD$`4kZMd+A||E^U8KnW8>S$OX$(*VOTeTkpbv$~ zxfCCi@JdBbOf|Arkt<{J-vobJRCa*Lbf?0*6fOc&K@58p#Xc|v{8W(-g6SeA{b5Ca z1WXzJQt_|Il+lxlo|qCi4JOrBik_JCUxN`(56yWvD1nP${An)H$Df!=azoJ*QwDA+ zGBHJX7tD#y`}ESZ@&ifGKEMZAKO#Y4itPnt3iTtHyna&riAn#9B3EQm{fZCbH;O+o z*}qftzjMm|0uIUJqheSYQ+-vT+$l_^Mv7dKNmW(RS7b_9fS$rtSGWc}Vn z6EIyBnf5Q{ik_Gvs;9`r)GiGby_KT>A6Z&f5s(ZiLTe=;F*zIKqZZf+Of^71*C9K1 zg+0J@5tH6iVK0Tf75~3t!(Vy)J9^4!2P8-t?V=?7Kd|9nHT8i+7;%vokisD}xQ--E0@yr5q)c7Qu8?#^kj~v0JP#1Czc0AJkME!P5BO1P7ITE0_}Arto$! zUH?Uv#~&p?IXb8${F##Qf1i;)ZDvj)LE2AVQ4;ifpZLBQRZ+F@LGt0wA77(fnGBd-oA@iVr$%eG#i&VOFO{!R?hf z3!ly2HU8%q^^%=Jv(K4W;B)(1N5n{I5m;nzdUzT0VgXqorPgXBvE1Gi+3^w(9b$(hh%l_69?YYPcx9&GIes5aWd+LOc+ymzi zAMn_4^G3n02QKfwIpP>)a`BPFkLL5=-u?W|W+SIxh2N^yzE9tpso8t4<_&E0!w)vQ z@_+9$zxNlPIxVineVx{SY8zAAZ4HMzbzjmlu17JyEk!@kCfKsjJ^jjpJhQ-?HN&+p z-q!il`guWG@bkqvomhw+vd7Yn?jJfk+cTxR$GXuuQ}gQE7B3BJTh#R4mS>9-z6l7o znml}>(|3-o7GD`2+AAsjn%&dx4p-*+or=wDP~&o+uwcH>t3|Ij zZxZ_y|F$=A#iI3rFS~SFzi#e#!kWE-*6A0B?`$3?4} zv>oJJb(HHm19KC?I-NZ~ZAQ#D#=ZMEyDZ;RA$uI$>Sfd*;~Vc5#zL*9DOpeB?)hvR zXy1AA-5+l*bGG|byWer|!G=@6<9=|;w(P^+H}uZCdBV(Ot?k{hf$Po=uCk?TxAr@) zv+XUAy$wc#zpFd$!Nd)mg{~dcSX;Py4u2v)*swl zht_}2?Z5r)ktL_w|DeD0{)uPNnXC%gt5Pw04;F+td{_VN+x_;>0%za9=NW6gk9QRU zPFT3VEcm5o!?`Id_czbI*}$^>)x(SK_S*8OVA=FNwEiR{g* zzuReD;kMu{XI3=+G}@}K`IUBO4+=lO?wOU9-Kt9c$-iG&@O0?9k{8=vJTz(G^w4Pe zzM7wX_O#ZKnLCD=)L-~ZPKE4gD`s!(jzK=X8jiJkl>E{sVc(F&Yqs=TSv>cCTwM5e zajW;PsT22Kx9D=n-E!0Hi(BgryLkU`tw%3=Mm0}&Z=CS-sJ&0bVP?{bYY?){%+`2jgj20J6BcfZIYQvr8e3?_*+Zjk4owY?^=b}HD+g%y zk;a5$yd5-GNE2fRO>K_tCe2JoXzI1#x^bo~q6OEF`8q*yoD^ovv?UY|Nin)56!q8< zQY>+X!mbq*7A&Vp=jj|#XeFvGtLc)E2M~VgTj>+kz%F~6!qMpaAy(jQ26Sg zI8F*rX6gaOLsE?PfWn&{A;l73DC|6;(6LlcD7v8gfPwziYugu@q?l# zD?+YP<{k(d&T@$&*j=JX*1A0?ischUvqwZREU*J8mK6}i zu~$U#ET|(Wffa(-xL{;e+X-16$-+88pU5^7jbdD9P!bzJl+22VQkc*Ml*%HA(%1o_ zbY|KWl)(~+MzbSCW0++SXe>)58pleAGMP;t@KWIP={o za{AEQWsXzwnUlfehT0qEr28Kq{K=xPKCAhp^~vw9mW&K7o@0EYp=Rcp?rS#IIJNL? zE&n$MPF@{z;%K9uAD5=kBNgg$xu9aatsQkYSEUU+H16f%!J}B_z@`?{n>_ecZ+5(z zp^-=3T8qU=e7()i?=G4@|MhLsyTm$NyAw-ZXY91uxkc>yy=~F*krk$Dv0}uh>IZCD zzu=3peOpCMsl9f(S>eWztn=5t*#AcNXshWrjhnciZ*0`+W7d(dS>4v_HD{BL+lCYb zy4Vcu*s#7^0Q>p~$8PoKEV?h-_rCY)&ey-o>N22L>+@@DJigj#`FUzWh;8b(=C#MH z-gEHj4<~d!d1IQ`yM4MM<|~^|+VAN1b*qIJ`kDM>eW%|ZT0PWqFJckB(B6yL0V2js zdxMs+1fl|VglH+V>;qcHQi+zc5~3B%CLFYqWfHAor9`WleP6EMfWnGJ9`&*2N&h>w z$EGFSm}%FsZq3t0vx9`JlC?k22;1cM_QIu<3&+NN`~24G*?SE~m)sllnfoWxTF+|v zTWW6X74MTqV~$kF>l&7W=()A*D$zRTjv>sgXSqZh*j=KHtaX3TCYDdMnLQ%f!U6|? zwz2}EZR{1%b`~^{x>^K!*7kwuYCG9)P;k3g*dS05+f1~Zaf3m7*Z>fF7zN`)gJHan z2}7X&ghdb)vjar?ndwl_0hU1YDLX=RkXa4`ea2FW4zUuV&za3|&=)L|=rAiKI>PKD zKu1{)(UD6D9|aEPgKGl5uIj%(V(wb0nr)uis&p0ilI^_ zQYmAQ@pJ4qD7f=1EEZJCHWPirxH!-SHh}0`Rz!4>3GtvyEQ07VJ3w@WnI?d)vIL@Q z>jWqoWkB&8OUQuY4Jpo&;vKUb4aKI3 zP)r&P#d}slivE+Ja2^B2N0vDT3gav&ZbHFxJaZU}WoJKW=8T1=3eT>QCf)!|+i}on zd6qX0ng-d>JR?mtp0&w@<`ijGWI`kG>@jJ^G2MXg{ zC~lI%hS^VsVm~S7OoqaiU4?>c&fKSf>{u>Q3wD>NC3`d#)QSa81KG0zA_w-0$dLt2 z2RX4qB4_p+kqZl(0di%ViQE`B6XebY5P7g7B2Omdg1lG+kvBU)#$IalhM)=}e zV1@adeu1qKn?H*)E>}$;RpM-@Lh&u0NinRdamCqlxMLi@+>EWv=N6E~jd`$Wh3BHH zm&GFmYJ`V+YEhtm9Lxme-yCa7i&x}xe!S44x%|(++}K@_GqXGa5sxQj)8V)JkL(=n z@URBOU_~)7r$wAGcd59LaXOyl6vi3b|7AEOF7C z8}+|$Iu4f}0g_6S9wYxJ&Y94eQ0TP?txbtU`o#x!b2=qGB~_$-iVEkukxP{8or26G zRe4j8N-t%QtA&5);VOr%_$i)m<|S3oKd)G+Y1E1>-OgR+ICHjnCugO7fu|#+vPvDJ z<}S{dcUno+;K91?;yUt$tBU9D;&@J*uud_wpgis>;x=iI;t7bdu=Uk{Cl{5NApH+W zYT-GXi$B@T)s;F%Sw|>-zlXCJQLz-{w&kifrAI(<8GEzFjroAinhzi4i^;3TO zrlL$i=vi;NwktL`43nOJC*2NK*qApn&;!tnLK(Li7tA`ni4_B)Wj;f&y>LQ z+`jsF;~~Y4p54OFxTNa~#g3kC`bn;@vWK(jX|$geoxIrZo;h$x(Orj*;;sjLuIO$;M;WGHOXQL#uE)^fPYORt(LJF@ z5J=eopr=r&%AYDaOStPmN3Hk_I?6ypfF7Tss(hu`QM1wWS9Gb*ZCk@l&uCFi(pQT3 zlbX^;vHMxk85+Zbo))FtzJ`*jl-hTRqN@TXT~i<*pc*oTjv}-H(%`1d*Hv`Q;4UUl zTxN>S7H;}?xpb+IQ)9ZL$LI`FuIQ^isw&KPnw3CPz)=ZI9jjCcOpiw6Pty|k2D)Zo z7saj>-1JZ>U9Mnq+5>f!64Mx>XdD1~;E?=0sQpRl2sD6_JUtadC%CE2=%Qz=DMDv} znujhQ#m)up=Za1T9i>OToNANeXrtJgJdu_cpaXn?)&M9&W19*Oh>yZ~=tH!?#%blc00+wv_9_;D!xUkCaLr=}f1BalYi zYv2u#3Eg;LA}|R+y=$_89AFAC6_^Ih1ag5{z-(X+Fc+l2JHD5}4fgJU2S5W=2lPTd=#j*pKo_7C_y+hExC|TzP5`F>dj7QuKo8*l4txMU z0$;-K3*b|r7}y4E2e3?OHUXP~`P3#0;1Gd@0Dj-D`38Y601JRL$b*2vz%YOwz7Gbv z0o{QRfI2P>3mOK#Kx=@yKXrHN-EDyYKo7J70)h4b-KRI9vDg$28=x6r3p5ApfEGYY zpcP;bH~=(3&}>4h5Un~i>(EL=D+~Qxh#sk-S%-e~G!2*z%m8KrdB7}yeqcqX!ZZzM z(?<@F35*9O022W`DJMP8It^7j9hd>k1n5~=dJvZ$;%x)aQ^I{3jLVI2+#r_q2s}qz?Xrmz%_uD!;8RSfPRIw5m*fr0`%*nqloW3unwR(nSP1% z5V%i2khlQ{t(~+;)0#{_*P;y$ZD8o9N;Dro0cZ}UC6VS``pV`ua0hq~d;oq1-T`lb z?|{3&FTk$=Z6bCdaXs)E+=l>Kx3lO0eOiN4fH0soKV$|;bA8p#G|U8NZUc9KyTEtAJ>Wj@J@5nY0C)%(9^vCL@C0}YJOiEsFMyZ8 zE8q%n4JZLl1787WfV05Yz&YSNPzrntTm&uwmw`FJaAYtITpzFi8UU8S0BZkqlq?g# z!Yus~WCuKU0=s}BU^lP_*bD3fJ^_k>{lEd>Q-FSQvJ_YbEC*HqD}hzOYM>BU1FQws z0qcPcz)IQ)j)#L5_I#Yr^F4<~z!?cd0c((P4ZJzv3S{~v%VvPqa$36SM*}}WPs{F) z0R57UmRnj~NhUwy{s9PtE4w?buFVWIrO?!}2D(OIno`UFS|HZJzAN<9%GCF305tfJ zl*SlLakhfn7NEFkz*3)I15kgbe!m!41mpwrfq4K;Jv0U7a+(&>ltXjU41ngSY+w)& z0(1w0fojEf9r-<4!&@Zu2KWtl2XOGy0PjJ+1LW=i`Urdg+5<+44e7~_hg|hfIyx|< zZ^X!!YzS&N@-qfH(@!Wm!C?W^00f{qP#^db0qTM405t&s% zhQJ*KL;?}OP+%A^9H0)Xf(n%dOadkX6M*qRCNK^d3yc9q0~tU%kOurY?#a;Q08@c! z9Bvw@Eve0?kdnRk~IbM7dZZ6yI#akE_!bb!a0Mz?e0V{zOz;a+2 zPyjGsiGrmS+^UW^Q%PYR-0Ok;zy_cg_ypJo>;?7!yMZE3!;-yuONWgRHUV3J%>Y%K zT1_Y5J`NlMzU0_7Z{ER#Y_9=VfK#lvEyhgt$#nlfa?O#!S6~QfEHNVm(yaq8GbJS+8U6X)+Sn`XsxOT z1VPsupedR3)_@g2>sLd7{3#60kS)NCc~nI|r|oF22U&>%nSmd7GZ6GSOG)%&%S+Oe4FPSq_%<&lVXrFwYVMMkn6~92lMrf zuz6H+DrM1A$&Z|J2)@aELK%=uEUI{E8nLi02!*tyg4J(~H7mEd4vD7hqCjtLsPrrG6gCipXvh``8KXqrPPD$*5z?`acN!3U*$o4{tOK8mAU$ zV$~tb+Rk2|RNiuPSx9FjU%-;Xc}tev84a|SEhAMC+t(S1tM5e|u+{dl$+R(_A*hdB z$tA2x7bGsVj3pPqMs`8YyRcQH?9ZNcK^#q3a#xT8vmw$kzplKakc}}z-AM8LjOBJk zh?DH@G~S#&>5Ap=JgX6exK1#A5Q14Vt2il=^dQ*XVn;~%lwBwKg}o+AH)bCUy2OSA zLs`Pc2E$S=lic4dQAfW8W03S_5#3NK^*xR2b649s^uYfgldB5d>mA$Kjn9!D1(4$J z)*WL{eLbU5e~&(At8O_Cb8op4<}w2e@Zd*5cixjnWqjS8Z(yaqh4BlgW!L<|8wA5% znSUY~7lNFQVctaFu!Imk#7cb$`^r^(BuhryuOF z>3yvYJeTF|f`~B;SnnQ)FPqKifs)g647_<&%pbVNVJ~{11b^KF6k|6ROtg`#ZBHb( zgZ1l)*do|0NLK2b=)OsL`_mO}(PODFZj|a+_5}>Qr(ipPWh^_=eDdgX?>0jt)f|J!3bawEc*{ zSQWAzF_qBdVs*xD^QIb&=hxw^n`7;SW;AmQgZ*T-b2hRoOt!7%k$KCx|nmE9dqi5b;Uz|QqXH%Z3fs}&MD zXkNeWka-1@jW{owlTodCtWh7-jru;yu%*wRw_9EMq1@m&3xff^?Hx&W>iaBxUry** ztImwlayuKgitO;@P!@0AREj&I1y*CEs%yF3*W=y!&gI5A>>0(TzD2Xq_@3PN6E9|$ z8x-RK1;loN`GuqSe;5H)>PshY-TGq1R*yrijX2Detx+D0BRfQ)^sICsx{ag?XRk<= zz-sgbWij_`-mIEzozL{pc`Gl!%s#4l-lfGOzFm2A>gzER4)|~Ksygb2a-Xwo4n=pD z6%JAp`k5Vpim&d>ZuG@6WW%_evXs18?S4o}eNAU%{ojS!P0W8Ok57G(=Yz!=KNjkL zIauzK%7!2)HrU17D4i5wx~Zk zsnmhuWU^tw19&IxZL2cOtfYAm7kRedXt=YN4$2!%;`2 zEc#*uXr$`4#M4=*X>;~*Ag{Gj-y6Ep%I(t&kD>;a8_O-==Prd*UpH!E(ecsB9b-g!Vzhp+i~DgQuVxml$xCuL_CYdaX(QQycq(`Z}#Fw-{U%7aQRXNiY$&}imt z)nH_2i?g)5&p!1_c9V(g!o_l9wK1irOWD=ISY|xi%5%?uXa#S~h7ILC8>+7}otS@Q zV70?dSMc0v?0{))Wp~1`X*@BM?_qU0P@b_aeV!A%J>=qj%$UlAexJDx!@Tkg2DCpt zQrGYGu%)L%daO??SrH5{MSn$hpTmwO z*dzBnwM+N?5UZpFyFB)h>}0Z1UsF21tI_ROwZ0wzJ7udhnS~5TMCyA@@3(&N>YaCU zlnXh+WQTJbmNOh{%2sv`cJAu?QPY;&G;aTJsH!!I0L{(qar9|$7JK^qfHq@7L zDL%M=Q{Rtjr@XdH@{u-O>Kj$n7kx=Ss4U#xAvWp?>Z`ycA9v3LRO4Sqr@okaS;6Us zsiXGSkOR^3s=lgKeS?_fBkgY^L*xe|)OU<2KAx;*FmG*8-`uLcQB3hgUH&_{`0L`T zZ;VynWG1EK;X?m2RDD^j@)EOkl9xNx(SJ4z>dR@>m!?rV26<<8rw49)(HQFc)s$MG zdWBD2`21u2{B>C?^>L>=%72JWU)FX1x~!GuTh4Z9C^L@aJ^1yZ%s-NEV6DFGc5UP7 z$C{>p+f1%Wj7;|fp)3U!KF33)FN(9LIz20H>QFb3$GYxGRjpB9$!mEkU${AK*H(n3 zc?j)uER20lVbymxcf9mv!Tm29?1Tl~Lc>CR>+Xz_{=eJW`v0VaMJIY5#%f0KvDWGf zefNYWJurW~_Bt%wa8nJ7CcRmmXubjO+?#C!v%^umm-Syq_$PB-l~qPGLsJpW{Aj+R z5~l}0IGo*~G~&bA+i28RMmTec;bX1Tm+&5LXjk>%u;F)*E0l+Z(@C~7hPU)l-{w25 z&fvtvsoZiH;4T_}8udlNmUZhU_OY!k-``4;?ySD-Lkt>2eRXhXR^n$jiuPY*Nbd%V#c7s@NiB3 zU5>T-&ft|>7Cfn6@0)3`!?^)v|M)-_8iyuR-x~Zrk=vEhtRqexq@@8C8G~?igns?z z?S%NF{THt1xgpS4Kr?j^TZynE)wA7(BL7BvUe1RUwGPld~zLH zAmlkz^EE7J`|V!+)f0!#=0-gCDKzHLsIMvR;d*q9<>@cY5r*zJ(E-8+v8M6JtNO;{ zM$PWp9u}G%fCb$=!a{uq@<49+_0GSpN|8z-bZB)g0&ifE)y5Y29H2ODUs|Jn9Uu5ZmtN{A0y=j>fxrm+Lta>MLoTM zhFV#*I29$!(^9wBU19qCIP!&((#$k1n$;bN1PY>A=aGDO>vhp`{xP2Cd~gJI+>Y-Wf zhn*VySZ<-dFxs_@Q1NvOJl5o~S>Qc+(@oUnFHt^IZDc0$A9CLHGq zn!O`fA}r0-w^h%mb!h6lFBaY6xnm>Pk|e$<-+LtcGzoLC`numq=_h?Z#D926smawJ zl*;^*kxEP|oqcPvqjD!5?l8XByK;*usVoH+KI)sIx8J<+^7EGd>E#ycyQDp?elxt$ zqQdFrJ~vX?>IuAg8)|6v4b)aOI<9wE7jUcGN_|JQOWebI>zZE2je(jweHyDtb)df0 zI$^xcFvo7^mX}+MOJnU|;iJ9>JN23C^6|eoNG&awusBV=Ilq$p`##;yj1J{t|K%FC zuB?XTeX7|w_Dc#MOY0359}j-oIJO{_A8PzEQ=ZUS;m-`$U&%UOx=U_pn&WFzI>ug-mc~H5Dc-CcxIh} zoY84K&D@Lz z`}Cf`R#MoJu%I1RP;JeE&=y6hO6(~26!=)eC+~{`b*|sIH;sHSLE&0Hfj!OOW94&M zGZs6VZzCU%{`H}(6Z0N}!=gVN==N0)bk&!RtFOhCWtp`SIJ%ZDS;#YK z1E0!gQL?Cf79}6dqR%Pz%4boskY`ajFD#AuQ&m(xZ<4iKS=s;U@hEvrh8N zUh!N{HjvKs)U>73Ju`NP(yr`uPYxoT?pfkzAyzqvy0Sw&*=`u?Nd}c2;>iZmA)cDH zbd+btcI6=L%8v5nAktBuC4Qsz1X0W1Vp=fk$-K39rC)=2xZtctzg!vIpKPri)ocA~ zw2UXFVYHy~z1H-}*iv^}&elxkJ60bIYs|9QSC_MwlhNPqL8d9%;X|-p^4hw+5gI2; z)UMJu3g%2Vg>T~XQb{BB)|a`vcW?2K(vTLG-{C_y277;Nd~JUA%KheaQ%E;=nrbW9 z>?ynhZ?=N%pMpI^^A+sr6ztjpR>*sZ#~5>TCbr5h+sScSOr$y2e+5gL$~UN<4hzcT z4=dPw$b8aDwq+{cUHLxL$V;D4bc~B-g>rp8eG_?en3=H`%A(x3*{_jrH=fjNYFT5lU4>H0U!_>rUn@QR zkv;#8PqFT}TlMl?K$>{PREsa0pq^+yg{g8reCWoy*2XjI!`RJ8_;|Q@(^su8*R$scYh7)FT*vil z1r3afzuZQuV`<~sdjo5hi{5~v&%U{QM?)4KIi{mf^*1reOU~8Kn%SL6Av~}-b93G# z$K|;oYW$HEt0(bXQ)sBqwgyw*>vDJ~n^4a&O$y`bf|JdT@S$zuBoCJ+N6o6xxe;wI zkoN)vq+XYv+x5fV_08F&aQs_>2h1)Hr>y^&(y+~PN{L|FIzI7>h$!*sAs{}w&Gh#4 z&fd)C=AnVRwn@81aR*z8u>86mZ2w%oqwRLYLEWqC zPPq}kyxP;1$m}mN<{ETis@t zJSLIFne%uDL6!gANT{6rkRlc^AK%!$Vg2Ugt8Y9|mt2^av}4W%d@fB%g1GYR`yBNF1Ax6y0UeH!Yq!7Pb79J<7*(0>3h00pG-M z2R(oW!S(P7>-ueNYWV~*Jz$Vy5nk(~x!0{zkXn;_3~Wv z@sO#rJ=0pG0U#$|G$ruurH z;l|bauxkst1};Znz}D;%{M4+De}%-9r-CGSDBngq!;&I$oC93SJcj` z2R*sOY%cT7Skr5KRo1RemF&i;>8{SMsp-xb0yH2q;>M>ZM8`Ns#YZG1#U!$#Qod1W zxeVKi-p(|dDknN7-8m*LEjcYcE+)e{At@s*At^l}DmijQOccrKDPWfK z3vb=*4=P0bM;k=#&hEbAo3;5vM6mmV3^V$23pt37NOw+2OU_6pM|$R{$mB#8xP`a2 zESIUM6(qLnB5zl(ES%yg#UXiFl$8ZuWo~D8mc5O)?O0Y~c$T@P3eiz^U>_Y5n~)Sk znM#RC%g9Veg~X0dipoexPI69+Ns7yeXQnH7>mmQBN0gOVOJ((-$d#C*BQhe&qF2fx zC55EZqtX&mGLqAzI`I4pPqjkSELI4Y&W^0-?OOh0G32`VQ`uNVwJLTd^i>GFiBL;L zTX|d8%5n;m%G6Se=fC7_i`U)a?>HIgX+D_BkM%j@JdHXV3g0dzKFT#VIc-!#Mp81m zW<+!}Dl{S`L6YJ!Q=B75CnQGyQF2aBp?Z%x`W|Tl# zl*rAW!r*X$<*eszSZLKMTI;f$sD@<k6t7^*b>^Eif4 c*_d|rlKR~zwX3voWGThGMe&t3RnoNoACSlq#Q*>R delta 34673 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 aYg#O%iOATA*X}3%OUumj8dz+u?SBCz*6K?D diff --git a/frontend/package.json b/frontend/package.json index 89aeda9..7a4da5b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -41,9 +41,11 @@ "dependencies": { "@lucia-auth/adapter-drizzle": "^1.0.7", "@prgm/sveltekit-progress-bar": "^2.0.0", + "@stripe/stripe-js": "^4.3.0", "@types/he": "^1.2.3", "apexcharts": "^3.44.0", "arctic": "^1.9.2", + "argon2": "^0.41.0", "bits-ui": "^0.21.13", "clsx": "^2.0.0", "cmdk-sv": "^0.0.13", @@ -59,6 +61,7 @@ "postgres": "^3.4.3", "qr-code-styling": "^1.6.0-rc.1", "resend": "^3.4.0", + "stripe": "^16.8.0", "svelte-sonner": "^0.3.10", "sveltekit-superforms": "^2.12.2", "tailwind-merge": "^2.0.0", diff --git a/frontend/src/lib/db/migrate.ts b/frontend/src/lib/db/migrate.ts index 1c9ea4c..a0f16ed 100644 --- a/frontend/src/lib/db/migrate.ts +++ b/frontend/src/lib/db/migrate.ts @@ -2,7 +2,7 @@ import { drizzle } from 'drizzle-orm/postgres-js' import { migrate } from 'drizzle-orm/postgres-js/migrator' import postgres from 'postgres' -const sql = postgres(Bun.env.DATABASE_URL ?? '', { max: 1 }) +const sql = postgres(process.env.DATABASE_URL ?? '', { max: 1 }) const db = drizzle(sql) await migrate(db, { migrationsFolder: 'drizzle' }) diff --git a/frontend/src/routes/(app)/dashboard/settings/security/+page.server.ts b/frontend/src/routes/(app)/dashboard/settings/security/+page.server.ts index 710ece1..bc648f8 100644 --- a/frontend/src/routes/(app)/dashboard/settings/security/+page.server.ts +++ b/frontend/src/routes/(app)/dashboard/settings/security/+page.server.ts @@ -11,6 +11,7 @@ import { project, shortener, user, visitor } from '$lib/db/schema' import { eq, inArray } from 'drizzle-orm' import { lucia } from '$lib/server/auth' import { env } from '$env/dynamic/private' +import * as argon2 from 'argon2' export const load = (async (event) => { return { @@ -41,18 +42,24 @@ export const actions: Actions = { return setError(form, 'old_password', 'User Not Found') } - const passwordMatch = await Bun.password.verify( - form.data.old_password, + if (!userData.password) { + return setError( + form, + 'old_password', + 'User is using other login method', + ) + } + + const passwordMatch = await argon2.verify( userData.password, + form.data.old_password, ) if (!passwordMatch) { return setError(form, 'old_password', 'Old Password Not Match') } - const newPassword = await Bun.password.hash( - form.data.new_password, - ) + const newPassword = await argon2.hash(form.data.new_password) await db .update(user) @@ -94,9 +101,37 @@ export const actions: Actions = { return setError(form, 'password', 'User Not Found') } - const passwordMatch = await Bun.password.verify( - form.data.password, + if (userData.googleId) { + await lucia.invalidateUserSessions(userId) + + await db.delete(user).where(eq(user.id, userId)) + + const shorteners = await db + .delete(shortener) + .where(eq(shortener.userId, userId)) + .returning() + + await db.delete(project).where(eq(project.userId, userId)) + + await db.delete(visitor).where( + inArray( + visitor.shortenerId, + shorteners.map((shortener) => shortener.id), + ), + ) + + return { + form, + } + } + + if (!userData.password) { + return setError(form, 'password', 'User Not Found') + } + + const passwordMatch = await argon2.verify( userData.password, + form.data.password, ) if (!passwordMatch) { diff --git a/frontend/src/routes/(auth)/login/+page.server.ts b/frontend/src/routes/(auth)/login/+page.server.ts index 346b148..88d6efe 100644 --- a/frontend/src/routes/(auth)/login/+page.server.ts +++ b/frontend/src/routes/(auth)/login/+page.server.ts @@ -8,6 +8,7 @@ import { user as userSchema } from '$lib/db/schema' import { eq } from 'drizzle-orm' import { lucia } from '$lib/server/auth' import { env } from '$env/dynamic/private' +import * as argon2 from 'argon2' export const load = (async (event) => { return { @@ -44,8 +45,7 @@ export const actions: Actions = { } const matchPassword = - user && - (await Bun.password.verify(form.data.password, user.password)) + user && (await argon2.verify(user.password, form.data.password)) if (!user || !matchPassword) { return setError(form, 'email', 'Invalid credentials') diff --git a/frontend/src/routes/(auth)/signup/+page.server.ts b/frontend/src/routes/(auth)/signup/+page.server.ts index 4179452..d27094b 100644 --- a/frontend/src/routes/(auth)/signup/+page.server.ts +++ b/frontend/src/routes/(auth)/signup/+page.server.ts @@ -9,6 +9,7 @@ import { eq } from 'drizzle-orm' import { lucia } from '$lib/server/auth' import { env } from '$env/dynamic/private' import { sendEmailVerification } from '$lib/server/email' +import * as argon2 from 'argon2' export const load = (async (event) => { return { @@ -47,7 +48,7 @@ export const actions: Actions = { return setError(form, 'email', 'Email Already Exist') } - const hashedPassword = await Bun.password.hash(form.data.password) + const hashedPassword = await argon2.hash(form.data.password) const returnUsers = await db .insert(userSchema) .values({