From 6184835992a8420cc27e89488f36d9fa12603665 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 16:48:41 +0000 Subject: [PATCH] Changes Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com> --- .env | 5 + bun.lockb | Bin 288556 -> 293002 bytes package.json | 1 + src/integrations/supabase/auth-middleware.ts | 77 +++++++++ src/integrations/supabase/client.server.ts | 37 +++++ src/integrations/supabase/client.ts | 36 +++++ src/integrations/supabase/types.ts | 155 +++++++++++++++++++ supabase/config.toml | 1 + 8 files changed, 312 insertions(+) create mode 100644 .env create mode 100644 src/integrations/supabase/auth-middleware.ts create mode 100644 src/integrations/supabase/client.server.ts create mode 100644 src/integrations/supabase/client.ts create mode 100644 src/integrations/supabase/types.ts create mode 100644 supabase/config.toml diff --git a/.env b/.env new file mode 100644 index 0000000..14fb927 --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +SUPABASE_PUBLISHABLE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InNtc2FybWdvaXJsY2VkbXF2ZGdjIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzY0MzczNjAsImV4cCI6MjA5MjAxMzM2MH0.AjMSQOn3BtzV-fJ2x9SWoM2ozjLyPD6g3dmTSeCT9II" +SUPABASE_URL="https://smsarmgoirlcedmqvdgc.supabase.co" +VITE_SUPABASE_PROJECT_ID="smsarmgoirlcedmqvdgc" +VITE_SUPABASE_PUBLISHABLE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InNtc2FybWdvaXJsY2VkbXF2ZGdjIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzY0MzczNjAsImV4cCI6MjA5MjAxMzM2MH0.AjMSQOn3BtzV-fJ2x9SWoM2ozjLyPD6g3dmTSeCT9II" +VITE_SUPABASE_URL="https://smsarmgoirlcedmqvdgc.supabase.co" diff --git a/bun.lockb b/bun.lockb index 6a506b66490ee7a5df0c80b9eb68d1ed90ff6221..4d5c249748abefb8032cdf7127bbd152d76a56ab 100755 GIT binary patch delta 47880 zcmeEv2UrzH+xG4rj(9Bo_nx`unLax+J75?oA*L&8G1hqj>_9Rn8wuLlyR+yH`k* z#GI8paWzpM%CRVza{L3y6$f7dmjLeqQwf%W@h^THE@U4HCi|9PvUdhMfvv%0{}9Ea z_~~E@Ukj%2sbC84uZPFQw-E+a!KD#k4K4+Kiuxk0_%mS2XeSs!@k_wehGT^u45o~_ zfUUv(BcfvhqobwkWpw{JFjYM~AUq-jgYUyZhCcW&kFviWWQ|a=e|wa%R|Zd;aTa>l zMg;`~#-RHnn72jwxK0)Ik$R?*J|JSELqmEZw0&hs%7?rUK&M-8J(xyvOcgzqx$x6K zYl-+YkSc)7f!{jo-FOL1-B{3|kNidz^j^vjJL)B&$Hl)u0D2}q6HNEsaWLHy8^P3# zzg5!{ngu^~^B^#dlge)TFmQ#RZnYj@D$sdUlL~$uOa)67{^*GC@SrG3iV6x04v310 zK2V+PSZ||)9LN%kCE_AI^@wXdbnfNu92gNA5!D{LiiF?~3WyGp79l)8{L_WqDBL{N2HYVCPj^xA%vi3f54BZ`BGQ#jn!2O?+YfSci`8ZQS^Mip6Pt|D>Mks1yAz|iQy=vQeK+JoA8k!YWguz=`( z(C;;y^H!rac(>#>GEr zqzBvvQ#BeQpdi@SSDz?qf~mNHVZEpvQYD1bfUpHqhn~g=q5_9R_l$@^_zz9=b{*18 zFHm$)RK&o5P$?3A%6My2Ny2Owe+XO%4HAF0xt>rOOUzv)?p+Jr7Z4Z`6^`WY!cW~~ zY^m4hTQH5gFfe8R&`;;U;D~-9y#k`p3%xKo_BYRzXIkmS4~cf}6B^M|%4n@uGfn7S z{Pp7Ogde?AJHBUBKwwa`Bvoi5<{fZ8WV9PhIh&uDc$w8+0nr zgdTdhFZ`6ya|{xyR&kcBmhhj38H}uM2k4FB)JwNAKzD?mH%Pxz`bIm)284x50a1PW z2Sh~&MM9@)_XJZTwgXe~S28E7A{7<*XaENdj*bW&7$gM-2L(liL`X}6b?X7)y+Q&* zBq@;vSQW94f=XrZ15>QYef6~autcjOab8dEU_8^^WKn5fR!Gv(p3Al-j}E-AB*@Md9B7rn{Bv{pim$e!6QaN9rTs_b9!m&w@)s-v*|hnl1ELa7p;vi}32;Qt;;k(>m}N>5%;iFpb`g zU}}!hB;^{c_sv{Uz!tH30e=Bgi+F;mhJ$FB;B#Pz z-U6G!l%5m9X}ZWG_%+fa{ad6*_jBrS6eJD~^UAae0!7Fip?66dn1)oc;CW!ma15C2 z+Q#bzUI+dP{)J%5AQ%}?Q?~(=-P#1*KND;Zf7nQU$Wp$nZQg>FwvEya%mw*F(IamE zR?pxj{1h>NMK(RJi)vmud$6>;CIw}Tmr^aN*G&N*C@4Tg5KQkBUR9A?=S0l z!mOutIVElqn_yi$?!gqjvyOqOlh%W&D$~Iw!2`h5i37re!Usx{^kA~yR3|PCe!skN&-`1rhsk1ff1NHard|jy)>9cdx7t?bn?VYaFAd-ow?;J7x#+mmAe6^ zbdG_kNq2y$sq4+w?~Va|c6;r4;4z-z!oz|lcr18LK-7=BFt z@oN)xd-G!R;a=0c)x_QLUwWeX>%ArlsBJar?)Z0~Xs%&sP>oB2sf&IFQ;TI{m{1o6 zVV@ZuBT27U>qDm38ht2r2FKBT-Wm?#(4c|gh$A(CpN2@UprHQP1WET0k>==YU>bvd zYjuAznBpw~=L4TccwTTaxGZ=Xm_i49l6AxW z&Y=;3*z|xy!a`!C6YF(-CKA#Lv_a3XUr_8oD(HFmDSq$JfS8z|UeZ|DQ9*;E2gHPg zM&tP+azId2tdwVy9xo^wiyR6P13S7|#%x0SQ;mWlo}0nyGVT%RMbqjVCt>h@Q`)N%nV z!=^}F#5O&*c3`@vJVfqAz;y3efvv&)w(I)rZ2HXDAL9*2UdK<4&)u~Hv# zC%|Q(Kii{cV7?bW9x&#Catd~I59{gF#SP16Tu|wd-i?815UNLs!+M3S!C%2&;D}z&*YHz)uY+k0F)!&C z5FfL6{3bB1u-M3G#kzG&AL!->p6CIAQP>H@N!!!)jQWQ}VfaQ%VM7oDpD7u7zsCdz zg@^Qxl|~8wD%hj9;unKy{6z)n`y8(mdc$~tt)Q0&)18HJ6fp?*X6#A5BE_LoJZHo& zLQ8zdQ@SBGE!rlt1Og~xUa&2A_i;VKeJ~~b__UtTW%$W%))`&zPo>1?TllHvP9QuF zI8DSe@087l8`>>RlUNE2s6=5wQGJ5kB&pjueGK*vh>nRwf>A*OqABf6=v1J^=k=lT z5S$T~lJJ#+|>J0Fn<@5e295BGRXy4Kx32Kk!8R=k408B$&WRq zCX=g~_7;7isR>%)hBguFkTc4`G>b?_&woO~$<+Fe z%(aF|aj<1~J$&U@mRiGPJdI%y$R2q3$hDZir^z@613HBKMnfS<>ZG~8fvbaNvw=m{ zG#T?@I_RqT`!TteN#4qu;(CWA;#!rR!?izis%?_jun=5-Wy!dfW3O;+$Gq#9jO#E} zbYgF7`xsR$!Cl#!x{WO0=uVQnp9R!48OvdN*G}^fWm)i_hF^<<3=-;@jFT|K25RAt zm`#0?u{CB&J^osj1b^O==I{vS>SZ#f!>@-|WvTE_!UWn!i~p4QH!vAHVj|V^Tf;Kp z&sAEIzShD!u}E(e8Gcb@%;9=U!K`URle~l_;`*4K!_|#BVN?ubA-Mj(GeUN=rp-;N z1?KR&m?DfUqpufAe-2}3AaiPAl9#g(Tu-uOT&uHJxDICCekOSp8;|QPmVxUWX5Z2z zUt|F-O=^)!l2ijJ8JJT`FWHY}L9?qYN%f)0EV6}{+>0f&GRZSp8m{M=O>2`{s){7F zLAavD8P1Yg(`dbes|R!SH_6c~7T4k|)!$?s;ewfyr{+;?S&y#Okg0zgBv2J+gjxof z&Am{-%r;aUgvbY3k)f|rsc8EE(GpT-Yvodxsn>ZQiP*GThG z+`Y`Tvq{a3V6reU(!5w|XOkSu)Gj6z*uRTOeTcw%T6kn_$}bbz;96#lDz=G5eq&Of zL2Lfrt|gPZn&io>DXy5Ux|&qAj-I#7vJl6QIdwD1Nh}1{J1iO3w(J$IN11nblU#(2 z$JL)@;L4bN51Q2idYII5=z8jXBgv4q)zja zq-uzxFe>YAmISSQ14+VjU3_llU&~9L%3K3YitNpX1p3OOS!y8NhH5XG!2NMeXR~p& zW0|9c8XlTE?Kk`#($F)wSMGAyB{r!gLCF!Sr}Bj09D zeN6If7J}>VEV++K^)l&&leNN)W!}M5)$zE7vJ70GGW!sk^8#=k&sN}ioMnZWR3lot zHgYm(@w`|Yj3HK+9qsD_HL0ITO@<%+gGPw-@xq984K>LFSS+r~ zSt_o@nHpx27c&1albY31lA390(;ZNUWg=t@iwrl(H??aqwiWIUOpY+Ab6e|!&4Oig z^pY>IL}*3)^^R6p;(`XuslQ3x3`KMsQhdgep}FBMrD-C!R)b;8JJO`4L8Dsb=KgsU zPu9AMrE2)vJUZ#N(zC9^0-{Xv47LJSdzKYtQk%Eco6(Zd7#+$IqG>)z!_}YJ#Lx`T zDaK^XkNdg-I~whSs^5Wnkhu;p87(@{DoSb-mO8*Bf5+5;Cix2UA80b#bVTl2*j|=7 z(4@+pBnkJgm|fgig!1^$^R9GZ}03lBCvbO_UFYVPrfy84qUErFzFtW^#f_ z-3yIo5{21x@xlO4gjS=s-pvZlKXMdv8fj8fplLHsc8fh?$sW&z)t)T$vU83J-M8m@6H3)%)~ltV79B==atXp`#S z_x-wrp*ok@j4`QKpkaE5x6jCt~ z!>~-6YElagk|d01kyn4_I*nGW*lDQkub<_~R+-G|fu*m=5-dKE6*v*L!;wh2nz5v&0aV%Fz;l>VdG%9+0E zX$Y7V^>QgyzGbz!uNw8Oz5vL~9;qCGkM4B6=vJf6Irz`>QaX=jooD%~DmD=n={8(B=YT8R%x!UnmJaI z{4|Tyxn4@cactXMv&Hyvtl2zYQ4nLsINEK`pW|aJGoJR@JLdW*!^g9}^L=ejLZBfl zi-97u#Ar{o;skSnuqiPPg0DHXteOcIb*w}agSna?6jZG@(cE;|buluC9jE|$1#IrZ zkHznOt_n+?U(<4uzCapjhEZq0=c8qnyw^)PJBf8p^0k>fSzoU$L}}ZwVIt*7A%~fui_8^AP@o?esD#=H^1sBahiZ-`wSyDkQo~V~0 z7o%Lm6IrG2ebsXiY5m1!u@0u7?<=Tnrt6cYM4L9_X877L=O7=|lIhX4l}c>^Uv;V_ zjcz5LvGYrPZT3KLW9$T1OU?BIT&*?N z3%GpArM8%D9?{7iyo?jzYpYpYhAWWO<32|3Ig-?oG&b!=3%QS`NpsDqw}7jQru_hy zNFA>3n$~`vIlYx|>FHU|H`{fEOSjwpUdy|{to4ISuR#i2dLCabq+X;_MZguHxzgd% z>sNdcbqPwU^k2mKuJtv351|%2+R8_{w1~Z4>uXazNgv|oelW14hMvmEBsO84FPpWg zh3v~Fuk$hbET&nATod7Hq`8j6)s|dxX(p$bjQy5S@yI3xE?+i(QzHvFnrV{hdvmmj zaOp{%fJ={1VyRi{16NDdbweWyIP^ey8Kp+)n&8r-PK8S^#fkTt;}7N-ec;k#tbt1} zzzewaxL(W6b`#+eMS)98Pc5=S?|y}0V5#lkqq#+4387xb-{EV^>K*k_TCHTSxA-c) ztJv#9zKX>fHesu;8n(tfsmp#|>JRYMMO1BFFUcXvP7vyo^WT!(i;;qu8!xhko+4`DQIjXy!Ht3RQZ>{3mA0dFHR zqRo_2XC1q{-B%sDPG2`=+Uuwf;G=s;V#r3VoUGrNMwS}xrFMsp!f+?zS#UmlR3PK~ z4V8LF7-a9U)bi^^9NnrxZ`Be?%@5buWxRAow(T+aKsg3M)s;^pT zlb*DZrZv?cKAJ78XyI3aW1RqU3degXW))!h!vQ&m_W-Islsv9A;rU>tg zu2`h7+WUOfkQDQC0JY>?v+uo~dK3~BGy9=HEx85XWI!@xTlIuQO=)0}?HX9Z<3_pB z-cdaRA9b}pGdgb74Mj;BG*m61)Msn<`lt)wqI9)gw|W;oYFkXjv%HjY+t{1~zUruL z`Y^Cy$=ke?lx?iiL0{t|h}h9@^HIHi(ic125Uspy=ECQV6wLF51?|pQfnyfNc3QgB zXRh1z#xvXC%+keE8N8jHPxCddM_?mLSov)`>wC!8#(Rg}7`e^nEYr_Z8M}k-ESv2J zY=DFfBG8~M6OKFezS1_=Y6yIq4Rbx{rS1_v(HM(bs+PO-CXiX??gr$cj@1X_Sol2Q z%lE$3m7Tj-?W4XnR=XvsDMCcPQXyJm)nKUlR>r@rm(6-%V;-A%wPpDC-K_I5Uz^}m zQAUx1)=+sAmmhP?ST8YAs|_I5LH<^Z=8~cC(SR{B*B~!r zDtwJt7!Ed#`)ER}n2lP>vAN^C66{u=SPvA=E0rvWYuX-4Powe+-R4X9|*@Tn6 zYVI_BQ)R_y5A;nMb2#N|vj8H^2BKLcg%%w3B-Hj$^=Zoeka;4d`!ozbnkkLiHlXui z^M)w#2QOv*VRq=WuT8lldhN|)s3`68m6#)}^BG??6@hf4=4Od#N}HqR-6B0mS)Q$6 z>;@%@9+i#haD{8G`o|<`tTqGZInJ!k`6}Ixvo@f9>1@t9Uo|~l-?(Atea=gD%FwH1 z!JImHsU6^}g6y!H+T*3phL2`dY+w6$sn><20YkNcKOQFGQgdH zN#r1Wl#i^q1!biojpy@+>3m=t0pN_oF=-a*gTG(Rvv4j1*gRvY-N^*swV=~g2ngW8x)zU5;)3ztcAmAHi2 zN^=FnrH8J8s~u@FM&bjLvH4{Te9dMSTzb4Ka5dMoN>|MBBH+@~+5(pz!+6!KwS=pc z7GpkKdgxua^z>Xa&2~fJ(#x^yy=HmM9HSjvdW?B+=_U9TE&xSJox+#j{Cb2|3mTg z{6AUpyvSmlmd$^WMgCew)U@M8hQtbhCtU4AOyQFNN8ks5KL0Mq{ksYLoAKj5r~wVK zm0G<%%{18diSYjnqy7Ig3H{A<*z>F++8Dr2LhE4c7qkyCH3t@UZ6ILT);>9z?orHA zT0G1|8eh?@B#AgTa0{S&`Yu49oJ{FIz>8CwL6#OQNyHT4IY1-sH{pK`rV;rDpos4T zD=;G60&E1UU<%I*&ISHTu$|By!BntPV2W2pM*YcA4uT4camirtlgF zw*of+=L5GC_Qd3DCAhWFiOK0-R|xc$Bh{e22bvmH<$e@f^%nF@4H#JeEEb28mS*Pv4i-UO4$E#bdIV}d?#XnppO zLh&Ka4}L5Bf5lYbcd(;^7~s)riVKYaD=;OIheW}o7l5A%WUGiVVJi&&4qGB2M-iWx zGAs%vskqRI$ypK?TCl5tY3#Vg!9gYQpwN$)5~=~6YF1l>6BmKsU+C??WY=DV=Va15 zK&SLOgURF@TuARq9(>}=j+~qa0l~r`CsV`_kw9M&PE5{Fp@#{bm#{KQm{7{P;d zJx(GAxnpsm42B3EN+LeQ)Km$=PfUF{22A#2g`SfsqY2Py@Fjw+!3)3?ZwVOxq@{GB z@kb6S=?XCQ%_c42zsppx?Z`(Pe>+8nIhjhjmkhxBML01PG)?G-!PElgpP3Sq|ES<& zf{%j>K)(W}bZ>yEg?Jg~rVz-mxiDx6ru)Aum_Ec*ke-73fbHRr2jibK z3Kz<78kj1y08C@%doaaY0jBgnDMB!qG8zD; z2;z6e8dDRG5cc%DM@o1ym_A>^)MZnIeH=NcslF2l%?4A3bA`cQF%@)yu*=Dm!9t-E zQ+i3lPfSk++jT!)dLE094ao zMGc8*Og#XX1{c5xC4XTWse-A6iWtTE4~N!N_QK#(Oc5M}T~T58uQ0_gCgPV6@kwR4k0vR|7E+q_zNiPjn*!*|;9=e#d8;au-0FiKnZyWgBrqsm?C%zt|@e4>YKVkuP5{`Vamr#*n1g~KMCF9S>jChZQ9Lpils=5wLZMFeSYgZbWGDrv0 zCnuBL3Fws3Nx`Rt-KW@s4_D+O^sFqMCv!d@UfQ!tmqe_bO!^h*6m&y`6O(>R_=%~3 z?}91WdqV#dQ@jTvJO{^V5g#Ie!k!8PVv6t_ObP!cbYjw93jLMP{}ra`+mU=dW009)SCqN%!YNEe!uu9SY)p&9LYJ`8w zp0;)4v|^eW{r{oxpY>DAju#mc)8L&b{KRw+^&dZA{Xt~#C9IAAFEOMv|BfBaQY%G) zKEZL?VB04Q{`c8O&-vfVnBB}OueIZTBt|{{v#1U+)jtiOo<9uGCnx`Nph_)52dvaW z{~V}NYe>>R2de)ZsQz=H`p<#tKL@Hg4^nAnBtPx?|2a_o=RozJ1J!>HRR5a?uG*&l zKal}#ZT~q?rRiHgSfz&|I!L7tF+DU@22(pZ3%`p9Cno!U4pjd+Q2pmX6*mGtbihjY zN{)k6O^5&g_XE`?|EUAjl-c%j^igo+tMJpi z?0elGIsMn$s!LGray|Fu?m0W+T3UfDzg5A@Y8ADZR{NpVrU^TIxb;lgF7Du>;Lay}n*txq6+iYn1wCu>Zsjbv&!z4_{WL$JFNUoKFwjbEor`Upx2NU+jM6 zySFy_pN>eM_2&9@113mW`Xm1zVDn2@)ZrGV&bITOk=cLnkz{QGS8opi38wfxweKUOqLY{Yj^@rE}) zw5jZoHh$jItlI6)v#N8({>*PKL^PJ4FWNQSc&|~B?;q4iskpLozx%o4Ui`fK>((27 zN<4mN?WEBmM^f&XhR>k)$jrqvpIm6gTbE~8E<5XpYHQ+qKRA28_p-ZB>a01psFv6I zWeM+UrO&-=oB8+x>a@#?5WZ!#Il9vQXpO z)n_1~zou{?V`0sdT+zS8-&)EMAzzq@r2hj9nS)M?ja>eK>H+jLR$yfD4&YZw&4i_Jpunm6@&)~4Mz zo(m?ONv~3>zi+24CF2SYxpJU@$-9L^hkIF@mvs2<-J&H8C&Ycr&XrbMPn$C8U5x`J z_NN%Khj7)LQ z7(b!Iz9jo`RzaoKuP!EcWp2rv_omEV+&JUc!>^s6&*4W=ycSJ%r(JtlYtp8p1qKCp zjvTzL`rHeCr~3|e%x~T2Qv3Ku!|j(J8(_Pl>4MQx@y@NkJ~6bp`?Jw6OMaWb$quig z4>J-+1Lm1Ef=R>edg0P8%iCkU);UEc#8e)z5JH6|5cV&GkjQNoK{!i-7KQOt62^TGp==T?W{8GZ3gHw9oI5Rs#cdKs zFNQE%x0tmIf(Kcl{p1OA=;$4`CtCBw_h-2#uFQNaBf0A#_{; z;W-IQ^fWA2LO8kz!cv~KOzt2r({%Xd@9=RGq&2tWY9i7n`l4JBKny(T@O0IlZX!TS43&te*@?cUqN)3%NtREgDEIL&_)#C zC{KnUALHsK&~Y9>l+L#jWpJC#pkH_h(FvYPbduYrfKKs9qSHK$=nQw-0y@iMiO%s1 zqVv4sR?r2WKy;CxBf7+0w}CG6@kCd6Cec-1>nBhqPb9j=?+{(*-rGSp_-vw^Jd5ZS zZ@L5YD^DW2&0i7S;r=^8clipUdtBZHy3aciJ>bbi54pM<^oR!#J?2}9vbaqu=m`%Y zddgFYo^ks1-<04M6Y-T(Q96DALw_UK=g*6BYMkS_oIPd9z+Ar z*pCK&$1_P-o(7@u&vJ7`R`~Rv<@UVeAt=vDF(|y@0VtM-p)5TB#i;Nnq--Ij-9ae1 z6~6c&l;9&!jA>9*g||tAVs{kECMa?qE+3-KB_Ze#1Z$p5!r)_Y6*>$dKMyzzp~7(p z`$@3jHb)?wC1Jo32(~b5?r~>83<=d7;pxHJ5MEH+yw|_&qDCvk!K;)ya?eG37*{P z9E95>j6MgU7SAAI)+GoY=ONVL3Fjd+xeVbZ3H7+^1qd%mm~jDu7tbVN`4tF_FGBF< zi5DSsyb9qt2|nEW5(LXk2um+PXw0)n*g`_P%MeUF=`w`iYY>cAAT;IvS0LD3hp>r+ z=3KrC;UEb?S0VWEWD*A7fKVtCLMtAS38BJG2>VI!=Qh_MoF!qvH3(nxR1(JBf>8E4 zgmyggI)s|PLO4Z22kvwOm)j(az5$^V&mdveZ3rGWA#~vhHz72+1K}nKUAgNm2ro&P zaSK9so=L*;yAT@x3L$_e{tBVvJqXW92;|;8w2fEH1^S665MjM1+QD6OD^pRC z)Z9vWV>>*#<)!}{!JU=tVqx^ijkmN?;BBSw0&dDdOVbgM{S{M{}F!_-Yw@@jtc%G$_{uvt`)v-mx*HV8_~e<~1u&z`cop3>-B>c+dW)nM`N{O#jB z-yWrI<3HZ%9~u-sI4z;}qZh{MWA@V_NQ-Xsv`suP?2j zGT_r18vbc7meaer^l2mP=Li<|R;+}(HD!d*=vOKfmzuJ;g?5yVgoQ}&Hm1T&AM?*x=%+B{ zghsz$p?PBn^bm3B#{#p379ccwW39i?dJ2u+OsDrLsnr7Mt7I~w-b)tZaA^2P ze=tBADw>t-D4pU!cWBf?@j|0srr#w~3(+rED7}(^`ThI3!p;fWRM86agcer{Vgf{J z%K0L4X}D?B(I-V1mVujo+eM!(LMsb*s?fFytsI4mLT?jVd1yO?_LI;mK*I~PUu!j@ zpQ%tf6@eL|ggb;*2^uvWedtS8vZFy6D70NdvrE?ny9@ls{Ytr%^!-Xv*&8#a_7W=% zPkNz_ej7?}$Ibv|0vwnH%m!$@&eXCJ|I6Z5tszffWHmUAioQAMbh*tq#w`{Xa%$e{DF4#3nCi%^!p6@ zV?wb2jrySgebpEY(1`B`&>s;B1Hu6s@%@1YfH%+(@BnH8wSeNlF{FDONCz?>*aWSw2_#SYARthK$lmW^DbQhHe zDge`9lL$-)81NlHchoF^?xHyW{VH-aFuWu#blyWRMGpW50)qj1fsIbi`t!_#iep?o zIGaLh2GGy@9s!SmEZ_<76nFu=1YQHb18)Gl?kvp*761zY`a*-=J~shPfM!4gpdL^Q zs14Ks+=1!@f!JAXI;2z%84HD8k?juLLLbr` zK==GKfB_?bcwiLp8*EJAN+{74xUT}&fa?JLZtFJi5O@sG@4|it_5z!Mt-Ri0rE1(p zIO&b3<-iJHB`_1(Y#<%(4B!`lW|PJMEkw-#T6JiZp;e_Ca0xc_3(xZa%`)48oxpB@ zW|)lt{V11y2^PC zjz9p~ava)tJTL*62uuRL2bKcMfFFS6zzSd`unJfWtO0%m)&lE*WMDn80oVv^0yYCF z7G9_=99w~Hz)wIDK)<)5>2xN*fmy%<6zCQ}%NR|&G|f8lfTK$3xF9(D0Q9?0TC!=0 zb^{Ke^7{e$HFN;b6X*=kkHA|2^yBb0Ks%r{@DTNW1Y`lXfL{T6MgIbD5jX{$2F?Iy zfkVJyYQ!UO90iU8^h0C%No`)h8psFa2dn@;gnI&Ifsz3ItZM-<51`+c%>n3lgciV1 z*bf6}Q5^vc1nBLh!2oR;4kDkYNaGp(?Bp&S=YVwJ7oY$PoWP^O^qbK%7{7r3IdC30 z0lWlyAVd1OU46g{z-CdRpY?49=y!q(ff#^ZjX8^S<{};10we=%fX2WunptRR?*Y(q zPOEYyM6iJIBk(~)tPRuyXy@es>_AwE%!eFTO0}1<<5K_wU;!9`TtIHX5>NpvAP
  • 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 delta 45015 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 diff --git a/package.json b/package.json index ad02dd6..c5445e7 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", + "@supabase/supabase-js": "^2.103.3", "@tailwindcss/vite": "^4.2.1", "@tanstack/react-query": "^5.99.0", "@tanstack/react-router": "^1.168.0", diff --git a/src/integrations/supabase/auth-middleware.ts b/src/integrations/supabase/auth-middleware.ts new file mode 100644 index 0000000..4e8f69d --- /dev/null +++ b/src/integrations/supabase/auth-middleware.ts @@ -0,0 +1,77 @@ +// This file is automatically generated. Do not edit it directly. +import { createMiddleware } from '@tanstack/react-start' +import { getRequest } from '@tanstack/react-start/server' +import { createClient } from '@supabase/supabase-js' +import type { Database } from './types' + + + +export const requireSupabaseAuth = createMiddleware({ type: 'function' }).server( + async ({ next }) => { + + const SUPABASE_URL = process.env.SUPABASE_URL; + const SUPABASE_PUBLISHABLE_KEY = process.env.SUPABASE_PUBLISHABLE_KEY; + + if (!SUPABASE_URL || !SUPABASE_PUBLISHABLE_KEY) { + throw new Response( + 'Missing Supabase environment variables. Ensure SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY are set.', + { status: 500 } + ); + } + + const request = getRequest(); + + if (!request?.headers) { + throw new Response('Unauthorized: No request headers available', { status: 401 }); + } + + const authHeader = request.headers.get('authorization'); + + if (!authHeader) { + throw new Response('Unauthorized: No authorization header provided', { status: 401 }); + } + + if (!authHeader.startsWith('Bearer ')) { + throw new Response('Unauthorized: Only Bearer tokens are supported', { status: 401 }); + } + + const token = authHeader.replace('Bearer ', ''); + if (!token) { + throw new Response('Unauthorized: No token provided', { status: 401 }); + } + + const supabase = createClient( + SUPABASE_URL!, + SUPABASE_PUBLISHABLE_KEY!, + { + global: { + headers: { + Authorization: `Bearer ${token}`, + }, + }, + auth: { + storage: undefined, + persistSession: false, + autoRefreshToken: false, + }, + } + ); + + const { data, error } = await supabase.auth.getClaims(token); + if (error || !data?.claims) { + throw new Response('Unauthorized: Invalid token', { status: 401 }); + } + + if (!data.claims.sub) { + throw new Response('Unauthorized: No user ID found in token', { status: 401 }); + } + + return next({ + context: { + supabase, + userId: data.claims.sub, + claims: data.claims, + }, + }) + } +) diff --git a/src/integrations/supabase/client.server.ts b/src/integrations/supabase/client.server.ts new file mode 100644 index 0000000..bfe7546 --- /dev/null +++ b/src/integrations/supabase/client.server.ts @@ -0,0 +1,37 @@ +// This file is automatically generated. Do not edit it directly. +// Server-side Supabase client with service role key - bypasses RLS. +// Use this for admin operations in server functions and server routes only. +// For user-authenticated queries (with RLS), use the auth middleware instead. +import { createClient } from '@supabase/supabase-js'; +import type { Database } from './types'; + +function createSupabaseAdminClient() { + const SUPABASE_URL = process.env.SUPABASE_URL; + const SUPABASE_SERVICE_ROLE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY; + + if (!SUPABASE_URL || !SUPABASE_SERVICE_ROLE_KEY) { + throw new Error( + 'Missing Supabase server environment variables. Ensure SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are set.' + ); + } + + return createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, { + auth: { + storage: undefined, + persistSession: false, + autoRefreshToken: false, + } + }); +} + +let _supabaseAdmin: ReturnType | undefined; + +// Server-side Supabase client with service role - bypasses RLS +// SECURITY: Only use this for trusted server-side operations, never expose to client code +// Import like: import { supabaseAdmin } from "@/integrations/supabase/client.server"; +export const supabaseAdmin = new Proxy({} as ReturnType, { + get(_, prop, receiver) { + if (!_supabaseAdmin) _supabaseAdmin = createSupabaseAdminClient(); + return Reflect.get(_supabaseAdmin, prop, receiver); + }, +}); diff --git a/src/integrations/supabase/client.ts b/src/integrations/supabase/client.ts new file mode 100644 index 0000000..c81d68f --- /dev/null +++ b/src/integrations/supabase/client.ts @@ -0,0 +1,36 @@ +// This file is automatically generated. Do not edit it directly. +import { createClient } from '@supabase/supabase-js'; +import type { Database } from './types'; + +function createSupabaseClient() { + // Use import.meta.env for client-side (Vite build-time replacement) + // Fall back to process.env for SSR (server-side rendering) + const SUPABASE_URL = import.meta.env.VITE_SUPABASE_URL || process.env.SUPABASE_URL; + const SUPABASE_PUBLISHABLE_KEY = import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY; + + if (!SUPABASE_URL || !SUPABASE_PUBLISHABLE_KEY) { + throw new Error( + 'Missing Supabase environment variables. Ensure SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY (or VITE_ prefixed versions) are set in your .env file.' + ); + } + + return createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, { + auth: { + storage: typeof window !== 'undefined' ? localStorage : undefined, + persistSession: true, + autoRefreshToken: true, + } + }); +} + +let _supabase: ReturnType | undefined; + +// Import the supabase client like this: +// import { supabase } from "@/integrations/supabase/client"; +export const supabase = new Proxy({} as ReturnType, { + get(_, prop, receiver) { + if (!_supabase) _supabase = createSupabaseClient(); + return Reflect.get(_supabase, prop, receiver); + }, +}); + diff --git a/src/integrations/supabase/types.ts b/src/integrations/supabase/types.ts new file mode 100644 index 0000000..ba7e5bb --- /dev/null +++ b/src/integrations/supabase/types.ts @@ -0,0 +1,155 @@ +export type Json = + | string + | number + | boolean + | null + | { [key: string]: Json | undefined } + | Json[] + +export type Database = { + // Allows to automatically instantiate createClient with right options + // instead of createClient(URL, KEY) + __InternalSupabase: { + PostgrestVersion: "14.5" + } + public: { + Tables: { + [_ in never]: never + } + Views: { + [_ in never]: never + } + Functions: { + [_ in never]: never + } + Enums: { + [_ in never]: never + } + CompositeTypes: { + [_ in never]: never + } + } +} + +type DatabaseWithoutInternals = Omit + +type DefaultSchema = DatabaseWithoutInternals[Extract] + +export type Tables< + DefaultSchemaTableNameOrOptions extends + | keyof (DefaultSchema["Tables"] & DefaultSchema["Views"]) + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] & + DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"]) + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] & + DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])[TableName] extends { + Row: infer R + } + ? R + : never + : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema["Tables"] & + DefaultSchema["Views"]) + ? (DefaultSchema["Tables"] & + DefaultSchema["Views"])[DefaultSchemaTableNameOrOptions] extends { + Row: infer R + } + ? R + : never + : never + +export type TablesInsert< + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema["Tables"] + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Insert: infer I + } + ? I + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] + ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { + Insert: infer I + } + ? I + : never + : never + +export type TablesUpdate< + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema["Tables"] + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Update: infer U + } + ? U + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] + ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { + Update: infer U + } + ? U + : never + : never + +export type Enums< + DefaultSchemaEnumNameOrOptions extends + | keyof DefaultSchema["Enums"] + | { schema: keyof DatabaseWithoutInternals }, + EnumName extends DefaultSchemaEnumNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"] + : never = never, +> = DefaultSchemaEnumNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][EnumName] + : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema["Enums"] + ? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions] + : never + +export type CompositeTypes< + PublicCompositeTypeNameOrOptions extends + | keyof DefaultSchema["CompositeTypes"] + | { schema: keyof DatabaseWithoutInternals }, + CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"] + : never = never, +> = PublicCompositeTypeNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName] + : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema["CompositeTypes"] + ? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] + : never + +export const Constants = { + public: { + Enums: {}, + }, +} as const diff --git a/supabase/config.toml b/supabase/config.toml new file mode 100644 index 0000000..b925aa7 --- /dev/null +++ b/supabase/config.toml @@ -0,0 +1 @@ +project_id = "smsarmgoirlcedmqvdgc" \ No newline at end of file