Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions aw_server/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,11 +228,19 @@ def get_events(
return events

@check_bucket_exists
def create_events(self, bucket_id: str, events: List[Event]) -> Optional[Event]:
def create_events(self, bucket_id: str, events: List[Event]) -> List[Event]:
"""Create events for a bucket. Can handle both single events and multiple ones.

Returns the inserted event when a single event was inserted, otherwise None."""
return self.db[bucket_id].insert(events)
Always returns a list of inserted events (matching aw-server-rust behavior).
For single events, the returned event includes the server-assigned ID.
For bulk inserts, events may not have IDs due to storage limitations."""
if len(events) == 1:
# Pass as single Event so Bucket.insert uses insert_one (returns Event with ID)
inserted = self.db[bucket_id].insert(events[0])
return [inserted]
else:
self.db[bucket_id].insert(events)
return events

@check_bucket_exists
def get_eventcount(
Expand Down
4 changes: 2 additions & 2 deletions aw_server/rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,8 @@ def post(self, bucket_id):
else:
raise BadRequest("Invalid POST data", "")

event = current_app.api.create_events(bucket_id, events)
return event.to_json_dict() if event else None, 200
events = current_app.api.create_events(bucket_id, events)
return [e.to_json_dict() for e in events], 200


@api.route("/0/buckets/<string:bucket_id>/events/count")
Expand Down
52 changes: 52 additions & 0 deletions tests/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,56 @@ def get_events():
assert len(r.json) == n_events


def test_insert_event_returns_list(flask_client, bucket):
"""Test that POST /events returns a list of events with IDs (matching aw-server-rust)."""
now = datetime.now()
event_data = {
"timestamp": now.isoformat(),
"duration": 0,
"data": {"label": "test"},
}

# Single event as list
r = flask_client.post(
f"/api/0/buckets/{bucket}/events",
json=[event_data],
)
assert r.status_code == 200
assert isinstance(r.json, list), f"Expected list, got {type(r.json)}"
assert len(r.json) == 1
assert r.json[0]["id"] is not None
assert r.json[0]["data"] == {"label": "test"}

# Single event as dict (legacy format)
r = flask_client.post(
f"/api/0/buckets/{bucket}/events",
json=event_data,
)
assert r.status_code == 200
assert isinstance(r.json, list), f"Expected list, got {type(r.json)}"
assert len(r.json) == 1
assert r.json[0]["id"] is not None


def test_insert_events_returns_list(flask_client, bucket):
"""Test that POST /events with multiple events returns a list."""
now = datetime.now()
events_data = [
{
"timestamp": (now - timedelta(hours=i)).isoformat(),
"duration": 0,
"data": {"label": f"test-{i}"},
}
for i in range(3)
]

r = flask_client.post(
f"/api/0/buckets/{bucket}/events",
json=events_data,
)
assert r.status_code == 200
assert isinstance(r.json, list), f"Expected list, got {type(r.json)}"
assert len(r.json) == 3


# TODO: Add benchmark for basic AFK-filtering query
Loading