From 154c5c3a7880f5b75da84be33692b6b08d971d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=9C-24=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE?= Date: Wed, 25 Mar 2026 14:00:47 +0000 Subject: [PATCH 1/8] feat: add visibility field --- store/schemas.py | 1 + 1 file changed, 1 insertion(+) diff --git a/store/schemas.py b/store/schemas.py index 3d13dee..688d502 100644 --- a/store/schemas.py +++ b/store/schemas.py @@ -12,6 +12,7 @@ class ProcessedAgentDataInDB(BaseModel): z: float latitude: float longitude: float + visible: bool timestamp: datetime -- 2.49.1 From 1375e6e4bec22b0ebc065316d2c10b9d0cb65a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=9C-24=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE?= Date: Wed, 25 Mar 2026 14:12:09 +0000 Subject: [PATCH 2/8] feat: add visibility field to database table --- store/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/store/main.py b/store/main.py index 94ea9f7..d11896c 100644 --- a/store/main.py +++ b/store/main.py @@ -8,6 +8,7 @@ from sqlalchemy import ( Integer, String, Float, + Boolean, DateTime, ) from sqlalchemy.sql import select @@ -29,6 +30,7 @@ processed_agent_data = Table( Column("z", Float), Column("latitude", Float), Column("longitude", Float), + Column("visible", Boolean), Column("timestamp", DateTime), ) @@ -80,6 +82,7 @@ def ProcessedAgentData_to_td(data: List[ProcessedAgentData]): "z": item.agent_data.accelerometer.z, "latitude": item.agent_data.gps.latitude, "longitude": item.agent_data.gps.longitude, + "visible": True, "timestamp": item.agent_data.timestamp, } for item in data -- 2.49.1 From e2e68e8506cf18a3353432316355b3a8f83bba42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=9C-24=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE?= Date: Wed, 25 Mar 2026 16:50:19 +0000 Subject: [PATCH 3/8] fix: add visible columnt to .sql init script --- store/docker/db/structure.sql | 5 +++-- store/main.py | 5 +++-- store/schemas.py | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/store/docker/db/structure.sql b/store/docker/db/structure.sql index 06b6f76..01566a3 100644 --- a/store/docker/db/structure.sql +++ b/store/docker/db/structure.sql @@ -7,5 +7,6 @@ CREATE TABLE processed_agent_data ( z FLOAT, latitude FLOAT, longitude FLOAT, - timestamp TIMESTAMP -); \ No newline at end of file + timestamp TIMESTAMP, + visible BOOLEAN +); diff --git a/store/main.py b/store/main.py index d11896c..6639e41 100644 --- a/store/main.py +++ b/store/main.py @@ -30,8 +30,8 @@ processed_agent_data = Table( Column("z", Float), Column("latitude", Float), Column("longitude", Float), - Column("visible", Boolean), Column("timestamp", DateTime), + Column("visible", Boolean), ) # WebSocket subscriptions @@ -82,8 +82,8 @@ def ProcessedAgentData_to_td(data: List[ProcessedAgentData]): "z": item.agent_data.accelerometer.z, "latitude": item.agent_data.gps.latitude, "longitude": item.agent_data.gps.longitude, - "visible": True, "timestamp": item.agent_data.timestamp, + "visible": True, } for item in data ] @@ -173,6 +173,7 @@ def update_processed_agent_data(processed_agent_data_id: int, data: ProcessedAge z=data.agent_data.accelerometer.z, latitude=data.agent_data.gps.latitude, longitude=data.agent_data.gps.longitude, + visible=data.visible, timestamp=data.agent_data.timestamp, ) ) diff --git a/store/schemas.py b/store/schemas.py index 688d502..a6a5339 100644 --- a/store/schemas.py +++ b/store/schemas.py @@ -12,8 +12,8 @@ class ProcessedAgentDataInDB(BaseModel): z: float latitude: float longitude: float - visible: bool timestamp: datetime + visible: bool # FastAPI models @@ -50,3 +50,4 @@ class AgentData(BaseModel): class ProcessedAgentData(BaseModel): road_state: str agent_data: AgentData + visible: bool -- 2.49.1 From ae10e212cb200949de6aee5e1c6b30f85dbcf9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=9C-24=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE?= Date: Wed, 25 Mar 2026 17:15:28 +0000 Subject: [PATCH 4/8] fix: remove visible from schemas, so only store knows about it --- store/schemas.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/store/schemas.py b/store/schemas.py index a6a5339..3d13dee 100644 --- a/store/schemas.py +++ b/store/schemas.py @@ -13,7 +13,6 @@ class ProcessedAgentDataInDB(BaseModel): latitude: float longitude: float timestamp: datetime - visible: bool # FastAPI models @@ -50,4 +49,3 @@ class AgentData(BaseModel): class ProcessedAgentData(BaseModel): road_state: str agent_data: AgentData - visible: bool -- 2.49.1 From 26230df61231762253bb3a2999295d03ed6883db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=9C-24=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE?= Date: Thu, 26 Mar 2026 10:57:10 +0000 Subject: [PATCH 5/8] feat: add schema for receiving data from websocker --- store/schemas.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/store/schemas.py b/store/schemas.py index 3d13dee..e224570 100644 --- a/store/schemas.py +++ b/store/schemas.py @@ -49,3 +49,7 @@ class AgentData(BaseModel): class ProcessedAgentData(BaseModel): road_state: str agent_data: AgentData + +class WebSockerData(BaseModel): + id: int + -- 2.49.1 From 05c94bda81f195d53acd683b053cc087edd0d740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=9C-24=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE?= Date: Thu, 26 Mar 2026 13:16:13 +0000 Subject: [PATCH 6/8] feat: update visibility field with websocket --- store/main.py | 17 +++++++++++++++-- store/schemas.py | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/store/main.py b/store/main.py index 6639e41..5069286 100644 --- a/store/main.py +++ b/store/main.py @@ -14,7 +14,7 @@ from sqlalchemy import ( from sqlalchemy.sql import select from database import metadata, SessionLocal -from schemas import ProcessedAgentData, ProcessedAgentDataInDB +from schemas import ProcessedAgentData, ProcessedAgentDataInDB, WebSocketData # FastAPI app setup app = FastAPI() @@ -59,7 +59,20 @@ async def websocket_endpoint(websocket: WebSocket, user_id: int): # receive forever while True: - await websocket.receive_text() + data = await websocket.receive_text() + if (data): + ws_data = WebSocketData.model_validate(json.loads(data)) + session = SessionLocal() + update_query = ( + processed_agent_data.update() + .where(processed_agent_data.c.id == ws_data.id) + .values(visible=False) + ).returning(processed_agent_data) + res = session.execute(update_query).fetchone() + if (not res): + print("Websocket update fail") + session.commit() + session.close() except WebSocketDisconnect: subscriptions.remove(websocket) diff --git a/store/schemas.py b/store/schemas.py index e224570..1771d18 100644 --- a/store/schemas.py +++ b/store/schemas.py @@ -50,6 +50,6 @@ class ProcessedAgentData(BaseModel): road_state: str agent_data: AgentData -class WebSockerData(BaseModel): +class WebSocketData(BaseModel): id: int -- 2.49.1 From 0d364ddf6100eaa185be5bc6ee12fb5faf0fd60b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=9C-24=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE?= Date: Thu, 26 Mar 2026 13:21:37 +0000 Subject: [PATCH 7/8] fix: remove visibility update from PUT endpoint --- store/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/store/main.py b/store/main.py index 5069286..5d18620 100644 --- a/store/main.py +++ b/store/main.py @@ -186,7 +186,6 @@ def update_processed_agent_data(processed_agent_data_id: int, data: ProcessedAge z=data.agent_data.accelerometer.z, latitude=data.agent_data.gps.latitude, longitude=data.agent_data.gps.longitude, - visible=data.visible, timestamp=data.agent_data.timestamp, ) ) -- 2.49.1 From d073243c673c0c3aec3bf7af06b4021aeb489270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=86=D0=9C-24=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE?= Date: Thu, 26 Mar 2026 13:38:04 +0000 Subject: [PATCH 8/8] refactor: use try block for error handling and session rollback --- store/main.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/store/main.py b/store/main.py index 5d18620..8ebef39 100644 --- a/store/main.py +++ b/store/main.py @@ -60,19 +60,23 @@ async def websocket_endpoint(websocket: WebSocket, user_id: int): # receive forever while True: data = await websocket.receive_text() - if (data): - ws_data = WebSocketData.model_validate(json.loads(data)) - session = SessionLocal() - update_query = ( - processed_agent_data.update() - .where(processed_agent_data.c.id == ws_data.id) - .values(visible=False) - ).returning(processed_agent_data) - res = session.execute(update_query).fetchone() - if (not res): - print("Websocket update fail") - session.commit() - session.close() + try: + if (data): + ws_data = WebSocketData.model_validate(json.loads(data)) + session = SessionLocal() + update_query = ( + processed_agent_data.update() + .where(processed_agent_data.c.id == ws_data.id) + .values(visible=False) + ).returning(processed_agent_data) + res = session.execute(update_query).fetchone() + if (not res): + session.rollback() + raise Exception("Error while websocket PUT") + session.commit() + finally: + session.close() + except WebSocketDisconnect: subscriptions.remove(websocket) -- 2.49.1