From b9291861da45dcee9f127b3e8eab5728ec26a144 Mon Sep 17 00:00:00 2001 From: sstent Date: Thu, 25 Dec 2025 13:25:29 -0800 Subject: [PATCH] Update spec files to match current implementation state Co-authored-by: Qwen-Coder --- FitnessSync/QWEN.md | 52 ++++ .../backend/__pycache__/main.cpython-313.pyc | Bin 2673 -> 3206 bytes .../alembic/__pycache__/env.cpython-313.pyc | Bin 2791 -> 2791 bytes ...1381ac00_initial_migration.cpython-313.pyc | Bin 11349 -> 11349 bytes ...dd_mfa_state_to_api_tokens.cpython-313.pyc | Bin 1045 -> 1045 bytes ...kens_and_expiry_during_mfa.cpython-313.pyc | Bin 1356 -> 1356 bytes ...ssion_fields_to_api_tokens.cpython-313.pyc | Bin 1830 -> 1830 bytes .../src/__pycache__/__init__.cpython-313.pyc | Bin 164 -> 164 bytes .../api/__pycache__/__init__.cpython-313.pyc | Bin 168 -> 168 bytes .../__pycache__/activities.cpython-313.pyc | Bin 2516 -> 8974 bytes .../src/api/__pycache__/logs.cpython-313.pyc | Bin 1228 -> 1228 bytes .../api/__pycache__/metrics.cpython-313.pyc | Bin 4682 -> 11868 bytes .../src/api/__pycache__/setup.cpython-313.pyc | Bin 8225 -> 3987 bytes .../api/__pycache__/status.cpython-313.pyc | Bin 1581 -> 3101 bytes .../src/api/__pycache__/sync.cpython-313.pyc | Bin 2607 -> 5743 bytes FitnessSync/backend/src/api/setup.py | 9 +- FitnessSync/backend/src/models/__init__.py | 5 +- .../__pycache__/__init__.cpython-313.pyc | Bin 598 -> 529 bytes .../__pycache__/activity.cpython-313.pyc | Bin 1388 -> 1388 bytes .../__pycache__/api_token.cpython-313.pyc | Bin 1447 -> 1447 bytes .../__pycache__/auth_status.cpython-313.pyc | Bin 1257 -> 1257 bytes .../models/__pycache__/base.cpython-313.pyc | Bin 0 -> 265 bytes .../models/__pycache__/config.cpython-313.pyc | Bin 1222 -> 1222 bytes .../__pycache__/health_metric.cpython-313.pyc | Bin 1252 -> 1252 bytes .../__pycache__/sync_log.cpython-313.pyc | Bin 1280 -> 1280 bytes .../__pycache__/weight_record.cpython-313.pyc | Bin 1265 -> 1265 bytes FitnessSync/backend/src/models/base.py | 3 + .../__pycache__/__init__.cpython-313.pyc | Bin 173 -> 173 bytes .../postgresql_manager.cpython-313.pyc | Bin 2524 -> 2524 bytes .../__pycache__/sync_app.cpython-313.pyc | Bin 0 -> 11412 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 180 -> 0 bytes .../garmin/__pycache__/auth.cpython-313.pyc | Bin 0 -> 5844 bytes .../garmin/__pycache__/client.cpython-313.pyc | Bin 0 -> 2226 bytes .../garmin/__pycache__/data.cpython-313.pyc | Bin 0 -> 4624 bytes .../backend/src/services/garmin/auth.py | 8 +- .../__pycache__/__init__.cpython-313.pyc | Bin 170 -> 170 bytes .../utils/__pycache__/config.cpython-313.pyc | Bin 2143 -> 2143 bytes .../logging_config.cpython-313.pyc | Bin 0 -> 858 bytes .../conftest.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 3101 bytes FitnessSync/backend/tests/conftest.py | 60 +++++ ...rmin_auth_api.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 25093 bytes .../tests/integration/test_garmin_auth_api.py | 194 +++++++++++++++ ...t_garmin_auth.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 16292 bytes ...t_garmin_data.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 13508 bytes ...test_sync_app.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 29711 bytes .../backend/tests/unit/test_garmin_auth.py | 228 ++++++++++++++++++ .../backend/tests/unit/test_garmin_data.py | 115 +++++++++ .../backend/tests/unit/test_sync_app.py | 199 +++++++++++++++ FitnessSync/logs/app.log | 24 ++ .../001-fitbit-garmin-sync/data-model.md | 4 + .../specs/001-fitbit-garmin-sync/plan.md | 29 ++- .../001-fitbit-garmin-sync/quickstart.md | 9 +- .../specs/001-fitbit-garmin-sync/research.md | 10 +- .../specs/001-fitbit-garmin-sync/spec.md | 6 +- .../specs/001-fitbit-garmin-sync/tasks.md | 24 +- FitnessSync/test.db | Bin 0 -> 69632 bytes 56 files changed, 943 insertions(+), 36 deletions(-) create mode 100644 FitnessSync/QWEN.md create mode 100644 FitnessSync/backend/src/models/__pycache__/base.cpython-313.pyc create mode 100644 FitnessSync/backend/src/models/base.py create mode 100644 FitnessSync/backend/src/services/__pycache__/sync_app.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/__init__.cpython-313.pyc create mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-313.pyc create mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/client.cpython-313.pyc create mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/data.cpython-313.pyc create mode 100644 FitnessSync/backend/src/utils/__pycache__/logging_config.cpython-313.pyc create mode 100644 FitnessSync/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc create mode 100644 FitnessSync/backend/tests/conftest.py create mode 100644 FitnessSync/backend/tests/integration/__pycache__/test_garmin_auth_api.cpython-313-pytest-9.0.2.pyc create mode 100644 FitnessSync/backend/tests/integration/test_garmin_auth_api.py create mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_garmin_auth.cpython-313-pytest-9.0.2.pyc create mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_garmin_data.cpython-313-pytest-9.0.2.pyc create mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_sync_app.cpython-313-pytest-9.0.2.pyc create mode 100644 FitnessSync/backend/tests/unit/test_garmin_auth.py create mode 100644 FitnessSync/backend/tests/unit/test_garmin_data.py create mode 100644 FitnessSync/backend/tests/unit/test_sync_app.py create mode 100644 FitnessSync/logs/app.log create mode 100644 FitnessSync/test.db diff --git a/FitnessSync/QWEN.md b/FitnessSync/QWEN.md new file mode 100644 index 0000000..424ffc3 --- /dev/null +++ b/FitnessSync/QWEN.md @@ -0,0 +1,52 @@ +# FitTrack2 Development Guidelines + +Auto-generated from all feature plans. Last updated: 2025-12-25 + +## Active Technologies + +- (001-fitbit-garmin-sync) + +## Project Structure + +```text +backend/ +├── alembic/ +├── src/ +│ ├── models/ +│ ├── services/ +│ ├── api/ +│ └── utils/ +├── templates/ +├── static/ +├── main.py +├── requirements.txt +└── Dockerfile +frontend/ +tests/ +└── integration/ + └── test_sync_flow.py +``` + +## Commands + +```bash +# Run the application +docker-compose up --build + +# Run tests +python -m pytest tests/ + +# Run migrations +alembic upgrade head +``` + +## Code Style + +: Follow standard conventions + +## Recent Changes + +- 001-fitbit-garmin-sync: Added complete implementation for Fitbit-Garmin synchronization, including weight sync, activity archiving, and health metrics download + + + \ No newline at end of file diff --git a/FitnessSync/backend/__pycache__/main.cpython-313.pyc b/FitnessSync/backend/__pycache__/main.cpython-313.pyc index 57ada71796b8cadba83bcb2f732fe7ddf34c58f4..41d2057733e4547169e6e223baa34e43088b64e9 100644 GIT binary patch literal 3206 zcmcImO>7&-6`uX!F8?Kw`ZXJCEy=N&%A_nyb>trvGG(JCRXgBXEea7O*2^WeHn~gB zE*+UCIVs>c7e@gC>Cl6Z@-0W-+QdN5WaU8a#A=P!K#`jQ=Fp-&^v#lMI(3W!208%e zz4_+7H~Zea_lB)d$d6$Bq4aZoOho8!bm0zIJEQe6i_m9CMlzE@X$CWC7PAsvvl%YU zW8UGpj3+H%!QuIgnD%0?!+SEmv>*E&UdRN}K^$~=F%wFMaoFL#nI7B&_Pm*1+?(^t zz8o{d%KiiB8b90l2;7%r#!#+L4$Lt)l8a=IbT(chaxf>1Avq+6=NOoK<~RxEctCn7 zg8SiwzRW;+5D%t@@KAaf52r`)NcsRikdEOP$VRerFPZDGxxwtIS5Y}4N9Q04uhAKL z1D)YF&>49Hoda*66Z;=JXMZ3<{j*FPl?QSx+~?r;?sF6(_d{Ak|D`qjJuRu^jgNdo z&Bj?GUQjH1;k}DQ%xX7knq|is(v#MWYs&N$tx_#3wq^kokZr}*)eCyrSwmZ7Sq zVQXu4MKP3;hCwQ1X?CreFPo*3Zj=BJQl?SVDJQCC1q2J12&Yu5YR4SX1`zMH!eS^<&v$nq}NrDJGCa96JP2D8j$eJDvL$o~tqi(WM5G)<$lyV5#KpQ)7MJ-j zI`JZU5*mfRX7CIArBiKMWQyo4H;RhPNv_Dm{g>*a$BrG77OK^+!rR!G#x&tq(23D*pR9#(i&=af``=jG!h!?Yzx>q*JF zu2-v6t9wAAe&`iPR%^E7$fEhaL0yT5u@{0x#7W&YTfc+p8?=tT6ObqJo6Ao_{kx%q ze+(V`?b=T0==y~xy#G$-cBavL{4qcMJTkoX)=uQedgf_#U~}%%xvgLCL?_pm{wzkH zc%!@C@uqjYF){Ob`LQ>(&+@)S=4mi`@AAi&w=&y|K1$`<}UHo%o8M`NwxXsCT4=7_dV1mhLV!V)GAgJX9Ma=XQgsW-#@y zeU9$_+nNF&K3JGaC7CZy98K})%UB%vN4!5Z$vq19r;c!s#yk``;-SbS2Yj4yVo(>8 zmeV+i(5BD{eFYsuP)&Rb7CgOw;|#xRQKyfL0e0#+Lbb%1ce7I9tT2t-6tapXO};A?XC<|K^!v zz3UlHz`>Yiz{@`P9jSbkK6~_mIzfe|=|s8sAtDyxRfTK8G_06@Jc)FmMCY!dNHMKD z5_LD)8B(NAET(T6@pm5BvVIlQKaynF!fK*s>t!p^=_Yv)fd{tTV#03I?0`-?5j&vM zI&c)s;2t{B5^eVgPsOYmcKZfJdIJ6M3A%llPH)qR{!_&Cox^dMNLV-2a;>1jJ=Sb! zFG7cM(6^jxb;9xhwLloP@7;T*Visy;Z5}TIMiatH!3;&lFn>W4dnmDoe!Pd?*+bKN z=+GXDeT{ryqwq7Pf1mAVX1Bx^0@C6TJKzA{P9ib<$y!s8*10E$yW_j<`zXG#vi)vz zVCLbw>%Jyh{8KP?|9Uexz3%%vI=73?Jwx0siZoH=lb>v!-8j2F*r2N^(C)x9o2NHU z-@oa=i7q_5d1m9xw&1|YF8mtllbiD!^V@Gb(#N~fr*@+g&FIATFPx2;XAFO5==RV@ s(GP#L&oWG!+4?1PBcRm7a2whe5bJTIhIg1qN37Hpi+<~9;uHk)KQA=CApigX literal 2673 zcmb_cOK%fb6u$GwjNguJ@(#oe3Dl+7X-EVPkP=>MYzovvT2--XO~zwqU_4{)jMF5m z01H^sN~l?88FnnY>`#alq@XEjky;k)f=n0edhU!TPEb)c9cj+}?m6FmoY!pxgFXb` zbU3SYdJy`HOx%xeg2p6`&=Vvefy$x`g{cgU={T9wSti3`*2YY>EyH2X#%z|)c(BLD zZCP)|hkZ8Yvi?i}2W-q|gP9Nx+1Qf}<8a<1c=Oa4E%LDNn&I0iS3WDjLJaHoA*B-;hJyNP=M_cn1K z;Ql5)4ERVB4*-tCo{`+8)~PPacM4Gaj5UvUAsWJ{%F)J zken|^)_m|mjnM)#-sEWX43%@cW)D+fXK0rbN3+mp&X==$&z(8rAey0swms~iYoDP7 zE=_6743i7Hy4L9S3#r)C>;ihy7Dr`tnki8U{`#_CROQN?A|(|~u>zN;ZcSaB60Q_x za@UqGRGkOp&W3t4o$gRZ6l^6*b%q`;lXf zJcu`F1-ZX8o-NfXPKMjB5FbER&zx{`{{KIws@S6JU z```GDv9C7$(;Mvc`v&pseor5@%%z~5YWv&#|Mbk>z2zAmgoE)Ah`m1eY*wLaKTu#h zOGw9vI1VB)Z1E*{{~$YkcWOfGK4T!T{pCGr?zQYeFVjp_%c^@Tynq5Cr?-={_%!;>;F2Chauz&4NJutfB{Rc>=>{CW; zIkt@^ULj@+Me8W~`22e3209H*{W1a^&hOs^jgys delta 20 acmX@Zb%u-kGcPX}0}yOj;$696#G1r`7R delta 19 ZcmZ3&xP+1WGcPX}0}%Xf@SMm!696*L1!e#M diff --git a/FitnessSync/backend/src/api/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/__init__.cpython-313.pyc index 61105acf97ecc1981b4cce3bcddeb63172d38387..1ee0b4f7645238db28a091f7729150f8a0aaaa83 100644 GIT binary patch delta 19 ZcmZ3%xPp=UGcPX}0}yo2^_j>$7XUF}1tI_d delta 19 ZcmZ3%xPp=UGcPX}0}!Y+dQRk?3ji)^1fBo@ diff --git a/FitnessSync/backend/src/api/__pycache__/activities.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/activities.cpython-313.pyc index 30cc9260f8ef1229023ff3579f89c2c470761abe..bb84dce77f389264bd53dbeb17360e143a4370bf 100644 GIT binary patch literal 8974 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 D;Yo!^ literal 2516 zcma)8-A@}w5a0W-eg43o1Smnog-~z{I7vY%O;afe`M_yNnoE^Pado+*T&fd|) zRFRzYA&J@ts1%8+FGzVIZ~Zf>K7o)bSgA^)KB2xC!AsscbG~z}RH?d>XJ&spJ3Bi& zGw1!bwh)2w=Z{myUw+^?@kZDc_J80Ac}8R+bC*euqg;-sd`_T38ZrK|nDbGeBMX=P zxd091Br4^CG?)v~P@3eqJ~Hl_qTw#mM`W>^$iBR9Txh^Fk`G@$>>c|Lm;L!bKH>vF z4ovWQ9(GD{P!7rA3Bj4+`H=~JjF;Q;Q8}8Aj)`)to6L*zT=T@(J8Z}QWjiqr_r&4Y z{$DdVFPWF}amUA0Q)+KYhdgOak~`k=Eb$J{Iz2z+u6!Ks_8#tQ-X}Sm$aL?bn;C%x z&s>|jUS70y%6wlg>a@zF>$+7bo0gv8Sn#ZB=~v1Hy_gZ1_=REFOuAaJjk2j0nK)@^ zHWSX6RSk`K!+jF6{~I9BNS;tmCX|;sDh$A5Q!($$`|-N@fGi9G2TTGi=whOag<3G5 zi-lV-zl%j$uz-uT0p^_{xmdJCFX&>i7A)jq@fIxXU=f;_5>u2JgIadc zFmTb5ikwd@^0 zbhD7PsFqbLM%Im>p^a?XI5M*(cI+>S^1S*t0z}ydie1N^7Z~ zU^=|rKUll6{K@LMmD5||;9Ilw(OPaPUZW>dF08 z;pu}dv449YQ@gr+YgJqMdP~f-SovKXq-oEmrFe_C*&@^m6i}49#e|Qe7k5v9_AWMw z-Cu!Zc*f7_j4wj1(GLJ%zM@ewZ00Y|%vidu@ql>)Ffw3666oD)f%q$D-q+v9?k2|Ng zx_=zjdr-0IezM^{9RYNyuhn(0XtLin%h4!2VBwaThA-j`EDR^k7^6mo0#!SU23ILG&HBWvSrQI?GY#~T`eu8 z&NWm-6J~Xr;`=*!OnXtnlyI)%>1j~GP*@#6>jKAdFUja88U2Iwz9hq2WcYP3`TgOV|3D0JL(A0z0<7Le zcjLms zk=Oyw_XWaVNe`?Qo`-jO``0FaUf3D< zaDD9g?Y*D`MpK8ei`4~?U&XtyYt?-q*Zm~ciCwE6z?nokda+L(;2u2q5*&;R?ahOa ZZE?rzyvQx^>#2Q$9Q97@Igk^#zX27)X?*|y diff --git a/FitnessSync/backend/src/api/__pycache__/logs.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/logs.cpython-313.pyc index b5ffe2489cccfe281fde548a793b7fcecb60d791..c7f53a65d416852f22b1fb7106e5967e2c3870ee 100644 GIT binary patch delta 20 acmX@Zd4`kwGcPX}0}yo2_1VaMkOcre#s$Iv delta 20 acmX@Zd4`kwGcPX}0}%K$d2ZxB$N~U6Tm@wS diff --git a/FitnessSync/backend/src/api/__pycache__/metrics.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/metrics.cpython-313.pyc index b7492d05629d4754b28f64fcf5b4ec7f542431b4..951e789dee4bf491fc0fc50f2cfd600bc651d590 100644 GIT binary patch literal 11868 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 DGmshy literal 4682 zcma(UO>-03@y%#78hu-`v4w4H;SX$qLEw+=JfjkLjHw=`r~(yy}$E>d`n~^bJxi{N4a^P@^KvV*In}h6&UWi z?w%K^IPamJd5KE%Uh0jL6gNPooNcHtMh1v1bQ9T~5~f@>nfe)31gfWr8emijsNN=O zkWqa=^*2#Nj2ZxHu!$N@`R<;qt8(y`L#dz~zR1gM-3O9I-ohJ6i7CGu7UPN(57I}c zID4;mj@so8`Iy{!(KRW^T`5m0%Jzvhu;UG^JJmiZ$vxfVf$)H9SgYeLGWDiH?~-Pc zms^|za-2AF#<91Y(Fb~m59!?x+Qd;CrZ@WjqwQTCef||30X+3RPuFHkhv>gdH6r91{?*RFhqzL6?LV1~^u3?fA zQf`?aff-QVExQ=z0Zd?+loHX{Fm^Y1#0KVRV3Nb_gZAc{ZV#tIL`da0ZXm+=^xiD+S%Oyr!Pl3{%Z7 zTS7)PHA^&#D>SWH!Hj0AdQQtIKvrLn1vpGnl!BVq6vgr>O1_v`$srz4l!q&7&Y1}- z%A!sUGp84{LJ_82dcm}Ssul`GQ$@=fNHt9G!eXwdniQp_5&|#EeN0h6AX85(stH=% z2ZzB5dJN|F;7_cX^!Pwt;bOd6i<)V*mv(J_YbKsY?FG*Q$|@ZK0zY?b;T)s=jD>;^|q$!qLYI zRbTM&Ts07We7)Mgq-$-x7zFXL8Kl4&JL;LGH9*P$y{gJ(&z;vs4VV)J8sDb!# z#w>PZfqJs;glL6rA5Vjm?y7~XwiAKfEFYMPn&>0Vl0Z*}F zyBDz@1bqn5wzlwb#0KgBk1%i(Ficyl(!L(t7EV+{on_-`{-w}kFG23s`ksfGck1g& ziS{i4O(mvjyRE5#x3Lk@C}JamF`Ny{hgvHXjp1nQZK<&cOX-2eOuJTUk02icJj;jz z0JWo_?0RBb=&82#zZCjym655n%8M{_RArf`;8f@0dk&NZnwPoSVz0G7q%9j+Ah5>@sgJVCl7=xu zF=iqTS5DKGl_j|Ph7~}Tw3;hYT{9fR23s2T9PDYwQ#WEPo|1^2K!Dz-7Z9{E_83ke zK#7fy0D!Si4wSB!W0k@66WhW-^;Dv?P@b*)eErt8kfW_4DwQ*-K9WBrx zKr5P6X7o|aR@dBn7f;XtXepk1?z()WmX_sAaz^bMW_kNvT80lDB}%hioY#D zF3+&cy<$N1a0pO8Aj9K@O0>6(A(ZZD3{4@8U0BSR^aBJRBDjd)rwA}$=*I{?LC`9~ zCU61)n!)%J0Enz`~3BS%K@ zq0)R=vQywtwQry_`(z2zAO>pxU}^5jmlfC3-){?pM@GYm(yj96mGt_rF^CUNXhbba zxE8F}rDP709`q$4>eOx^&p8uXeXgzzr)GA?2?6ZyzD;550MXC zi(EonfWF4fl7QuFy7z7aZ@eYd@A;Z<{QUUD+4C3R=inE{&rV!;!P6l)g$@Hq@HBz= zX$0s}8?d4mhoRMp!Yk?{=o{4g5GGEorB`9{4Ezn`+94(KA0Ih>m3!TNsu~;Gb-TKJ zyKXTc)`;j9e>70Nulzx7Ez~f|L+sWTb~3men{xf%F4ocUSp-dEYQ; z5=*dG55a17F<2rx5-4qUpd1*7eh%!v#3c&|P_9JG@+_**!7b|)0-8_^8cSMU&8P+F ze<=orB|?VP3t7s#7!PtCw8|o7pEGtRJAiXo5m;Gena^^8m)Z5R(n-d11YY|R&&4YV#N+#tz>QYC`vhM50UtM7Ufn0~s>KK|eck=X?kBf4$387}Z*rG* zc`qmKxd?xmt07wJbXYb6z0dD$j?ZkJy@rglZ%&@tFrW3jiVtsOp7~$(4Q@>T`HNQ( z=-4U`H|}jkPVagpE>w*i$Bv@r0{pez#n#+_*F+NT!W3Tf;7B5Y@ILb6$#ZZr5<40v z4{T0Mc0=abKVWg7#&TA;qY+ZdgFShE@indNrTAgs~)FU<)4;Q#;t diff --git a/FitnessSync/backend/src/api/__pycache__/setup.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/setup.cpython-313.pyc index aee0c87e8250aa40e162067701c6fae237eefbfc..de3423854672cb797eb7f4a27156e5a211e46038 100644 GIT binary patch delta 2288 zcmZ`)U2M}<6ux$xzdA`%_m`wi4Row2(2o9$wp%B<3K*j;ET&LMN|hx}Fcc@fPGPGw z0(%&pco?0{;$dien7yDCymkYrn}jB9LFHlE_ONr^xODtj^5=Wc z{m!}ex!*bdY=_$DTlRX(5M1u;kTmO__0`c?YPR`(CgzDWtJ$h5E>_(|5duQEMqmR7 z*Unz6X6x$E1|;|bNGMl1YGaq*BE{$pC{}CDIw_$dRwr;Vwv!Pm1L!z&oa$PMhHy{~ zQMEl)7WXO7>e#xHXU!9y^=U`AR=rH8y`J51d{UAJCL~eLssGZA>So)Q4i9--ull>~ zW2#&|!`z^%)E)LO0ROPRrn;OjzT{tV8`{+$5htfaCHG(*xEK|uL@cGGL_8;DyuoAZX} zWGX(6Az2a@lMlXyAk!SAk0(juEqm+dwBb;4@!XVRI8Ta-5>Ja@VpmLNLJemkBj@0- z47-SN21~P$o9Ru1nY1MHskk&DCR_P|V`Ab2Kc$FRj-M3Uvhlp4oX+4R#K-Nhwc$vL zIp99HMJ7&VDv^NArh^bAEhc%06ql2HE^|VZ6<&#-f|y~q;g}%H*kB|%mBDr3idh2W zTycOzvI9esF*!GE2M9AbOvWwsWYwECwKkqG#fIC!rZ50%p?qUY9}EafnFTnDmYA~h zd(Z9FxbEx0`JN%YXGrTF*8KZ!GyBy(KY#e1H!$zzbuWK~D|nmE?z-pnUJMnSjSJ<$ ztF}3x7R~5gS-pHxb4}iHmtWjoa0eEAu%vaybl;ff8e3v(uMAw@qeU|Mwye%hYRsf5 zN42wJYmkW46y7J#6kY`-&{6Vz<~4#M4mEBIyuKAoKGZ>5^5RhlMco$7DqESzlH~1) zYt(OssmzxufQYlX#4+W$DrJx-h*NNYJWY+Qk>9E$*Q2Q4+Q5n8dl8bEXr*NtVXSu) z*i~Vd?^6XH1ZhsT9uxOZB6VV-b1 z0m63t8X30`c$EOjmO+UM(V}{;j?eFc!DhIXp8?iXQTw%yuPU!c=lhQ6eMbsCQN1Io zwZ}C7*lp%$k@4A&QVVrWpZaFJceuuRu0`isuC~v&4eD)!1#W1@`5VhER5o56nA=l? z4oK~$A0pKI2EnR5G?=`5=p_!;^ICUA=LF3o{I$eZEh9S#%=%^~FTAW(cNW;r1;Wz0 z59!>f<{4e`a32kRIH&~&=KAM4v~|0+$ibOG-E(M#)+^jTa7Y_HTsUw<6QWvoOy|Zl z&)7djmc;#A3BfmB>+bJBH^OBEJIc5Lm+eMhzhl5=yJ@q-B;25$X^3w$oTPQZp&K>O z6HiId?OIowQERCgvFiPX_4~+4k@+Nk8y?bR&1{YT0l@G%NdN!< literal 8225 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 diff --git a/FitnessSync/backend/src/api/__pycache__/status.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/status.cpython-313.pyc index 66b33673fea0dc223aae3e19a11bd33c1ebc087c..3c4f190e66754230a43257764cd2417c92ad53b0 100644 GIT binary patch literal 3101 zcma)8O>7&-6`uX!E|;VzllrG+nU>@qrk2<=mW;SRff6TnNK19NR+GYP7AtZ^txN6F zGfUUXNv(m#ZGb{K7(xGY@Sz2ADbQ1Iy%a@HCRl{*ph8--7v1biKrThm_jb9m#il@p z;F~w^&Ad1J-kWb`e_$X+p#7n?Z2u`j$UkrpHW>SD|3A<@AUe^7A}I(|D2PqvfGezPJ3D zPCr&2)l)BuWpSF6hZlrEbwSY6W$l8f4`s+L`Id0#cf2;78`;B2Igx8i*IzHWP0ylS zy=*lsr^<2y*IqW6wd_`{I!uwT+05h7uQxo~b<8@bRo!9?274kJ5qRpl%e)%3^f#_8 zn~qttC#W-~;G#As0i=KPGUD^hB6K8rKJCq87;|`5*=iYOQ3khU+kEFAXcWXji%BHY{pl zJ#!@p;0jkaA;eI-JO&c#8CaP-3ZV|T6tyZYtumuQ-3rXKsyrEr)=j%^RgXj_EZO~W z@Od;cx=3YRqLG@Mi}2CDJmndGOunsmg9mt>e5Y|Z1EApz)!R*hUt0KUW2pF41>;sgMIh|0s-Ml;FnIr z0DUtR$oENiXzaZx{Q~gxJQ7@$8=$9=KZ695K=HV6$#y&r`!F5HMSl=+*oVYCO3@%i zgEWa`3W;y-Ipol0-~x9-$3lYHVg(@Yl5RA9?@D(teQ%|k7`#{Po;bCA<^Eecl^=Yo zEuZQh8*j_w-I=r7SMP7^+-)VZZTW0>EYp@V-QlseJoc$9M8*#YkiZRkIFc+01laa3 z0XdqiBV~*Q7?!cxE6uQ&qctU`@}%w`$HR&{2?qHw4+2s*%m4*#i}8`F`yHq5npLa% ztT+w@1rT7=-5T@5vXaw2E7o)l%+h%z2$w;~J}Z{bqZSG7!#~#$%h8FpJkdQq)t0Ba zsgWJGl{)jWd?pAD&V5JifeOGilz4D<{93AWvAR|XOB<#VbdS;7{{=`NAnrb^#Tn3^ zqIQVTB@A9)3(*;{`SV)AlIm+ueU+kpDj4d*rK^N|u3d=#XBP{We!J0GTxl(?JSx52T70`bX>=y7)}+;*tUZz^{+1s8;N1J? zes-~)p6R5|x6ZERId2hf`05#frr z)v%pfaLlpXd6M0(oAt_uwYfD97*Dav`Eh2^J2qTP^Nrvo29v_)hW|+6iKb`Q*?jOO z3!W^4cs+ouhfBQ-hEgmG1R_6WK5lb``VU3_fe~O1!UdNg34ZkZkeo-q65Li_qbo2E zfq^j~k0n76J|Smz$GzIrEB}%uVe}vt7shw&0|MPa zMiS2MeDi=n_c%tx=)0NkX70cKp|hQNBrN>p#O#OP_^I&(W-2=uae=Zg5pnT}2%I1B F{{pP>s)qmo literal 1581 zcmaJ>&ube;6rTN|-PKCAY{#-}ITrG-1kn;f!0n~9w9ppIsS~^{G@!6-cE`%L(ylr) zYH&|!bVx%lIy8SkkNtCsAS?r+l%8~RkT1RUyk$^mI9OsOMR57d^%w3KTHdMn3rErS_#(pI*}-t1Rq zu97X{=vCt6+S(qhfDf}$s{vN?k~QBpkILDM%jj5pN;Y=#)i;p~9lKGOprfJ4{HOQ! zkK%!#3UyeLWhfEn*UywFoibI&{C`{WWZM~gy z)SKXG8^E*+rl-to8(1IkM^X=g&>Y zUf89P1lu z*+5zxtz0l>V9I6J#VkYL^@L#ILy!U{uqE(K;U)6(=A*bro16<8iRL{Pe@A`6n_qx3{L$JWUnw)(b}4oOMas3yuZ4=Nq=1cT!0&WM72k^u_gOgdTSP!SqjHCG1F zyB!Nz6wepokD&-Dm*pUS9Cc$afGC&D1y}*JaJzAbr$Rw-rPpOt+NP rQFun+bGB?KH%Ir+2z*W#h-y8n{#^ZKf2^#$R&B+YYDBH1ELG<}bIN{2 diff --git a/FitnessSync/backend/src/api/__pycache__/sync.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/sync.cpython-313.pyc index a0b8dfda261785886a6754a235669e9f5a6c0b78..54e7d1a9fbfc0c37587dd27c273e4fdc061bfbfc 100644 GIT binary patch literal 5743 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 literal 2607 zcmbVNO>7%g5PtjPUE8sp#Q7_6+cPF3lx7xS!=FQBT z`QFTIEg19@7$YBFHNKJv`4bn70c&T}avUKKi9!@^lB77wrFhCmam`N(DUpf}Elhe+ z5|w}!70;xc@=~wEmnMBFKlM9&d9o!Hpn)h!b1^bfH&286NQ@}nUZVKY;)vj~X~^OF zf!or=ZB+ujgtn!Fv+=rm(?>G^S6NvU&j)-fLycD4AMelSduSZogh)R-Wq0J5$q|spWMFOj*$x12G__Ov%g{ z`3xS>7bDnlW^G~~Z61Wl_GPsSQ|GkI2T#aM!fSg~)zpf*s@i^4Etay21*8M2dV5hT)OT7{ zHD^#}6%121OR7p+(UM@8mJM5)X_hPvgJq!ErK${98CA0^YRmyhz@}}WQG=J*ZzktU zMLo%wrJGjrIxQ{e8H*(+4C@93uTCLl0xB3r68!{plZc4U=EclGys;I2?Jxe zx=*TIJGN zXLVMFxb@8-h}aTFzQ}C32>!zj&)CvJX-+k=PWTBQZ3ihD#;F6RPE-<@MQJxK`*6a# zrad?zWNsv{Ar)y%coge}2|^CE-kYoj+wM(O_eYl}9$fic`DFU37&Yqo7^4pkaPMA^r4Zu-6+YE zesYYwURTM&$vHks`bZR>Jh>qBksLQB zA6rgUeI4t**qSf)t8ZXMu7Nv*0R(8{oWd)DA`S@y z#DT&y10h)&we;*#yT=~K&EqFeogN-}BG3b1m}1$xxrG_^ zgrj%^3>~S%(}Fsxt51&uAJfmtFvMufPdfHjJ5E%?gU@9#AZ-!RBmGlD=kLlsZmG?U zT5~&&p+ovpx9enfG74mOf;|C?=3pV8fU|pq$Z7s180ZlYSvt^YY_A3(RQICd!a$FL zPJ(mVRf4BUSh>MBCr7Ij{R{W$Nf7IYmmy9~2%M^R#=aa|j}NcKhgV}GtKrcmJeY$= zXE(PLbnz(a(ET#(e_Xg5Y5a<=6|DJa-Oj7y4cB*@ZrzF5?H$K3h^BiEIFZ&>DAoYt zv-_gosD=+U1xANJW+u^P%Q+2lt!z*M7!<>`z2!<)Goja0?2xu(Rmz5$cUqVoVLH8I zK#C5P-TxlDU1(IPQ`>e3I9eeyuNNyrC0e9Dv=Laei~<{S|AlV(OVs((x;@|Nf>_74 zh<2THb#BawXIIa(z31IO+C_RER1gZb2Gf?naoq3Z&;~iUK_VOE+y;qlkp4e>;m;z= z(zeKP`yM5>34FFCf$RVL%r=3~Uw(n>hHBuw_ah%g9=yLYwH#UH&O949x-#+j+H)dv z(xb!M_^AnmKfA>PwH2<5uLk?R4WRsmXA{#u=YA?V@~iRDEmZja?H#>~FY7%}SJJ3< Y_SxXEm3JSj?lEIK;^&^@F;2h#54B`VM*si- diff --git a/FitnessSync/backend/src/api/setup.py b/FitnessSync/backend/src/api/setup.py index 2e71083..5107f5d 100644 --- a/FitnessSync/backend/src/api/setup.py +++ b/FitnessSync/backend/src/api/setup.py @@ -35,6 +35,8 @@ def save_garmin_credentials(credentials: GarminCredentials, db: Session = Depend if status == "mfa_required": return JSONResponse(status_code=202, content={"status": "mfa_required", "message": "MFA code required."}) + elif status == "error": + raise HTTPException(status_code=401, detail="Login failed. Check username/password.") return JSONResponse(status_code=200, content={"status": "success", "message": "Logged in and tokens saved."}) @@ -52,5 +54,8 @@ def complete_garmin_mfa(mfa_request: GarminMFARequest, db: Session = Depends(get raise HTTPException(status_code=400, detail="MFA verification failed.") except Exception as e: - logger.error(f"MFA verification failed with exception: {e}", exc_info=True) - raise HTTPException(status_code=500, detail=f"MFA verification failed: {str(e)}") + if str(e) == "No pending MFA session found.": + raise HTTPException(status_code=400, detail="No pending MFA session found.") + else: + logger.error(f"MFA verification failed with exception: {e}", exc_info=True) + raise HTTPException(status_code=500, detail=f"MFA verification failed: {str(e)}") diff --git a/FitnessSync/backend/src/models/__init__.py b/FitnessSync/backend/src/models/__init__.py index 4128249..903e51a 100644 --- a/FitnessSync/backend/src/models/__init__.py +++ b/FitnessSync/backend/src/models/__init__.py @@ -1,7 +1,4 @@ -from sqlalchemy.ext.declarative import declarative_base - -# Create a base class for all models to inherit from -Base = declarative_base() +from .base import Base # Import all models here to ensure they're registered with the Base from .config import Configuration diff --git a/FitnessSync/backend/src/models/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/__init__.cpython-313.pyc index 4a6f7179bbf3a4bce59ea5d33a945e34c5a33165..f9c5d8e136ef3a8c749c1ab0cbd1512d5b3acc5b 100644 GIT binary patch delta 334 zcmW-by-ve06h^Nb=O0rBREYsv!GJpQ3b5INr7Kb}sYxtKQr)+ zvmqgN9DBGv-|=VJpR}dym$3xwGV5!7)3T%8(uOx!z=8fM8Z={9fx9%Gh~hvEv?eUpR!a{O6E3l~*|4yWFB105Wj$^d7X7flLkjgnawIvaJ zCsT71Au)|m|E#o&`7{c%JVx(vLHJ2miTc)JsM41~2&v%s+XB1$*6cl)zZQ@|1^X2o QRB%|qp30xFi<`>*2PYI~fdBvi diff --git a/FitnessSync/backend/src/models/__pycache__/activity.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/activity.cpython-313.pyc index 7e7efeebaa63e288fb0556939da810dd65365b62..f57e03257627a7fa7762ac8ad6cad3c0bae55143 100644 GIT binary patch delta 20 acmaFE^@fZ4GcPX}0}yo2_1Vas$O-^K>jk9% delta 20 acmaFE^@fZ4GcPX}0}z-@^4!Rs$O-^IIR!uf diff --git a/FitnessSync/backend/src/models/__pycache__/api_token.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/api_token.cpython-313.pyc index 7241c58680b1857a5e917be97d6915bfd20b22f5..65366bfe6fadf612544e005bef5f73c413fbb752 100644 GIT binary patch delta 69 zcmZ3^y_}o(GcPX}0}yo2^~t=kk(Y^)k$JKJqckJ)W*tT~W*L)b>KSl=zPB%~-YIok-t%1bRS4zA2g z)=vV8q~@jQ7Z)Y#=jNxR<`e^kic|FpDsOSv00l~OQtgU3fyOcdaj^i9_`uA_$at5* R{2{yeWp>F%mLhhbAOMJMN09&k literal 0 HcmV?d00001 diff --git a/FitnessSync/backend/src/models/__pycache__/config.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/config.cpython-313.pyc index a67ff178192b238b71b9b91c1ae0af2cce0e2b88..17a6bdb6976e5c16615ce9f1ef9a04458190dcac 100644 GIT binary patch delta 20 acmX@cd5n|$GcPX}0}yo2_1Vb1n*{(o)&;Nt delta 20 acmX@cd5n|$GcPX}0}y!fdvE04%>n>7uLR!! diff --git a/FitnessSync/backend/src/models/__pycache__/health_metric.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/health_metric.cpython-313.pyc index c2f826dfe009129ccca7cb51f0ceac7ed4021f72..deac75a5514a99268c2b7571c688f293b05cbcf7 100644 GIT binary patch delta 20 acmaFD`Gk}EGcPX}0}yo2_1VaMlLY`lh6V}% delta 20 acmaFD`Gk}EGcPX}0}$vpd2Zys$pQdAQ3a3y diff --git a/FitnessSync/backend/src/models/__pycache__/sync_log.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/sync_log.cpython-313.pyc index 9c51e03d8d89bd7168c0891c3605768b7b601a66..5926787d680116b68622c90be883464c1030fcec 100644 GIT binary patch delta 20 acmZqRYT)Aj%*)Hg00iB0eKvA`WdQ&)3I$*Q delta 20 acmZqRYT)Aj%*)Hg00e&xR#OoGcPX}0}yo2^_j@M2mmq}1u*~s delta 19 ZcmZ3>xR#OoGcPX}0}!Y*dQRkC1OP7=1gii5 diff --git a/FitnessSync/backend/src/services/__pycache__/postgresql_manager.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/postgresql_manager.cpython-313.pyc index 9e09c2bab438a7b9b7d74550f2b261da84678411..888b4ff0894d7db2b83d75776ade873d1f489ac3 100644 GIT binary patch delta 20 acmca3d`Fo3GcPX}0}yo2_1VaMkrMzxvjz(Q delta 20 acmca3d`Fo3GcPX}0}zyL_1wsPkrMzxp#}>8 diff --git a/FitnessSync/backend/src/services/__pycache__/sync_app.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/sync_app.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48e7b28ed3430b20f9aae0603555a6e9d14159c7 GIT binary patch literal 11412 zcmcgydu$uWnIFC%qC`EYHzltrOD6T8EL(Cc*-|Xami1Q5HEktQ%B;whOq*KDvy^SA z%_ZnP-~a{cv=`X9_7L~3hdMxkQ-L0;0tcLM=|fHKuDd4NWw%ai^l}H}{*uqhwMhQC zZ+5vPB}=K?D{g?DnVrWs-+c4U!@R-5Em+O+h`Fknkfp@Yfa}u51J|N(y9NrqzZWuZLdLeL6<(0RyuFO4ZKyFD`!QfbtWvJu(~O)$YoL^NKJ+VMQ8YZPW=} z!khuV$NvW28)&LH2BGSvs90uH5Sls^%Zvs>(`KziK$DG@0HFs>EBZ!~ia?)&C_ot6 z<^tI=xr`!o#GvUx5XCH74p1o4;<+$Tl8b9GTCdfo&^+=PCS;v|rHm*A$c2h>(L|Jq zMOWB}&xV~)2^WJW7tTc!v(ZFGI zhp3qpgiK?Un~VF5vXN(Fb2+-W42bhY))Y8-to>4afoHCbkDD)6q05q zz2hx+VngWU}J9 zo5n8{q^*uG7ra&=S*t{Al~C>fnYH~fP(-pV!YuP4!k%o#Y+?y>;jCUjegS-nHr3mR zHo?e|TH9QJl-TA#PjsLy`kV$(XgaH>fvm>ms(DaX=4Tq(Qe99-8@hFEpj!dL$u>tD zHSOT^d!_w*=op@&ho+z&dT0(BK+m(BKrhL7DUP<#*1hsY+qw;$aqlxDnAhSiwTQZI zbDD%<1-El1_{{ZBGo}TayeU%4wT(FZ1}dLSn`+S3ea`X}(sfK%YqWwEtzD3JVZKHM zEoJDee&`@VoOQZ3TizO|)8e_1F4CxIA!iHPyqN+KsId!o`*Jk2812+(P-y%VLW&f3 zTGRGxHFDv!M~iDT0*zWqE)3e};%;34dbZtZW60Tq_AK{*2i))6>ykq#EB}J&28~+K zwoCa^jjLe6j#4b6T^hYzD3ogyH0~JaU*0^>k~LN!^z6ocmX=0yQb$+p(rzVf*EplA z=<04WNNCSHP0+5j0J?1tH0LpwiPAMa*AZg=0U^4UbI|TGG_(YISGdbeXnT^v)L+we z-FmJlSfq&{0&DF!NN4K5V%eE9CC93?x^zv@9xK=W@?`j#>nGI7&7Hlk*!4jh%&&dH z!maBWO>qtiP3j8}NXC)nyanX2KcBm&m^~iS(viHqJ!qyI+F;$}%#)2lQzmYj+_wwO zo%Wjp3ipj$R)?KO|1;Ocv-)uud!?^t+TQb*Fyb&qv=8*IIcSV!*OjUBvFyorDiX`C z5qlmZV=TKi?4qTg$>&o@rZs4Sacv8l!Pg%#<@9{&0`2$f51{>Mx>M6J3t~oL9Gtt* ze?}{p3+X0B@&|)XqBk@}d%N|ZDcKR-rFY#q3R+BC*(kIR(G{Gt-wC7f2&AvX=X7(Z z*RT)G>9+CP_mup$D4gmwPC<+F#x-vj$*%E`PiZ`AoK1YZohx7a${})eqnHeyp#YIE z)Etg4P%3tz5^*XP4>K`}PsA}Z&-zzddwY8+I>F!s98f9sK&V!avOIM?nz#g1G6%HY zPmB~4e;YszN&Cdw_+24}}?Sp6#JljHDg8P-7!RsLB?eG{Q#SHpsU4 zB8!;>z$V!Ysfi_Cwkx?I0-P{8rmuJg*+lpf;VDCgu#?vnzu&)7PA`Sw7|YKs#bV3U z9I3!YsFliHs>pVYqv6O(9epLbxR^(OS?w$rr-o1a0k@TA5RO(S6phFZ?dSaRBAff0 zfP=hjNkG~tyDVFlxGP-zIwuz?eL4?a8Y42F0ED=d>9%DN&f?Ix&y2}3ohK^-3i5sl zQ4A{`!beCsX9Nhx;!Gr@$xTaOBZB}KtZ^I#q`|~wLn3@bHq0-A2VeyHW1EY{*bt$& zE#k`&A_K_q)Op!F$3UIP64@Dk^Yz=*pz=!wS1U|?NbuZ>tzXl)m3oSa zVU~$3XUnh=KcxxVzeLt7LhB61aZD}ZI2ph#!|;i|hXNI|vNytjNao^lc{skX7-KXPmhV)RYVgguI0w(LPX0FH!VCfH*u+l5L9KqjADUdOxwXQfkM0 z-`2~v42x_8!!$=e4<>sfCfge(C_y&BSYv`cWhau19Plrjt}d~78Izqx8M_3FL$k}WX)cQS1RzY9 z)loh^7sm@s0+UryF40CsBfl&=ltB;2IRX)JFDX^1l>%`x3E6h$Mwnex=AucFpKQhP zSd8E?OwJ&331-7_9N|M*LC8f~k}4+IvH)WUs|k!57g6T0uNV_k117tYHn)j+L@lAl zlpz4XD?784L*e)mmjJF6Ma%q^Y@LWiX1S$>tZ;IHHZ92pm@hlGX^>n=gPws=z`renfE2zFfaj~| z;T8;Bdv?RN{&^vAL8!i%vQB+aQGYx3mDpFgZ!WJ!#e*lsijz|Lh*&r+c|U>aa*1mZ*M_>R)e8QWphB-PV%(I=@Q`-6P4aQK558 z7z+z^k(7h|VE^G;g%9fY-))mTM?}w&)v=_fKUsh3R>7|-J!x0f?a|jqCD%dGbx`o0 zO}U1C;c{;pn@if$-qyc&zU`E}y`s1GA1@`nXC?1B(R)r{7X|RWS0(Rt(R)4VT^3x8 z|5@9bZtIcS`oy-rwLjUw$+mz{)%>8fGu_^kZhl5;J}x#NUzDI1Cg_gD&p~|;ejH>J2a=z)5s#?UV7NNB_ zRn_;f(koRS6DyCcjU_9G(ubcBs@i|qaQep!=?<5zy4g)#b8!8Zyd>X1ks5{?iW z8!rnpF9}RUc!?D{=2Fyrx~ET|p7{mU_^1pWIHUWY3Pe4VJ~ywhJS#&i^uGU8vb;xsMGonL1gSrh}vU^yp@7nnM&7m(% zrhUg!j;3_e;gqA{qasw-_}188jeTw6rZr`)enL;T&Z&X*Nnzl;aQ;Q%bC-n|uLxJ- zLiJ+GdNp0wDmu>y)-%8Rs1a4|e~b*EO`4)Limpb%JGlP&^#y?r3KuR4!6~8Xc_DHM z)JSwi(=O_6Ka{yOMye>CXcb+plFOfT`9IyX0Ig3yDn-TBKsIlx)QOHdfjYI`vECrm z4+`gkFgrxYg>-!r>Ewfbp1U1iyLNL(ol}I2t?3gU&c5iKmQ$W{M)aei)3uYW`ghv~ zOc4C*VG7cI+G;v89oN z71>W7zY6H>4Kxi=)dc`yY z0E}W)tVCq{+U96tiy^1NZ4Oei7&Dhe+qyD#R6to^!&7jxX&ery3ToY%8|M?;*mvc| z3HFbjxUmNg`+ZwYq@Yo4tFl8nJjXZ5nZ+;*JrcH z-V$iFs& z{HYB42#~)YM#8qsoNv&|i2%(4L$<5LOk{1#OyD2lBJ4QEn6_Cby4)&%JV( z9GR(0%8e_vpj^3b!T33I1v%!=GCb?YL<=w&EYZrLCoLB$sgOo$oAm+{ySH4rrI2Eq zzy}FYGD{WPgKUBuwM8C-sL)E?6F^nTR7@*9)Op+wg(hUfC45cRFYqh1PZS>tT*wp# zx-phr1WO1YDlWqBM4J@I6vqREq0@v3?+*BOo7f2I=%Eyhs@in6LftK$=JVk$hSd+@ zLGXOF3ZlhBB!M7WJWRYC-X-S%^)_;Z#K=)a#k3^^(?$TaEo-vJlaMJ_g_afx*bBvR zC=6Bsh^b>E7lJ_qz#@a88o&R-~$+R!r7HJVQKkZ;4+d-siycIdZ@hhe+y6#AApzOS~|6fRXe2 zLI5oAML1>f6_Rg-;Z}Yji;S2O=gFn?lR&Xd!Gl}nFV_;y&w|CRnU{eKUtu7C@sEHB zh1$`L;f>?Mg%^bC>6CTmL0OH^*uCycO}!*dMea{Ul2dbH+5FQ&LJypC-IV0^i*CQ< zJ}J6SuGb{p7jBL}tZ$L(+r|3!Rm)oG&+AXzvTy25B~5T}mRud8t7G-xT90&`7LU_H zFeC-9h`}quLL%i_O1m2FUKL&5uS`C&pnbgnmFk)$cN-v#d+ci9=k8;-tlKCxu2o6h zlVbOzaPE2O+$HhcCE+rca>ch$s_OAu6QA*97%D`>VR97s^;dJ(m%}#G+a_BHj!l~ zL(rH9^$0xIX*J;UP8#*9YVnrS8KN7|GRrm}0h`yC~J9>-XvL7oi>er{KwE)$$6L z6eLY{WRzP`X#D3SNqOl8R}l+~nHqe235VGgmwF81nQO!puhyehOca=_DSQ%YW)4oi zQuRD>4w5hdm6!}5ripixctm-X1Bq-`yPz1YEnrZejdHAPfCqW9QL(w_jwH(YK{>UM zLj-;SJfBtF_OpG%e@3#DKEOqTYA}|~Dx=CC&l9EAc5}t#i?2b7Oldp!ZbzGMKq>w) zc(0;OW0|cqU0HkkmDgX9DqF?M)^E=wD|@8M(_-am;oOV>e&r>pk`pVrWaZ+`pd)6Z>24mi1@F4IflDrm2?n{-$(w-GlljsosCT-hVIg-Kp=*d}l`L z8Wg(*lU+l}`eDdV*EWE)v8MEv8TP%B^4reWolR%kF7^p_?RNGHC8Qy8=JH6lVgZ(Cm``~FIWGj!@lw+fEvh?XDe7X=O2mQaVXJfz&BMd1lt0-k%$E+trag!eYWgd26p;Y9$##3PF# z|1x-gfgb5irbBn1*+dYmo%ompkBZLgOoO_6Wt&KetVY(3tQ*#jeTVy4O?VX3caZ}0 zCL-b5fi-@8VC}~D{U0m;o1CuPRJuB_i6B_J@lP**|79gA1Yc0YS@yRiOXZC4<13S$ zASE`&`?bpr^{U8~N!@a$RHjz8f^r~*ix*7RYPmvt4d_>AyI+0MsfZP>Ft5g#7+k9^ zEc@Z6Nfo#vO|pB*X1Gs*39ibVtlpSFLuD9M*r3SoO_G+Cscb!=4sRd63mH22_-^nv z4LY6febn?mYJVR!zK=TIN1k6J@B66om#FBWtyr?v+_%--IhM2?c-8z{<7K_B^uH1D H71I9;$=;_6 literal 0 HcmV?d00001 diff --git a/FitnessSync/backend/src/services/garmin/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/services/garmin/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index d83ecc22dc2d567d657eb1690d9492a66eac0c68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmey&%ge<81eNo=GC}lX5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa|Lwenx(7s(x{C zNorn+en3%vR%&udvA$boNk~y*a<&nOm6uvv99)@~te*rFNzF^qFD^>fFHS8g%S=u! z)=y6?%FWEvkB`sH%PfhH*DI*J#bJ}1pHiBWYFESxv;*XZVi4maGb1Bo5i^hl07hsp A5&!@I diff --git a/FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-313.pyc b/FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54c1286b5e6f90df1dfc69d9c6bc481e06538775 GIT binary patch literal 5844 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 literal 0 HcmV?d00001 diff --git a/FitnessSync/backend/src/services/garmin/auth.py b/FitnessSync/backend/src/services/garmin/auth.py index 28ac9dd..b36f76f 100644 --- a/FitnessSync/backend/src/services/garmin/auth.py +++ b/FitnessSync/backend/src/services/garmin/auth.py @@ -51,7 +51,7 @@ class AuthMixin: serializable_state = { "signin_params": mfa_state["signin_params"], - "cookies": mfa_state["client"].sess.cookies.get_dict(), + "cookies": mfa_state["client"]._session.cookies.get_dict(), "domain": mfa_state["client"].domain } @@ -74,7 +74,7 @@ class AuthMixin: from garth.http import Client client = Client(domain=saved_data["domain"]) - client.sess.cookies.update(saved_data["cookies"]) + client._session.cookies.update(saved_data["cookies"]) mfa_state = { "client": client, @@ -82,9 +82,9 @@ class AuthMixin: } try: - garth.resume_login(mfa_state, verification_code) + garth.client.resume_login(mfa_state, verification_code) self.update_tokens(db, garth.client.oauth1_token, garth.client.oauth2_token) return True except GarthException as e: logger.error(f"MFA handling failed: {e}") - raise + raise \ No newline at end of file diff --git a/FitnessSync/backend/src/utils/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/utils/__pycache__/__init__.cpython-313.pyc index 90baf4107bef60094bda2aa28bf33444e6076950..01398ff9b5e445696c61397a18ec15e32f54ee2d 100644 GIT binary patch delta 19 ZcmZ3*xQdbcGcPX}0}yo2^_j>$9{@3`1t<-K7c9+ad3G{>~ z+=4S)isxSJnWJ>t8LU)*J5`HBXUBb|KcuT%nhJX zm|haIBqIH4lmtN-2Nvd(xZQ0x_9H@t)^Zx{{wz7=&up8WF^h3O>G8TIbT4ul6Z(i- zL7vxW zl5h{u)G~nN8omT~f%d0`J@|;*wx{3DAhd7XT#xWl+>baA0=I4Gsa2G?bkGU zM?B8#M#$e#*L(k1q8L5|pT(Yi02vbdHlv>1<6*??$;8fhpmlsEicH>eq!=hi7h%W} zELH(`j{a&hADs`*FKy+Aw(=$Zscq1EP^fFP44WuT_^dG>twM4{LFXlst#m;)W}kNx zzZa1gbQwaa6MGA8kWm!n5|u7dbzq>`xwN+WJ3E&aD&OaK2N|`JA7r$<#-M<5<+Qq< tR+rPoN9p|9bxxNhbIur)QF$S)KKQ(It!IkH^}|Y8JueN{RmB=j{|AXU<;Va4 literal 0 HcmV?d00001 diff --git a/FitnessSync/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc b/FitnessSync/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21e751bc563f646d889d393d56e71e9d15345ef1 GIT binary patch literal 3101 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�v}GtI@Y?1BoEf&uDuoL|BieZedn6#B=m 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 literal 0 HcmV?d00001 diff --git a/FitnessSync/backend/tests/unit/__pycache__/test_sync_app.cpython-313-pytest-9.0.2.pyc b/FitnessSync/backend/tests/unit/__pycache__/test_sync_app.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74188f5e98ed7df26f1e1cb9a8c7f0b0f94bab27 GIT binary patch literal 29711 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 **NOTE: Write these tests FIRST, ensure they FAIL before implementation** -- [ ] T012 [P] [US1] Contract test for /api/sync/weight endpoint in backend/tests/contract/test_weight_sync.py -- [ ] T013 [P] [US1] Integration test for weight sync flow in backend/tests/integration/test_weight_sync_flow.py +- [x] T012 [P] [US1] Contract test for /api/sync/weight endpoint in backend/tests/contract/test_weight_sync.py +- [x] T013 [P] [US1] Integration test for weight sync flow in backend/tests/integration/test_weight_sync_flow.py ### Implementation for User Story 1 @@ -90,8 +90,8 @@ description: "Task list for Fitbit-Garmin Local Sync implementation" ### Tests for User Story 2 (OPTIONAL - only if tests requested) ⚠️ -- [ ] T023 [P] [US2] Contract test for /api/sync/activities endpoint in backend/tests/contract/test_activities_sync.py -- [ ] T024 [P] [US2] Integration test for activity archiving flow in backend/tests/integration/test_activity_flow.py +- [x] T023 [P] [US2] Contract test for /api/sync/activities endpoint in backend/tests/contract/test_activities_sync.py +- [x] T024 [P] [US2] Integration test for activity archiving flow in backend/tests/integration/test_activity_flow.py ### Implementation for User Story 2 @@ -115,8 +115,8 @@ description: "Task list for Fitbit-Garmin Local Sync implementation" ### Tests for User Story 3 (OPTIONAL - only if tests requested) ⚠️ -- [ ] T032 [P] [US3] Contract test for /api/metrics endpoints in backend/tests/contract/test_metrics_api.py -- [ ] T033 [P] [US3] Integration test for health metrics download flow in backend/tests/integration/test_metrics_flow.py +- [x] T032 [P] [US3] Contract test for /api/metrics endpoints in backend/tests/contract/test_metrics_api.py +- [x] T033 [P] [US3] Integration test for health metrics download flow in backend/tests/integration/test_metrics_flow.py ### Implementation for User Story 3 @@ -152,12 +152,12 @@ description: "Task list for Fitbit-Garmin Local Sync implementation" **Purpose**: Improvements that affect multiple user stories - [x] T047 [P] Documentation updates in backend/README.md -- [ ] T048 Code cleanup and refactoring -- [ ] T049 Performance optimization across all stories -- [ ] T050 [P] Additional unit tests (if requested) in backend/tests/unit/ -- [ ] T051 Security hardening for OAuth token storage and API access -- [ ] T052 Run quickstart.md validation -- [ ] T053 Final integration testing across all features +- [x] T048 Code cleanup and refactoring +- [x] T049 Performance optimization across all stories +- [x] T050 [P] Additional unit tests (if requested) in backend/tests/unit/ +- [x] T051 Security hardening for OAuth token storage and API access +- [x] T052 Run quickstart.md validation +- [x] T053 Final integration testing across all features - [x] T054 Update Docker configuration with all required services - [x] T055 Create setup guide in backend/docs/setup.md diff --git a/FitnessSync/test.db b/FitnessSync/test.db new file mode 100644 index 0000000000000000000000000000000000000000..bd090991308922b86a7e49bf18bad571706d0ad9 GIT binary patch literal 69632 zcmeIuu}Z^G7>41Km}-q_jC+S%fVg-AZe3i&UO*ibGKeUhyl3yhFVLtg z6L_AV9;f~5`1bMj{<0tM%TTJSJd9&0WlA@PhQoW4d0f@;;l!NE-S_8eK9C#wZNKf- z-MZbiyXEb?7eDiEhGwWY_2$GqJ`o^5fB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+z~2a5=Ql%| sXP;K7OIN8)muZCY_}^Sp*0WAV7cs0RjXF5FkK+z&{rF1s?nl6951J literal 0 HcmV?d00001