From b28b0d2fac42fbcaea5b5f01d6867dac5fde2a44 Mon Sep 17 00:00:00 2001 From: Raika Furude Date: Mon, 24 Nov 2025 15:32:12 -0500 Subject: [PATCH] working check in --- .../__pycache__/database.cpython-39.pyc | Bin 17070 -> 8364 bytes vitallink/backend/database.py | 556 ++----- vitallink/logs/all_pids.txt | 8 +- vitallink/logs/backend.log | 1317 +++++++++++------ vitallink/logs/backend.pid | 2 +- vitallink/logs/dashboard.log | 2 +- vitallink/logs/dashboard.pid | 2 +- vitallink/logs/kiosk.log | 2 +- vitallink/logs/kiosk.pid | 2 +- vitallink/logs/wristbands.pid | 2 +- vitallink/vitallink.db | Bin 53248 -> 86016 bytes 11 files changed, 952 insertions(+), 941 deletions(-) diff --git a/vitallink/backend/__pycache__/database.cpython-39.pyc b/vitallink/backend/__pycache__/database.cpython-39.pyc index 51d3263c2c74478932159a8fa845a12f9c8730fb..5c85fbbbca3ff24ea1b5343ee92ae8b0e0b044e5 100644 GIT binary patch delta 3148 zcmai0TWlOx8J;t9W_EUVy}Q1|-nG4#_?k%^$EBsX7pHa;$4OR=XD0gwP_tIc836FbGd3EH8tXekn zCe!ob8HE`vbX#Gem({$*)CI*hYYXCEWI=HCxL$bAP!#dkaIg4>`YTb_hPCM{i{cMj zR=z*f#)mGlMo7mO zP;`s$htD9DxM8l!4gO{p{~xg<3FoY1;?I$8@kcBBMGRSyX&Ku2cXXWefK7oj-hqLm zKLpAlwDgYOR^NK#bGVs(3H|ZlXY)V*28+?TdPA^dMi#?hGk*e z#&QskesMMSgQGT?w^eR}!agllD-~Pysq2)N<jK%^8HZYo5S4f+$}CN`A1#p1vU3IIyA_H6>9VIAbM#1`GAfjIpIn$;loKqY zz1P)3g#mMJBKOQlu6UDk3<89L~d}IFki*r-6wg2qO7q{9^ zi1(9Jyq-yj50YW=cKb2$m-b0PvVEeGYNsepT`I$vyDpg@@7_e%5s@{vn#LxRvqa6uYr9fj414i<`Pw&?T7qVcj5}Vlv$& z?)G*)wd;jOzzgMaGn&#@kE15X0DKBMxO4CHrQz%w&o9Ce)-HiFeY2!?Htt2PmKkD0RZ1S9oe&+g9py8ykkUK|Q^0 zyp}l<56KRpo>!nlD0OpZAk$4Yr-7B9Lzn@u!!oafK+BBRD&WgL{JuZrd>F}%Anwxk z{gU{3I=n@D!eI9^V+mSD@=Dx^V`zqBKABjnrTsN@p}Pa-@8VC(rvKnj|! zIs74J!9M5=UoTe+%;l$%b-$&23f6QHJJ!|q_#w5$bA3Y-&*D~ekNYrd_?g3^`~)Om z;IxM7|5e0q`jX>)hXjuvq_nAT$)2<1y>#6PoRbot_NQWau42i`^jQ}J1M52eFlplM zK)>;N(80~YG1*YZ2PcG{?fHhi+iT}-%hyYuv*z-ns4-?rkR-bW!Y|<3{+zMRz}`9h zBqNo=(Y*N6siAKka3H2vf?sqntjg20Q5#T5!SUX#6@zJTQmTwLdBpcR-=53ISjmM{;VX_z6+3jG zcmf~D;=wZ@D49m9l;-cTS^T)G^U^6a7>@-7&D3M}Eb~DL#O~Mn4;%VGg~sVH4;F_& z0=&MAuXgcr>!X`3FytKw_y@!(!f}Mh0DP@f@wkT5vk1>2%p&Lr7z&Q(&7LHen#(^b z`~&?OJT4}%NvN8jX2{fIlkj8lxeDiw@mVxGY<(V0cl5|3h^U`LvmDv%2*-frL+*_- wWYeR3P|Qqa&+-^7a_o|l>S4S3=F@9ccC+l929GH&GEm(lCW(>`Vj6Vnf9E>RdjJ3c literal 17070 zcmc&*TWlQHd7j(OE{CfXMadE+TlUzNOs!2yldTro*}i; z-gIUtOVeeOR7MaqaFV9?Mn=d2eGpI-MUaQ0XbZFf@{m3j1&VnokfIj>EfAn>n#hLT z?>}d5yQFA436PcM@XVQW&Ya8tfB)tDQ`@n_Qt;@H{FYJK;S`*#Q`oPBsmbzp47P(6@N6gA?PMcpH-dH} z>^SP?+2|dO?Ph!4%2al-XHimM520i)+lP`-_8dxfv;8PJz#c})9z1^pZ#&2yMUM|T zd)Z^xv~Q^VyJAlJD*MFWvC5dU@9KVLv&Y|7D+indS083iuqW9ecKB_~Rop*?`|;HM z5!@G3_fO-!W9%6=@wO4Rm}E!UF*YT8SbtA0{JKL^iRdphv@FMD%$0o1M7!26s)~zhYf%c(vwS zqkYXjUGr*}Yp!F@)owZ5TKvph!*lGe!`+7KIqkY*FL$`zt$7Wn?YR^74Qh$MwKlVB ztE}PK9U?Hi8kHCE7Hr)}LM>M9r2 zAjfK+<271NQ4fqcyg4vVH|k!Ho9|M^S`&44*W6p}dcD*3oSR+?{jWH@RvA_lYjV;) z9}dvQY?_WWvrw8|D%nfZugsO~*;noI{E}UIeRgqaF`kNj#Io@VXI5=6d#UvLl6`(* z_T2QsCHvE*OB15PWy~~wO8t~C%+1M1%MI>&)po7r$hQ4Yo3(8ovd-nL+PJq`U9Zz} z#j^?9#>_soIA6AFoY!uN;keEXhc~=ivW6(CUvcW!s*QG)7SLXrJy%*>nm%`4Ogb4X zYq<3*HNN5uRFhMwuX2w4!83=;ft@bBI(=bo$sRAyFPxj68<+JOZnakT8aEvKmHGL( z(sbF5>KzX|;tsZwRcl^qBvGB23kwUS@=`S(qgDK*McXInk%*_p8toNV?xKB!CN$|{ zz91}6NUgZt#!AYp#(l{B#lFs#mr7?!3+b)3r!Oqc&z3#)y)koyX#z!1|VN^g;y_kTm5BjxASa&iRZMs)w<|VHWRB(`%dqWMe$zA+vR2r zD@R1UCE?UR*2c&#U!7kl&7LU}GuTIx^(kTyua>ZrGo^%|($Ax9UE&RJsa3@n_Yoces<< zEiAv=X@j~`oLjrx?(kNv*}ztAvvqIQ8pN3`r`l??S3Oh>Nm{=0m$I{j6Tp-93Py8; zM8wt*zx@`|`o*36LN{0Ty8Xs>nk>OPxs+|^&A}pU{|Y1x;R^OIwRs`lxb0fkz0v{P z^>Lm==3fHOE#89MZrPyL6uUJ$E8FgbD;ia!Mjvx4M6>PJI;?W5J18oJj2n-zMToLS zdwjwkkL4BJ5Y&Z~LbtW1!#!jiuYOdFHEJJ9ak-gk$d)C{@t~^=a@xxYGo+ zZ~3T;`8Zy+-dTk<7fIGgzE7nV-i!8HN~3YGLUY^(P>j2c)@qZKgz=waxe4qM z+Ns0w2P$Db*8FD6r%SI7XnqZLvl=pOxF9xEs{yqkCB`P~Sh7P+302Au={Rn&RoC&u z5AQAXR#THsm-o#$g`4QTPWpNJXW-@(E_Vuvqrmc0$m*-; zY}hfF4m-+V8CX>rX0q&CO2uS3HiW-fX2J5v2fHpthDT&~_=lsM9qROAOXGUBgr@s> zu}@8yEJxX8SOZyhnI?3lu3;q6kMeZQ;BrTh^wgeGg{g`ZLtRwvs^y}_hwvmYU`e!# zT41jl>0%-Pbp=_<_4z^r##t%et5pgOg^yDHD4f!GO|6mT0@$?JUF zyE!C^wnrURM^yij%`2Hy-?WxQAYv_PN>~wv@1=BIP1Z`Rjppy4X?9>4M|)|9(}F=t zR7CR%GIgrLA3}a$$b28lzJyEexP~3yw|ShRIV@mK6T&KjR>+>LRs*YAZFSgclk)j$ z_4;b989vEYtDs91>#oQ7PI~oTO6Y~DK@cr-T0EXb;?hMg$*G1mV&t--6pWM)VWCRX z?Bgb46Y5>vqi8LQ5?S*x^bWTWde5;uSn5gtk;NM9W2ll5WZPaRCZb?RpSkY;K*&Jy zM9h{KOAAXRQ|F_GP_5&~R3+M~2Ai-$aX(=vUWf@h_Bl-0@GwYeObzK5`4%SZ$cHci z4L;>Mz-`J45Wl!+U!0!1088)4%MU?t-Vvf=mwD;Zxf6pt^^F}@%djR`qu zh-5bf`Sc(HQ+glDm7P)Fp^8{E_~W2W{sbk5C^?J-Z21`e1i46&uM=`cKgwrt{R1v{ z0*T~%rV<%0Yl8f=ko*)PY><(-7k)F{KX{=FCV_WMI-ADbXu+T;INYC)myDMC!uiwW zf(q-p_F`!%sxD28llIH@YiD6bM|H@{gu=L&a#5EclMTU>@5Y!>C;*b?$&XMX7(M3p zVE3vRWhCy!%f5?xu5j)Ghcw-M&ocd@3o?yr9euIcsl&1N($Oti1C!}(ec(VSN^m09 zasioWEj?{r-vBdiT2CWc&z`cLVLBLAV}`6xlB%H!#!Xf{;~zLznQ-X=4RL4Ywn7Ru3eb?B~E%?n?R&>F96Jqf2P7&_-sg`&Mp5GgM9dE4=5A zZ@sCT`T_6{3l+xQjQcd|QCwncIWp1K(uN6~O=0}H#-QwN5b^`zk;X`jyd_G2ryi6O zAic)&E6N5Gmt{*Z+m4voGJ-h7J=*~kE%;*sMa39xGKymFp#M*Odz*&Ma7HjSq#Lmx zJ!xMf6zN0IST84Nygp$|7aeZkmg~n*>O#8a;MXQUC=iRx1cw8M$^X_jw2y$CKvW5y z)U)6+ZezuRp?FM?^3HWmN?>5hfk9=(zyebaB*;Yr2@D!YkP!nZ7tMqa1AWDTOZ_Sw z7(s@uwz{r_l92R{qw_%&85V>j7xW+T+@AiAsx?bTE*k;?qYkF}p#d;G_@Ccacp z_ZT_>f(ek$G#jM%ncVSKdAkp(38iDCejYao3HG!ES=RKPp5XKvED&bArSy!`%5Bna zGydT-jwda=kcO_nUMIVp%*I+o4gTNvZQEjLt~9fh7=Hr<@jwE=KK1qU>cafFLG!Y& z!nPno1TnvG8h-0nE+u1uyM1w{uamjibF)insnMtK5-$_(FXD1vM6!aVeB=2w(!UhJ zozUoz-^AA}*4joAyC+P4V5#v4T`5sBsdt}kvqushk2ZR8?XYq&AuJK=? zSTG~$}xrOOZ{nJ|$ z9Ed%VYmvbp?t3EUk{8^SQdS^#kXwdN=}N8HEM`)${4!n-J7tx-9Ud4MuRA#40}p=Z zf6)ZU7*z~FcGmofHC)gznIHR8A9wf|l;E6Py=QpFdZq{KaT!n^X+5H*v>-#R2&%e}+R&HKh8cJCO%nUDxz36J#Lzn| zIW0LT^uOOny=nALJ0%7bUt)$dbf?@D6Lz#16Qpwsb!WovdkMAfcjHFqnAOO8+gJa= zxSe2ixiXv@FCYyE=Al0J8RWn!wCaf(z$fYUlavq}3jF0qkpoUA^1r_mzCbkxSYszC z5vf=21UI@*prRx%4X`Y=f!uw7@<^f`Snv6Vw>vfiWnILP)9{DKRQIG24zpDFuMF;JbndBDDe2ihv6~*gmC%@yLv-yYYl~E?qot#HU%p4Y4paa zOFl!%X(Yu=Fq|6K0F4Ur!e$du2AO83#$0}en)Xv1C!f;^qB3$Om^tl!gu-L*`X{!g zC_+QArrY2y|1`RT8JAH1IeK}SlKv3{BZK`-&~OB%k{WCpKea4iYEJu!|I|kt5Iim~ z(d!HFEV+#~j&I>S7Wz6rMgvHgH(}Wm^k6q7#JBtrN{Af-9eyiLqOdq5XLFDqk;25E zreunela$O;vPjA6lnhKWpC0>HQNf)E z|K2m+v+^TWVISgVKG0M{HQ&!aX?>7C$Ulqzibh~1=P@azGaH_d)Jd2}KUxXWAijso z{YxYbWi8V))|CzAwDQK0&uMEWydi2Y>uK-^P4u$D{LA#r7nSSzUbYwIl&cUiOoh;a zNRcKYi4iZmo)dy669I_u{ut{+iMhyjz}rGrgiOgtgNZ@>z}d{qw=!!vPs6_gG!O!$ItlX#LYWqCxlNj`lwMx3;4+UkIe#0veA<1d^@(ZNrZ z&ORpk1Xk>=370s2$pd7K6g1^~V_0zT2np^`X};2d8X~coh%fq)Egoa@uj7WPYsLy~ zmC7H5tkzyo){I_e9m*cX1obrjJWBPrR74n&Opi-+Q4dQjN|dWG-+JglY?FCbSu=Yk zZ6k1=?y@q1tCtONe#n26a6Y}%@~|cf4Dw$O(fnswK3kx6|E5T&K7R7JzuTTJpH6KB zc~!!~M2QfEFQjWy^vp}-s1uP$N5)~d(_!P}xZUf)SA%5S7OOvA^baMvc`|;XoZC_% zKRz`z^~;6+O2p)tS3*GC25s;+D7i?k*q%4RjC%QDDvnXhN2E*{$(f%jFLg3Rd#kYcyCJjg_1M_qL$|F~gK{ zIUE#(;^E-7!$Yft*t@PHW)nT{E8??E>#Xs3;&`hM~-D=eU`hEfsHog zpAd|<+G^Ec=wdn^OsPgamW)nvccTVJ`~yd=~P{5x@@jFeeui@>GlwnYd2P^SNPV|$SV?8 z+S+$Ry-Bx8T#;`3X7>@z_SivVzfxLytyC%lA_#U;{@d;JvO@n7RUVS}av2b8g6JXU zu!;pAEk_I$CSA!#d74{tM-zZym}o4dnTLifPAY>8$5}m#>{*6~+@VA;)-2@))R5i8 zSRt8IT}em3OB^Qrjv447R^flGLO~~8V~qa2>p%4Xz8dI;FX4TCHU%*eyA^NdPj@FsprbC?qwxB?9a^nmErnc-;vAG%ErU9cfutzJb#MsP)5%@=Ekqn6hl41b zio%y99F{oC27CRUXRc>af;=hQP}6mm2eayIhe)A-c)6Z&TP2y;Grgg83u?{q1|pL0 z&@s@6|3c|zx5GW08n(JkCpk6{M?pgEh>e}Ts91lxj~qh=d|HaUP=2`|;-J1aG7kTW z%E@uTKaV6l7!e37jD-8Do!AMyMD<=pa*y`o9w`&Wyi_<0I(6hvQiVg59HvC*wiCz& z`83^Dc82sz%z?9d2ajRsMKNB1DWybZ*bz%3uodq~NOy%g7fQ0wkLz?R6!6#RU3$}L zOC5cZ9+09AZxwWPmNYFY4v8+>o6?2503EaF=Lgor0 zuGyaUFu)ZC1jdZ9%DM)g=aAot+9TIA{%>qodo;Ws#r==jZfHk)VBzWPpF!GOt`Gd$miu_|Jw~>Dw`6rNn5_!A@>rkNCUH{sqbvYET$lb@7yaxaQ7|5i-L!l5c@Evvp7D6|nHh?S zz)?(B>PV!rNCy^SOfZD7{Dm`!FTb=(2=SwD|IT-V%=8?>Bf|S{Z$z0tzOR1PH(oe; zeA(CCH*7y+FFMyxibIBq_8jv~y!Y(FNpT#3o5k+@vnR!|L`8d+`Pswv64a-Y;*8?H zj$T&DVg7f2K7(fdu5dpi366OTC6mi>!SE!lf-LlBd@|$kJ-Fj86%9FUgpP4olR;K| zxzgx>p_`7=Em|p=wMGqum?F(AP#e^jIKHfiGr%fqEH4LHr-{Hb=!4SfjIfEzo#p`6 z1bevvzDVtkRJea7_#xS@n0w(yGSmW0q=I??FkaB|+K85e3b#kk>(&P*U7GeTEGG34 zHTMAwsSgY-_r9T-?;9VOW&zUAFKz*0Tfdn~1Pw5PiG*j_kWsZnvjd0;Jq~?BUjvNc7+UIa zskanRBEdjJ$HAEeNVG=1EJfH?%S!Lou#Nx8FK@o5yKEQD?c+fTNZ zRC~&t{4)FtNDx}KFuOE6gU>}u7x4uOEQjg2ON+CMCv5&3ROtee`|2BDC|h`KS4r^O zKm77HZE@rSCbJjBp${6+c>@*5eL(?{6HX)qc?vy>sIt$~N-9ysl&;}HGTJBPq3=|q z*@d?KZip~x0_dZlAN&L5>;avO;$KelpWcEl9?%s9y!{%D$>L-9!}n8ifRcwPAqtUk zZRBI61MN=D<6ouHw<$?vtjHCp>?V?bCQ2vWm15iq`sh(nDnsjJ)TcD$Q7!(FT&7D< zBn<(~n*Y>R(UNqQyoxx%M%#WBm_2=dmcj$YB*Qp=}B2jOa}eHeG$?QWndXyvJ4S7oQ1y$nTKGd>&tzeUeyrlWql%dB0Ow)4DyB;Wjp?T1o7JnZ^+{F;wKpVd{-0h3 z#7iijVHwYqap*m9`Y2S}9O9rwYlgv7V&(`J)$SmmozJ=`+10e3Ey1 z@r0kZq4L>9rLx%VyBa@>>VbM= zaPx;=TyfeUfBuq#j{h5#6n~spB7*(M!I5$cM=gBap0s_##~A9(@V4TneXgr zf44;9$UiKMZhUl+ZQ)C-8#M&eTydIRYAZ3s-y5P;Bnv`J@rNcSL!$EcJ%C62?Bt{{ ztNeXoC*sb=$3|YG+k_vAJ}#%DIea|gEZ0!X{{)kzw@cybYm*&+@4OJS2&-<&Z{Ovt zps`S8{1MJEd`A+hFo%WCQpw71AD)x$Dy%pl6Ys*OUx|}Ocy9tL{Di&PxXek|a}rv7 zloA2QpQRirKJu7ZkOpZ2QgD2Yasp0iqlEf|2tdAq(-N2;Uq)F_nC2_utCjPjOq`_P zS&*+We3ucshY4!$O List[Dict]: - """Get tier change history for incident review""" + """Get tier change history""" cursor = await self.conn.execute( """ SELECT change_time, old_tier, new_tier, trigger_reason, vitals_snapshot @@ -322,329 +269,52 @@ async def save_patient(self, patient_data: Dict): for row in rows ] - # ======================================================================== - # SYSTEM EVENTS (Audit Trail) - # ======================================================================== - - -async def log_event( - self, - event_type: str, - patient_id: Optional[str], - band_id: Optional[str], - details: Dict, -): - """Log system event for audit trail""" - - # Ensure details is JSON serializable - serializable_details = {} - for key, value in details.items(): - if isinstance(value, datetime): - serializable_details[key] = value.isoformat() - else: - serializable_details[key] = value - - await self.conn.execute( - """ - INSERT INTO system_events ( - event_time, event_type, patient_id, band_id, details - ) VALUES (?, ?, ?, ?, ?) - """, - ( - datetime.now().isoformat(), # Convert to string - event_type, - patient_id, - band_id, - json.dumps(serializable_details), - ), - ) - await self.conn.commit() - - async def get_events( + async def log_event( self, - event_type: Optional[str] = None, - patient_id: Optional[str] = None, - hours: int = 24, - ) -> List[Dict]: - """Get system events for analysis""" + event_type: str, + patient_id: Optional[str], + band_id: Optional[str], + details: Dict, + ): + """Log system event for audit trail""" + serializable_details = {} + for key, value in details.items(): + if isinstance(value, datetime): + serializable_details[key] = value.isoformat() + else: + serializable_details[key] = value - query = "SELECT event_time, event_type, patient_id, band_id, details FROM system_events WHERE 1=1" - params = [] - - if event_type: - query += " AND event_type = ?" - params.append(event_type) - - if patient_id: - query += " AND patient_id = ?" - params.append(patient_id) - - query += " AND event_time > datetime('now', '-' || ? || ' hours')" - params.append(hours) - - query += " ORDER BY event_time DESC LIMIT 1000" - - cursor = await self.conn.execute(query, params) - rows = await cursor.fetchall() - - return [ - { - "event_time": row[0], - "event_type": row[1], - "patient_id": row[2], - "band_id": row[3], - "details": json.loads(row[4]) if row[4] else {}, - } - for row in rows - ] - - # ======================================================================== - # ANALYTICS & REPLAY - # ======================================================================== - - async def get_session_summary( - self, start_time: datetime, end_time: datetime - ) -> Dict: - """Get summary statistics for a session (for incident review)""" - - cursor = await self.conn.execute( + await self.conn.execute( """ - SELECT - COUNT(DISTINCT patient_id) as total_patients, - COUNT(*) as total_vitals, - AVG(hr_bpm) as avg_hr, - AVG(spo2) as avg_spo2, - AVG(temp_c) as avg_temp - FROM vitals_readings - WHERE timestamp BETWEEN ? AND ? + INSERT INTO system_events ( + event_time, event_type, patient_id, band_id, details + ) VALUES (?, ?, ?, ?, ?) """, - (start_time.timestamp(), end_time.timestamp()), + ( + datetime.now().isoformat(), + event_type, + patient_id, + band_id, + json.dumps(serializable_details), + ), ) + await self.conn.commit() - row = await cursor.fetchone() - - return { - "total_patients": row[0], - "total_vitals_recorded": row[1], - "average_hr": round(row[2], 1) if row[2] else 0, - "average_spo2": round(row[3], 1) if row[3] else 0, - "average_temp": round(row[4], 2) if row[4] else 0, - } - - async def export_patient_data(self, patient_id: str) -> Dict: - """Export complete patient data for incident investigation""" - - # Get patient info - cursor = await self.conn.execute( + async def discharge_patient(self, patient_id: str): + """Mark patient as discharged""" + await self.conn.execute( """ - SELECT * FROM patients WHERE patient_id = ? + UPDATE patients + SET is_active = 0, discharge_time = ? + WHERE patient_id = ? """, - (patient_id,), + (datetime.now().isoformat(), patient_id), ) - patient_row = await cursor.fetchone() + await self.conn.commit() - if not patient_row: - return None - - # Get all vitals - vitals = await self.get_patient_vitals_history(patient_id, limit=10000) - - # Get tier changes - tier_changes = await self.get_tier_history(patient_id) - - # Get related events - events = await self.get_events(patient_id=patient_id, hours=24) - - return { - "patient_id": patient_id, - "name": f"{patient_row[2]} {patient_row[3]}", - "dob": patient_row[4], - "symptoms": json.loads(patient_row[5]) if patient_row[5] else [], - "severity": patient_row[6], - "check_in_time": patient_row[7], - "discharge_time": patient_row[8], - "total_vitals": len(vitals), - "vitals_timeline": vitals, - "tier_changes": tier_changes, - "events": events, - "export_time": datetime.now().isoformat(), - } - - -# ============================================================================ -# REPLAY SYSTEM -# ============================================================================ - - -class VitalsReplaySystem: - """Replay historical vitals data for analysis""" - - def __init__(self, db: VitalLinkDatabase): - self.db = db - - async def replay_patient_session(self, patient_id: str, speed: float = 1.0): - """ - Replay a patient's entire session - speed: 1.0 = real-time, 10.0 = 10x faster, 0.1 = slow motion - """ - - vitals = await self.db.get_patient_vitals_history(patient_id, limit=10000) - vitals.reverse() # Chronological order - - if not vitals: - print(f"No data found for patient {patient_id}") - return - - print(f"\n{'=' * 80}") - print(f"REPLAYING SESSION: {patient_id} ({len(vitals)} readings)") - print(f"Speed: {speed}x | Press Ctrl+C to stop") - print(f"{'=' * 80}\n") - - start_time = vitals[0]["timestamp"] - - for i, reading in enumerate(vitals): - # Calculate delay - if i > 0: - time_diff = reading["timestamp"] - vitals[i - 1]["timestamp"] - await asyncio.sleep(time_diff / speed) - - # Display reading - elapsed = reading["timestamp"] - start_time - tier_symbol = ( - "🔴" - if reading["tier"] == "EMERGENCY" - else "🟡" - if reading["tier"] == "ALERT" - else "🟢" - ) - - print( - f"[{elapsed:7.1f}s] {tier_symbol} Seq={reading['seq']:3d} | " - f"HR={reading['hr_bpm']:3d} SpO2={reading['spo2']:2d}% " - f"Temp={reading['temp_c']:.1f}°C | {reading['tier']}" - ) - - print(f"\n{'=' * 80}") - print(f"Replay complete: {len(vitals)} readings") - print(f"{'=' * 80}\n") - - async def analyze_critical_events(self, patient_id: str): - """Analyze critical tier changes and deterioration events""" - - tier_changes = await self.db.get_tier_history(patient_id) - - print(f"\n{'=' * 80}") - print(f"CRITICAL EVENT ANALYSIS: {patient_id}") - print(f"{'=' * 80}\n") - - for change in tier_changes: - print(f"[{change['change_time']}]") - print(f" {change['old_tier']} → {change['new_tier']}") - print(f" Reason: {change['reason']}") - print(f" Vitals: {change['vitals']}") - print() - - print(f"{'=' * 80}\n") - - -# ============================================================================ -# INTEGRATION HELPERS -# ============================================================================ - - -async def init_database(db_path: str = "vitallink.db") -> VitalLinkDatabase: - """Initialize database for use in FastAPI""" - db = VitalLinkDatabase(db_path) - await db.initialize() - return db - - -# ============================================================================ -# CLI TOOLS -# ============================================================================ - - -async def cli_export_patient(patient_id: str, output_file: str = None): - """Export patient data to JSON file""" - db = VitalLinkDatabase() - await db.initialize() - - data = await db.export_patient_data(patient_id) - - if not data: - print(f"Patient {patient_id} not found") - return - - if output_file: - with open(output_file, "w") as f: - json.dump(data, f, indent=2) - print(f"✓ Exported to {output_file}") - else: - print(json.dumps(data, indent=2)) - - await db.close() - - -async def cli_replay_session(patient_id: str, speed: float = 1.0): - """Replay a patient session""" - db = VitalLinkDatabase() - await db.initialize() - - replay = VitalsReplaySystem(db) - await replay.replay_patient_session(patient_id, speed) - - await db.close() - - -async def cli_analyze_incident(patient_id: str): - """Analyze critical events for a patient""" - db = VitalLinkDatabase() - await db.initialize() - - replay = VitalsReplaySystem(db) - await replay.analyze_critical_events(patient_id) - - # Also show vital trends - vitals = await db.get_patient_vitals_history(patient_id, limit=1000) - - if vitals: - print("VITAL SIGN TRENDS:") - print( - f" HR range: {min(v['hr_bpm'] for v in vitals)} - {max(v['hr_bpm'] for v in vitals)} bpm" + await self.log_event( + "discharge", + patient_id, + None, + {"discharge_time": datetime.now().isoformat()}, ) - print( - f" SpO2 range: {min(v['spo2'] for v in vitals)} - {max(v['spo2'] for v in vitals)}%" - ) - print( - f" Temp range: {min(v['temp_c'] for v in vitals):.1f} - {max(v['temp_c'] for v in vitals):.1f}°C" - ) - print() - - await db.close() - - -if __name__ == "__main__": - import argparse - import asyncio - - parser = argparse.ArgumentParser(description="VitalLink Database Tools") - parser.add_argument("--export", metavar="PATIENT_ID", help="Export patient data") - parser.add_argument("--replay", metavar="PATIENT_ID", help="Replay patient session") - parser.add_argument( - "--analyze", metavar="PATIENT_ID", help="Analyze critical events" - ) - parser.add_argument( - "--speed", type=float, default=1.0, help="Replay speed multiplier" - ) - parser.add_argument("--output", "-o", help="Output file for export") - - args = parser.parse_args() - - if args.export: - asyncio.run(cli_export_patient(args.export, args.output)) - elif args.replay: - asyncio.run(cli_replay_session(args.replay, args.speed)) - elif args.analyze: - asyncio.run(cli_analyze_incident(args.analyze)) - else: - parser.print_help() diff --git a/vitallink/logs/all_pids.txt b/vitallink/logs/all_pids.txt index db23dd6..99355a2 100644 --- a/vitallink/logs/all_pids.txt +++ b/vitallink/logs/all_pids.txt @@ -1,4 +1,4 @@ -68221 -68237 -68245 -68281 +70573 +70588 +70601 +70667 diff --git a/vitallink/logs/backend.log b/vitallink/logs/backend.log index ecd8214..ea456cb 100644 --- a/vitallink/logs/backend.log +++ b/vitallink/logs/backend.log @@ -1,4 +1,4 @@ -INFO: Started server process [68221] +INFO: Started server process [70573] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) @@ -10,492 +10,833 @@ API Documentation: http://localhost:8000/docs WebSocket Endpoint: ws://localhost:8000/ws Database: vitallink.db ================================================================================ -INFO: 127.0.0.1:54604 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54608 - "GET / HTTP/1.1" 200 OK -INFO: 127.0.0.1:54624 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54630 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54642 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54656 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37292 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37304 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37318 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37322 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54604 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37324 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37334 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58836 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58838 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58854 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58862 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58866 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58878 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60090 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60098 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60110 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60114 - "OPTIONS /api/checkin HTTP/1.1" 200 OK -INFO: 127.0.0.1:60114 - "POST /api/checkin HTTP/1.1" 500 Internal Server Error -ERROR: Exception in ASGI application -Traceback (most recent call last): - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi - result = await app( # type: ignore[func-returns-value] - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ - return await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 1133, in __call__ - await super().__call__(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/applications.py", line 113, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 186, in __call__ - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 164, in __call__ - await self.app(scope, receive, _send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/cors.py", line 93, in __call__ - await self.simple_response(scope, receive, send, request_headers=headers) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/cors.py", line 144, in simple_response - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/exceptions.py", line 63, in __call__ - await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 716, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 736, in app - await route.handle(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 290, in handle - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 123, in app - await wrap_app_handling_exceptions(app, request)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 109, in app - response = await f(request) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 389, in app - raw_response = await run_endpoint_function( - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 288, in run_endpoint_function - return await dependant.call(**values) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py", line 211, in check_in_patient - await db.save_patient(patient.dict()) -AttributeError: 'VitalLinkDatabase' object has no attribute 'save_patient' -INFO: 127.0.0.1:60130 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57428 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57428 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57428 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57436 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57440 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51082 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57428 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57428 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57428 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51096 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51110 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51116 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51150 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51156 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41892 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:41904 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41916 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41922 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:41930 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41938 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51432 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51438 - "OPTIONS /api/checkin HTTP/1.1" 200 OK +/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:211: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ + await db.save_patient(patient.dict()) +/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:213: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ + await broadcast_update({"type": "patient_added", "patient": patient.dict()}) +INFO: 127.0.0.1:51438 - "POST /api/checkin HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51452 - "GET /api/queue HTTP/1.1" 200 OK /home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:320: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ patient.last_vitals = data.dict() -INFO: 127.0.0.1:60142 - "POST /api/vitals HTTP/1.1" 500 Internal Server Error -ERROR: Exception in ASGI application -Traceback (most recent call last): - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi - result = await app( # type: ignore[func-returns-value] - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ - return await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 1133, in __call__ - await super().__call__(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/applications.py", line 113, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 186, in __call__ - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 164, in __call__ - await self.app(scope, receive, _send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/cors.py", line 85, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/exceptions.py", line 63, in __call__ - await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 716, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 736, in app - await route.handle(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 290, in handle - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 123, in app - await wrap_app_handling_exceptions(app, request)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 109, in app - response = await f(request) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 389, in app - raw_response = await run_endpoint_function( - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 288, in run_endpoint_function - return await dependant.call(**values) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py", line 323, in receive_vitals - await db.save_vitals(data.dict()) -AttributeError: 'VitalLinkDatabase' object has no attribute 'save_vitals' -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60152 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60156 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37100 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37104 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37118 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37130 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37146 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37154 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37158 - "OPTIONS /api/checkin HTTP/1.1" 200 OK -INFO: 127.0.0.1:37158 - "POST /api/checkin HTTP/1.1" 500 Internal Server Error -ERROR: Exception in ASGI application -Traceback (most recent call last): - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi - result = await app( # type: ignore[func-returns-value] - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ - return await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 1133, in __call__ - await super().__call__(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/applications.py", line 113, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 186, in __call__ - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 164, in __call__ - await self.app(scope, receive, _send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/cors.py", line 93, in __call__ - await self.simple_response(scope, receive, send, request_headers=headers) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/cors.py", line 144, in simple_response - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/exceptions.py", line 63, in __call__ - await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 716, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 736, in app - await route.handle(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 290, in handle - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 123, in app - await wrap_app_handling_exceptions(app, request)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 109, in app - response = await f(request) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 389, in app - raw_response = await run_endpoint_function( - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 288, in run_endpoint_function - return await dependant.call(**values) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py", line 211, in check_in_patient - await db.save_patient(patient.dict()) -AttributeError: 'VitalLinkDatabase' object has no attribute 'save_patient' -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39068 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39070 - "POST /api/vitals HTTP/1.1" 500 Internal Server Error -ERROR: Exception in ASGI application -Traceback (most recent call last): - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi - result = await app( # type: ignore[func-returns-value] - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ - return await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 1133, in __call__ - await super().__call__(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/applications.py", line 113, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 186, in __call__ - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 164, in __call__ - await self.app(scope, receive, _send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/cors.py", line 85, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/exceptions.py", line 63, in __call__ - await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 716, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 736, in app - await route.handle(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 290, in handle - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 123, in app - await wrap_app_handling_exceptions(app, request)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 109, in app - response = await f(request) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 389, in app - raw_response = await run_endpoint_function( - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 288, in run_endpoint_function - return await dependant.call(**values) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py", line 323, in receive_vitals - await db.save_vitals(data.dict()) -AttributeError: 'VitalLinkDatabase' object has no attribute 'save_vitals' -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39082 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39092 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39094 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39106 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39120 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:42204 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42212 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42218 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42224 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:42240 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42252 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49566 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49582 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49590 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49600 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49612 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49620 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51080 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51086 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51096 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51098 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51100 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51106 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50966 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50978 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50984 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50986 - "POST /api/vitals HTTP/1.1" 500 Internal Server Error -ERROR: Exception in ASGI application -Traceback (most recent call last): - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi - result = await app( # type: ignore[func-returns-value] - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ - return await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 1133, in __call__ - await super().__call__(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/applications.py", line 113, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 186, in __call__ - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 164, in __call__ - await self.app(scope, receive, _send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/cors.py", line 85, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/exceptions.py", line 63, in __call__ - await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 716, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 736, in app - await route.handle(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 290, in handle - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 123, in app - await wrap_app_handling_exceptions(app, request)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 109, in app - response = await f(request) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 389, in app - raw_response = await run_endpoint_function( - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 288, in run_endpoint_function - return await dependant.call(**values) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py", line 323, in receive_vitals - await db.save_vitals(data.dict()) -AttributeError: 'VitalLinkDatabase' object has no attribute 'save_vitals' -INFO: 127.0.0.1:50992 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51008 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51020 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39962 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39970 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39976 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39978 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39992 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39996 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58090 - "POST /api/vitals HTTP/1.1" 500 Internal Server Error -ERROR: Exception in ASGI application -Traceback (most recent call last): - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi - result = await app( # type: ignore[func-returns-value] - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ - return await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 1133, in __call__ - await super().__call__(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/applications.py", line 113, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 186, in __call__ - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 164, in __call__ - await self.app(scope, receive, _send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/cors.py", line 85, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/middleware/exceptions.py", line 63, in __call__ - await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__ - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 716, in __call__ - await self.middleware_stack(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 736, in app - await route.handle(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/routing.py", line 290, in handle - await self.app(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 123, in app - await wrap_app_handling_exceptions(app, request)(scope, receive, send) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app - raise exc - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app - await app(scope, receive, sender) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 109, in app - response = await f(request) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 389, in app - raw_response = await run_endpoint_function( - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/.venv/lib/python3.9/site-packages/fastapi/routing.py", line 288, in run_endpoint_function - return await dependant.call(**values) - File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py", line 323, in receive_vitals - await db.save_vitals(data.dict()) -AttributeError: 'VitalLinkDatabase' object has no attribute 'save_vitals' -INFO: 127.0.0.1:58100 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58110 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58124 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58134 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58140 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58142 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51668 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51684 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51690 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:37290 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51704 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51712 - "GET /api/queue HTTP/1.1" 200 OK +/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:323: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ + await db.save_vitals(data.dict()) +/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:353: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ + "vitals": data.dict(), +INFO: 127.0.0.1:51464 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51472 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51476 - "GET /api/queue HTTP/1.1" 200 OK +/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:479: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ + "patient": patient.dict(), +INFO: 127.0.0.1:51132 - "GET /api/patients/P100001/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100001/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51482 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51486 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34134 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34140 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34154 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34168 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34176 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34184 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41796 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:41808 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41812 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41814 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:41816 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41818 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38896 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38902 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:38912 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38924 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:38930 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38942 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:45940 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45944 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100001/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100001/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45960 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:45966 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45968 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45972 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:55396 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55398 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55422 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100001/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100001/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55442 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55448 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:49652 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:49662 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:49670 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:49680 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:49686 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:49698 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:49712 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43538 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43550 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43554 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43564 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43578 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43586 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60212 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60224 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60236 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60248 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60260 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60262 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35390 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:35402 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35416 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35426 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:35434 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35440 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48120 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48128 - "POST /api/checkin HTTP/1.1" 200 OK +INFO: 127.0.0.1:48140 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48148 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:48154 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48158 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100002/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100002/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48184 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48192 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:52928 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52936 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52938 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:52942 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52958 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52962 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39644 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:39646 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:39656 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39660 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39676 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:39692 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39696 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54558 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54572 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100002/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100002/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54580 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54596 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54612 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54626 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43938 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43942 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43950 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43962 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43974 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57512 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57522 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57536 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57548 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57564 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57578 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55544 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55554 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:55556 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55562 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55566 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55576 - "POST /api/checkin HTTP/1.1" 200 OK +INFO: 127.0.0.1:55586 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55588 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55600 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60676 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60678 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60690 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60706 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60718 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60728 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34396 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34412 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:34426 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34436 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34448 - "POST /api/checkin HTTP/1.1" 200 OK +INFO: 127.0.0.1:34450 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34452 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:34454 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:34458 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:34470 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34476 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:49108 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:49116 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:49130 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:49148 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:49160 - "GET /api/queue HTTP/1.1" 200 OK +⚠️ DETERIORATION DETECTED: P100004 + Concerns: Vitals crossed into CRITICAL range + ⬆️ Escalation initiated due to deterioration +INFO: 127.0.0.1:49164 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:49174 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:49178 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:49188 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:49196 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:49210 - "GET /api/queue HTTP/1.1" 200 OK +🔄 TIER CHANGE: P100004 NORMAL → EMERGENCY (confirmed after 0 readings) +INFO: 127.0.0.1:49226 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:49232 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:49242 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:49254 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:49260 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42724 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42736 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42748 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42758 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42774 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42778 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42788 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42790 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42798 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100002/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100002/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:42818 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42828 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:42830 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42836 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42846 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42848 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42864 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51180 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51194 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51200 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51210 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100003/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100003/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51228 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51236 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51246 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51256 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51262 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51272 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51274 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51282 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51286 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51294 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51306 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51310 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50214 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50218 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50220 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50226 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50232 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50234 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50238 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:50264 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50268 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50272 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50286 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50296 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50306 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50310 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50326 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50336 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50350 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50356 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50358 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32818 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32830 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:32840 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32844 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32852 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:32866 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:32872 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32880 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:32882 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32884 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32890 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:32902 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32918 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:32924 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32926 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57008 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57016 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:57032 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57034 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57056 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:57068 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:57072 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57082 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:57086 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57088 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:57092 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57104 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57114 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:57118 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:57126 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57142 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57154 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34904 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34914 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34922 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:34930 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:34932 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34944 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:34952 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34982 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34996 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:35004 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:35024 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:35038 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:35044 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35058 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35072 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:33580 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:33594 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:33606 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33612 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:33624 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:33640 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:33650 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:33666 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33676 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:33692 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:33700 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:33708 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33716 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33730 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:33734 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:33736 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:32878 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32888 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:32896 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:32898 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32902 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:32908 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:32918 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32928 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:32942 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32952 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32960 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:32962 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32976 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:32982 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:32994 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33004 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:37090 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:37098 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:37106 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100002/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100002/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:37130 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:37146 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:37150 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:37166 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:37180 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:37184 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:37194 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:37198 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:37200 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:37208 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/patients/P100004/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:37228 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:37230 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:37238 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:37246 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:37254 - "POST /api/vitals HTTP/1.1" 200 OK +🔄 TIER CHANGE: P100003 NORMAL → ALERT (confirmed after 0 readings) +INFO: 127.0.0.1:42284 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42298 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42314 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42318 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42322 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42330 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42334 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42346 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42362 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42374 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42378 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42384 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42386 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42388 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42398 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42404 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42420 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42436 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42438 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42452 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42456 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42472 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42486 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42496 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +⚠️ DETERIORATION DETECTED: P100003 + Concerns: Vitals crossed into CRITICAL range +INFO: 127.0.0.1:50194 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50202 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +🔄 TIER CHANGE: P100003 ALERT → EMERGENCY (confirmed after 0 readings) +INFO: 127.0.0.1:50218 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50230 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50240 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50252 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50266 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50274 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:51132 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50278 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50286 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50296 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50308 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50310 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50320 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50324 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50338 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50344 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50346 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50358 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50364 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50372 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50388 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50404 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50410 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50424 - "GET /api/patients/P100003/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:50424 - "GET /api/patients/P100003/vitals-history?limit=200 HTTP/1.1" 200 OK +INFO: 127.0.0.1:50426 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50426 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:50426 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50458 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50434 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50442 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43780 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43788 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43796 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43806 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43818 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50426 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50426 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:50426 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43820 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43828 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43834 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43846 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43854 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43860 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43874 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43888 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43890 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43900 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43912 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43922 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43946 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43960 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43972 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43982 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43992 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:44008 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44010 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:44026 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:44034 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60532 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60538 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60542 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60544 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60546 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60558 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60566 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43930 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60570 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60576 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60578 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60588 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60590 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60606 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60616 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60622 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60626 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60632 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60642 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60654 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60662 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60670 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60672 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60674 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60680 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60686 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60696 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50486 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50488 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50498 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50514 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50520 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50536 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50538 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50550 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50556 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50560 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50568 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50570 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50582 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50586 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50590 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50596 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50600 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50608 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50622 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50626 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:60668 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50632 - "POST /api/wristband-details HTTP/1.1" 200 OK diff --git a/vitallink/logs/backend.pid b/vitallink/logs/backend.pid index 9df02d0..4b3e20c 100644 --- a/vitallink/logs/backend.pid +++ b/vitallink/logs/backend.pid @@ -1 +1 @@ -68221 +70573 diff --git a/vitallink/logs/dashboard.log b/vitallink/logs/dashboard.log index 9d2b6ca..1a3084e 100644 --- a/vitallink/logs/dashboard.log +++ b/vitallink/logs/dashboard.log @@ -3,7 +3,7 @@ > vite - VITE v7.1.10 ready in 219 ms + VITE v7.1.10 ready in 246 ms ➜ Local: http://localhost:5173/ ➜ Network: use --host to expose diff --git a/vitallink/logs/dashboard.pid b/vitallink/logs/dashboard.pid index cc1a012..1176633 100644 --- a/vitallink/logs/dashboard.pid +++ b/vitallink/logs/dashboard.pid @@ -1 +1 @@ -68245 +70601 diff --git a/vitallink/logs/kiosk.log b/vitallink/logs/kiosk.log index a6b29a4..2564271 100644 --- a/vitallink/logs/kiosk.log +++ b/vitallink/logs/kiosk.log @@ -4,7 +4,7 @@ Port 5173 is in use, trying another one... - VITE v7.1.10 ready in 250 ms + VITE v7.1.10 ready in 228 ms ➜ Local: http://localhost:5174/ ➜ Network: use --host to expose diff --git a/vitallink/logs/kiosk.pid b/vitallink/logs/kiosk.pid index a1b288b..737a9f6 100644 --- a/vitallink/logs/kiosk.pid +++ b/vitallink/logs/kiosk.pid @@ -1 +1 @@ -68281 +70667 diff --git a/vitallink/logs/wristbands.pid b/vitallink/logs/wristbands.pid index a5bb77e..e95625d 100644 --- a/vitallink/logs/wristbands.pid +++ b/vitallink/logs/wristbands.pid @@ -1 +1 @@ -68237 +70588 diff --git a/vitallink/vitallink.db b/vitallink/vitallink.db index bd0dab8d1b44d81c24615397f2f6b46667794ae0..f93e38d1480ec72f6ff1da661154a72603f86650 100644 GIT binary patch literal 86016 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 E50NgV5C8xG delta 252 zcmZozz}m2Yd4e>nECT}r??eTAM%j%COZYjM_`WglSMz<_EU55`Z}T@fK1L2E{+A5= zU-@5d77Vz{FUQR+%@|;400c%%T+Gs(5Vj#N&=^6ki%Q8z6bBg1OQWH}$^U{k2HwCaLY-S1gBd^5;GKX&t z1OFTT>->lK*YeNcZ|2YAkK}jZ*XL*DyUn+eUyAPo-!Z;9Ko=JAZJ#5@n8C;_$geV) teF4yBgQRW(@ex4*)pDMri;5