diff --git a/server/api_server/api_server_start.py b/server/api_server/api_server_start.py index 17c68a1b..4937876b 100755 --- a/server/api_server/api_server_start.py +++ b/server/api_server/api_server_start.py @@ -73,6 +73,7 @@ from .openapi.schemas import ( # noqa: E402 [flake8 lint suppression] DeviceInfo, BaseResponse, DeviceTotalsResponse, DeviceTotalsNamedResponse, + EventsTotalsNamedResponse, DeleteDevicesRequest, DeviceImportRequest, DeviceImportResponse, UpdateDeviceColumnRequest, LockDeviceFieldRequest, UnlockDeviceFieldsRequest, @@ -1527,6 +1528,37 @@ def api_get_events_totals(payload=None): return jsonify(totals) +@app.route("/sessions/totals/named", methods=["GET"]) +@validate_request( + operation_id="get_events_totals_named", + summary="Get Named Event Totals", + description="Retrieve event/session totals with named fields for a specified period.", + query_params=[{ + "name": "period", + "description": "Time period (e.g., '7 days')", + "required": False, + "schema": {"type": "string", "default": "7 days"} + }], + response_model=EventsTotalsNamedResponse, + tags=["events"], + auth_callable=is_authorized +) +def api_get_events_totals_named(payload=None): + period = request.args.get("period", "7 days") + event_handler = EventInstance() + totals = event_handler.getEventsTotals(period) + # totals order: [all_events, sessions, missing, voided, new, down] + totals_dict = { + "total": totals[0] if len(totals) > 0 else 0, + "sessions": totals[1] if len(totals) > 1 else 0, + "missing": totals[2] if len(totals) > 2 else 0, + "voided": totals[3] if len(totals) > 3 else 0, + "new": totals[4] if len(totals) > 4 else 0, + "down": totals[5] if len(totals) > 5 else 0 + } + return jsonify({"success": True, "totals": totals_dict}) + + @app.route('/events/recent', methods=['GET', 'POST']) @validate_request( operation_id="get_recent_events", diff --git a/server/api_server/openapi/schemas.py b/server/api_server/openapi/schemas.py index b711e8ea..fc98ceec 100644 --- a/server/api_server/openapi/schemas.py +++ b/server/api_server/openapi/schemas.py @@ -318,6 +318,24 @@ class DeviceTotalsNamedResponse(BaseResponse): ) +class EventsTotalsNamedResponse(BaseResponse): + """Response with named event/session statistics.""" + totals: Dict[str, int] = Field( + ..., + description="Dictionary of counts: total, sessions, missing, voided, new, down", + json_schema_extra={ + "examples": [{ + "total": 100, + "sessions": 50, + "missing": 0, + "voided": 0, + "new": 5, + "down": 2 + }] + } + ) + + class DeviceExportRequest(BaseModel): """Request for exporting devices.""" format: Literal["csv", "json"] = Field(