From 67d2358a373f9c0d66eddb493d2f3e18afa4c938 Mon Sep 17 00:00:00 2001 From: uku Date: Mon, 25 Nov 2024 12:17:27 +0100 Subject: [PATCH] fix: make logging in not mandatory --- bun.lockb | Bin 139464 -> 139800 bytes migrations/0004_fix_tables.sql | 44 +++++++++++++++++++++++++++ package.json | 1 + src/lib/auth/index.ts | 5 +++ src/lib/index.ts | 2 +- src/routes/+page.server.ts | 7 +---- src/routes/api/game/+server.ts | 6 ++-- src/routes/api/save/+server.ts | 16 ++++++++++ src/routes/login/+server.ts | 12 +++++--- src/routes/login/callback/+server.ts | 12 +++++--- src/routes/results/+page.server.ts | 7 +++-- src/routes/results/+page.svelte | 11 +++++++ 12 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 migrations/0004_fix_tables.sql create mode 100644 src/routes/api/save/+server.ts diff --git a/bun.lockb b/bun.lockb index 3cfcf9cc256fd4ab2e525f5a3466d019de7c8a52..a59d4e69710a3146c9cd33f7821f5c106a309edf 100755 GIT binary patch delta 23269 zcmX?ckYmOXjtP32o)t}7FIdj1&C8v!Dpe|f^MMO~p{`v5KLS_XRQHVC?9!pg!~gO85l$v7#hB?F))ZQFf=@X(r2Lb z4k*0@N>6~&HBdSON{6yBFbFd+G&n)%`UZUnqd^8rbFncn2r)1;{9uL9&!F@bD18V@ z7v<;Vlol{BNC_}7$TBcA{Nra}kYQkGc*qaopWtU;kYr$JSjEr4AjiPa(8kZepu)h= zkjBrzpuoV;-~kq|XJ}C6XJAlfU}#|GXJAlbU}$*4$G{-Zz|e3MN-yVw7|;Rb=kP%+ z3gly8kY-?LaN&al=Q9Qd20;dfhScJm%)Al?hO-h33|tHh4F-}73<3-c4LPZ0d7!vb zlZ1#1gXnq&h6Y(l1_n+BhK7{X)B@eiVupPZ3=I4X3=LZ)AmR$r5Ppj^L}QsWBr;b@ zFfi~iFf_DCFfgbxFf?Qq>!#=ACoz1JfvBsLU|`?|iKpk~7o{>Vs{( z;`RT`nc;pTP#2oYlT4KTgPRNyJ3=CX03=9qX%^(6vMTyC&#S9E)<`9iF z=8%XzXAY6iO)W}KHA1A&%*l*w;`N6tAOYWO39@^}M0~OhBqKkvftY&@B0hOKo1ox-Hjp55aDWt}x9lPG>&XwI$(L7K4x& zV`#YN4AJfF2C+4{xHz>qnStT7GbAK-K3Dn$)Q27ZA;KH1{p@{)v zkecV@L+omvj$ROb(q0SDSUfp}K;nM~L|=WwoIr@i+|1lmPyx^s2+99d`6(bS zLvbKPLuw!-6rutl5$_MBT>~K=u!hn-;ShdxIK)F@ED-g65s>II3WNlMP$Vd!DKj*{ zVxJ`vV!^KnhyfoXAPQehF65L?{16REpBJMc*=ch$q#&9W4KjwIp(+~Ujncf7%;Zc4 z28B3?vn%sUlQS3?80N)6obfykV!B>DBzzK!bxRVHa#D{@{>Z5=sGA6JgFKWzJXw=V zzWzlL#Ljz35WN?YAgVGFi}TC#7#NgNAYq(ZoK%{blfppd=0H*diR}TBn*;ABYjV3Y zapg`f;@0D6`1bO6vWkY*<^|k)xLJ)D7#f%+D{7iEaWGAe61QV?pFC6Cp0RfFO>uk1 zy^|#+>>2+~j+C(H3}$9v02Nn^lNAlkIs2Iz7%UhV8o)fpOOquf?HR2mM@rf=7EPWh zY0r3I@=Zy5P9|2Eo`p6RlOv_SqLWsg9n&32hMr|XX$XkWJ}_h6OIlaA|2Aj!uC9RnZq$b}|vt!JfEU9kKxj>46!3~^H64lH(pGh$=Sb>_6lOKwiGwDlD zzNK!**(VLNB~ikh@zmr<4SOa&naQ&>>{$I|7#NBs$4Xc;9+)htY0tzUJ2^_zj@3q% zfx&LFthzO0)#RI+_MGcLds&`9=<+k9o49ggK|KJVYM@n3pXN@jC}t-(Go$i&-XvT>Nu#q>eq4zQW{L zI(D2{3J`6~ASuoj3J~8jPfj$j;81{=56NySij!yQ+A*d~zNu@^xj+#T>|B!{>Y8)j zQ)FQ913P)4xH+qi5(9(PIjGdEj>e(~ynJlSq&-q@7fx&@+p@C!aLUD6W3uQ>S zvVip$DKjtxfc1m2>LFzY22d_%nVcwP&iO@|fk6ixiHf@BoC+!s*RoH3sAA5Us{(N? z6UdXG5I3~vWKx9$5%c6kP4me&3}GN7Ofx(f1p@9LcCv|e9nLX!9El4at68}9dNC-27{b8#Oi4$-* zaL&|*L?sJ2ah%tN+b?0x$*u#_2a3xCC=cv^)&)8Y3{D`oaK6@o#26&8sp>K?m@_am z@PR`!(gk(TzHpL7`*ydWWz2M zJ(HpSn~fM4!Y0eATC+|v1{J;_mY4|xLmXJF)`Wo}1kAc<0xEK4RjoP2O(9k?f>JYM z^5mKJ_Kfo<-?X>qylDzcp`a8aZw3p)hnnV$&68(3*mItMih^Yc_FKZ74a$=DEFn&1oSbN8&Z%O>z+exK#)tOioCQ`8! zPM+yz&wASy9N>o5oXU0(w?P6T*$$F@87C)-n{!UJgCu5fUCw#h4iYSoG{bKXic?VG z<2^aj!=7`BJ;YZ`;HddH`KE_GXSf3-i86!jUpP6^)1DQSx7BlIZ@J_ zlfxOJl7Didl{urs~#W6$L1I(e3>9b@CvA^+29wFMhSr?7-5_}gQe$YkLwL-fLW;A& z9TGQ8puEAjYjUK&J>%=iGyUxuZ6@FJx96PV0dYMiSpLQ2$N+mrlgTp!>{&}a85pc5 z$NE}xZt#Ry5Al7H7bIpG!3p-D7bKooCMPgRDR4UC zZ1snvF;;Na+wBk04Jk$5`!g_DgNx#Yy5>w;0h4Ei*)eXKd^60RQ!t2uAsH+MN~jZp z7#I@3yoZwJoGihRS`O?*#^T90!|gfu2SaKUhRKP(=1hzslcOT+7y~EIjId{&9>Tzo zJUQ0Pn(^0U$w+%nzfedTWS;ym#DXIfViwpzjOQlbjI`(c8wyM6phksr7$jS;ff7Dz zdl;wz602d&dKAKPw&r9GhXq`suQ{hZl*a@vL8d`@jG(Avyfpb{v^|qp#AK-$JI1KV zkumm+%O}r_vFFr}WMBw~c+k_Fv2C(stUc?MNKmPLSKOLYA_`&w$7IDwbJmb3Pzfz7 zVa?eGVnNClNpq$XQIlu+*fB9gPo5QL$7nnGW}H2%Kn%$5cjK&Ci(^0yN)YQx45(2E zVj0JR8j2v+gji5Z^=_OsVJ9$J}m zK8LDc2Gu64)`=jWg3?+&hy^wiR6kuwgrzG`g({Z>F%_aG48)r(t82|TbMnj-drtOb z28J|nIiqN3&X_w{GS!}O<>bgzd(L;skTk~x&Jp@4kc0v*Gg%8$7#J)j&&{%7Nnv2{ zpDdeZ&H5vSfx&n3+;kh3R1gCsGzreS4`=D5F)(;fmQAx^Nn>E}1nWEiXK|*(#Dd_g z*>KhqI7>GJrmhUm+MmI|;0`vAEfdD_g|nu>S+_G87+fdEX4tS~ffyinrovgPz^u7x zHWJwk3{ju}1$X%o#GlC@v(+a@)f=*g){Fs@BlGMTmrkCUXI(GO03Nyl z+Ye%c7|1j;19)tLfsp|`*aVUWjUK~k&^W#;9L!6(Vh>nAJjOe*g_!&aET5!Ck#vy!H3!ps_np9h}H;Jjo$(m25<@k zO%gEFGB7Z(F)%PRL-m1ZP}G^WGBAMStPLuGj|QcIb_NCprpdZB@{?@}1vEjLx>Z)Po~#4^#jf4GOaTPPw1_lO2klU8MqkO85kJs7#SFNC*Q3X2Ms|p z_&}vWG>GX7b%sBP!@$6RjRr{tK-C37=@5`00|NtyW}a+YDh@6#BA||rgwjz^RUjJV z*cd1undW6+V8~>I#CR`M9+?J}4U?hfO<{z@^mM2zWKb0MQ`k97YBP zP+_wG#9?4yz(#`{wg_s$Vko@?svbmxI@7F zXP_F+LJhde2p)-Mcmj3#GpIqxG$@I_go+bQn_$rZN|o;z!BYqfj7*TAV_|}%URDr) zGH;VSIN-RTqTEoL2jpo`UCG420Alii2++(22{cHl0El2QKZ zPLQGJ>+#XcKX?i3qOGMw^HX z3=E@9L{OP9+C&^}B7!O-25e16Py!ikB7%d522IIuNS_H`(-34eNS>r7;^vzzDvS;{ z?jE#swP}V!i+L zyxDoS+OBu%Cd|k3Pt5h4Y}+O=`ERQ?BkN?(w(!Y6+IT0gZS!VipZv2eeDaER-pR4; z-i(}+SGI>wj_BZ>%-iA3$UQl-BbE9nL5+xv)E&QFQXj?r=u2$%;MUjN+3kd%_td zCSU9cXOx_**&EI%HMy}joKbr6&E9ZEnaPHI;f%7AJNv>JkJ!z^n9nuit-^rZw z!zb^U&pSDHzBi-)5=7R9a5({}JpIzY17(7{WVff?|3wbBk zF7##$oqTd(_~eR3ypweoc{7Gju3Qv8Sz|Hp8WCtED#o&0u*H)H%{%cbFyUo7RFJa?%#W8&nOOT#D6SjIcq zcbPY6276ifWRK;%lm9OBW=x&zxjcOGkLA3R*Dm*FOrQL7dHCcND|jczuJC5eoV;>H z_~eL{ypwrXdNXEEj$9c&nPV0277 zYH!BE$(gIeCrhm1oqTq+H)HW+$u;4VPpsjcT)W1bv2^muHQ|#h*78o)UF*$QKDlyj z_+*WByp!*)^=7P`thp|H@{M)8lY7^BGgeQ&xh{Ni$9mq$w(GqaYbSTE51(wYfp_xT z_1=v2lPx!dPkyn1ckGJMZMP+q@YkPnO&s zKKaCU-pRGwy&0!YKDj-7a>Wkb$+|nd8K+OK+z~!mV<+$AyF0uYXHM4K89w>OPTtAA zJG~iaPrkV`d~(Mw-pRJRycy?C?%WkV*s zId-2ndBG&!zXhb;GMj8zc=IB$(#qmC+|4GJ304&H{<%r zI}e0U&N#?BS@xheJj$tMqmPp&x3 zJ6ZRzH{rp7mzDI{D<;@W~bDcqi+g^Jct0x$<22WR3H@lkcAM zX1qCB^L+T^8|Qf^_n!A=ygm8m`S8gd7kDSzUhrnTJGt{h_+*QVyp!Kv@MgR}+45re zNg%ZuTYXI$c)?0dot%5koALeRo!7!AXI$r*13nZtzY%d)=Gy^JK{z;ge6?;GJB1 z!<+HzPJVmaoALi-%RAwdU)R#!zX*(JP{?}6*Kd*PE;+~=Jfdmmi4-4CA}@ql+S z?*nk%_8@#R$3x!9dmng%YPW~slXpDiot*m+T)RCCpPccCce3mwaP9Uee6qx2-pOYl zfor$N;ge51=AB&o*c(*8Jr18-@q~A>?h|iN4fiB`vc^;1$#t2R~>bjTVlUKarogDkh8&uo93ZESDns+kqYjAD%I(#z68{Wx# zUweb2(I})hEKNm#5?)zM{v#eDSYyaPrQ@oegfBgpTZfPCOdu(2i1F@!x>#BfBYN{ zs`b8vGrCP)_$3@v=Y0uh^q3s@H5^pqeGO;yn#}ku98}+Z3upA1yzyH&sJ8na&geHe z@q0L^uKOO&7%*AzM>wda`w`9Gn_GGa^cT#P%ZZ}d~(Gv-pRVZz_r}3 z@W~p#c_-if1+L|Ohfluon|E^WZ*VR5JA87-AKuBff55fepYX{Re|aar{R6J${)SI} z@t1e<+`rz8iJM>k6=$4mU??)_KM&*a>4}nz;gc_jv2f-k=H+LmfR;!U{ugF!*e)y1 zc$pC-Gd+fpk%JYq%Zh)yqBvtVSdcRnx~Jp!_J>T2-OLE^^nE%bKjZT07ep92n2e&g%ZW2`fnCO%TUuO_n4FQSmB7Hj z15q?bjFE%2FNuMHd-_LK#&od7u(jpjz*1+Dh1&()7XS(i*iMAw+Y==j|2R)-HRM_l z2kOr-Fno!ho*v6+3mPH)_a6d4?QA9JTm?iC0|Sf?GVLu?P#HRJ0UB8a4bOq}sY3OE zhV0@%0t^fcYEUuI6htCa3^vsTn$gK+0L>CY=es~=gQlv|Knw;322JQR4`}X95~^7T zY9MGP@&nWnpt=r|Vx1H)&im@||H&EuIu&2xq71x+-Ff_%fkz~IKn5D%WE1kFFm zLIvHS3i&`&7EsL|P%%&s1T=RGGT0L;CcwbJ0Gdz%xzP(MrjP*9=#x7AUmRl6hX(FR`{Xa$qhHyp(2GCsA z3q}S8&>YuOMh1pC3=9mQIp8e}3=CTt7#OxQFff27o7XZhFo4D*S28d#tYTnb08Mu< zW?*0dO^VNBU|^Wfz`y{SKA*+Fz%Y%0fdMoz51P8~VPIhBgpTflRu9xc(vmwv0|NsC zXn&3l0|NtSSZ6LH0|RJ^a26v2!$d{~2GArXXaW;7JqemG13u&m>3u&nHU(Pm>3wOnHU&km>3v9sSPxt#t)k608Mi+ zF))B8(RV>7*;g|#Fo34`LDT-AB>@W<7#Ki{5hgJ}mMnlqu{%K72Q>LA0E%QL$gDGH zmdS>RfkB&zfkB6f0X(9i%mkTz10_??3_WPgz+?snhCa~h8Ab*MX+{PHSw;p1IYtHs z(CiZ^(}U)~^q3eJK(lqAc|vw328MnH1_n?@2W4zfAz;Ylz`y{SB;y2G#K^z^%H5zz zYtW1(D1(ABBxq)T69WSSXbA#np#*4Nw~vv5p`Q`7bZ7ddWX3SPC?*C5b0!7`3y_73 z3=E)&IM8gM3?l;rXsVr!iGiU4l(a#Snh(lTO7) zX$6`+Wnf^ioZgwrXkQNsdQd!q(zFc&Bsf7)07}cCG!06&jSQgGd<@{}jv59A22g$n z8B@i;z);G-z>p7`DQ92+7YS($3=E(xSqTgb4Dq0HfdRbsogo^!)F%Kmm(KuRRLS5A zN-N$B;B|4J1>p>?43LFPwhRmmpyJ;VG!w}HUgHMZCIDJ{4B7<&T9ymugXG;9z=#ph-bcP5@1PftC`1;ue%0L3tbGNKm|j@;WHHfzp5%G>VWNiR@F5<4}Cc zzyOY3kViow4GQ(ip!f$F4qBT83wl^^gMuF9J5T`)DsVs!1SM8b;sg~)ph6i`IDrx^ zC;@{)1XM`F#6blVNDd?pS{VcinH3BS44`rbWFACqJ$NlH1Be4E*+8Yf2ec;G$iTp` zfq{Vmw9E)p6M#xTP;CGzGe9*2sHOlJ3aULoWyxl!K2S}vje!AdCde@$2Y@UDIUeRH zkbR(#+-bqUzyK3G#lXODk%55$w22jzY0p6m2#~{0GB7ZJmLGwl3lw}OrdMV%O4lD? zU|;~1WiTli4N`K3fq?;JaE`gH~6UQn`tC3H}caTm0Ul7WE% zv~d~a`rA;~g4m!?0i`=oW`ZTR2Mi1h_aS><8J;jOFg%8;2bl#*HlR!g!k{%>Fi*UP zmUZtyMfO_;1_n?xyn)6Rs2K**4D#J)1_p+Y3=9k(Ky63JnE{~V7{Cilz$JA3e~_Dw zFfcG2Wnf@94vkIFx-pQEAp4FnFfg28U|=}Jz`%f<2;gpDU|>LY0?ay46Y@W_=>Ret z)Qo_s`^CV(07_hcKmquJfq?RSe5`O1H}_)Wt{qS##~0>dQcPJ zkdcAGfRTX#w6sl+k%0l!#0NF$g&7$b^cf*l6UfD&5&={KfZD5|b}Oi~05#h{%{Ndb zY{m#_KY~gPkeCf41A{fRU2Dq-SpgTy2wAHZ%*enH#Kp4{9QS90g8y?*Ea~5-1ozX$+M9K z0b>@U&2-B`Mq@_H>A8iBl8mm?7lNtn3kw;U8D(HQuqWzA^{Q>PwG?4wW&y7dYfxmF zexQg^f=QQU`k&d164O5wF-kG6oX%U!C@Bp);6(fC;-ZV$n_`$4;|%qT^b8po4o!C~ zW|U;SGJWGpM&aps#f)sy&!FdtJfBwbX`%hM-7Jg-dPatNrVI=}ruP>!N}9nABr)?j zvu)v|Ema5wup>(hoMy#uXX9r=$mp|8zgNsCAq_p{q@jalO-8(+RRuyt=ybsnMoGqu z>5Z!xg{Rw1#_EC8Zxgk6)Q={YE*fcUA{N!I$X|OBf}YIM}EEDPfe5hMo5kWOqSZ zMpke+LZR_={Zd9rQ`iA9tKBkVi|p0sAQZrkkjY6{^#9t#osI~Z(&@FOjFOBl)2Ej* z8Z!n?KV8ZwDGfVEW$XVppSYw>sj@Jd=oy*l889$(O#ctE33l)bTgj!AoO7R<5DH*N zvusvni8Xl9DvXeMGTpa~QPLE4mP>d4-#Ocr1z#Z)z)pMl5jV5WWX`Go2pNy*v&$GI zrD5m8n5(a~F#3JL4WXcI`gxGqumfd6?(JXL{-se0p#XN|j6Hi`T2aTz6okyf>9XaF zlBWNlXVmaNx@f5L=kyu3pE)|B;C?&P2}$q%eAVek-FWD<~tBOjiUk zE%gi-I;JaDFiJ8`nSO9GqsVms3Px6G*s&F2tdX*Qvdt%%7%ic8t(%??QhZ=K{}e`X zSu+OMnJQL>-XT(r_t$`PngJ-My`Da?ol%6%1jKfk9@xSt$@qWz#|lPYCP9hm4wZ~X zGBVJ!VEPtr3jJGqJ{0Uw1CT=vB&PROGDFcL5 z8Z+iikF8=fW~`h(5k$32-`mP4$+&X*eUOr^)A`#OC8c4f=!gnz++Ee5Hv{Z6aPm4k zUALOim`PZ2`oC&MiRo3kRb3HbPY}DM(NEsbQ3mhMnLO z9(ct!_S4CSV7Gz2-ZH(uhEbC7+w_?=jK)k#a?{V%fC@Re=`U&+eWYOr^5`$OJMgSE zsg{W`&Opx)6l9yH``0r1GR9AzTgxcP7&U!+Eu%5x)#(?fGfKjOQLc_rNI6Xj)R$#w z(1#w#lXyt+sQV1bui(Hp2ALE!{eC;x2oN>Bt&Y)88g?p=gXsMkR{J?X)`Gllz`(G1 z`ujRYV`vtY?&D;!&U8Q_pC`=s$gbJ)@*_ zqdMfkkDDE8|LmeWIKkclrDufL@<+<_H?&K zMk7<$xjU;BBNqK?{jY)u%n<0wJa2v^-HjLKFabLY9L$fVuWe)m8T_%8(HLqVqs?^D zCPr<>>(d>Z7(c=UmrVC)C91UA z8I4d9B-Eu~CxT+av4K%s)_{RP!Zc=#n=ahJ=qm#|+~-K7!FR5nZT;X_2WK`Rlixf_*M34@wZQqk|@HKYTb-$*==ax>`^F+X2oF;+>4z(y&4ny)+hJtePI% z$*9P9YkGYrqa-6lmo)5TqCC0J`>)=H=`7&s8Q%Q0%manG%j_n`%v5d%Z!^xSSnNyfbC?cLx)b~lLHKmFkfMiDDxP=O9R$I15dfsLmG zOf#4mTE?PZiC7$;mXZBjPV-TD}P7*|f8+{ft3XgvL9AEP2;-SppmjFOC# zr#DVu6k!8bz~JglYUW zSC|;%jP(rkj2RdnP5%#4_i6e@kgk8zYe5u-*--1CC571ZjT0DU8E;KLKY>xw6m|qr z<;SfzZrksv1DB!3dPXJ;up_AwJd?SVIzw-PZ3UMOU<<^}O&DG~Ku)oG`0wmG4HI5S z9SLe5FyJ;8qIr7LL`E6L{nO`9WQ^yW;l#k8!NAY}31LXsNHR{GZas<7m~qMU{7H<) z(y*he{C^(ax`!oc7SuH+3=F5I@14Xb$#`%2b&&F})43-zYTI(UfVWA)57XNj(onr# zV8sssMim#x=}EW?EO5S-WQ3N1kP?~A98@AhOVB0LZ%<}KEbkpMs)h^DU7nFxXW1FH37JZBQo7_Dq}F!n>euQ%19cE{pNb$%w#iNdOD*oqv`a_ z>5SS;oG#O+O=q-1l+&-LGfGP1E0X1BFd8#@PY<5K=*w6>ec=qo*-UDl)9q$5N=U=b zMYM}!+H>VS$9*P7(Ee4>{uoW6f1 zqcI~mTS!djp2euk=rvt`9;4#)s9B6cjMJv)&SErXoIZWwEJjI~%$-?`uZZq1ronP3 zG|OF^{&zj2B*a2kHe)emU;t-eP)Y&kYG`gnDFTckMF8{+NKC(y;Yr4?(*x%*rZX}5 zPT#kN(TMTW^p9&8eVIgkr#q}=G-6WoonA1XQHx36clv_0j1sKIHVh2n)A!F}lwvVv zU}%_reLkbH2<&XOnu!Oa*bgYoWn$Fvn=ZG2(TA~NdiDZFW5(X;^A|AsGQOVvb^&8L zlT_gJu!W2Y(y(dY2S*tieP>!uU}97Y1n+cdu%13~A-I3uznoE08g_!3=5)Rn2fj&2 zf$I)%r#Wi+{e_H@rm!Q|xXaS(uipQs&BPdIrU!0c!VYCyk$-LX#X?>MuvP<5!QM1o zcM+qcH0)HjALqEVX8LWr#>8l#XAG+Q7kFU0`{DBT57>DYpsEe3 z*lGIA#f*)N)zhVyFiOh6j*QzlrSpP;T(u^sngS(p1_m*f=>ba^B^dptXD(q}3kqS0 zrHl%uFQ7-mt!OO~)!A4P1U4UBR=c`nv1`t=PqTGG=rToXaA!> zdl&oL4scNqZZ1O(q+@81wB=$lW3S`_1sT}Q3{p1J_bg?Ukj7dWfU6*AdCsqc=1eKmMhzB5DQNV=&Z;~2$U45c=;&jF4D2+!jdo0dFFctSAY@?Y-R-z2<&)f4 z6pxUBorq_9QuVs?{E5j>8CC{{28Fokx0W&bFwUE7WE@dNdx=m3XF@Y1gi_(ghR`pca!6!}$cr%7%>Mb^m|yug(+!^@qVN zlAF`-E@y0H%$pv+f>BZic5a>v|Ayryy%)Ne80(B6!LOS*eaZ?(Bk9A5kREnQ&$h74 zJM-Ql906_{Niu>dk?H&^8Cj)a$MMy$#m=_vS(=APbQh-UuVj>zhMmaQydm|xmZkqr zsEf@R7+y?IUdd=I4Lh1|_RLdKg}FPp!3qpP83jCiCCT_~`stO7k}|M^at}V8xI$Rm z{X1yb#n4>O(2{|RZQ3eE2~%vtR1gKQvv(J*tjl`Gp?V3S)oHr#Dn?00@Ff00yJY(LRg99R*v6zF2Eon@P7?dW$uBSR4WaeH zblKI6l8oRnDPbjuYS_uc^P~-SU4EGyg-|WaK0RkOql7f zHKU|7wvj1_;ic0ruV!o{yTqM-eJx|Q2)0qm>0#>_6_}u-l+!1yW0V37Rjygbm_|+$ zk`Y=#L2Dpz#VE-Lsl2AAY+#gP;>w-guz^v6i(?aH7`9{6^hFyOU8cX-z-Yi2K3#Gn zqrBCu0PuF+2Bu$i+oVnl99tOxnjL0nsQ<>v+**D;7hQe_)T}28+lw|biZk(oM{@Ob z^}+P?hD(g9+dDTiO6G7WfOfuu*2gGLUn9??B>bN3_nnK6IbRn*#XA(4rf0-5%1r++ O&!ousYr3KW({cdO!)ROp delta 22919 zcmbPngyY0PjtP32Z_ginpxqL(eDf2B-EJqtn`i9Uvcl-hkMA9~E~o8SFMrEIfr$YG z5+{bsGsVVEtWe-gEJ`lPOlDx60={6``1f}C3bbW&tgwbFIrIpzj7=#%Z8U UseeJ6_mcg%D^DR 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 { - if (locals.user === null) { - redirect(302, "/login"); - } else { - return { user: locals.user }; - } + return { user: locals.user }; }; diff --git a/src/routes/api/game/+server.ts b/src/routes/api/game/+server.ts index 0ee5b31..30e6730 100644 --- a/src/routes/api/game/+server.ts +++ b/src/routes/api/game/+server.ts @@ -6,9 +6,7 @@ export const GET: RequestHandler = async ({ url, platform, locals }) => { const db = platform?.env?.TCL_GUESSR_D1 ?? null; if (db === null) error(500, "could not connect to d1"); - const user = locals.user; - if (user === null) error(401, "not logged in"); - + const userId = locals.user?.id ?? null; const options = parseOptions(url); const crossingStops = await getMergedStops(options.stopsType); @@ -18,7 +16,7 @@ export const GET: RequestHandler = async ({ url, platform, locals }) => { error(400, "could not select random stop"); } - const gameData = await createGame(user.id, options.mode, options.stopsType, randomStops, db); + const gameData = await createGame(userId, options.mode, options.stopsType, randomStops, db); return Response.json(gameData); }; diff --git a/src/routes/api/save/+server.ts b/src/routes/api/save/+server.ts new file mode 100644 index 0000000..d57992b --- /dev/null +++ b/src/routes/api/save/+server.ts @@ -0,0 +1,16 @@ +import { error, redirect } from "@sveltejs/kit"; +import type { RequestHandler } from "./$types"; + +export const GET: RequestHandler = async ({ locals, platform, url }) => { + const db = platform?.env?.TCL_GUESSR_D1 ?? null; + if (db === null) error(500, "could not connect to d1"); + + const gameId = url.searchParams.get("id") ?? null; + if (gameId === null) error(400, "no game id specified"); + + if (locals.user === null) error(401); + + await db.prepare("UPDATE game SET user_id = ? WHERE id = ?").bind(locals.user.id, gameId).run(); + + redirect(302, `/results?gameId=${gameId}`); +}; diff --git a/src/routes/login/+server.ts b/src/routes/login/+server.ts index b32ac72..12361bf 100644 --- a/src/routes/login/+server.ts +++ b/src/routes/login/+server.ts @@ -2,18 +2,20 @@ import { redirect } from "@sveltejs/kit"; import { generateState } from "arctic"; import { discord } from "$lib/auth/discord"; import type { RequestHandler } from "./$types"; +import type { CookieData } from "$lib/auth"; + +export const GET: RequestHandler = async ({ cookies, url }) => { + const cookie: CookieData = { state: generateState(), next: url.searchParams.get("next") ?? "/" }; -export const GET: RequestHandler = async ({ cookies }) => { - const state = generateState(); const scopes = ["identify"]; - const url = discord.createAuthorizationURL(state, scopes); + const authUrl = discord.createAuthorizationURL(cookie.state, scopes); - cookies.set("discord_oauth_state", state, { + cookies.set("discord_oauth_state", JSON.stringify(cookie), { path: "/", httpOnly: true, maxAge: 60 * 10, sameSite: "lax", }); - redirect(302, url); + redirect(302, authUrl); }; diff --git a/src/routes/login/callback/+server.ts b/src/routes/login/callback/+server.ts index 46ada4a..2d82b19 100644 --- a/src/routes/login/callback/+server.ts +++ b/src/routes/login/callback/+server.ts @@ -1,9 +1,11 @@ import { error, redirect } from "@sveltejs/kit"; -import type { RequestHandler } from "./$types"; import { discord, type DiscordUser } from "$lib/auth/discord"; import { OAuth2RequestError, type OAuth2Tokens } from "arctic"; import { createSession, generateSessionToken } from "$lib/auth/session"; import { setSessionTokenCookie } from "$lib/auth/cookie"; +import { destr } from "destr"; +import type { RequestHandler } from "./$types"; +import type { CookieData } from "$lib/auth"; export const GET: RequestHandler = async ({ platform, url, cookies, fetch }) => { const db = platform?.env?.TCL_GUESSR_D1 ?? null; @@ -11,13 +13,13 @@ export const GET: RequestHandler = async ({ platform, url, cookies, fetch }) => const code = url.searchParams.get("code"); const state = url.searchParams.get("state"); - const storedState = cookies.get("discord_oauth_state") ?? null; + const cookie = destr(cookies.get("discord_oauth_state")) ?? null; - if (code === null || state === null || storedState === null) { + if (code === null || state === null || cookie === null) { error(400, "missing things from oauth2 response"); } - if (state !== storedState) { + if (state !== cookie.state) { error(400, "state does not match"); } @@ -49,5 +51,5 @@ export const GET: RequestHandler = async ({ platform, url, cookies, fetch }) => const session = await createSession(sessionToken, discordUser.id, db); setSessionTokenCookie(cookies, sessionToken, session.expiresAt); - redirect(302, "/"); + redirect(302, cookie.next); }; diff --git a/src/routes/results/+page.server.ts b/src/routes/results/+page.server.ts index 61c10eb..d37b0ea 100644 --- a/src/routes/results/+page.server.ts +++ b/src/routes/results/+page.server.ts @@ -4,12 +4,13 @@ import { error } from "@sveltejs/kit"; interface JoinedRoundScore { mode: string; total_score: number; + name: string; points: number; distance: number; stop_name: string; } -export const load: PageServerLoad = async ({ url, platform }) => { +export const load: PageServerLoad = async ({ locals, url, platform }) => { const db = platform?.env?.TCL_GUESSR_D1; if (!db) error(500, "could not connect to d1"); @@ -18,10 +19,10 @@ export const load: PageServerLoad = async ({ url, platform }) => { const { results } = await db .prepare( - "SELECT game.mode, game.total_score, round.points, round.distance, round.stop_name FROM game INNER JOIN round ON round.game_id = game.id WHERE game.id = ?;", + "SELECT game.mode, game.total_score, user.name, round.points, round.distance, round.stop_name FROM game INNER JOIN round ON round.game_id = game.id LEFT JOIN user ON user.id = game.user_id WHERE game.id = ?;", ) .bind(gameId) .all(); - return { rounds: results, gameId }; + return { rounds: results, gameId, loggedIn: locals.user !== null }; }; diff --git a/src/routes/results/+page.svelte b/src/routes/results/+page.svelte index fd84395..12f416f 100644 --- a/src/routes/results/+page.svelte +++ b/src/routes/results/+page.svelte @@ -10,6 +10,9 @@ const totalScore = props.data.rounds[0].total_score; const mode = props.data.rounds[0].mode; + const name = props.data.rounds[0].name; + + const saveParams = new URLSearchParams({ next: `/api/save?id=${props.data.gameId}` });
@@ -19,6 +22,14 @@ mode: {mode} + {#if name !== null} + joué par {name} + {:else if props.data.loggedIn} + joué par un inconnu... + {:else} + connectez vous pour sauvegarder votre score! + {/if} + {#each props.data.rounds as round}