From 186cd4cc7c6deb8af3b971f88a23a807bd6c4299 Mon Sep 17 00:00:00 2001 From: John Patrick Teruel Date: Fri, 24 Apr 2026 21:11:56 +0800 Subject: [PATCH] Add CORS support for frontend on localhost:3000 The frontend at http://localhost:3000 was getting CORS (Cross-Origin Resource Sharing) errors when trying to make API requests to http://localhost:8000. Added CORSMiddleware to FastAPI backend with: - allow_origins: http://localhost:3000 and http://127.0.0.1:3000 - allow_credentials: true (for Authorization headers) - allow_methods: all (GET, POST, OPTIONS, etc.) - allow_headers: all (including Authorization, Content-Type, etc.) This allows the browser to make cross-origin requests from the frontend to the API. CORS headers now properly returned: access-control-allow-origin: http://localhost:3000 access-control-allow-credentials: true Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- api/main.py | 10 ++++++++++ consumer/__pycache__/decision.cpython-314.pyc | Bin 0 -> 5896 bytes consumer/__pycache__/models.cpython-314.pyc | Bin 0 -> 4011 bytes consumer/__pycache__/pipeline.cpython-314.pyc | Bin 0 -> 8341 bytes 4 files changed, 10 insertions(+) create mode 100644 consumer/__pycache__/decision.cpython-314.pyc create mode 100644 consumer/__pycache__/models.cpython-314.pyc create mode 100644 consumer/__pycache__/pipeline.cpython-314.pyc diff --git a/api/main.py b/api/main.py index 0fc6f58..bc56c8e 100644 --- a/api/main.py +++ b/api/main.py @@ -15,6 +15,7 @@ fundamental to scalable microservices architecture. from fastapi import FastAPI, Depends, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials +from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from jose import jwt, JWTError from kafka import KafkaProducer @@ -129,6 +130,15 @@ app = FastAPI( version="1.0.0" ) +# Add CORS middleware to allow requests from frontend +app.add_middleware( + CORSMiddleware, + allow_origins=["http://localhost:3000", "http://127.0.0.1:3000"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + @app.get("/health") async def health_check(): """Health check endpoint""" diff --git a/consumer/__pycache__/decision.cpython-314.pyc b/consumer/__pycache__/decision.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e4b8ada5204e8e93d2621f7e930ed0b3d5f2ca0 GIT binary patch literal 5896 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 literal 0 HcmV?d00001 diff --git a/consumer/__pycache__/models.cpython-314.pyc b/consumer/__pycache__/models.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9433265807c36c6d73858af92861ffc018333e9 GIT binary patch literal 4011 zcmdT{O>7&-6`o!Gh+Iju?D{XR91m;D6>Eu1XvIJBPby1JqFA=*rOlx5&t|<`l3Opi z?98lfx)&Xa);YCE8XzqiAZ>v*zV+N*+?;%r8>66#0-hAal=fgB1f5Sny#iJif7vaYO(TN}ziLT5lLXo{H zROr>&*h_H{-$5>@CAn5tJ?yjOLUKY0e~Z3NBun(z7NW-|)QFeTm7OG)FyDYl+DWf! zyR>Y1%xTprjC|MTnx@;l?X|db$#EUw*nCnOr*ocJrEO-93uZbkyGom=%R!?1Ejnj* zY(}4@qcxL@95q|jh*hMcRoiaoC=WNm`L^&`i`JOwm3tF`; zhdXc|ZS?5D=SHYkqi}~7H!XqO9KGs@1~n-jeT=%Wq_}D$4X-#xuQnXlrk2-iyY@9| zSL-k^IT*@>lYkNIx+%aQu&D_uz_YKlZ7|;zl-liZnLItya5(ka!f86!ZBAWKYFQn6 zh3BbhSw1tZPF_2eQ-Z`9A9k`@)F1sNy$k{PM_rT=_!$_5Rul?;2Zrxzw`@q3!7aZ!I$UqNtxf` z(YsY`da zOSZx`oC5iHfh-d(QC1#F`t#|BvVZV&_E8MkOE8C6-G{?LAN<2Owe&g|YJr^Znu}E6 zDZ2nYq!@~?`Z0q{pboTl?0f`XLP}`b$6A(DVqM5rNUOJ_4o23MiD$fJxxOIoL5v8JZO6Lo+Cd!G3kD+RmsZT2uyL&~hg|8$H(=rd`6x*;8-BFsEpcyf*WJNg z?<#+$yMNvPi~e_~ewn#3b9Z3-a*Sj~{+`PGu>ZCG#m&>VPTV@OxbgJel>Q|(|CrL3 z*TIso-zUpj^n-7K!@N0sY-i&4Bg4n`CEnZFe{661y?y=D$@H4&f?zvU&u80H0X467Kg{)0Ik0 zR|g^ELmxk|p&M`Y#7RX@0(j!xopwOTfSB9o{}z_eqU1eEUyvD)H)M8=+!lf@MUQbz zmokT6rVw#$&YN~iWVu+1BuTb-oO7@W4^cPVH{EV!S`Q>0^(}8z^K`V ztPjc2X*TVu1M$}Fo?sS%HA2u-Ww|187llH z_5RSo8;SeF*>|#Uzx2-Ow@)mlo{FG+KeKmn;`l9Vaqr8wv-kJCczfsFeJAg%D=wC= zEoM3oW6I!nm5*YvwDwRVL)pa?4ZR-ILN_&hAuO_|L6cD+pO3zMFlz;U8xVa!5Pi`7 zKcMf&{{{Mf2bYY{SDd6XP%Do0%FHm$Ao}ju3#y z=H{nQ&{3@8;pVNHQ-zusB180fkn^`k6Q@cgeZF#>jzXzyw}p8LDsl`*xm=uKDq|x^ zdYEHac|HM6#m_`jQF`91pblu-_@&Ww@a5a(y9Y~m);+ga@fR~!5KY%U1xBoo3m3lE zS{{h|45R8UsYgRw(A;3P6-nx!vC9L zzKr84Nbnkb6v)Rv0Mk8)7nb8#2LDS|#mieEcRs`fy1WYj{O=x$rD`tCu-Ii^0TT3K z*#n=WK~i+u&@+rNLAq{>Iav>}XK<=~Y25ZEkW?28hsz+&^# zb7we1(ot4+upLO3ckVs++;h)8_uO;7Iayo7Ab9@it=|duL4^L3yy%a$RC#^?l^kM` zjNU=4DQJ>S>aSTg!>>7LnWJQ?i}YE7);XJOQ|naFK1a*6TDJxrbBxTWbz9Im=aOAr zh_%Z#EG^fv4%xkG4q<)T@^3eS_T%Muy~Z-E^PE|G>moG0dQbTm#(GCh+PmDqx|)&P z$kssF#MVODyy|7$=l=|$IIO=Ntu}X~(b8a$%+#a)`#hO1fdw`~uLPC%QUK(Qt$(SS`ld+t_8WS!V$1#l&hJi_m zi^&4K18tcbkL67s^GR6{dAu%inK+K~GVlRPoG#6-a!-kIA<4-+<`M}k$$VNG!|OaJ zXJ8$Bz&!JAi>|@6G@J|uHwD{(7puw=97G8#j5rx zHdx{oC&$Xi03ipwSP-I~x5J6ap%tSq1g$SVY@>c=x{jhWy)rY+b~{)<+QQjhNVmhH_8S=-0jO5PK@JO)nQE=4og2!cn}8{gW=%h zLh$X$aByi+aTv!#_+1M^V8@Ke#|0@$PK;hpr$jkhr+JN`1b3SkhyCg6iRz{RX@c=i zjUbxlx1Wg7KM6GN+sc7rntDI*udL?rvMjW+LDMU{mN@YS0!GQhCtMzkeGT8ys9)5nhZn3 z?G2*H!E`D%q`QP6-R=9+w-x$gg4%U~E{_ptz{2RT}r}WI>ovYJwt%{x1CY zZ~yJv_f7vo|0DgN`N`?YLf@t5WKjxDyf<81a@c28>ef;znRv%^6odr7Dk-$;l%hgh zslUM`GJG`7LziYOqEg3YQ`spnOX9aVe4lC}gn+j(t%a&~?aPc1Dj zU%fKJuIe`=A18NYw*OoG%b7JPCJJjBft*Ui{d7Vxoyc~7i_|bQRnjq>ZGVdcbB0@h zc>YS)>-YN^h1PYe)Rk_hXz9vKiHb`#xG1?ac~NoemsONk9s3_bum6c3pF^=FQX3mE z86_k^UJCX^BxWZPmn9OzRGg~vqT!`ba7uA$FPGS*`59L4y38(J4f!asn~XV5iXKv6 zC?vuW!y`6AMe!bDIpPnX=Om&1Jrp@~U_(~tU(Emc{I;z?H9w;mQqOy)3)D>MMeP8x zR$tNES@bp^SS_u#Jk@yMLJeKTh7<4yO%1l(0<<*u8AQ#t+!C~SI-b$qXKnq@>e@d$ zcB$CbTRhfvP-FMla&rgurMdI4119Sf54hfwLx3yNt>a?T-9QM7E4tN1uaxni}i>r$jbJ-(nVm4m|1(} z3~&L_uW$i5A{H3IL@3r-gIHI@3bWgE-*#j;0J5^ySGg!(nsaZN5-zLS$`u~wmm`K> zPTP*qu)ECp2+C?1JXJCnfs1Yr2t^FNrR_&>uKS)cRO`VAkt$>`LXR{Zq1pOMncqR@ z{|Zu{AClDPt-0#HQ$|pQP}*^X^xlX=wU&lTJA<}Hl|P)3_R27_g0n6s+r&14L-mSu0yg+T7=)sh(Sg(qT;I3xB5!(v_bBR$`%`swaN{PgjNGeoZC7akpw08dQ4 zw1&RriP;v2O#8TT0%gqH;$s=W3rIFkqWc7d>E8)4sBsg-|COsvIYp~@B}jgSVDOi zmrQMOkl7nKGBc`=4nQNHt{#mCgmuXGB?uCQR7UbKXFx^(4iX01fK~Bgf*1o-0I!KW zcbylRvwnOv9Va+S24dQhusn0lkCy=);V}fXnS{(JwG}}miG=NhoK$SwRw|Q}6&moN z*d_-x69d6+C>WYq2rkaxR6grnJpYhiYBad~ozWJar) z_X1&HJzE1!S4y)0#pt!=@Jt8~51m~#wxfhl5P+w@Qk#%wXq%wM zhuHx}8yg^F^(`61vt(0LTmute1NKafBn|QrLSC^)lchZ}GCqajZfry~jbz)eO)f57 znOykMYH1-ulQ%XnOJJ8Vte9?XXeLj;kr{$onfSNAxQCa8jU)g%G0-P$;0-~=YD%^M z`M|(<)_lvixbcghljpMuL&DMWf&!3rP7^z+T2S`lwS~za&9FFtm#3E4;Ns;~ynJ0q zrwLbG6Kd>F5GD`+@F<)}-Nd3GUH4_XONu+ADqXcN9r(c-@}q{`5Qm?FH7TxAQmQgk zYSg!Yo?6g4GL}7A;(C^F)wYV)&9Wa(6fr^79tr4EVomFbiAY>UX{HkIEH2yM)Y6sE z!c2Ik$^>zS*dG|53ImG0@RAJ;{)r!-Q|trAVn313Q%bO+`l1z=s+6dvA;q%+*`s=< zG=IS>_M4oT1QVPxh>7o^LinBl( zC1V~#j*&zA?Wn0c-#xtB7|1OaYg_O7c58ccmy0zmcUyLAj^}2J?zX#QyYBwn+?QGg zwtaj%vOTw5Q=mHa%%=YI{mvcp?(kIp^z_bD-ZNLAf<|Bey_@%hU;g;P?9Rx8i#zY< zude39@8mtv0`;z*C7sUDgTc0@eD3yEWf7xa;=sxhEdGCw81q z+zXJXl?PlXP#3EPcsuSUcfEsq-m%Btu?Od$c&8x|{G;^w&f#5eV9z`C*gLgz`H6QS zw@|cuw-0V;Db!68w@`3dkUHg&qjx*mBxPRt>_x{NTZ{`~&3iKOA zr)PWQ!wb(`^&c(XS?)aj) z`<{Qdd3djR{BiU6gIiCU=kB<^EKT_>YJ&}1pqDGwI9j02ROy5$@#L=i)Si3nv3slt zNpWL$arBLyslw>x?f33=K5aVvC|vCD{c^d`ar)zy`|*7T@?3b1tZG)=VC>F#ftsjd zOx5Py$9JioJ?h+J>f8foftoIoHoQx9?@|88l%Gsi*GlGV>;|sZp#zfd9_Ty|v#Y@U z@txzlBQyEH?9S$+TmSx(fBVUkrD%Tf-Moh@P;0sXCHr|wb!yo&n78p5+4HDs?<)op zr$;wwbPTN+`SxKs9a{l5znE)#&@4a}X;Z`$B1p*#&$=3q&O@Ykcz@aqa~s*yTbRg5 zo-Q;GuE2phNw!~=+lLN`8ugVxtoX;*L6@UA*3yG8T7igKdu%8UE~gy6m;`je(t!jM%xi$nFmEfF_ek08W!XE> z!iQyE;r}NM=`;8o*|S&R`w!f}sq~of`HXxTD*4yS09Ar;HnpXFZp)r9FhPj);rC53L-ASaG$CCAP$%UV^Hj+#fX>4n~8q`>~o2kWK@Sc#W#WG5&TR44TXyG z)%QKA>(BjgpYmD<3`aIzpeKkA{J~!HV7__qgUdyC(?{>$dH+*)?`NKtFWS2QX7J~O zAI$GlRL#4lXP%yW^G`h&zjC7%|9&Td*v5A0&ON&KG2L6B`wg!BPw5lCKX9Xljss*; z2R8k+>tk2GYxZBIN5c}=*cmhx}Ev+dgRL_hUJzuC7CvTp!nbde#}5rft6Q#t^> z){$>COz%4;+@(+aLAnA<{qXfE3;GS?yks~3rjdgBCwAu)vVKzEbLoQhlQTBba={8M z50M4x4=s4A-}11>Jmo_V`%I+XZy|M`f4bSC(9tOQFd2>dS`>RU8c)TdQITYzik$$t zBxbQ*Cm)VA?AE2${pzMlB0({<;DThxicR~xq2awGp3p$w0a80b3Ll|zu5pqO1A|%@ zHWVtjIJ=}cAYfY1U}KPnd>aHI)Od?PxvEX6+x-tn^~+jRLSKaGG6{ZMTm>THj-{VM z0je~azB0Q^@Tm})T>pV;KSy1kqn`gleV?OFsO$q^i*v4GZF|mHto7%dpmr0zhrFL6 zZ;`3{=+vE4Md#@MS}i8?K8={VJxAN8j<&n!pE!DRwy#}&lkMwGQ_N)Q`kJ-0m~1wZK{<22e+S8bpQYW literal 0 HcmV?d00001