Compare commits

...

12 Commits

Author SHA1 Message Date
ІМ-24 Владислав Коваленко
eca98c4469 fix: actually use session variable in websocket GET
All checks were successful
Component testing / Hub testing (push) Successful in 23s
Component testing / Store testing (push) Successful in 24s
Component testing / Integration smoke testing (push) Successful in 2m42s
2026-03-26 16:52:00 +00:00
ІМ-24 Владислав Коваленко
c553384ce7 fix: add session rollback in DELETE
All checks were successful
Component testing / Hub testing (push) Successful in 17s
Component testing / Store testing (push) Successful in 28s
Component testing / Integration smoke testing (push) Successful in 2m44s
2026-03-26 15:59:57 +00:00
ІМ-24 Владислав Коваленко
1bf5687505 fix: add session rollback in PUT 2026-03-26 15:56:34 +00:00
ІМ-24 Владислав Коваленко
0d9dcef994 fix: close connection after GET in websocket 2026-03-26 15:52:33 +00:00
ІМ-24 Владислав Коваленко
d073243c67 refactor: use try block for error handling and session rollback
All checks were successful
Component testing / Hub testing (push) Successful in 23s
Component testing / Store testing (push) Successful in 30s
Component testing / Integration smoke testing (push) Successful in 2m28s
2026-03-26 14:07:37 +00:00
ІМ-24 Владислав Коваленко
0d364ddf61 fix: remove visibility update from PUT endpoint 2026-03-26 14:07:37 +00:00
ІМ-24 Владислав Коваленко
05c94bda81 feat: update visibility field with websocket 2026-03-26 14:07:37 +00:00
ІМ-24 Владислав Коваленко
26230df612 feat: add schema for receiving data from websocker 2026-03-26 14:07:37 +00:00
ІМ-24 Владислав Коваленко
ae10e212cb fix: remove visible from schemas, so only store knows about it 2026-03-26 14:07:37 +00:00
ІМ-24 Владислав Коваленко
e2e68e8506 fix: add visible columnt to .sql init script 2026-03-26 14:07:37 +00:00
ІМ-24 Владислав Коваленко
1375e6e4be feat: add visibility field to database table 2026-03-26 14:07:37 +00:00
ІМ-24 Владислав Коваленко
154c5c3a78 feat: add visibility field 2026-03-26 14:07:37 +00:00
3 changed files with 43 additions and 7 deletions

View File

@@ -7,5 +7,6 @@ CREATE TABLE processed_agent_data (
z FLOAT, z FLOAT,
latitude FLOAT, latitude FLOAT,
longitude FLOAT, longitude FLOAT,
timestamp TIMESTAMP timestamp TIMESTAMP,
); visible BOOLEAN
);

View File

@@ -8,12 +8,13 @@ from sqlalchemy import (
Integer, Integer,
String, String,
Float, Float,
Boolean,
DateTime, DateTime,
) )
from sqlalchemy.sql import select from sqlalchemy.sql import select
from database import metadata, SessionLocal from database import metadata, SessionLocal
from schemas import ProcessedAgentData, ProcessedAgentDataInDB from schemas import ProcessedAgentData, ProcessedAgentDataInDB, WebSocketData
# FastAPI app setup # FastAPI app setup
app = FastAPI() app = FastAPI()
@@ -30,6 +31,7 @@ processed_agent_data = Table(
Column("latitude", Float), Column("latitude", Float),
Column("longitude", Float), Column("longitude", Float),
Column("timestamp", DateTime), Column("timestamp", DateTime),
Column("visible", Boolean),
) )
# WebSocket subscriptions # WebSocket subscriptions
@@ -46,7 +48,9 @@ async def websocket_endpoint(websocket: WebSocket, user_id: int):
try: try:
# send already available data # send already available data
r = processed_agent_data.select().order_by(processed_agent_data.c.timestamp) r = processed_agent_data.select().order_by(processed_agent_data.c.timestamp)
stored_data = SessionLocal().execute(r).fetchall() session = SessionLocal()
stored_data = session.execute(r).fetchall()
session.close()
jsonable_data = [{c.name: getattr(i, c.name) for c in processed_agent_data.columns} for i in stored_data] jsonable_data = [{c.name: getattr(i, c.name) for c in processed_agent_data.columns} for i in stored_data]
for i in jsonable_data: for i in jsonable_data:
@@ -57,7 +61,24 @@ async def websocket_endpoint(websocket: WebSocket, user_id: int):
# receive forever # receive forever
while True: while True:
await websocket.receive_text() data = await websocket.receive_text()
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: except WebSocketDisconnect:
subscriptions.remove(websocket) subscriptions.remove(websocket)
@@ -81,6 +102,7 @@ def ProcessedAgentData_to_td(data: List[ProcessedAgentData]):
"latitude": item.agent_data.gps.latitude, "latitude": item.agent_data.gps.latitude,
"longitude": item.agent_data.gps.longitude, "longitude": item.agent_data.gps.longitude,
"timestamp": item.agent_data.timestamp, "timestamp": item.agent_data.timestamp,
"visible": True,
} }
for item in data for item in data
] ]
@@ -178,8 +200,12 @@ def update_processed_agent_data(processed_agent_data_id: int, data: ProcessedAge
session.commit() session.commit()
updated_result = session.execute(query).fetchone() updated_result = session.execute(query).fetchone()
return ProcessedAgentDataInDB(**updated_result._mapping) return ProcessedAgentDataInDB(**updated_result._mapping)
except Exception as err:
session.rollback()
print(f"Database error: {err}")
raise HTTPException(status_code=500, detail="Internal Server Error")
finally: finally:
session.close() session.close()
@@ -210,7 +236,12 @@ def delete_processed_agent_data(processed_agent_data_id: int):
session.commit() session.commit()
return ProcessedAgentDataInDB(**result._mapping) return ProcessedAgentDataInDB(**result._mapping)
except Exception as err:
session.rollback()
print(f"Database error: {err}")
raise HTTPException(status_code=500, detail="Internal Server Error")
finally: finally:
session.close() session.close()

View File

@@ -49,3 +49,7 @@ class AgentData(BaseModel):
class ProcessedAgentData(BaseModel): class ProcessedAgentData(BaseModel):
road_state: str road_state: str
agent_data: AgentData agent_data: AgentData
class WebSocketData(BaseModel):
id: int