Compare commits

...

2 Commits

Author SHA1 Message Date
8c77f3fbae Fixed incorrect grouping, in eventmessages
All checks were successful
checks-impure / test (pull_request) Successful in 25s
checks / test (pull_request) Successful in 1m14s
2024-01-24 22:08:53 +01:00
bc4761e7a2 Fixed wrong ordering of eventmessages
All checks were successful
checks-impure / test (pull_request) Successful in 26s
checks / test (pull_request) Successful in 1m14s
2024-01-24 18:41:12 +01:00
4 changed files with 63 additions and 38 deletions

View File

@@ -1,11 +1,13 @@
import json
import logging import logging
import time import time
import typing import typing
from collections import OrderedDict
from typing import Any, List, Optional from typing import Any, List, Optional
import httpx import httpx
from fastapi import APIRouter, BackgroundTasks, Depends, Query from fastapi import APIRouter, BackgroundTasks, Depends, Query
from fastapi.responses import HTMLResponse, JSONResponse from fastapi.responses import HTMLResponse, PlainTextResponse
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from clan_cli.config import ap_url, c1_url, c2_url, dlg_url, group_type_to_label from clan_cli.config import ap_url, c1_url, c2_url, dlg_url, group_type_to_label
@@ -360,19 +362,24 @@ def create_eventmessage(
@typing.no_type_check @typing.no_type_check
@router.get( @router.get(
"/api/v1/event_messages", "/api/v1/event_messages",
response_class=JSONResponse, response_class=PlainTextResponse,
tags=[Tags.eventmessages], tags=[Tags.eventmessages],
) )
def get_all_eventmessages( def get_all_eventmessages(
skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db) skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db)
) -> JSONResponse: ) -> PlainTextResponse:
# SQL sorts eventmessages by timestamp, so we don't need to sort them here
eventmessages = sql_crud.get_eventmessages(db, skip=skip, limit=limit) eventmessages = sql_crud.get_eventmessages(db, skip=skip, limit=limit)
result: dict[int, dict[int, List[Eventmessage]]] = {} cresult: List[OrderedDict[int, OrderedDict[int, List[Eventmessage]]]] = []
for msg in eventmessages: cresult_idx = 0
cresult.append(OrderedDict())
for idx, msg in enumerate(eventmessages):
# Use the group_type_to_label from config.py to get the group name and msg_type name # Use the group_type_to_label from config.py to get the group name and msg_type name
group = group_type_to_label.get(msg.group, None) group = group_type_to_label.get(msg.group, None)
group_name = group.get("name", None) if group is not None else str(msg.group) group_name = (
str(group.get("name", None)) if group is not None else str(msg.group)
)
msg_type_name = ( msg_type_name = (
group.get(msg.msg_type, None) if group is not None else str(msg.msg_type) group.get(msg.msg_type, None) if group is not None else str(msg.msg_type)
) )
@@ -383,14 +390,26 @@ def get_all_eventmessages(
des_name = sql_crud.get_entity_by_did(db, msg.des_did) des_name = sql_crud.get_entity_by_did(db, msg.des_did)
des_name = des_name if des_name is None else des_name.name des_name = des_name if des_name is None else des_name.name
result = cresult[cresult_idx]
if result.get("group_name") is None:
# Initialize the result array and dictionary # Initialize the result array and dictionary
if result.get(group_name) is None: result["group_name"] = group_name
result[group_name] = {} elif result["group_name"] != group_name:
if result[group_name].get(msg.group_id) is None: # If the group name changed, create a new result array and dictionary
result[group_name][msg.group_id] = [] cresult_idx += 1
cresult.append(OrderedDict())
result = cresult[cresult_idx]
result["group_name"] = group_name
if result.get("groups") is None:
result["groups"] = OrderedDict()
if result["groups"].get(msg.group_id) is None:
result["groups"][msg.group_id] = []
# Append the eventmessage to the result array # Append the eventmessage to the result array
result_arr = result[group_name][msg.group_id] result_arr = result["groups"][msg.group_id]
result_arr.append( result_arr.append(
Eventmessage( Eventmessage(
id=msg.id, id=msg.id,
@@ -408,9 +427,7 @@ def get_all_eventmessages(
).dict() ).dict()
) )
# sort by timestamp return PlainTextResponse(content=json.dumps(cresult, indent=4), status_code=200)
result_arr.sort(key=lambda x: x["timestamp"])
return JSONResponse(content=result, status_code=200)
############################## ##############################

View File

@@ -1,7 +1,7 @@
# Imports # Imports
from typing import List, Optional from typing import List, Optional
from sqlalchemy import func from sqlalchemy import asc, func
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy.sql.expression import true from sqlalchemy.sql.expression import true
@@ -319,4 +319,11 @@ def create_eventmessage(
def get_eventmessages( def get_eventmessages(
db: Session, skip: int = 0, limit: int = 100 db: Session, skip: int = 0, limit: int = 100
) -> List[sql_models.Eventmessage]: ) -> List[sql_models.Eventmessage]:
return db.query(sql_models.Eventmessage).offset(skip).limit(limit).all() # Use order_by and desc to sort by timestamp
return (
db.query(sql_models.Eventmessage)
.order_by(asc(sql_models.Eventmessage.timestamp))
.offset(skip)
.limit(limit)
.all()
)

View File

@@ -101,7 +101,7 @@ class Eventmessage(Base):
## Queryable body ## ## Queryable body ##
# Primary Key # Primary Key
id = Column(Integer, primary_key=True, autoincrement=True) id = Column(Integer, primary_key=True, autoincrement=True)
timestamp = Column(Integer, unique=True, index=True) timestamp = Column(Integer, index=True)
group = Column(Integer, index=True) group = Column(Integer, index=True)
group_id = Column(Integer, index=True) group_id = Column(Integer, index=True)
msg_type = Column(Integer, index=True) # message type for the label msg_type = Column(Integer, index=True) # message type for the label

View File

@@ -122,49 +122,50 @@ def test_create_services(api_client: ApiClient) -> None:
random.seed(77) random.seed(77)
def create_eventmessages(num: int = 2) -> list[EventmessageCreate]: def create_eventmessages(num: int = 4) -> list[EventmessageCreate]:
res = [] res = []
starttime = int(time.time()) starttime = int(time.time())
for i in range(num): for idx in range(num):
group_id = i % 5 + random.getrandbits(6) i2 = idx + 1
group_id = i2 % 5 + random.getrandbits(6) + 1
em_req_send = EventmessageCreate( em_req_send = EventmessageCreate(
timestamp=starttime + i * 10, timestamp=starttime + i2 * 10,
group=i % 5, group=i2 % 5,
group_id=group_id, group_id=group_id,
msg_type=1, msg_type=1,
src_did=f"did:sov:test:12{i}", src_did=f"did:sov:test:12{i2}",
des_did=f"did:sov:test:12{i+1}", des_did=f"did:sov:test:12{i2+1}",
msg={}, msg={},
) )
res.append(em_req_send) res.append(em_req_send)
em_req_rec = EventmessageCreate( em_req_rec = EventmessageCreate(
timestamp=starttime + (i * 10) + 2, timestamp=starttime + (i2 * 10) + 2,
group=i % 5, group=i2 % 5,
group_id=group_id, group_id=group_id,
msg_type=2, msg_type=2,
src_did=f"did:sov:test:12{i}", src_did=f"did:sov:test:12{i2}",
des_did=f"did:sov:test:12{i+1}", des_did=f"did:sov:test:12{i2+1}",
msg={}, msg={},
) )
res.append(em_req_rec) res.append(em_req_rec)
group_id = i % 5 + random.getrandbits(6) group_id = i2 % 5 + random.getrandbits(6)
em_res_send = EventmessageCreate( em_res_send = EventmessageCreate(
timestamp=starttime + i * 10 + 4, timestamp=starttime + i2 * 10 + 4,
group=i % 5, group=i2 % 5,
group_id=group_id, group_id=group_id,
msg_type=3, msg_type=3,
src_did=f"did:sov:test:12{i+1}", src_did=f"did:sov:test:12{i2+1}",
des_did=f"did:sov:test:12{i}", des_did=f"did:sov:test:12{i2}",
msg={}, msg={},
) )
res.append(em_res_send) res.append(em_res_send)
em_res_rec = EventmessageCreate( em_res_rec = EventmessageCreate(
timestamp=starttime + (i * 10) + 8, timestamp=starttime + (i2 * 10) + 8,
group=i % 5, group=i2 % 5,
group_id=group_id, group_id=group_id,
msg_type=4, msg_type=4,
src_did=f"did:sov:test:12{i+1}", src_did=f"did:sov:test:12{i2+1}",
des_did=f"did:sov:test:12{i}", des_did=f"did:sov:test:12{i2}",
msg={}, msg={},
) )
res.append(em_res_rec) res.append(em_res_rec)