From c3c2dbcfa8cd63ee024c16009a622132ff7c26ac Mon Sep 17 00:00:00 2001 From: HardMax71 Date: Sun, 8 Feb 2026 12:57:41 +0100 Subject: [PATCH 1/6] fix: action_url is str, removed nullability and fixed tests/callers --- backend/app/db/docs/notification.py | 2 +- backend/app/domain/notification/models.py | 4 ++-- backend/app/schemas_pydantic/notification.py | 6 ++--- backend/app/services/notification_service.py | 12 ++++++---- .../notifications/test_notification_sse.py | 1 + .../test_notification_service.py | 22 +++++++++++++++++-- 6 files changed, 35 insertions(+), 12 deletions(-) diff --git a/backend/app/db/docs/notification.py b/backend/app/db/docs/notification.py index 5bc714af..ee70ff6d 100644 --- a/backend/app/db/docs/notification.py +++ b/backend/app/db/docs/notification.py @@ -28,7 +28,7 @@ class NotificationDocument(Document): # Content subject: str body: str - action_url: str | None = None + action_url: str = "" tags: list[str] = Field(default_factory=list) # Tracking diff --git a/backend/app/domain/notification/models.py b/backend/app/domain/notification/models.py index 45123ab9..9b50326d 100644 --- a/backend/app/domain/notification/models.py +++ b/backend/app/domain/notification/models.py @@ -24,7 +24,7 @@ class DomainNotification(BaseModel): subject: str = "" body: str = "" - action_url: str | None = None + action_url: str = "" tags: list[str] = Field(default_factory=list) created_at: datetime = Field(default_factory=lambda: datetime.now(UTC)) @@ -85,7 +85,7 @@ class DomainNotificationCreate(BaseModel): subject: str body: str severity: NotificationSeverity = NotificationSeverity.MEDIUM - action_url: str | None = None + action_url: str tags: list[str] = Field(default_factory=list) scheduled_for: datetime | None = None webhook_url: str | None = None diff --git a/backend/app/schemas_pydantic/notification.py b/backend/app/schemas_pydantic/notification.py index 222b1721..949e87b0 100644 --- a/backend/app/schemas_pydantic/notification.py +++ b/backend/app/schemas_pydantic/notification.py @@ -25,7 +25,7 @@ class Notification(BaseModel): # Content subject: str body: str - action_url: str | None = None + action_url: str = "" tags: list[str] = Field(default_factory=list) # Tracking @@ -152,9 +152,9 @@ class NotificationResponse(BaseModel): status: NotificationStatus subject: str body: str - action_url: str | None + action_url: str created_at: datetime - read_at: datetime | None + read_at: datetime | None = None severity: NotificationSeverity tags: list[str] diff --git a/backend/app/services/notification_service.py b/backend/app/services/notification_service.py index b431dd01..06fbeccf 100644 --- a/backend/app/services/notification_service.py +++ b/backend/app/services/notification_service.py @@ -128,10 +128,10 @@ async def create_notification( subject: str, body: str, tags: list[str], + action_url: str, severity: NotificationSeverity = NotificationSeverity.MEDIUM, channel: NotificationChannel = NotificationChannel.IN_APP, scheduled_for: datetime | None = None, - action_url: str | None = None, metadata: NotificationContext | None = None, ) -> DomainNotification: if not tags: @@ -304,8 +304,9 @@ async def _create_system_for_user( user_id=user_id, subject=title, body=str(base_context.get("message", "Alert")), - severity=cfg.severity, tags=tags, + action_url="/api/v1/notifications", + severity=cfg.severity, channel=NotificationChannel.IN_APP, metadata=base_context, ) @@ -407,7 +408,7 @@ async def _send_slack(self, notification: DomainNotification, subscription: Doma "Sending Slack notification", extra={ "notification_id": str(notification.notification_id), - "has_action": notification.action_url is not None, + "has_action": bool(notification.action_url), "priority_color": self._get_slack_color(notification.severity), }, ) @@ -450,6 +451,7 @@ async def handle_execution_timeout(self, event: ExecutionTimeoutEvent) -> None: body=body, severity=NotificationSeverity.HIGH, tags=["execution", "timeout", ENTITY_EXECUTION_TAG, f"exec:{event.execution_id}"], + action_url=f"/api/v1/executions/{event.execution_id}/result", metadata=event.model_dump( exclude={"metadata", "event_type", "event_version", "timestamp", "aggregate_id", "topic"} ), @@ -471,6 +473,7 @@ async def handle_execution_completed(self, event: ExecutionCompletedEvent) -> No body=body, severity=NotificationSeverity.MEDIUM, tags=["execution", "completed", ENTITY_EXECUTION_TAG, f"exec:{event.execution_id}"], + action_url=f"/api/v1/executions/{event.execution_id}/result", metadata=event.model_dump( exclude={"metadata", "event_type", "event_version", "timestamp", "aggregate_id", "topic"} ), @@ -500,6 +503,7 @@ async def handle_execution_failed(self, event: ExecutionFailedEvent) -> None: body=body, severity=NotificationSeverity.HIGH, tags=["execution", "failed", ENTITY_EXECUTION_TAG, f"exec:{event.execution_id}"], + action_url=f"/api/v1/executions/{event.execution_id}/result", metadata=event_data, ) @@ -610,7 +614,7 @@ async def _publish_notification_sse(self, notification: DomainNotification) -> N tags=list(notification.tags or []), subject=notification.subject, body=notification.body, - action_url=notification.action_url or "", + action_url=notification.action_url, created_at=notification.created_at, ) await self.sse_bus.publish_notification(notification.user_id, message) diff --git a/backend/tests/e2e/notifications/test_notification_sse.py b/backend/tests/e2e/notifications/test_notification_sse.py index 9e922be8..e3007a6d 100644 --- a/backend/tests/e2e/notifications/test_notification_sse.py +++ b/backend/tests/e2e/notifications/test_notification_sse.py @@ -30,6 +30,7 @@ async def test_in_app_notification_published_to_sse(scope: AsyncContainer) -> No subject="Hello", body="World", tags=["test"], + action_url="/api/v1/notifications", severity=NotificationSeverity.MEDIUM, channel=NotificationChannel.IN_APP, ) diff --git a/backend/tests/e2e/services/notifications/test_notification_service.py b/backend/tests/e2e/services/notifications/test_notification_service.py index c7bb0da3..9e7a7c8c 100644 --- a/backend/tests/e2e/services/notifications/test_notification_service.py +++ b/backend/tests/e2e/services/notifications/test_notification_service.py @@ -17,6 +17,9 @@ pytestmark = [pytest.mark.e2e, pytest.mark.mongodb] +_TEST_ACTION_URL = "/api/v1/notifications" + + def _unique_user_id() -> str: return f"notif_user_{uuid.uuid4().hex[:8]}" @@ -35,6 +38,7 @@ async def test_create_notification_basic(self, scope: AsyncContainer) -> None: subject="Test Subject", body="Test body content", tags=["test", "basic"], + action_url=_TEST_ACTION_URL, severity=NotificationSeverity.MEDIUM, channel=NotificationChannel.IN_APP, ) @@ -61,6 +65,7 @@ async def test_create_notification_with_metadata( subject="With Metadata", body="Body", tags=["meta"], + action_url="/api/v1/executions/exec-123/result", metadata={"execution_id": "exec-123", "duration": 45.5}, ) @@ -81,10 +86,10 @@ async def test_create_notification_with_action_url( subject="Action Required", body="Click to view", tags=["action"], - action_url="/executions/exec-123", + action_url="/api/v1/executions/exec-123/result", ) - assert notification.action_url == "/executions/exec-123" + assert notification.action_url == "/api/v1/executions/exec-123/result" @pytest.mark.asyncio async def test_create_notification_all_severities( @@ -107,6 +112,7 @@ async def test_create_notification_all_severities( subject=f"Severity {severity}", body="Body", tags=["severity-test"], + action_url=_TEST_ACTION_URL, severity=severity, ) assert notification.severity == severity @@ -125,6 +131,7 @@ async def test_create_notification_empty_tags_raises( subject="No Tags", body="Body", tags=[], + action_url=_TEST_ACTION_URL, ) @@ -143,6 +150,7 @@ async def test_mark_as_read_success(self, scope: AsyncContainer) -> None: subject="To Read", body="Body", tags=["read-test"], + action_url=_TEST_ACTION_URL, ) # Mark as read @@ -177,6 +185,7 @@ async def test_mark_all_as_read(self, scope: AsyncContainer) -> None: subject=f"Notification {i}", body="Body", tags=["bulk-read"], + action_url=_TEST_ACTION_URL, ) # Mark all as read @@ -208,6 +217,7 @@ async def test_get_unread_count(self, scope: AsyncContainer) -> None: subject="Unread", body="Body", tags=["count-test"], + action_url=_TEST_ACTION_URL, ) # Count should increase @@ -231,6 +241,7 @@ async def test_list_notifications_basic(self, scope: AsyncContainer) -> None: subject=f"List Test {i}", body="Body", tags=["list-test"], + action_url=_TEST_ACTION_URL, ) # List with pagination @@ -254,12 +265,14 @@ async def test_list_notifications_with_tag_filter( subject="Tagged A", body="Body", tags=["filter-a"], + action_url=_TEST_ACTION_URL, ) await svc.create_notification( user_id=user_id, subject="Tagged B", body="Body", tags=["filter-b"], + action_url=_TEST_ACTION_URL, ) # Filter by tag @@ -285,12 +298,14 @@ async def test_list_notifications_exclude_tags( subject="Include Me", body="Body", tags=["include"], + action_url=_TEST_ACTION_URL, ) await svc.create_notification( user_id=user_id, subject="Exclude Me", body="Body", tags=["exclude"], + action_url=_TEST_ACTION_URL, ) # List excluding 'exclude' tag @@ -318,6 +333,7 @@ async def test_delete_notification_success(self, scope: AsyncContainer) -> None: subject="To Delete", body="Body", tags=["delete-test"], + action_url=_TEST_ACTION_URL, ) # Delete it @@ -509,6 +525,7 @@ async def test_full_notification_lifecycle(self, scope: AsyncContainer) -> None: subject="Lifecycle Test", body="Testing full lifecycle", tags=["lifecycle"], + action_url=_TEST_ACTION_URL, ) assert notification.notification_id is not None @@ -545,6 +562,7 @@ async def test_notification_with_subscription_filter( subject="High Priority", body="Body", tags=["filter-test"], + action_url=_TEST_ACTION_URL, severity=NotificationSeverity.HIGH, ) assert high_notif.notification_id is not None From 93e18b82a0335c064b3d2cc550c3a57242f5dcd3 Mon Sep 17 00:00:00 2001 From: HardMax71 Date: Sun, 8 Feb 2026 13:25:20 +0100 Subject: [PATCH 2/6] fix: removed useless try-catch-raise500 from admin/events endpoints --- backend/app/api/routes/admin/events.py | 240 +++++++++++-------------- 1 file changed, 100 insertions(+), 140 deletions(-) diff --git a/backend/app/api/routes/admin/events.py b/backend/app/api/routes/admin/events.py index 3c5e89dc..3816f337 100644 --- a/backend/app/api/routes/admin/events.py +++ b/backend/app/api/routes/admin/events.py @@ -31,26 +31,22 @@ @router.post("/browse") async def browse_events(request: EventBrowseRequest, service: FromDishka[AdminEventsService]) -> EventBrowseResponse: - try: - event_filter = EventFilter(**request.filters.model_dump()) - - result = await service.browse_events( - event_filter=event_filter, - skip=request.skip, - limit=request.limit, - sort_by=request.sort_by, - sort_order=request.sort_order, - ) + event_filter = EventFilter(**request.filters.model_dump()) - return EventBrowseResponse( - events=result.events, - total=result.total, - skip=result.skip, - limit=result.limit, - ) + result = await service.browse_events( + event_filter=event_filter, + skip=request.skip, + limit=request.limit, + sort_by=request.sort_by, + sort_order=request.sort_order, + ) - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + return EventBrowseResponse( + events=result.events, + total=result.total, + skip=result.skip, + limit=result.limit, + ) @router.get("/stats") @@ -58,12 +54,8 @@ async def get_event_stats( service: FromDishka[AdminEventsService], hours: int = Query(default=24, le=168), ) -> EventStatsResponse: - try: - stats = await service.get_event_stats(hours=hours) - return EventStatsResponse.model_validate(stats) - - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + stats = await service.get_event_stats(hours=hours) + return EventStatsResponse.model_validate(stats) @router.get("/export/csv") @@ -74,21 +66,17 @@ async def export_events_csv( end_time: datetime | None = Query(None, description="End time"), limit: int = Query(default=10000, le=50000), ) -> StreamingResponse: - try: - export_filter = EventFilter( - event_types=event_types, - start_time=start_time, - end_time=end_time, - ) - result = await service.export_events_csv_content(event_filter=export_filter, limit=limit) - return StreamingResponse( - iter([result.content]), - media_type=result.media_type, - headers={"Content-Disposition": f"attachment; filename={result.file_name}"}, - ) - - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + export_filter = EventFilter( + event_types=event_types, + start_time=start_time, + end_time=end_time, + ) + result = await service.export_events_csv_content(event_filter=export_filter, limit=limit) + return StreamingResponse( + iter([result.content]), + media_type=result.media_type, + headers={"Content-Disposition": f"attachment; filename={result.file_name}"}, + ) @router.get("/export/json") @@ -104,131 +92,103 @@ async def export_events_json( limit: int = Query(default=10000, le=50000), ) -> StreamingResponse: """Export events as JSON with comprehensive filtering.""" - try: - export_filter = EventFilter( - event_types=event_types, - aggregate_id=aggregate_id, - correlation_id=correlation_id, - user_id=user_id, - service_name=service_name, - start_time=start_time, - end_time=end_time, - ) - result = await service.export_events_json_content(event_filter=export_filter, limit=limit) - return StreamingResponse( - iter([result.content]), - media_type=result.media_type, - headers={"Content-Disposition": f"attachment; filename={result.file_name}"}, - ) - - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + export_filter = EventFilter( + event_types=event_types, + aggregate_id=aggregate_id, + correlation_id=correlation_id, + user_id=user_id, + service_name=service_name, + start_time=start_time, + end_time=end_time, + ) + result = await service.export_events_json_content(event_filter=export_filter, limit=limit) + return StreamingResponse( + iter([result.content]), + media_type=result.media_type, + headers={"Content-Disposition": f"attachment; filename={result.file_name}"}, + ) @router.get("/{event_id}") async def get_event_detail(event_id: str, service: FromDishka[AdminEventsService]) -> EventDetailResponse: - try: - result = await service.get_event_detail(event_id) + result = await service.get_event_detail(event_id) - if not result: - raise HTTPException(status_code=404, detail="Event not found") + if not result: + raise HTTPException(status_code=404, detail="Event not found") - return EventDetailResponse( - event=result.event, - related_events=result.related_events, - timeline=result.timeline, - ) - - except HTTPException: - raise - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + return EventDetailResponse( + event=result.event, + related_events=result.related_events, + timeline=result.timeline, + ) @router.post("/replay") async def replay_events( request: EventReplayRequest, background_tasks: BackgroundTasks, service: FromDishka[AdminEventsService] ) -> EventReplayResponse: + replay_correlation_id = f"replay_{CorrelationContext.get_correlation_id()}" + replay_filter = ReplayFilter( + event_ids=request.event_ids, + correlation_id=request.correlation_id, + aggregate_id=request.aggregate_id, + start_time=request.start_time, + end_time=request.end_time, + ) try: - replay_correlation_id = f"replay_{CorrelationContext.get_correlation_id()}" - replay_filter = ReplayFilter( - event_ids=request.event_ids, - correlation_id=request.correlation_id, - aggregate_id=request.aggregate_id, - start_time=request.start_time, - end_time=request.end_time, - ) - try: - result = await service.prepare_or_schedule_replay( - replay_filter=replay_filter, - dry_run=request.dry_run, - replay_correlation_id=replay_correlation_id, - target_service=request.target_service, - ) - except ValueError as e: - msg = str(e) - if "No events found" in msg: - raise HTTPException(status_code=404, detail=msg) - if "Too many events" in msg: - raise HTTPException(status_code=400, detail=msg) - raise - - if not result.dry_run and result.session_id: - background_tasks.add_task(service.start_replay_session, result.session_id) - - return EventReplayResponse( - dry_run=result.dry_run, - total_events=result.total_events, - replay_correlation_id=result.replay_correlation_id, - session_id=result.session_id, - status=result.status, - events_preview=result.events_preview, + result = await service.prepare_or_schedule_replay( + replay_filter=replay_filter, + dry_run=request.dry_run, + replay_correlation_id=replay_correlation_id, + target_service=request.target_service, ) - - except HTTPException: + except ValueError as e: + msg = str(e) + if "No events found" in msg: + raise HTTPException(status_code=404, detail=msg) + if "Too many events" in msg: + raise HTTPException(status_code=400, detail=msg) raise - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + + if not result.dry_run and result.session_id: + background_tasks.add_task(service.start_replay_session, result.session_id) + + return EventReplayResponse( + dry_run=result.dry_run, + total_events=result.total_events, + replay_correlation_id=result.replay_correlation_id, + session_id=result.session_id, + status=result.status, + events_preview=result.events_preview, + ) @router.get("/replay/{session_id}/status") async def get_replay_status(session_id: str, service: FromDishka[AdminEventsService]) -> EventReplayStatusResponse: - try: - status = await service.get_replay_status(session_id) - - if not status: - raise HTTPException(status_code=404, detail="Replay session not found") - - session = status.session - estimated_completion = status.estimated_completion - execution_results = status.execution_results - return EventReplayStatusResponse( - **{ - **session.model_dump(), - "status": session.status, - "estimated_completion": estimated_completion, - "execution_results": execution_results, - } - ) + status = await service.get_replay_status(session_id) - except HTTPException: - raise - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + if not status: + raise HTTPException(status_code=404, detail="Replay session not found") + + session = status.session + estimated_completion = status.estimated_completion + execution_results = status.execution_results + return EventReplayStatusResponse( + **{ + **session.model_dump(), + "status": session.status, + "estimated_completion": estimated_completion, + "execution_results": execution_results, + } + ) @router.delete("/{event_id}") async def delete_event( event_id: str, admin: Annotated[UserResponse, Depends(admin_user)], service: FromDishka[AdminEventsService] ) -> EventDeleteResponse: - try: - deleted = await service.delete_event(event_id=event_id, deleted_by=admin.email) - if not deleted: - raise HTTPException(status_code=500, detail="Failed to delete event") - - return EventDeleteResponse(message="Event deleted and archived", event_id=event_id) + deleted = await service.delete_event(event_id=event_id, deleted_by=admin.email) + if not deleted: + raise HTTPException(status_code=500, detail="Failed to delete event") - except HTTPException: - raise - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + return EventDeleteResponse(message="Event deleted and archived", event_id=event_id) From 7cb2a8783c026fb5cb3073cc351837ccfd8546f3 Mon Sep 17 00:00:00 2001 From: HardMax71 Date: Sun, 8 Feb 2026 13:32:05 +0100 Subject: [PATCH 3/6] fix: input param inconsistencies - `int = Query(..)` -> `Annotated[int, Query(..)]` --- backend/app/api/routes/admin/events.py | 26 ++++++++-------- backend/app/api/routes/admin/users.py | 6 ++-- backend/app/api/routes/dlq.py | 12 ++++---- backend/app/api/routes/events.py | 40 +++++++++++++------------ backend/app/api/routes/execution.py | 16 +++++----- backend/app/api/routes/notifications.py | 16 ++++++---- backend/app/api/routes/replay.py | 8 +++-- backend/app/api/routes/saga.py | 14 +++++---- 8 files changed, 75 insertions(+), 63 deletions(-) diff --git a/backend/app/api/routes/admin/events.py b/backend/app/api/routes/admin/events.py index 3816f337..35228db5 100644 --- a/backend/app/api/routes/admin/events.py +++ b/backend/app/api/routes/admin/events.py @@ -52,7 +52,7 @@ async def browse_events(request: EventBrowseRequest, service: FromDishka[AdminEv @router.get("/stats") async def get_event_stats( service: FromDishka[AdminEventsService], - hours: int = Query(default=24, le=168), + hours: Annotated[int, Query(le=168)] = 24, ) -> EventStatsResponse: stats = await service.get_event_stats(hours=hours) return EventStatsResponse.model_validate(stats) @@ -61,10 +61,10 @@ async def get_event_stats( @router.get("/export/csv") async def export_events_csv( service: FromDishka[AdminEventsService], - event_types: list[EventType] | None = Query(None, description="Event types (repeat param for multiple)"), - start_time: datetime | None = Query(None, description="Start time"), - end_time: datetime | None = Query(None, description="End time"), - limit: int = Query(default=10000, le=50000), + event_types: Annotated[list[EventType] | None, Query(description="Event types (repeat param for multiple)")] = None, + start_time: Annotated[datetime | None, Query(description="Start time")] = None, + end_time: Annotated[datetime | None, Query(description="End time")] = None, + limit: Annotated[int, Query(le=50000)] = 10000, ) -> StreamingResponse: export_filter = EventFilter( event_types=event_types, @@ -82,14 +82,14 @@ async def export_events_csv( @router.get("/export/json") async def export_events_json( service: FromDishka[AdminEventsService], - event_types: list[EventType] | None = Query(None, description="Event types (repeat param for multiple)"), - aggregate_id: str | None = Query(None, description="Aggregate ID filter"), - correlation_id: str | None = Query(None, description="Correlation ID filter"), - user_id: str | None = Query(None, description="User ID filter"), - service_name: str | None = Query(None, description="Service name filter"), - start_time: datetime | None = Query(None, description="Start time"), - end_time: datetime | None = Query(None, description="End time"), - limit: int = Query(default=10000, le=50000), + event_types: Annotated[list[EventType] | None, Query(description="Event types (repeat param for multiple)")] = None, + aggregate_id: Annotated[str | None, Query(description="Aggregate ID filter")] = None, + correlation_id: Annotated[str | None, Query(description="Correlation ID filter")] = None, + user_id: Annotated[str | None, Query(description="User ID filter")] = None, + service_name: Annotated[str | None, Query(description="Service name filter")] = None, + start_time: Annotated[datetime | None, Query(description="Start time")] = None, + end_time: Annotated[datetime | None, Query(description="End time")] = None, + limit: Annotated[int, Query(le=50000)] = 10000, ) -> StreamingResponse: """Export events as JSON with comprehensive filtering.""" export_filter = EventFilter( diff --git a/backend/app/api/routes/admin/users.py b/backend/app/api/routes/admin/users.py index 457c04ae..23bb7817 100644 --- a/backend/app/api/routes/admin/users.py +++ b/backend/app/api/routes/admin/users.py @@ -38,8 +38,8 @@ async def list_users( admin: Annotated[UserResponse, Depends(admin_user)], admin_user_service: FromDishka[AdminUserService], - limit: int = Query(default=100, le=1000), - offset: int = Query(default=0, ge=0), + limit: Annotated[int, Query(le=1000)] = 100, + offset: Annotated[int, Query(ge=0)] = 0, search: str | None = None, role: UserRole | None = None, ) -> UserListResponse: @@ -142,7 +142,7 @@ async def delete_user( admin: Annotated[UserResponse, Depends(admin_user)], user_id: str, admin_user_service: FromDishka[AdminUserService], - cascade: bool = Query(default=True, description="Cascade delete user's data"), + cascade: Annotated[bool, Query(description="Cascade delete user's data")] = True, ) -> DeleteUserResponse: # Prevent self-deletion; delegate to service if admin.user_id == user_id: diff --git a/backend/app/api/routes/dlq.py b/backend/app/api/routes/dlq.py index 9df6963e..704cb811 100644 --- a/backend/app/api/routes/dlq.py +++ b/backend/app/api/routes/dlq.py @@ -1,3 +1,5 @@ +from typing import Annotated + from dishka import FromDishka from dishka.integrations.fastapi import DishkaRoute from fastapi import APIRouter, Depends, HTTPException, Query @@ -34,11 +36,11 @@ async def get_dlq_statistics(repository: FromDishka[DLQRepository]) -> DLQStats: @router.get("/messages", response_model=DLQMessagesResponse) async def get_dlq_messages( repository: FromDishka[DLQRepository], - status: DLQMessageStatus | None = Query(None), + status: Annotated[DLQMessageStatus | None, Query()] = None, topic: str | None = None, - event_type: EventType | None = Query(None), - limit: int = Query(50, ge=1, le=1000), - offset: int = Query(0, ge=0), + event_type: Annotated[EventType | None, Query()] = None, + limit: Annotated[int, Query(ge=1, le=1000)] = 50, + offset: Annotated[int, Query(ge=0)] = 0, ) -> DLQMessagesResponse: result = await repository.get_messages( status=status, topic=topic, event_type=event_type, limit=limit, offset=offset @@ -86,7 +88,7 @@ async def set_retry_policy(policy_request: RetryPolicyRequest, dlq_manager: From async def discard_dlq_message( event_id: str, dlq_manager: FromDishka[DLQManager], - reason: str = Query(..., description="Reason for discarding"), + reason: Annotated[str, Query(description="Reason for discarding")], ) -> MessageResponse: success = await dlq_manager.discard_message_manually(event_id, f"manual: {reason}") if not success: diff --git a/backend/app/api/routes/events.py b/backend/app/api/routes/events.py index bcd7f9e2..1034ada5 100644 --- a/backend/app/api/routes/events.py +++ b/backend/app/api/routes/events.py @@ -39,9 +39,9 @@ async def get_execution_events( current_user: Annotated[UserResponse, Depends(current_user)], event_service: FromDishka[EventService], execution_service: FromDishka[ExecutionService], - include_system_events: bool = Query(False, description="Include system-generated events"), - limit: int = Query(100, ge=1, le=1000), - skip: int = Query(0, ge=0), + include_system_events: Annotated[bool, Query(description="Include system-generated events")] = False, + limit: Annotated[int, Query(ge=1, le=1000)] = 100, + skip: Annotated[int, Query(ge=0)] = 0, ) -> EventListResponse: # Check execution ownership first (before checking events) execution = await execution_service.get_execution_result(execution_id) @@ -73,12 +73,12 @@ async def get_execution_events( async def get_user_events( current_user: Annotated[UserResponse, Depends(current_user)], event_service: FromDishka[EventService], - event_types: list[EventType] | None = Query(None), - start_time: datetime | None = Query(None), - end_time: datetime | None = Query(None), - limit: int = Query(100, ge=1, le=1000), - skip: int = Query(0, ge=0), - sort_order: SortOrder = Query(SortOrder.DESC), + event_types: Annotated[list[EventType] | None, Query()] = None, + start_time: Annotated[datetime | None, Query()] = None, + end_time: Annotated[datetime | None, Query()] = None, + limit: Annotated[int, Query(ge=1, le=1000)] = 100, + skip: Annotated[int, Query(ge=0)] = 0, + sort_order: Annotated[SortOrder, Query()] = SortOrder.DESC, ) -> EventListResponse: """Get events for the current user""" result = await event_service.get_user_events_paginated( @@ -142,9 +142,9 @@ async def get_events_by_correlation( correlation_id: str, current_user: Annotated[UserResponse, Depends(current_user)], event_service: FromDishka[EventService], - include_all_users: bool = Query(False, description="Include events from all users (admin only)"), - limit: int = Query(100, ge=1, le=1000), - skip: int = Query(0, ge=0), + include_all_users: Annotated[bool, Query(description="Include events from all users (admin only)")] = False, + limit: Annotated[int, Query(ge=1, le=1000)] = 100, + skip: Annotated[int, Query(ge=0)] = 0, ) -> EventListResponse: result = await event_service.get_events_by_correlation( correlation_id=correlation_id, @@ -168,8 +168,8 @@ async def get_events_by_correlation( async def get_current_request_events( current_user: Annotated[UserResponse, Depends(current_user)], event_service: FromDishka[EventService], - limit: int = Query(100, ge=1, le=1000), - skip: int = Query(0, ge=0), + limit: Annotated[int, Query(ge=1, le=1000)] = 100, + skip: Annotated[int, Query(ge=0)] = 0, ) -> EventListResponse: correlation_id = CorrelationContext.get_correlation_id() if not correlation_id: @@ -197,9 +197,11 @@ async def get_current_request_events( async def get_event_statistics( current_user: Annotated[UserResponse, Depends(current_user)], event_service: FromDishka[EventService], - start_time: datetime | None = Query(None, description="Start time for statistics (defaults to 24 hours ago)"), - end_time: datetime | None = Query(None, description="End time for statistics (defaults to now)"), - include_all_users: bool = Query(False, description="Include stats from all users (admin only)"), + start_time: Annotated[ + datetime | None, Query(description="Start time for statistics (defaults to 24 hours ago)") + ] = None, + end_time: Annotated[datetime | None, Query(description="End time for statistics (defaults to now)")] = None, + include_all_users: Annotated[bool, Query(description="Include stats from all users (admin only)")] = False, ) -> EventStatistics: if not start_time: start_time = datetime.now(timezone.utc) - timedelta(days=1) # 24 hours ago @@ -318,8 +320,8 @@ async def replay_aggregate_events( kafka_event_service: FromDishka[KafkaEventService], settings: FromDishka[Settings], logger: FromDishka[logging.Logger], - target_service: str | None = Query(None, description="Service to replay events to"), - dry_run: bool = Query(True, description="If true, only show what would be replayed"), + target_service: Annotated[str | None, Query(description="Service to replay events to")] = None, + dry_run: Annotated[bool, Query(description="If true, only show what would be replayed")] = True, ) -> ReplayAggregateResponse: replay_info = await event_service.get_aggregate_replay_info(aggregate_id) if not replay_info: diff --git a/backend/app/api/routes/execution.py b/backend/app/api/routes/execution.py index 9dd2b6f6..10fcb6b4 100644 --- a/backend/app/api/routes/execution.py +++ b/backend/app/api/routes/execution.py @@ -235,8 +235,8 @@ async def retry_execution( async def get_execution_events( execution: Annotated[ExecutionInDB, Depends(get_execution_with_access)], event_service: FromDishka[EventService], - event_types: list[EventType] | None = Query(None, description="Event types to filter"), - limit: int = Query(100, ge=1, le=1000), + event_types: Annotated[list[EventType] | None, Query(description="Event types to filter")] = None, + limit: Annotated[int, Query(ge=1, le=1000)] = 100, ) -> list[DomainEvent]: """Get all events for an execution.""" events = await event_service.get_events_by_aggregate( @@ -249,12 +249,12 @@ async def get_execution_events( async def get_user_executions( current_user: Annotated[UserResponse, Depends(current_user)], execution_service: FromDishka[ExecutionService], - status: ExecutionStatus | None = Query(None), - lang: str | None = Query(None), - start_time: datetime | None = Query(None), - end_time: datetime | None = Query(None), - limit: int = Query(50, ge=1, le=200), - skip: int = Query(0, ge=0), + status: Annotated[ExecutionStatus | None, Query()] = None, + lang: Annotated[str | None, Query()] = None, + start_time: Annotated[datetime | None, Query()] = None, + end_time: Annotated[datetime | None, Query()] = None, + limit: Annotated[int, Query(ge=1, le=200)] = 50, + skip: Annotated[int, Query(ge=0)] = 0, ) -> ExecutionListResponse: """Get executions for the current user.""" diff --git a/backend/app/api/routes/notifications.py b/backend/app/api/routes/notifications.py index 8178f6d5..a585f6ba 100644 --- a/backend/app/api/routes/notifications.py +++ b/backend/app/api/routes/notifications.py @@ -1,3 +1,5 @@ +from typing import Annotated + from dishka import FromDishka from dishka.integrations.fastapi import DishkaRoute from fastapi import APIRouter, Query, Request, Response @@ -23,12 +25,14 @@ async def get_notifications( request: Request, notification_service: FromDishka[NotificationService], auth_service: FromDishka[AuthService], - status: NotificationStatus | None = Query(None), - include_tags: list[str] | None = Query(None, description="Only notifications with any of these tags"), - exclude_tags: list[str] | None = Query(None, description="Exclude notifications with any of these tags"), - tag_prefix: str | None = Query(None, description="Only notifications having a tag starting with this prefix"), - limit: int = Query(50, ge=1, le=100), - offset: int = Query(0, ge=0), + status: Annotated[NotificationStatus | None, Query()] = None, + include_tags: Annotated[list[str] | None, Query(description="Only notifications with any of these tags")] = None, + exclude_tags: Annotated[list[str] | None, Query(description="Exclude notifications with any of these tags")] = None, + tag_prefix: Annotated[ + str | None, Query(description="Only notifications having a tag starting with this prefix") + ] = None, + limit: Annotated[int, Query(ge=1, le=100)] = 50, + offset: Annotated[int, Query(ge=0)] = 0, ) -> NotificationListResponse: current_user = await auth_service.get_current_user(request) result = await notification_service.list_notifications( diff --git a/backend/app/api/routes/replay.py b/backend/app/api/routes/replay.py index 15fb8608..30c4a734 100644 --- a/backend/app/api/routes/replay.py +++ b/backend/app/api/routes/replay.py @@ -1,3 +1,5 @@ +from typing import Annotated + from dishka import FromDishka from dishka.integrations.fastapi import DishkaRoute from fastapi import APIRouter, Depends, Query @@ -59,8 +61,8 @@ async def cancel_replay_session(session_id: str, service: FromDishka[EventReplay @router.get("/sessions", response_model=list[SessionSummary]) async def list_replay_sessions( service: FromDishka[EventReplayService], - status: ReplayStatus | None = Query(None), - limit: int = Query(100, ge=1, le=1000), + status: Annotated[ReplayStatus | None, Query()] = None, + limit: Annotated[int, Query(ge=1, le=1000)] = 100, ) -> list[SessionSummary]: return [ SessionSummary(**{**s.model_dump(), **s.config.model_dump()}) @@ -76,7 +78,7 @@ async def get_replay_session(session_id: str, service: FromDishka[EventReplaySer @router.post("/cleanup", response_model=CleanupResponse) async def cleanup_old_sessions( service: FromDishka[EventReplayService], - older_than_hours: int = Query(24, ge=1), + older_than_hours: Annotated[int, Query(ge=1)] = 24, ) -> CleanupResponse: result = await service.cleanup_old_sessions(older_than_hours) return CleanupResponse(**result.model_dump()) diff --git a/backend/app/api/routes/saga.py b/backend/app/api/routes/saga.py index 3dff8d11..c4dcba82 100644 --- a/backend/app/api/routes/saga.py +++ b/backend/app/api/routes/saga.py @@ -1,3 +1,5 @@ +from typing import Annotated + from dishka import FromDishka from dishka.integrations.fastapi import DishkaRoute from fastapi import APIRouter, Query, Request @@ -52,9 +54,9 @@ async def get_execution_sagas( request: Request, saga_service: FromDishka[SagaService], auth_service: FromDishka[AuthService], - state: SagaState | None = Query(None, description="Filter by saga state"), - limit: int = Query(100, ge=1, le=1000), - skip: int = Query(0, ge=0), + state: Annotated[SagaState | None, Query(description="Filter by saga state")] = None, + limit: Annotated[int, Query(ge=1, le=1000)] = 100, + skip: Annotated[int, Query(ge=0)] = 0, ) -> SagaListResponse: """Get all sagas for an execution. @@ -91,9 +93,9 @@ async def list_sagas( request: Request, saga_service: FromDishka[SagaService], auth_service: FromDishka[AuthService], - state: SagaState | None = Query(None, description="Filter by saga state"), - limit: int = Query(100, ge=1, le=1000), - skip: int = Query(0, ge=0), + state: Annotated[SagaState | None, Query(description="Filter by saga state")] = None, + limit: Annotated[int, Query(ge=1, le=1000)] = 100, + skip: Annotated[int, Query(ge=0)] = 0, ) -> SagaListResponse: """List sagas accessible by the current user. From e59635a00ce7af40eefaad97f5361d3e79668530 Mon Sep 17 00:00:00 2001 From: HardMax71 Date: Sun, 8 Feb 2026 15:15:04 +0100 Subject: [PATCH 4/6] fix: preciser openapi docs (response for error, docstrings) + regen'd types and sdk for frontend --- backend/app/api/routes/admin/events.py | 18 +- backend/app/api/routes/admin/settings.py | 14 +- backend/app/api/routes/admin/users.py | 30 +- backend/app/api/routes/auth.py | 16 +- backend/app/api/routes/dlq.py | 18 +- backend/app/api/routes/events.py | 41 +- backend/app/api/routes/execution.py | 42 +- backend/app/api/routes/grafana_alerts.py | 2 + backend/app/api/routes/notifications.py | 9 +- backend/app/api/routes/replay.py | 12 +- backend/app/api/routes/saga.py | 19 +- backend/app/api/routes/saved_scripts.py | 12 +- backend/app/api/routes/user_settings.py | 12 +- backend/app/schemas_pydantic/common.py | 6 + docs/reference/openapi.json | 640 +++++++++++++++++++++-- frontend/src/lib/api/index.ts | 2 +- frontend/src/lib/api/sdk.gen.ts | 166 +++++- frontend/src/lib/api/types.gen.ts | 261 ++++++++- 18 files changed, 1221 insertions(+), 99 deletions(-) create mode 100644 backend/app/schemas_pydantic/common.py diff --git a/backend/app/api/routes/admin/events.py b/backend/app/api/routes/admin/events.py index 35228db5..11918db0 100644 --- a/backend/app/api/routes/admin/events.py +++ b/backend/app/api/routes/admin/events.py @@ -21,6 +21,7 @@ EventReplayStatusResponse, EventStatsResponse, ) +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.user import UserResponse from app.services.admin import AdminEventsService @@ -31,6 +32,7 @@ @router.post("/browse") async def browse_events(request: EventBrowseRequest, service: FromDishka[AdminEventsService]) -> EventBrowseResponse: + """Browse events with filtering, sorting, and pagination.""" event_filter = EventFilter(**request.filters.model_dump()) result = await service.browse_events( @@ -52,8 +54,9 @@ async def browse_events(request: EventBrowseRequest, service: FromDishka[AdminEv @router.get("/stats") async def get_event_stats( service: FromDishka[AdminEventsService], - hours: Annotated[int, Query(le=168)] = 24, + hours: Annotated[int, Query(le=168, description="Lookback window in hours (max 168)")] = 24, ) -> EventStatsResponse: + """Get event statistics for a given lookback window.""" stats = await service.get_event_stats(hours=hours) return EventStatsResponse.model_validate(stats) @@ -66,6 +69,7 @@ async def export_events_csv( end_time: Annotated[datetime | None, Query(description="End time")] = None, limit: Annotated[int, Query(le=50000)] = 10000, ) -> StreamingResponse: + """Export filtered events as a downloadable CSV file.""" export_filter = EventFilter( event_types=event_types, start_time=start_time, @@ -109,8 +113,9 @@ async def export_events_json( ) -@router.get("/{event_id}") +@router.get("/{event_id}", responses={404: {"model": ErrorResponse}}) async def get_event_detail(event_id: str, service: FromDishka[AdminEventsService]) -> EventDetailResponse: + """Get detailed information about a single event, including related events and timeline.""" result = await service.get_event_detail(event_id) if not result: @@ -123,10 +128,11 @@ async def get_event_detail(event_id: str, service: FromDishka[AdminEventsService ) -@router.post("/replay") +@router.post("/replay", responses={400: {"model": ErrorResponse}, 404: {"model": ErrorResponse}}) async def replay_events( request: EventReplayRequest, background_tasks: BackgroundTasks, service: FromDishka[AdminEventsService] ) -> EventReplayResponse: + """Replay events by filter criteria, with optional dry-run mode.""" replay_correlation_id = f"replay_{CorrelationContext.get_correlation_id()}" replay_filter = ReplayFilter( event_ids=request.event_ids, @@ -163,8 +169,9 @@ async def replay_events( ) -@router.get("/replay/{session_id}/status") +@router.get("/replay/{session_id}/status", responses={404: {"model": ErrorResponse}}) async def get_replay_status(session_id: str, service: FromDishka[AdminEventsService]) -> EventReplayStatusResponse: + """Get the status and progress of a replay session.""" status = await service.get_replay_status(session_id) if not status: @@ -183,10 +190,11 @@ async def get_replay_status(session_id: str, service: FromDishka[AdminEventsServ ) -@router.delete("/{event_id}") +@router.delete("/{event_id}", responses={500: {"model": ErrorResponse}}) async def delete_event( event_id: str, admin: Annotated[UserResponse, Depends(admin_user)], service: FromDishka[AdminEventsService] ) -> EventDeleteResponse: + """Delete and archive an event by ID.""" deleted = await service.delete_event(event_id=event_id, deleted_by=admin.email) if not deleted: raise HTTPException(status_code=500, detail="Failed to delete event") diff --git a/backend/app/api/routes/admin/settings.py b/backend/app/api/routes/admin/settings.py index 23a82628..c58efc4f 100644 --- a/backend/app/api/routes/admin/settings.py +++ b/backend/app/api/routes/admin/settings.py @@ -16,6 +16,7 @@ SystemSettings as DomainSystemSettings, ) from app.schemas_pydantic.admin_settings import SystemSettings +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.user import UserResponse from app.services.admin import AdminSettingsService @@ -46,11 +47,12 @@ def _pydantic_to_domain(schema: SystemSettings) -> DomainSystemSettings: ) -@router.get("/", response_model=SystemSettings) +@router.get("/", response_model=SystemSettings, responses={500: {"model": ErrorResponse}}) async def get_system_settings( admin: Annotated[UserResponse, Depends(admin_user)], service: FromDishka[AdminSettingsService], ) -> SystemSettings: + """Get the current system-wide settings.""" try: domain_settings = await service.get_system_settings(admin.username) return _domain_to_pydantic(domain_settings) @@ -59,12 +61,17 @@ async def get_system_settings( raise HTTPException(status_code=500, detail="Failed to retrieve settings") -@router.put("/", response_model=SystemSettings) +@router.put( + "/", + response_model=SystemSettings, + responses={400: {"model": ErrorResponse}, 422: {"model": ErrorResponse}, 500: {"model": ErrorResponse}}, +) async def update_system_settings( admin: Annotated[UserResponse, Depends(admin_user)], settings: SystemSettings, service: FromDishka[AdminSettingsService], ) -> SystemSettings: + """Replace system-wide settings.""" try: domain_settings = _pydantic_to_domain(settings) except (ValueError, ValidationError, KeyError) as e: @@ -86,11 +93,12 @@ async def update_system_settings( raise HTTPException(status_code=500, detail="Failed to update settings") -@router.post("/reset", response_model=SystemSettings) +@router.post("/reset", response_model=SystemSettings, responses={500: {"model": ErrorResponse}}) async def reset_system_settings( admin: Annotated[UserResponse, Depends(admin_user)], service: FromDishka[AdminSettingsService], ) -> SystemSettings: + """Reset system-wide settings to defaults.""" try: reset_domain_settings = await service.reset_system_settings(admin.username, admin.user_id) return _domain_to_pydantic(reset_domain_settings) diff --git a/backend/app/api/routes/admin/users.py b/backend/app/api/routes/admin/users.py index 23bb7817..b4d4079c 100644 --- a/backend/app/api/routes/admin/users.py +++ b/backend/app/api/routes/admin/users.py @@ -14,6 +14,7 @@ DerivedCounts, RateLimitSummary, ) +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.events import EventStatistics from app.schemas_pydantic.user import ( DeleteUserResponse, @@ -40,9 +41,10 @@ async def list_users( admin_user_service: FromDishka[AdminUserService], limit: Annotated[int, Query(le=1000)] = 100, offset: Annotated[int, Query(ge=0)] = 0, - search: str | None = None, - role: UserRole | None = None, + search: Annotated[str | None, Query(description="Search by username or email")] = None, + role: Annotated[UserRole | None, Query(description="Filter by user role")] = None, ) -> UserListResponse: + """List all users with optional search and role filtering.""" result = await admin_user_service.list_users( admin_username=admin.username, limit=limit, @@ -58,7 +60,7 @@ async def list_users( ) -@router.post("/", response_model=UserResponse) +@router.post("/", response_model=UserResponse, responses={400: {"model": ErrorResponse}}) async def create_user( admin: Annotated[UserResponse, Depends(admin_user)], user_data: UserCreate, @@ -73,12 +75,13 @@ async def create_user( return UserResponse.model_validate(domain_user) -@router.get("/{user_id}", response_model=UserResponse) +@router.get("/{user_id}", response_model=UserResponse, responses={404: {"model": ErrorResponse}}) async def get_user( admin: Annotated[UserResponse, Depends(admin_user)], user_id: str, admin_user_service: FromDishka[AdminUserService], ) -> UserResponse: + """Get a user by ID.""" user = await admin_user_service.get_user(admin_username=admin.username, user_id=user_id) if not user: raise HTTPException(status_code=404, detail="User not found") @@ -86,12 +89,13 @@ async def get_user( return UserResponse.model_validate(user) -@router.get("/{user_id}/overview", response_model=AdminUserOverview) +@router.get("/{user_id}/overview", response_model=AdminUserOverview, responses={404: {"model": ErrorResponse}}) async def get_user_overview( admin: Annotated[UserResponse, Depends(admin_user)], user_id: str, admin_user_service: FromDishka[AdminUserService], ) -> AdminUserOverview: + """Get a comprehensive overview of a user including stats and rate limits.""" # Service raises ValueError if not found -> map to 404 try: domain = await admin_user_service.get_user_overview(user_id=user_id, hours=24) @@ -106,7 +110,11 @@ async def get_user_overview( ) -@router.put("/{user_id}", response_model=UserResponse) +@router.put( + "/{user_id}", + response_model=UserResponse, + responses={404: {"model": ErrorResponse}, 500: {"model": ErrorResponse}}, +) async def update_user( admin: Annotated[UserResponse, Depends(admin_user)], user_id: str, @@ -114,6 +122,7 @@ async def update_user( user_repo: FromDishka[AdminUserRepository], admin_user_service: FromDishka[AdminUserService], ) -> UserResponse: + """Update a user's profile fields.""" # Get existing user (explicit 404), then update existing_user = await user_repo.get_user_by_id(user_id) if not existing_user: @@ -137,13 +146,14 @@ async def update_user( return UserResponse.model_validate(updated_user) -@router.delete("/{user_id}", response_model=DeleteUserResponse) +@router.delete("/{user_id}", response_model=DeleteUserResponse, responses={400: {"model": ErrorResponse}}) async def delete_user( admin: Annotated[UserResponse, Depends(admin_user)], user_id: str, admin_user_service: FromDishka[AdminUserService], cascade: Annotated[bool, Query(description="Cascade delete user's data")] = True, ) -> DeleteUserResponse: + """Delete a user and optionally cascade-delete their data.""" # Prevent self-deletion; delegate to service if admin.user_id == user_id: raise HTTPException(status_code=400, detail="Cannot delete your own account") @@ -163,13 +173,14 @@ async def delete_user( ) -@router.post("/{user_id}/reset-password", response_model=MessageResponse) +@router.post("/{user_id}/reset-password", response_model=MessageResponse, responses={500: {"model": ErrorResponse}}) async def reset_user_password( admin: Annotated[UserResponse, Depends(admin_user)], admin_user_service: FromDishka[AdminUserService], user_id: str, password_request: PasswordResetRequest, ) -> MessageResponse: + """Reset a user's password.""" success = await admin_user_service.reset_user_password( admin_username=admin.username, user_id=user_id, new_password=password_request.new_password ) @@ -184,6 +195,7 @@ async def get_user_rate_limits( admin_user_service: FromDishka[AdminUserService], user_id: str, ) -> UserRateLimitsResponse: + """Get rate limit configuration for a user.""" result = await admin_user_service.get_user_rate_limits(admin_username=admin.username, user_id=user_id) return UserRateLimitsResponse.model_validate(result) @@ -195,6 +207,7 @@ async def update_user_rate_limits( user_id: str, request: RateLimitUpdateRequest, ) -> RateLimitUpdateResponse: + """Update rate limit rules for a user.""" config = UserRateLimit( user_id=user_id, rules=[RateLimitRule(**r.model_dump()) for r in request.rules], @@ -212,5 +225,6 @@ async def reset_user_rate_limits( admin_user_service: FromDishka[AdminUserService], user_id: str, ) -> MessageResponse: + """Reset a user's rate limits to defaults.""" await admin_user_service.reset_user_rate_limits(admin_username=admin.username, user_id=user_id) return MessageResponse(message=f"Rate limits reset successfully for user {user_id}") diff --git a/backend/app/api/routes/auth.py b/backend/app/api/routes/auth.py index 55c9e4a3..8893eccb 100644 --- a/backend/app/api/routes/auth.py +++ b/backend/app/api/routes/auth.py @@ -11,6 +11,7 @@ from app.core.utils import get_client_ip from app.db.repositories import UserRepository from app.domain.user import DomainUserCreate +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.user import ( LoginResponse, MessageResponse, @@ -24,7 +25,7 @@ router = APIRouter(prefix="/auth", tags=["authentication"], route_class=DishkaRoute) -@router.post("/login", response_model=LoginResponse) +@router.post("/login", response_model=LoginResponse, responses={401: {"model": ErrorResponse}}) async def login( request: Request, response: Response, @@ -34,6 +35,7 @@ async def login( logger: FromDishka[logging.Logger], form_data: OAuth2PasswordRequestForm = Depends(), ) -> LoginResponse: + """Authenticate and receive session cookies.""" logger.info( "Login attempt", extra={ @@ -122,7 +124,11 @@ async def login( ) -@router.post("/register", response_model=UserResponse) +@router.post( + "/register", + response_model=UserResponse, + responses={400: {"model": ErrorResponse}, 409: {"model": ErrorResponse}, 500: {"model": ErrorResponse}}, +) async def register( request: Request, user: UserCreate, @@ -130,6 +136,7 @@ async def register( security_service: FromDishka[SecurityService], logger: FromDishka[logging.Logger], ) -> UserResponse: + """Register a new user account.""" logger.info( "Registration attempt", extra={ @@ -214,6 +221,7 @@ async def get_current_user_profile( auth_service: FromDishka[AuthService], logger: FromDishka[logging.Logger], ) -> UserResponse: + """Get the authenticated user's profile.""" current_user = await auth_service.get_current_user(request) logger.info( @@ -232,12 +240,13 @@ async def get_current_user_profile( return current_user -@router.get("/verify-token", response_model=TokenValidationResponse) +@router.get("/verify-token", response_model=TokenValidationResponse, responses={401: {"model": ErrorResponse}}) async def verify_token( request: Request, auth_service: FromDishka[AuthService], logger: FromDishka[logging.Logger], ) -> TokenValidationResponse: + """Verify the current access token.""" current_user = await auth_service.get_current_user(request) logger.info( "Token verification attempt", @@ -290,6 +299,7 @@ async def logout( response: Response, logger: FromDishka[logging.Logger], ) -> MessageResponse: + """Log out and clear session cookies.""" logger.info( "Logout attempt", extra={ diff --git a/backend/app/api/routes/dlq.py b/backend/app/api/routes/dlq.py index 704cb811..9132631e 100644 --- a/backend/app/api/routes/dlq.py +++ b/backend/app/api/routes/dlq.py @@ -10,6 +10,7 @@ from app.dlq.manager import DLQManager from app.dlq.models import DLQMessageStatus from app.domain.enums.events import EventType +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.dlq import ( DLQBatchRetryResponse, DLQMessageDetail, @@ -29,6 +30,7 @@ @router.get("/stats", response_model=DLQStats) async def get_dlq_statistics(repository: FromDishka[DLQRepository]) -> DLQStats: + """Get summary statistics for the dead letter queue.""" stats = await repository.get_dlq_stats() return DLQStats.model_validate(stats, from_attributes=True) @@ -36,12 +38,13 @@ async def get_dlq_statistics(repository: FromDishka[DLQRepository]) -> DLQStats: @router.get("/messages", response_model=DLQMessagesResponse) async def get_dlq_messages( repository: FromDishka[DLQRepository], - status: Annotated[DLQMessageStatus | None, Query()] = None, - topic: str | None = None, - event_type: Annotated[EventType | None, Query()] = None, + status: Annotated[DLQMessageStatus | None, Query(description="Filter by message status")] = None, + topic: Annotated[str | None, Query(description="Filter by source Kafka topic")] = None, + event_type: Annotated[EventType | None, Query(description="Filter by event type")] = None, limit: Annotated[int, Query(ge=1, le=1000)] = 50, offset: Annotated[int, Query(ge=0)] = 0, ) -> DLQMessagesResponse: + """List DLQ messages with optional filtering.""" result = await repository.get_messages( status=status, topic=topic, event_type=event_type, limit=limit, offset=offset ) @@ -52,8 +55,9 @@ async def get_dlq_messages( return DLQMessagesResponse(messages=messages, total=result.total, offset=result.offset, limit=result.limit) -@router.get("/messages/{event_id}", response_model=DLQMessageDetail) +@router.get("/messages/{event_id}", response_model=DLQMessageDetail, responses={404: {"model": ErrorResponse}}) async def get_dlq_message(event_id: str, repository: FromDishka[DLQRepository]) -> DLQMessageDetail: + """Get details of a specific DLQ message.""" message = await repository.get_message_by_id(event_id) if not message: raise HTTPException(status_code=404, detail="Message not found") @@ -64,12 +68,14 @@ async def get_dlq_message(event_id: str, repository: FromDishka[DLQRepository]) async def retry_dlq_messages( retry_request: ManualRetryRequest, dlq_manager: FromDishka[DLQManager] ) -> DLQBatchRetryResponse: + """Retry a batch of DLQ messages by their event IDs.""" result = await dlq_manager.retry_messages_batch(retry_request.event_ids) return DLQBatchRetryResponse.model_validate(result, from_attributes=True) @router.post("/retry-policy", response_model=MessageResponse) async def set_retry_policy(policy_request: RetryPolicyRequest, dlq_manager: FromDishka[DLQManager]) -> MessageResponse: + """Configure a retry policy for a specific Kafka topic.""" policy = RetryPolicy( topic=policy_request.topic, strategy=policy_request.strategy, @@ -84,12 +90,13 @@ async def set_retry_policy(policy_request: RetryPolicyRequest, dlq_manager: From return MessageResponse(message=f"Retry policy set for topic {policy_request.topic}") -@router.delete("/messages/{event_id}", response_model=MessageResponse) +@router.delete("/messages/{event_id}", response_model=MessageResponse, responses={404: {"model": ErrorResponse}}) async def discard_dlq_message( event_id: str, dlq_manager: FromDishka[DLQManager], reason: Annotated[str, Query(description="Reason for discarding")], ) -> MessageResponse: + """Permanently discard a DLQ message with a reason.""" success = await dlq_manager.discard_message_manually(event_id, f"manual: {reason}") if not success: raise HTTPException(status_code=404, detail="Message not found or already in terminal state") @@ -98,5 +105,6 @@ async def discard_dlq_message( @router.get("/topics", response_model=list[DLQTopicSummaryResponse]) async def get_dlq_topics(repository: FromDishka[DLQRepository]) -> list[DLQTopicSummaryResponse]: + """Get a per-topic summary of DLQ message counts.""" topics = await repository.get_topics_summary() return [DLQTopicSummaryResponse.model_validate(topic) for topic in topics] diff --git a/backend/app/api/routes/events.py b/backend/app/api/routes/events.py index 1034ada5..d7ed56f9 100644 --- a/backend/app/api/routes/events.py +++ b/backend/app/api/routes/events.py @@ -14,6 +14,7 @@ from app.domain.enums.user import UserRole from app.domain.events.event_models import EventFilter from app.domain.events.typed import BaseEvent, DomainEvent, EventMetadata +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.events import ( DeleteEventResponse, EventAggregationRequest, @@ -33,7 +34,11 @@ router = APIRouter(prefix="/events", tags=["events"], route_class=DishkaRoute) -@router.get("/executions/{execution_id}/events", response_model=EventListResponse) +@router.get( + "/executions/{execution_id}/events", + response_model=EventListResponse, + responses={403: {"model": ErrorResponse}}, +) async def get_execution_events( execution_id: str, current_user: Annotated[UserResponse, Depends(current_user)], @@ -43,6 +48,7 @@ async def get_execution_events( limit: Annotated[int, Query(ge=1, le=1000)] = 100, skip: Annotated[int, Query(ge=0)] = 0, ) -> EventListResponse: + """Get events for a specific execution.""" # Check execution ownership first (before checking events) execution = await execution_service.get_execution_result(execution_id) if execution.user_id and execution.user_id != current_user.user_id and current_user.role != UserRole.ADMIN: @@ -73,14 +79,14 @@ async def get_execution_events( async def get_user_events( current_user: Annotated[UserResponse, Depends(current_user)], event_service: FromDishka[EventService], - event_types: Annotated[list[EventType] | None, Query()] = None, - start_time: Annotated[datetime | None, Query()] = None, - end_time: Annotated[datetime | None, Query()] = None, + event_types: Annotated[list[EventType] | None, Query(description="Filter by event types")] = None, + start_time: Annotated[datetime | None, Query(description="Filter events after this time")] = None, + end_time: Annotated[datetime | None, Query(description="Filter events before this time")] = None, limit: Annotated[int, Query(ge=1, le=1000)] = 100, skip: Annotated[int, Query(ge=0)] = 0, - sort_order: Annotated[SortOrder, Query()] = SortOrder.DESC, + sort_order: Annotated[SortOrder, Query(description="Sort order by timestamp")] = SortOrder.DESC, ) -> EventListResponse: - """Get events for the current user""" + """Get events for the current user.""" result = await event_service.get_user_events_paginated( user_id=current_user.user_id, event_types=event_types, @@ -100,12 +106,13 @@ async def get_user_events( ) -@router.post("/query", response_model=EventListResponse) +@router.post("/query", response_model=EventListResponse, responses={403: {"model": ErrorResponse}}) async def query_events( current_user: Annotated[UserResponse, Depends(current_user)], filter_request: EventFilterRequest, event_service: FromDishka[EventService], ) -> EventListResponse: + """Query events with advanced filters.""" event_filter = EventFilter( event_types=filter_request.event_types, aggregate_id=filter_request.aggregate_id, @@ -146,6 +153,7 @@ async def get_events_by_correlation( limit: Annotated[int, Query(ge=1, le=1000)] = 100, skip: Annotated[int, Query(ge=0)] = 0, ) -> EventListResponse: + """Get all events sharing a correlation ID.""" result = await event_service.get_events_by_correlation( correlation_id=correlation_id, user_id=current_user.user_id, @@ -171,6 +179,7 @@ async def get_current_request_events( limit: Annotated[int, Query(ge=1, le=1000)] = 100, skip: Annotated[int, Query(ge=0)] = 0, ) -> EventListResponse: + """Get events associated with the current HTTP request's correlation ID.""" correlation_id = CorrelationContext.get_correlation_id() if not correlation_id: return EventListResponse(events=[], total=0, limit=limit, skip=skip, has_more=False) @@ -203,6 +212,7 @@ async def get_event_statistics( end_time: Annotated[datetime | None, Query(description="End time for statistics (defaults to now)")] = None, include_all_users: Annotated[bool, Query(description="Include stats from all users (admin only)")] = False, ) -> EventStatistics: + """Get aggregated event statistics for a time range.""" if not start_time: start_time = datetime.now(timezone.utc) - timedelta(days=1) # 24 hours ago if not end_time: @@ -219,11 +229,11 @@ async def get_event_statistics( return EventStatistics.model_validate(stats) -@router.get("/{event_id}", response_model=DomainEvent) +@router.get("/{event_id}", response_model=DomainEvent, responses={404: {"model": ErrorResponse}}) async def get_event( event_id: str, current_user: Annotated[UserResponse, Depends(current_user)], event_service: FromDishka[EventService] ) -> DomainEvent: - """Get a specific event by ID""" + """Get a specific event by ID.""" event = await event_service.get_event(event_id=event_id, user_id=current_user.user_id, user_role=current_user.role) if event is None: raise HTTPException(status_code=404, detail="Event not found") @@ -238,6 +248,7 @@ async def publish_custom_event( event_service: FromDishka[KafkaEventService], settings: FromDishka[Settings], ) -> PublishEventResponse: + """Publish a custom event to Kafka (admin only).""" base_meta = EventMetadata( service_name=settings.SERVICE_NAME, service_version=settings.SERVICE_VERSION, @@ -266,6 +277,7 @@ async def aggregate_events( aggregation: EventAggregationRequest, event_service: FromDishka[EventService], ) -> list[dict[str, Any]]: + """Run a custom aggregation pipeline on the event store.""" result = await event_service.aggregate_events( user_id=current_user.user_id, user_role=current_user.role, @@ -280,17 +292,19 @@ async def aggregate_events( async def list_event_types( current_user: Annotated[UserResponse, Depends(current_user)], event_service: FromDishka[EventService] ) -> list[str]: + """List all distinct event types in the store.""" event_types = await event_service.list_event_types(user_id=current_user.user_id, user_role=current_user.role) return event_types -@router.delete("/{event_id}", response_model=DeleteEventResponse) +@router.delete("/{event_id}", response_model=DeleteEventResponse, responses={404: {"model": ErrorResponse}}) async def delete_event( event_id: str, admin: Annotated[UserResponse, Depends(admin_user)], event_service: FromDishka[EventService], logger: FromDishka[logging.Logger], ) -> DeleteEventResponse: + """Delete and archive an event (admin only).""" result = await event_service.delete_event_with_archival(event_id=event_id, deleted_by=str(admin.email)) if result is None: @@ -312,7 +326,11 @@ async def delete_event( ) -@router.post("/replay/{aggregate_id}", response_model=ReplayAggregateResponse) +@router.post( + "/replay/{aggregate_id}", + response_model=ReplayAggregateResponse, + responses={404: {"model": ErrorResponse}}, +) async def replay_aggregate_events( aggregate_id: str, admin: Annotated[UserResponse, Depends(admin_user)], @@ -323,6 +341,7 @@ async def replay_aggregate_events( target_service: Annotated[str | None, Query(description="Service to replay events to")] = None, dry_run: Annotated[bool, Query(description="If true, only show what would be replayed")] = True, ) -> ReplayAggregateResponse: + """Replay all events for an aggregate (admin only).""" replay_info = await event_service.get_aggregate_replay_info(aggregate_id) if not replay_info: raise HTTPException(status_code=404, detail=f"No events found for aggregate {aggregate_id}") diff --git a/backend/app/api/routes/execution.py b/backend/app/api/routes/execution.py index 10fcb6b4..5f4fd336 100644 --- a/backend/app/api/routes/execution.py +++ b/backend/app/api/routes/execution.py @@ -15,6 +15,7 @@ from app.domain.events.typed import BaseEvent, DomainEvent, EventMetadata from app.domain.exceptions import DomainError from app.domain.idempotency import KeyStrategy +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.execution import ( CancelExecutionRequest, CancelResponse, @@ -52,7 +53,7 @@ async def get_execution_with_access( return ExecutionInDB.model_validate(domain_exec) -@router.post("/execute", response_model=ExecutionResponse) +@router.post("/execute", response_model=ExecutionResponse, responses={500: {"model": ErrorResponse}}) async def create_execution( request: Request, current_user: Annotated[UserResponse, Depends(current_user)], @@ -61,6 +62,7 @@ async def create_execution( idempotency_manager: FromDishka[IdempotencyManager], idempotency_key: Annotated[str | None, Header(alias="Idempotency-Key")] = None, ) -> ExecutionResponse: + """Submit a script for execution in an isolated Kubernetes pod.""" add_span_attributes( **{ "http.method": "POST", @@ -148,14 +150,23 @@ async def create_execution( raise HTTPException(status_code=500, detail="Internal server error during script execution") from e -@router.get("/executions/{execution_id}/result", response_model=ExecutionResult) +@router.get( + "/executions/{execution_id}/result", + response_model=ExecutionResult, + responses={403: {"model": ErrorResponse}}, +) async def get_result( execution: Annotated[ExecutionInDB, Depends(get_execution_with_access)], ) -> ExecutionResult: + """Retrieve the result of a specific execution.""" return ExecutionResult.model_validate(execution) -@router.post("/executions/{execution_id}/cancel", response_model=CancelResponse) +@router.post( + "/executions/{execution_id}/cancel", + response_model=CancelResponse, + responses={400: {"model": ErrorResponse}, 403: {"model": ErrorResponse}}, +) async def cancel_execution( execution: Annotated[ExecutionInDB, Depends(get_execution_with_access)], current_user: Annotated[UserResponse, Depends(current_user)], @@ -163,6 +174,7 @@ async def cancel_execution( event_service: FromDishka[KafkaEventService], settings: FromDishka[Settings], ) -> CancelResponse: + """Cancel a running or queued execution.""" # Handle terminal states terminal_states = [ExecutionStatus.COMPLETED, ExecutionStatus.FAILED, ExecutionStatus.TIMEOUT] @@ -204,7 +216,11 @@ async def cancel_execution( ) -@router.post("/executions/{execution_id}/retry", response_model=ExecutionResponse) +@router.post( + "/executions/{execution_id}/retry", + response_model=ExecutionResponse, + responses={400: {"model": ErrorResponse}, 403: {"model": ErrorResponse}}, +) async def retry_execution( original_execution: Annotated[ExecutionInDB, Depends(get_execution_with_access)], current_user: Annotated[UserResponse, Depends(current_user)], @@ -231,7 +247,11 @@ async def retry_execution( return ExecutionResponse.model_validate(new_result) -@router.get("/executions/{execution_id}/events", response_model=list[DomainEvent]) +@router.get( + "/executions/{execution_id}/events", + response_model=list[DomainEvent], + responses={403: {"model": ErrorResponse}}, +) async def get_execution_events( execution: Annotated[ExecutionInDB, Depends(get_execution_with_access)], event_service: FromDishka[EventService], @@ -249,10 +269,10 @@ async def get_execution_events( async def get_user_executions( current_user: Annotated[UserResponse, Depends(current_user)], execution_service: FromDishka[ExecutionService], - status: Annotated[ExecutionStatus | None, Query()] = None, - lang: Annotated[str | None, Query()] = None, - start_time: Annotated[datetime | None, Query()] = None, - end_time: Annotated[datetime | None, Query()] = None, + status: Annotated[ExecutionStatus | None, Query(description="Filter by execution status")] = None, + lang: Annotated[str | None, Query(description="Filter by programming language")] = None, + start_time: Annotated[datetime | None, Query(description="Filter executions created after this time")] = None, + end_time: Annotated[datetime | None, Query(description="Filter executions created before this time")] = None, limit: Annotated[int, Query(ge=1, le=200)] = 50, skip: Annotated[int, Query(ge=0)] = 0, ) -> ExecutionListResponse: @@ -283,14 +303,16 @@ async def get_user_executions( async def get_example_scripts( execution_service: FromDishka[ExecutionService], ) -> ExampleScripts: + """Get example scripts for the code editor.""" scripts = await execution_service.get_example_scripts() return ExampleScripts(scripts=scripts) -@router.get("/k8s-limits", response_model=ResourceLimits) +@router.get("/k8s-limits", response_model=ResourceLimits, responses={500: {"model": ErrorResponse}}) async def get_k8s_resource_limits( execution_service: FromDishka[ExecutionService], ) -> ResourceLimits: + """Get Kubernetes resource limits for script execution.""" try: limits = await execution_service.get_k8s_resource_limits() return ResourceLimits.model_validate(limits) diff --git a/backend/app/api/routes/grafana_alerts.py b/backend/app/api/routes/grafana_alerts.py index 8a0684ce..21f30c38 100644 --- a/backend/app/api/routes/grafana_alerts.py +++ b/backend/app/api/routes/grafana_alerts.py @@ -14,6 +14,7 @@ async def receive_grafana_alerts( webhook_payload: GrafanaWebhook, processor: FromDishka[GrafanaAlertProcessor], ) -> AlertResponse: + """Receive and process a Grafana alerting webhook payload.""" correlation_id = CorrelationContext.get_correlation_id() processed_count, errors = await processor.process_webhook(webhook_payload, correlation_id) @@ -30,6 +31,7 @@ async def receive_grafana_alerts( @router.get("/grafana/test") async def test_grafana_alert_endpoint() -> dict[str, str]: + """Verify the Grafana webhook endpoint is reachable.""" return { "status": "ok", "message": "Grafana webhook endpoint is ready", diff --git a/backend/app/api/routes/notifications.py b/backend/app/api/routes/notifications.py index a585f6ba..1b29e746 100644 --- a/backend/app/api/routes/notifications.py +++ b/backend/app/api/routes/notifications.py @@ -34,6 +34,7 @@ async def get_notifications( limit: Annotated[int, Query(ge=1, le=100)] = 50, offset: Annotated[int, Query(ge=0)] = 0, ) -> NotificationListResponse: + """List notifications for the authenticated user.""" current_user = await auth_service.get_current_user(request) result = await notification_service.list_notifications( user_id=current_user.user_id, @@ -58,6 +59,7 @@ async def mark_notification_read( request: Request, auth_service: FromDishka[AuthService], ) -> Response: + """Mark a single notification as read.""" current_user = await auth_service.get_current_user(request) _ = await notification_service.mark_as_read(notification_id=notification_id, user_id=current_user.user_id) @@ -68,8 +70,8 @@ async def mark_notification_read( async def mark_all_read( notification_service: FromDishka[NotificationService], request: Request, auth_service: FromDishka[AuthService] ) -> Response: + """Mark all notifications as read.""" current_user = await auth_service.get_current_user(request) - """Mark all notifications as read""" await notification_service.mark_all_as_read(current_user.user_id) return Response(status_code=204) @@ -78,6 +80,7 @@ async def mark_all_read( async def get_subscriptions( notification_service: FromDishka[NotificationService], request: Request, auth_service: FromDishka[AuthService] ) -> SubscriptionsResponse: + """Get all notification channel subscriptions for the authenticated user.""" current_user = await auth_service.get_current_user(request) subscriptions_dict = await notification_service.get_subscriptions(current_user.user_id) return SubscriptionsResponse( @@ -93,6 +96,7 @@ async def update_subscription( request: Request, auth_service: FromDishka[AuthService], ) -> NotificationSubscription: + """Update subscription settings for a notification channel.""" current_user = await auth_service.get_current_user(request) updated_sub = await notification_service.update_subscription( user_id=current_user.user_id, @@ -111,6 +115,7 @@ async def update_subscription( async def get_unread_count( notification_service: FromDishka[NotificationService], request: Request, auth_service: FromDishka[AuthService] ) -> UnreadCountResponse: + """Get the count of unread notifications.""" current_user = await auth_service.get_current_user(request) count = await notification_service.get_unread_count(current_user.user_id) @@ -124,7 +129,7 @@ async def delete_notification( request: Request, auth_service: FromDishka[AuthService], ) -> DeleteNotificationResponse: + """Delete a notification.""" current_user = await auth_service.get_current_user(request) - """Delete a notification""" _ = await notification_service.delete_notification(user_id=current_user.user_id, notification_id=notification_id) return DeleteNotificationResponse(message="Notification deleted") diff --git a/backend/app/api/routes/replay.py b/backend/app/api/routes/replay.py index 30c4a734..44c37661 100644 --- a/backend/app/api/routes/replay.py +++ b/backend/app/api/routes/replay.py @@ -24,6 +24,7 @@ async def create_replay_session( replay_request: ReplayRequest, service: FromDishka[EventReplayService], ) -> ReplayResponse: + """Create a new event replay session from a configuration.""" result = await service.create_session_from_config(ReplayConfig(**replay_request.model_dump())) return ReplayResponse(**result.model_dump()) @@ -33,6 +34,7 @@ async def start_replay_session( session_id: str, service: FromDishka[EventReplayService], ) -> ReplayResponse: + """Start a previously created replay session.""" result = await service.start_session(session_id) return ReplayResponse(**result.model_dump()) @@ -42,18 +44,21 @@ async def pause_replay_session( session_id: str, service: FromDishka[EventReplayService], ) -> ReplayResponse: + """Pause a running replay session.""" result = await service.pause_session(session_id) return ReplayResponse(**result.model_dump()) @router.post("/sessions/{session_id}/resume", response_model=ReplayResponse) async def resume_replay_session(session_id: str, service: FromDishka[EventReplayService]) -> ReplayResponse: + """Resume a paused replay session.""" result = await service.resume_session(session_id) return ReplayResponse(**result.model_dump()) @router.post("/sessions/{session_id}/cancel", response_model=ReplayResponse) async def cancel_replay_session(session_id: str, service: FromDishka[EventReplayService]) -> ReplayResponse: + """Cancel and stop a replay session.""" result = await service.cancel_session(session_id) return ReplayResponse(**result.model_dump()) @@ -61,9 +66,10 @@ async def cancel_replay_session(session_id: str, service: FromDishka[EventReplay @router.get("/sessions", response_model=list[SessionSummary]) async def list_replay_sessions( service: FromDishka[EventReplayService], - status: Annotated[ReplayStatus | None, Query()] = None, + status: Annotated[ReplayStatus | None, Query(description="Filter by replay session status")] = None, limit: Annotated[int, Query(ge=1, le=1000)] = 100, ) -> list[SessionSummary]: + """List replay sessions with optional status filtering.""" return [ SessionSummary(**{**s.model_dump(), **s.config.model_dump()}) for s in service.list_sessions(status=status, limit=limit) @@ -72,13 +78,15 @@ async def list_replay_sessions( @router.get("/sessions/{session_id}", response_model=ReplaySession) async def get_replay_session(session_id: str, service: FromDishka[EventReplayService]) -> ReplaySession: + """Get full details of a replay session.""" return ReplaySession.model_validate(service.get_session(session_id)) @router.post("/cleanup", response_model=CleanupResponse) async def cleanup_old_sessions( service: FromDishka[EventReplayService], - older_than_hours: Annotated[int, Query(ge=1)] = 24, + older_than_hours: Annotated[int, Query(ge=1, description="Delete sessions older than this many hours")] = 24, ) -> CleanupResponse: + """Remove replay sessions older than the specified threshold.""" result = await service.cleanup_old_sessions(older_than_hours) return CleanupResponse(**result.model_dump()) diff --git a/backend/app/api/routes/saga.py b/backend/app/api/routes/saga.py index c4dcba82..243f87eb 100644 --- a/backend/app/api/routes/saga.py +++ b/backend/app/api/routes/saga.py @@ -5,6 +5,7 @@ from fastapi import APIRouter, Query, Request from app.domain.enums.saga import SagaState +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.saga import ( SagaCancellationResponse, SagaListResponse, @@ -21,7 +22,11 @@ ) -@router.get("/{saga_id}", response_model=SagaStatusResponse) +@router.get( + "/{saga_id}", + response_model=SagaStatusResponse, + responses={403: {"model": ErrorResponse}, 404: {"model": ErrorResponse}}, +) async def get_saga_status( saga_id: str, request: Request, @@ -48,7 +53,11 @@ async def get_saga_status( return SagaStatusResponse.model_validate(saga) -@router.get("/execution/{execution_id}", response_model=SagaListResponse) +@router.get( + "/execution/{execution_id}", + response_model=SagaListResponse, + responses={403: {"model": ErrorResponse}}, +) async def get_execution_sagas( execution_id: str, request: Request, @@ -123,7 +132,11 @@ async def list_sagas( ) -@router.post("/{saga_id}/cancel", response_model=SagaCancellationResponse) +@router.post( + "/{saga_id}/cancel", + response_model=SagaCancellationResponse, + responses={400: {"model": ErrorResponse}, 403: {"model": ErrorResponse}, 404: {"model": ErrorResponse}}, +) async def cancel_saga( saga_id: str, request: Request, diff --git a/backend/app/api/routes/saved_scripts.py b/backend/app/api/routes/saved_scripts.py index 6af0d6de..0ec22379 100644 --- a/backend/app/api/routes/saved_scripts.py +++ b/backend/app/api/routes/saved_scripts.py @@ -3,6 +3,7 @@ from fastapi import APIRouter, Request from app.domain.saved_script import DomainSavedScriptCreate, DomainSavedScriptUpdate +from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.saved_script import ( SavedScriptCreateRequest, SavedScriptResponse, @@ -21,6 +22,7 @@ async def create_saved_script( saved_script_service: FromDishka[SavedScriptService], auth_service: FromDishka[AuthService], ) -> SavedScriptResponse: + """Save a new script to the user's collection.""" current_user = await auth_service.get_current_user(request) create = DomainSavedScriptCreate(**saved_script.model_dump()) domain = await saved_script_service.create_saved_script(create, current_user.user_id) @@ -33,25 +35,27 @@ async def list_saved_scripts( saved_script_service: FromDishka[SavedScriptService], auth_service: FromDishka[AuthService], ) -> list[SavedScriptResponse]: + """List all saved scripts for the authenticated user.""" current_user = await auth_service.get_current_user(request) items = await saved_script_service.list_saved_scripts(current_user.user_id) return [SavedScriptResponse.model_validate(item) for item in items] -@router.get("/scripts/{script_id}", response_model=SavedScriptResponse) +@router.get("/scripts/{script_id}", response_model=SavedScriptResponse, responses={404: {"model": ErrorResponse}}) async def get_saved_script( request: Request, script_id: str, saved_script_service: FromDishka[SavedScriptService], auth_service: FromDishka[AuthService], ) -> SavedScriptResponse: + """Get a saved script by ID.""" current_user = await auth_service.get_current_user(request) domain = await saved_script_service.get_saved_script(script_id, current_user.user_id) return SavedScriptResponse.model_validate(domain) -@router.put("/scripts/{script_id}", response_model=SavedScriptResponse) +@router.put("/scripts/{script_id}", response_model=SavedScriptResponse, responses={404: {"model": ErrorResponse}}) async def update_saved_script( request: Request, script_id: str, @@ -59,6 +63,7 @@ async def update_saved_script( saved_script_service: FromDishka[SavedScriptService], auth_service: FromDishka[AuthService], ) -> SavedScriptResponse: + """Update an existing saved script.""" current_user = await auth_service.get_current_user(request) update_data = DomainSavedScriptUpdate(**script_update.model_dump()) @@ -66,13 +71,14 @@ async def update_saved_script( return SavedScriptResponse.model_validate(domain) -@router.delete("/scripts/{script_id}", status_code=204) +@router.delete("/scripts/{script_id}", status_code=204, responses={404: {"model": ErrorResponse}}) async def delete_saved_script( request: Request, script_id: str, saved_script_service: FromDishka[SavedScriptService], auth_service: FromDishka[AuthService], ) -> None: + """Delete a saved script.""" current_user = await auth_service.get_current_user(request) await saved_script_service.delete_saved_script(script_id, current_user.user_id) diff --git a/backend/app/api/routes/user_settings.py b/backend/app/api/routes/user_settings.py index 6ba9f430..27e67287 100644 --- a/backend/app/api/routes/user_settings.py +++ b/backend/app/api/routes/user_settings.py @@ -2,7 +2,7 @@ from dishka import FromDishka from dishka.integrations.fastapi import DishkaRoute -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, Query from app.api.dependencies import current_user from app.domain.user.settings_models import ( @@ -31,6 +31,7 @@ async def get_user_settings( current_user: Annotated[UserResponse, Depends(current_user)], settings_service: FromDishka[UserSettingsService], ) -> UserSettings: + """Get the authenticated user's settings.""" domain = await settings_service.get_user_settings(current_user.user_id) return UserSettings.model_validate(domain) @@ -41,6 +42,7 @@ async def update_user_settings( updates: UserSettingsUpdate, settings_service: FromDishka[UserSettingsService], ) -> UserSettings: + """Update the authenticated user's settings.""" domain_updates = DomainUserSettingsUpdate( theme=updates.theme, timezone=updates.timezone, @@ -62,6 +64,7 @@ async def update_theme( update_request: ThemeUpdateRequest, settings_service: FromDishka[UserSettingsService], ) -> UserSettings: + """Update the user's theme preference.""" domain = await settings_service.update_theme(current_user.user_id, update_request.theme) return UserSettings.model_validate(domain) @@ -72,6 +75,7 @@ async def update_notification_settings( notifications: NotificationSettings, settings_service: FromDishka[UserSettingsService], ) -> UserSettings: + """Update notification preferences.""" domain = await settings_service.update_notification_settings( current_user.user_id, DomainNotificationSettings(**notifications.model_dump()), @@ -85,6 +89,7 @@ async def update_editor_settings( editor: EditorSettings, settings_service: FromDishka[UserSettingsService], ) -> UserSettings: + """Update code editor preferences.""" domain = await settings_service.update_editor_settings( current_user.user_id, DomainEditorSettings(**editor.model_dump()), @@ -96,8 +101,9 @@ async def update_editor_settings( async def get_settings_history( current_user: Annotated[UserResponse, Depends(current_user)], settings_service: FromDishka[UserSettingsService], - limit: int = 50, + limit: Annotated[int, Query(ge=1, le=200, description="Maximum number of history entries")] = 50, ) -> SettingsHistoryResponse: + """Get the change history for the user's settings.""" history = await settings_service.get_settings_history(current_user.user_id, limit=limit) entries = [SettingsHistoryEntry.model_validate(entry) for entry in history] return SettingsHistoryResponse(history=entries, limit=limit) @@ -109,6 +115,7 @@ async def restore_settings( restore_request: RestoreSettingsRequest, settings_service: FromDishka[UserSettingsService], ) -> UserSettings: + """Restore settings to a previous point in time.""" domain = await settings_service.restore_settings_to_point(current_user.user_id, restore_request.timestamp) return UserSettings.model_validate(domain) @@ -120,5 +127,6 @@ async def update_custom_setting( value: dict[str, object], settings_service: FromDishka[UserSettingsService], ) -> UserSettings: + """Set or update a single custom setting by key.""" domain = await settings_service.update_custom_setting(current_user.user_id, key, value) return UserSettings.model_validate(domain) diff --git a/backend/app/schemas_pydantic/common.py b/backend/app/schemas_pydantic/common.py new file mode 100644 index 00000000..5f788403 --- /dev/null +++ b/backend/app/schemas_pydantic/common.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel, Field + + +class ErrorResponse(BaseModel): + detail: str = Field(description="Human-readable error message") + type: str | None = Field(default=None, description="Error type identifier") diff --git a/docs/reference/openapi.json b/docs/reference/openapi.json index 2edcb937..f37fd970 100644 --- a/docs/reference/openapi.json +++ b/docs/reference/openapi.json @@ -11,6 +11,7 @@ "authentication" ], "summary": "Login", + "description": "Authenticate and receive session cookies.", "operationId": "login_api_v1_auth_login_post", "requestBody": { "content": { @@ -33,6 +34,16 @@ } } }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "422": { "description": "Validation Error", "content": { @@ -52,6 +63,7 @@ "authentication" ], "summary": "Register", + "description": "Register a new user account.", "operationId": "register_api_v1_auth_register_post", "requestBody": { "content": { @@ -74,6 +86,36 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "422": { "description": "Validation Error", "content": { @@ -93,6 +135,7 @@ "authentication" ], "summary": "Get Current User Profile", + "description": "Get the authenticated user's profile.", "operationId": "get_current_user_profile_api_v1_auth_me_get", "responses": { "200": { @@ -114,6 +157,7 @@ "authentication" ], "summary": "Verify Token", + "description": "Verify the current access token.", "operationId": "verify_token_api_v1_auth_verify_token_get", "responses": { "200": { @@ -125,6 +169,16 @@ } } } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } } @@ -135,6 +189,7 @@ "authentication" ], "summary": "Logout", + "description": "Log out and clear session cookies.", "operationId": "logout_api_v1_auth_logout_post", "responses": { "200": { @@ -156,6 +211,7 @@ "execution" ], "summary": "Create Execution", + "description": "Submit a script for execution in an isolated Kubernetes pod.", "operationId": "create_execution_api_v1_execute_post", "parameters": [ { @@ -196,6 +252,16 @@ } } }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Internal Server Error" + }, "422": { "description": "Validation Error", "content": { @@ -215,6 +281,7 @@ "execution" ], "summary": "Get Result", + "description": "Retrieve the result of a specific execution.", "operationId": "get_result_api_v1_executions__execution_id__result_get", "parameters": [ { @@ -238,6 +305,16 @@ } } }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Forbidden" + }, "422": { "description": "Validation Error", "content": { @@ -257,6 +334,7 @@ "execution" ], "summary": "Cancel Execution", + "description": "Cancel a running or queued execution.", "operationId": "cancel_execution_api_v1_executions__execution_id__cancel_post", "parameters": [ { @@ -290,6 +368,26 @@ } } }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Bad Request" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Forbidden" + }, "422": { "description": "Validation Error", "content": { @@ -343,6 +441,26 @@ } } }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Bad Request" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Forbidden" + }, "422": { "description": "Validation Error", "content": { @@ -657,6 +775,16 @@ } } }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Forbidden" + }, "422": { "description": "Validation Error", "content": { @@ -692,8 +820,10 @@ "type": "null" } ], + "description": "Filter by execution status", "title": "Status" - } + }, + "description": "Filter by execution status" }, { "name": "lang", @@ -708,8 +838,10 @@ "type": "null" } ], + "description": "Filter by programming language", "title": "Lang" - } + }, + "description": "Filter by programming language" }, { "name": "start_time", @@ -725,8 +857,10 @@ "type": "null" } ], + "description": "Filter executions created after this time", "title": "Start Time" - } + }, + "description": "Filter executions created after this time" }, { "name": "end_time", @@ -742,8 +876,10 @@ "type": "null" } ], + "description": "Filter executions created before this time", "title": "End Time" - } + }, + "description": "Filter executions created before this time" }, { "name": "limit", @@ -799,6 +935,7 @@ "execution" ], "summary": "Get Example Scripts", + "description": "Get example scripts for the code editor.", "operationId": "get_example_scripts_api_v1_example_scripts_get", "responses": { "200": { @@ -820,6 +957,7 @@ "execution" ], "summary": "Get K8S Resource Limits", + "description": "Get Kubernetes resource limits for script execution.", "operationId": "get_k8s_resource_limits_api_v1_k8s_limits_get", "responses": { "200": { @@ -831,6 +969,16 @@ } } } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } } @@ -884,6 +1032,7 @@ "scripts" ], "summary": "List Saved Scripts", + "description": "List all saved scripts for the authenticated user.", "operationId": "list_saved_scripts_api_v1_scripts_get", "responses": { "200": { @@ -907,6 +1056,7 @@ "scripts" ], "summary": "Create Saved Script", + "description": "Save a new script to the user's collection.", "operationId": "create_saved_script_api_v1_scripts_post", "requestBody": { "content": { @@ -948,6 +1098,7 @@ "scripts" ], "summary": "Get Saved Script", + "description": "Get a saved script by ID.", "operationId": "get_saved_script_api_v1_scripts__script_id__get", "parameters": [ { @@ -971,6 +1122,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -988,6 +1149,7 @@ "scripts" ], "summary": "Update Saved Script", + "description": "Update an existing saved script.", "operationId": "update_saved_script_api_v1_scripts__script_id__put", "parameters": [ { @@ -1021,6 +1183,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -1038,6 +1210,7 @@ "scripts" ], "summary": "Delete Saved Script", + "description": "Delete a saved script.", "operationId": "delete_saved_script_api_v1_scripts__script_id__delete", "parameters": [ { @@ -1054,6 +1227,16 @@ "204": { "description": "Successful Response" }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -1073,6 +1256,7 @@ "Event Replay" ], "summary": "Create Replay Session", + "description": "Create a new event replay session from a configuration.", "operationId": "create_replay_session_api_v1_replay_sessions_post", "requestBody": { "required": true, @@ -1112,6 +1296,7 @@ "Event Replay" ], "summary": "List Replay Sessions", + "description": "List replay sessions with optional status filtering.", "operationId": "list_replay_sessions_api_v1_replay_sessions_get", "parameters": [ { @@ -1127,8 +1312,10 @@ "type": "null" } ], + "description": "Filter by replay session status", "title": "Status" - } + }, + "description": "Filter by replay session status" }, { "name": "limit", @@ -1177,6 +1364,7 @@ "Event Replay" ], "summary": "Start Replay Session", + "description": "Start a previously created replay session.", "operationId": "start_replay_session_api_v1_replay_sessions__session_id__start_post", "parameters": [ { @@ -1219,6 +1407,7 @@ "Event Replay" ], "summary": "Pause Replay Session", + "description": "Pause a running replay session.", "operationId": "pause_replay_session_api_v1_replay_sessions__session_id__pause_post", "parameters": [ { @@ -1261,6 +1450,7 @@ "Event Replay" ], "summary": "Resume Replay Session", + "description": "Resume a paused replay session.", "operationId": "resume_replay_session_api_v1_replay_sessions__session_id__resume_post", "parameters": [ { @@ -1303,6 +1493,7 @@ "Event Replay" ], "summary": "Cancel Replay Session", + "description": "Cancel and stop a replay session.", "operationId": "cancel_replay_session_api_v1_replay_sessions__session_id__cancel_post", "parameters": [ { @@ -1345,6 +1536,7 @@ "Event Replay" ], "summary": "Get Replay Session", + "description": "Get full details of a replay session.", "operationId": "get_replay_session_api_v1_replay_sessions__session_id__get", "parameters": [ { @@ -1387,6 +1579,7 @@ "Event Replay" ], "summary": "Cleanup Old Sessions", + "description": "Remove replay sessions older than the specified threshold.", "operationId": "cleanup_old_sessions_api_v1_replay_cleanup_post", "parameters": [ { @@ -1396,9 +1589,11 @@ "schema": { "type": "integer", "minimum": 1, + "description": "Delete sessions older than this many hours", "default": 24, "title": "Older Than Hours" - } + }, + "description": "Delete sessions older than this many hours" } ], "responses": { @@ -1475,6 +1670,7 @@ "Dead Letter Queue" ], "summary": "Get Dlq Statistics", + "description": "Get summary statistics for the dead letter queue.", "operationId": "get_dlq_statistics_api_v1_dlq_stats_get", "responses": { "200": { @@ -1496,6 +1692,7 @@ "Dead Letter Queue" ], "summary": "Get Dlq Messages", + "description": "List DLQ messages with optional filtering.", "operationId": "get_dlq_messages_api_v1_dlq_messages_get", "parameters": [ { @@ -1511,8 +1708,10 @@ "type": "null" } ], + "description": "Filter by message status", "title": "Status" - } + }, + "description": "Filter by message status" }, { "name": "topic", @@ -1527,8 +1726,10 @@ "type": "null" } ], + "description": "Filter by source Kafka topic", "title": "Topic" - } + }, + "description": "Filter by source Kafka topic" }, { "name": "event_type", @@ -1543,8 +1744,10 @@ "type": "null" } ], + "description": "Filter by event type", "title": "Event Type" - } + }, + "description": "Filter by event type" }, { "name": "limit", @@ -1600,6 +1803,7 @@ "Dead Letter Queue" ], "summary": "Get Dlq Message", + "description": "Get details of a specific DLQ message.", "operationId": "get_dlq_message_api_v1_dlq_messages__event_id__get", "parameters": [ { @@ -1623,6 +1827,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -1640,6 +1854,7 @@ "Dead Letter Queue" ], "summary": "Discard Dlq Message", + "description": "Permanently discard a DLQ message with a reason.", "operationId": "discard_dlq_message_api_v1_dlq_messages__event_id__delete", "parameters": [ { @@ -1674,6 +1889,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -1693,6 +1918,7 @@ "Dead Letter Queue" ], "summary": "Retry Dlq Messages", + "description": "Retry a batch of DLQ messages by their event IDs.", "operationId": "retry_dlq_messages_api_v1_dlq_retry_post", "requestBody": { "content": { @@ -1734,6 +1960,7 @@ "Dead Letter Queue" ], "summary": "Set Retry Policy", + "description": "Configure a retry policy for a specific Kafka topic.", "operationId": "set_retry_policy_api_v1_dlq_retry_policy_post", "requestBody": { "content": { @@ -1775,6 +2002,7 @@ "Dead Letter Queue" ], "summary": "Get Dlq Topics", + "description": "Get a per-topic summary of DLQ message counts.", "operationId": "get_dlq_topics_api_v1_dlq_topics_get", "responses": { "200": { @@ -1865,6 +2093,7 @@ "events" ], "summary": "Get Execution Events", + "description": "Get events for a specific execution.", "operationId": "get_execution_events_api_v1_events_executions__execution_id__events_get", "parameters": [ { @@ -1923,6 +2152,16 @@ } } }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Forbidden" + }, "422": { "description": "Validation Error", "content": { @@ -1942,7 +2181,7 @@ "events" ], "summary": "Get User Events", - "description": "Get events for the current user", + "description": "Get events for the current user.", "operationId": "get_user_events_api_v1_events_user_get", "parameters": [ { @@ -1961,8 +2200,10 @@ "type": "null" } ], + "description": "Filter by event types", "title": "Event Types" - } + }, + "description": "Filter by event types" }, { "name": "start_time", @@ -1978,8 +2219,10 @@ "type": "null" } ], + "description": "Filter events after this time", "title": "Start Time" - } + }, + "description": "Filter events after this time" }, { "name": "end_time", @@ -1995,8 +2238,10 @@ "type": "null" } ], + "description": "Filter events before this time", "title": "End Time" - } + }, + "description": "Filter events before this time" }, { "name": "limit", @@ -2027,8 +2272,10 @@ "required": false, "schema": { "$ref": "#/components/schemas/SortOrder", + "description": "Sort order by timestamp", "default": "desc" - } + }, + "description": "Sort order by timestamp" } ], "responses": { @@ -2061,6 +2308,7 @@ "events" ], "summary": "Query Events", + "description": "Query events with advanced filters.", "operationId": "query_events_api_v1_events_query_post", "requestBody": { "content": { @@ -2083,6 +2331,16 @@ } } }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "422": { "description": "Validation Error", "content": { @@ -2102,6 +2360,7 @@ "events" ], "summary": "Get Events By Correlation", + "description": "Get all events sharing a correlation ID.", "operationId": "get_events_by_correlation_api_v1_events_correlation__correlation_id__get", "parameters": [ { @@ -2179,6 +2438,7 @@ "events" ], "summary": "Get Current Request Events", + "description": "Get events associated with the current HTTP request's correlation ID.", "operationId": "get_current_request_events_api_v1_events_current_request_get", "parameters": [ { @@ -2235,6 +2495,7 @@ "events" ], "summary": "Get Event Statistics", + "description": "Get aggregated event statistics for a time range.", "operationId": "get_event_statistics_api_v1_events_statistics_get", "parameters": [ { @@ -2318,7 +2579,7 @@ "events" ], "summary": "Get Event", - "description": "Get a specific event by ID", + "description": "Get a specific event by ID.", "operationId": "get_event_api_v1_events__event_id__get", "parameters": [ { @@ -2577,6 +2838,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -2594,6 +2865,7 @@ "events" ], "summary": "Delete Event", + "description": "Delete and archive an event (admin only).", "operationId": "delete_event_api_v1_events__event_id__delete", "parameters": [ { @@ -2617,6 +2889,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -2636,6 +2918,7 @@ "events" ], "summary": "Publish Custom Event", + "description": "Publish a custom event to Kafka (admin only).", "operationId": "publish_custom_event_api_v1_events_publish_post", "requestBody": { "content": { @@ -2677,6 +2960,7 @@ "events" ], "summary": "Aggregate Events", + "description": "Run a custom aggregation pipeline on the event store.", "operationId": "aggregate_events_api_v1_events_aggregate_post", "requestBody": { "content": { @@ -2722,6 +3006,7 @@ "events" ], "summary": "List Event Types", + "description": "List all distinct event types in the store.", "operationId": "list_event_types_api_v1_events_types_list_get", "responses": { "200": { @@ -2747,6 +3032,7 @@ "events" ], "summary": "Replay Aggregate Events", + "description": "Replay all events for an aggregate (admin only).", "operationId": "replay_aggregate_events_api_v1_events_replay__aggregate_id__post", "parameters": [ { @@ -2800,6 +3086,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -2819,6 +3115,7 @@ "admin-events" ], "summary": "Browse Events", + "description": "Browse events with filtering, sorting, and pagination.", "operationId": "browse_events_api_v1_admin_events_browse_post", "requestBody": { "content": { @@ -2860,6 +3157,7 @@ "admin-events" ], "summary": "Get Event Stats", + "description": "Get event statistics for a given lookback window.", "operationId": "get_event_stats_api_v1_admin_events_stats_get", "parameters": [ { @@ -2869,9 +3167,11 @@ "schema": { "type": "integer", "maximum": 168, + "description": "Lookback window in hours (max 168)", "default": 24, "title": "Hours" - } + }, + "description": "Lookback window in hours (max 168)" } ], "responses": { @@ -2904,6 +3204,7 @@ "admin-events" ], "summary": "Export Events Csv", + "description": "Export filtered events as a downloadable CSV file.", "operationId": "export_events_csv_api_v1_admin_events_export_csv_get", "parameters": [ { @@ -3179,6 +3480,7 @@ "admin-events" ], "summary": "Get Event Detail", + "description": "Get detailed information about a single event, including related events and timeline.", "operationId": "get_event_detail_api_v1_admin_events__event_id__get", "parameters": [ { @@ -3202,6 +3504,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -3219,6 +3531,7 @@ "admin-events" ], "summary": "Delete Event", + "description": "Delete and archive an event by ID.", "operationId": "delete_event_api_v1_admin_events__event_id__delete", "parameters": [ { @@ -3242,6 +3555,16 @@ } } }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Internal Server Error" + }, "422": { "description": "Validation Error", "content": { @@ -3261,6 +3584,7 @@ "admin-events" ], "summary": "Replay Events", + "description": "Replay events by filter criteria, with optional dry-run mode.", "operationId": "replay_events_api_v1_admin_events_replay_post", "requestBody": { "content": { @@ -3283,6 +3607,26 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "422": { "description": "Validation Error", "content": { @@ -3302,6 +3646,7 @@ "admin-events" ], "summary": "Get Replay Status", + "description": "Get the status and progress of a replay session.", "operationId": "get_replay_status_api_v1_admin_events_replay__session_id__status_get", "parameters": [ { @@ -3325,6 +3670,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -3345,6 +3700,7 @@ "settings" ], "summary": "Get System Settings", + "description": "Get the current system-wide settings.", "operationId": "get_system_settings_api_v1_admin_settings__get", "responses": { "200": { @@ -3356,6 +3712,16 @@ } } } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } }, @@ -3365,6 +3731,7 @@ "settings" ], "summary": "Update System Settings", + "description": "Replace system-wide settings.", "operationId": "update_system_settings_api_v1_admin_settings__put", "requestBody": { "content": { @@ -3387,12 +3754,32 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "422": { - "description": "Validation Error", + "description": "Unprocessable Entity", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3407,6 +3794,7 @@ "settings" ], "summary": "Reset System Settings", + "description": "Reset system-wide settings to defaults.", "operationId": "reset_system_settings_api_v1_admin_settings_reset_post", "responses": { "200": { @@ -3418,6 +3806,16 @@ } } } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } } @@ -3429,6 +3827,7 @@ "users" ], "summary": "List Users", + "description": "List all users with optional search and role filtering.", "operationId": "list_users_api_v1_admin_users__get", "parameters": [ { @@ -3466,8 +3865,10 @@ "type": "null" } ], + "description": "Search by username or email", "title": "Search" - } + }, + "description": "Search by username or email" }, { "name": "role", @@ -3482,8 +3883,10 @@ "type": "null" } ], + "description": "Filter by user role", "title": "Role" - } + }, + "description": "Filter by user role" } ], "responses": { @@ -3538,6 +3941,16 @@ } } }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Bad Request" + }, "422": { "description": "Validation Error", "content": { @@ -3558,6 +3971,7 @@ "users" ], "summary": "Get User", + "description": "Get a user by ID.", "operationId": "get_user_api_v1_admin_users__user_id__get", "parameters": [ { @@ -3581,6 +3995,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -3599,6 +4023,7 @@ "users" ], "summary": "Update User", + "description": "Update a user's profile fields.", "operationId": "update_user_api_v1_admin_users__user_id__put", "parameters": [ { @@ -3632,6 +4057,26 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Internal Server Error" + }, "422": { "description": "Validation Error", "content": { @@ -3650,6 +4095,7 @@ "users" ], "summary": "Delete User", + "description": "Delete a user and optionally cascade-delete their data.", "operationId": "delete_user_api_v1_admin_users__user_id__delete", "parameters": [ { @@ -3685,6 +4131,16 @@ } } }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Bad Request" + }, "422": { "description": "Validation Error", "content": { @@ -3705,6 +4161,7 @@ "users" ], "summary": "Get User Overview", + "description": "Get a comprehensive overview of a user including stats and rate limits.", "operationId": "get_user_overview_api_v1_admin_users__user_id__overview_get", "parameters": [ { @@ -3728,6 +4185,16 @@ } } }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -3748,6 +4215,7 @@ "users" ], "summary": "Reset User Password", + "description": "Reset a user's password.", "operationId": "reset_user_password_api_v1_admin_users__user_id__reset_password_post", "parameters": [ { @@ -3781,6 +4249,16 @@ } } }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Internal Server Error" + }, "422": { "description": "Validation Error", "content": { @@ -3801,6 +4279,7 @@ "users" ], "summary": "Get User Rate Limits", + "description": "Get rate limit configuration for a user.", "operationId": "get_user_rate_limits_api_v1_admin_users__user_id__rate_limits_get", "parameters": [ { @@ -3842,6 +4321,7 @@ "users" ], "summary": "Update User Rate Limits", + "description": "Update rate limit rules for a user.", "operationId": "update_user_rate_limits_api_v1_admin_users__user_id__rate_limits_put", "parameters": [ { @@ -3895,6 +4375,7 @@ "users" ], "summary": "Reset User Rate Limits", + "description": "Reset a user's rate limits to defaults.", "operationId": "reset_user_rate_limits_api_v1_admin_users__user_id__rate_limits_reset_post", "parameters": [ { @@ -3937,6 +4418,7 @@ "user-settings" ], "summary": "Get User Settings", + "description": "Get the authenticated user's settings.", "operationId": "get_user_settings_api_v1_user_settings__get", "responses": { "200": { @@ -3956,6 +4438,7 @@ "user-settings" ], "summary": "Update User Settings", + "description": "Update the authenticated user's settings.", "operationId": "update_user_settings_api_v1_user_settings__put", "requestBody": { "content": { @@ -3997,6 +4480,7 @@ "user-settings" ], "summary": "Update Theme", + "description": "Update the user's theme preference.", "operationId": "update_theme_api_v1_user_settings_theme_put", "requestBody": { "content": { @@ -4038,6 +4522,7 @@ "user-settings" ], "summary": "Update Notification Settings", + "description": "Update notification preferences.", "operationId": "update_notification_settings_api_v1_user_settings_notifications_put", "requestBody": { "content": { @@ -4079,6 +4564,7 @@ "user-settings" ], "summary": "Update Editor Settings", + "description": "Update code editor preferences.", "operationId": "update_editor_settings_api_v1_user_settings_editor_put", "requestBody": { "content": { @@ -4120,6 +4606,7 @@ "user-settings" ], "summary": "Get Settings History", + "description": "Get the change history for the user's settings.", "operationId": "get_settings_history_api_v1_user_settings_history_get", "parameters": [ { @@ -4128,9 +4615,13 @@ "required": false, "schema": { "type": "integer", + "maximum": 200, + "minimum": 1, + "description": "Maximum number of history entries", "default": 50, "title": "Limit" - } + }, + "description": "Maximum number of history entries" } ], "responses": { @@ -4163,6 +4654,7 @@ "user-settings" ], "summary": "Restore Settings", + "description": "Restore settings to a previous point in time.", "operationId": "restore_settings_api_v1_user_settings_restore_post", "requestBody": { "content": { @@ -4204,6 +4696,7 @@ "user-settings" ], "summary": "Update Custom Setting", + "description": "Set or update a single custom setting by key.", "operationId": "update_custom_setting_api_v1_user_settings_custom__key__put", "parameters": [ { @@ -4257,6 +4750,7 @@ "notifications" ], "summary": "Get Notifications", + "description": "List notifications for the authenticated user.", "operationId": "get_notifications_api_v1_notifications_get", "parameters": [ { @@ -4389,6 +4883,7 @@ "notifications" ], "summary": "Mark Notification Read", + "description": "Mark a single notification as read.", "operationId": "mark_notification_read_api_v1_notifications__notification_id__read_put", "parameters": [ { @@ -4424,6 +4919,7 @@ "notifications" ], "summary": "Mark All Read", + "description": "Mark all notifications as read.", "operationId": "mark_all_read_api_v1_notifications_mark_all_read_post", "responses": { "204": { @@ -4438,6 +4934,7 @@ "notifications" ], "summary": "Get Subscriptions", + "description": "Get all notification channel subscriptions for the authenticated user.", "operationId": "get_subscriptions_api_v1_notifications_subscriptions_get", "responses": { "200": { @@ -4459,6 +4956,7 @@ "notifications" ], "summary": "Update Subscription", + "description": "Update subscription settings for a notification channel.", "operationId": "update_subscription_api_v1_notifications_subscriptions__channel__put", "parameters": [ { @@ -4510,6 +5008,7 @@ "notifications" ], "summary": "Get Unread Count", + "description": "Get the count of unread notifications.", "operationId": "get_unread_count_api_v1_notifications_unread_count_get", "responses": { "200": { @@ -4531,6 +5030,7 @@ "notifications" ], "summary": "Delete Notification", + "description": "Delete a notification.", "operationId": "delete_notification_api_v1_notifications__notification_id__delete", "parameters": [ { @@ -4597,6 +5097,26 @@ } } }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -4681,6 +5201,16 @@ } } }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Forbidden" + }, "422": { "description": "Validation Error", "content": { @@ -4799,6 +5329,36 @@ } } }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Bad Request" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Not Found" + }, "422": { "description": "Validation Error", "content": { @@ -4818,6 +5378,7 @@ "alerts" ], "summary": "Receive Grafana Alerts", + "description": "Receive and process a Grafana alerting webhook payload.", "operationId": "receive_grafana_alerts_api_v1_alerts_grafana_post", "requestBody": { "content": { @@ -4859,6 +5420,7 @@ "alerts" ], "summary": "Test Grafana Alert Endpoint", + "description": "Verify the Grafana webhook endpoint is reachable.", "operationId": "test_grafana_alert_endpoint_api_v1_alerts_grafana_test_get", "responses": { "200": { @@ -7032,6 +7594,32 @@ "title": "Environment", "description": "Deployment environments." }, + "ErrorResponse": { + "properties": { + "detail": { + "type": "string", + "title": "Detail", + "description": "Human-readable error message" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type", + "description": "Error type identifier" + } + }, + "type": "object", + "required": [ + "detail" + ], + "title": "ErrorResponse" + }, "EventAggregationRequest": { "properties": { "pipeline": { @@ -10567,14 +11155,7 @@ "title": "Body" }, "action_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], + "type": "string", "title": "Action Url" }, "created_at": { @@ -10614,7 +11195,6 @@ "body", "action_url", "created_at", - "read_at", "severity", "tags" ], diff --git a/frontend/src/lib/api/index.ts b/frontend/src/lib/api/index.ts index c3c53622..157d187a 100644 --- a/frontend/src/lib/api/index.ts +++ b/frontend/src/lib/api/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts export { aggregateEventsApiV1EventsAggregatePost, browseEventsApiV1AdminEventsBrowsePost, cancelExecutionApiV1ExecutionsExecutionIdCancelPost, cancelReplaySessionApiV1ReplaySessionsSessionIdCancelPost, cancelSagaApiV1SagasSagaIdCancelPost, cleanupOldSessionsApiV1ReplayCleanupPost, createExecutionApiV1ExecutePost, createReplaySessionApiV1ReplaySessionsPost, createSavedScriptApiV1ScriptsPost, createUserApiV1AdminUsersPost, deleteEventApiV1AdminEventsEventIdDelete, deleteEventApiV1EventsEventIdDelete, deleteExecutionApiV1ExecutionsExecutionIdDelete, deleteNotificationApiV1NotificationsNotificationIdDelete, deleteSavedScriptApiV1ScriptsScriptIdDelete, deleteUserApiV1AdminUsersUserIdDelete, discardDlqMessageApiV1DlqMessagesEventIdDelete, executionEventsApiV1EventsExecutionsExecutionIdGet, exportEventsCsvApiV1AdminEventsExportCsvGet, exportEventsJsonApiV1AdminEventsExportJsonGet, getCurrentRequestEventsApiV1EventsCurrentRequestGet, getCurrentUserProfileApiV1AuthMeGet, getDlqMessageApiV1DlqMessagesEventIdGet, getDlqMessagesApiV1DlqMessagesGet, getDlqStatisticsApiV1DlqStatsGet, getDlqTopicsApiV1DlqTopicsGet, getEventApiV1EventsEventIdGet, getEventDetailApiV1AdminEventsEventIdGet, getEventsByCorrelationApiV1EventsCorrelationCorrelationIdGet, getEventStatisticsApiV1EventsStatisticsGet, getEventStatsApiV1AdminEventsStatsGet, getExampleScriptsApiV1ExampleScriptsGet, getExecutionEventsApiV1EventsExecutionsExecutionIdEventsGet, getExecutionEventsApiV1ExecutionsExecutionIdEventsGet, getExecutionSagasApiV1SagasExecutionExecutionIdGet, getK8sResourceLimitsApiV1K8sLimitsGet, getNotificationsApiV1NotificationsGet, getReplaySessionApiV1ReplaySessionsSessionIdGet, getReplayStatusApiV1AdminEventsReplaySessionIdStatusGet, getResultApiV1ExecutionsExecutionIdResultGet, getSagaStatusApiV1SagasSagaIdGet, getSavedScriptApiV1ScriptsScriptIdGet, getSettingsHistoryApiV1UserSettingsHistoryGet, getSubscriptionsApiV1NotificationsSubscriptionsGet, getSystemSettingsApiV1AdminSettingsGet, getUnreadCountApiV1NotificationsUnreadCountGet, getUserApiV1AdminUsersUserIdGet, getUserEventsApiV1EventsUserGet, getUserExecutionsApiV1UserExecutionsGet, getUserOverviewApiV1AdminUsersUserIdOverviewGet, getUserRateLimitsApiV1AdminUsersUserIdRateLimitsGet, getUserSettingsApiV1UserSettingsGet, listEventTypesApiV1EventsTypesListGet, listReplaySessionsApiV1ReplaySessionsGet, listSagasApiV1SagasGet, listSavedScriptsApiV1ScriptsGet, listUsersApiV1AdminUsersGet, livenessApiV1HealthLiveGet, loginApiV1AuthLoginPost, logoutApiV1AuthLogoutPost, markAllReadApiV1NotificationsMarkAllReadPost, markNotificationReadApiV1NotificationsNotificationIdReadPut, notificationStreamApiV1EventsNotificationsStreamGet, type Options, pauseReplaySessionApiV1ReplaySessionsSessionIdPausePost, publishCustomEventApiV1EventsPublishPost, queryEventsApiV1EventsQueryPost, readinessApiV1HealthReadyGet, receiveGrafanaAlertsApiV1AlertsGrafanaPost, registerApiV1AuthRegisterPost, replayAggregateEventsApiV1EventsReplayAggregateIdPost, replayEventsApiV1AdminEventsReplayPost, resetSystemSettingsApiV1AdminSettingsResetPost, resetUserPasswordApiV1AdminUsersUserIdResetPasswordPost, resetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPost, restoreSettingsApiV1UserSettingsRestorePost, resumeReplaySessionApiV1ReplaySessionsSessionIdResumePost, retryDlqMessagesApiV1DlqRetryPost, retryExecutionApiV1ExecutionsExecutionIdRetryPost, setRetryPolicyApiV1DlqRetryPolicyPost, startReplaySessionApiV1ReplaySessionsSessionIdStartPost, testGrafanaAlertEndpointApiV1AlertsGrafanaTestGet, updateCustomSettingApiV1UserSettingsCustomKeyPut, updateEditorSettingsApiV1UserSettingsEditorPut, updateNotificationSettingsApiV1UserSettingsNotificationsPut, updateSavedScriptApiV1ScriptsScriptIdPut, updateSubscriptionApiV1NotificationsSubscriptionsChannelPut, updateSystemSettingsApiV1AdminSettingsPut, updateThemeApiV1UserSettingsThemePut, updateUserApiV1AdminUsersUserIdPut, updateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPut, updateUserSettingsApiV1UserSettingsPut, verifyTokenApiV1AuthVerifyTokenGet } from './sdk.gen'; -export type { AdminUserOverview, AgeStatistics, AggregateEventsApiV1EventsAggregatePostData, AggregateEventsApiV1EventsAggregatePostError, AggregateEventsApiV1EventsAggregatePostErrors, AggregateEventsApiV1EventsAggregatePostResponse, AggregateEventsApiV1EventsAggregatePostResponses, AlertResponse, AllocateResourcesCommandEvent, AuthFailedEvent, BodyLoginApiV1AuthLoginPost, BrowseEventsApiV1AdminEventsBrowsePostData, BrowseEventsApiV1AdminEventsBrowsePostError, BrowseEventsApiV1AdminEventsBrowsePostErrors, BrowseEventsApiV1AdminEventsBrowsePostResponse, BrowseEventsApiV1AdminEventsBrowsePostResponses, CancelExecutionApiV1ExecutionsExecutionIdCancelPostData, CancelExecutionApiV1ExecutionsExecutionIdCancelPostError, CancelExecutionApiV1ExecutionsExecutionIdCancelPostErrors, CancelExecutionApiV1ExecutionsExecutionIdCancelPostResponse, CancelExecutionApiV1ExecutionsExecutionIdCancelPostResponses, CancelExecutionRequest, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostData, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostError, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostErrors, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostResponse, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostResponses, CancelResponse, CancelSagaApiV1SagasSagaIdCancelPostData, CancelSagaApiV1SagasSagaIdCancelPostError, CancelSagaApiV1SagasSagaIdCancelPostErrors, CancelSagaApiV1SagasSagaIdCancelPostResponse, CancelSagaApiV1SagasSagaIdCancelPostResponses, CleanupOldSessionsApiV1ReplayCleanupPostData, CleanupOldSessionsApiV1ReplayCleanupPostError, CleanupOldSessionsApiV1ReplayCleanupPostErrors, CleanupOldSessionsApiV1ReplayCleanupPostResponse, CleanupOldSessionsApiV1ReplayCleanupPostResponses, CleanupResponse, ClientOptions, ContainerStatusInfo, CreateExecutionApiV1ExecutePostData, CreateExecutionApiV1ExecutePostError, CreateExecutionApiV1ExecutePostErrors, CreateExecutionApiV1ExecutePostResponse, CreateExecutionApiV1ExecutePostResponses, CreatePodCommandEvent, CreateReplaySessionApiV1ReplaySessionsPostData, CreateReplaySessionApiV1ReplaySessionsPostError, CreateReplaySessionApiV1ReplaySessionsPostErrors, CreateReplaySessionApiV1ReplaySessionsPostResponse, CreateReplaySessionApiV1ReplaySessionsPostResponses, CreateSavedScriptApiV1ScriptsPostData, CreateSavedScriptApiV1ScriptsPostError, CreateSavedScriptApiV1ScriptsPostErrors, CreateSavedScriptApiV1ScriptsPostResponse, CreateSavedScriptApiV1ScriptsPostResponses, CreateUserApiV1AdminUsersPostData, CreateUserApiV1AdminUsersPostError, CreateUserApiV1AdminUsersPostErrors, CreateUserApiV1AdminUsersPostResponse, CreateUserApiV1AdminUsersPostResponses, DeleteEventApiV1AdminEventsEventIdDeleteData, DeleteEventApiV1AdminEventsEventIdDeleteError, DeleteEventApiV1AdminEventsEventIdDeleteErrors, DeleteEventApiV1AdminEventsEventIdDeleteResponse, DeleteEventApiV1AdminEventsEventIdDeleteResponses, DeleteEventApiV1EventsEventIdDeleteData, DeleteEventApiV1EventsEventIdDeleteError, DeleteEventApiV1EventsEventIdDeleteErrors, DeleteEventApiV1EventsEventIdDeleteResponse, DeleteEventApiV1EventsEventIdDeleteResponses, DeleteEventResponse, DeleteExecutionApiV1ExecutionsExecutionIdDeleteData, DeleteExecutionApiV1ExecutionsExecutionIdDeleteError, DeleteExecutionApiV1ExecutionsExecutionIdDeleteErrors, DeleteExecutionApiV1ExecutionsExecutionIdDeleteResponse, DeleteExecutionApiV1ExecutionsExecutionIdDeleteResponses, DeleteNotificationApiV1NotificationsNotificationIdDeleteData, DeleteNotificationApiV1NotificationsNotificationIdDeleteError, DeleteNotificationApiV1NotificationsNotificationIdDeleteErrors, DeleteNotificationApiV1NotificationsNotificationIdDeleteResponse, DeleteNotificationApiV1NotificationsNotificationIdDeleteResponses, DeleteNotificationResponse, DeletePodCommandEvent, DeleteResponse, DeleteSavedScriptApiV1ScriptsScriptIdDeleteData, DeleteSavedScriptApiV1ScriptsScriptIdDeleteError, DeleteSavedScriptApiV1ScriptsScriptIdDeleteErrors, DeleteSavedScriptApiV1ScriptsScriptIdDeleteResponse, DeleteSavedScriptApiV1ScriptsScriptIdDeleteResponses, DeleteUserApiV1AdminUsersUserIdDeleteData, DeleteUserApiV1AdminUsersUserIdDeleteError, DeleteUserApiV1AdminUsersUserIdDeleteErrors, DeleteUserApiV1AdminUsersUserIdDeleteResponse, DeleteUserApiV1AdminUsersUserIdDeleteResponses, DeleteUserResponse, DerivedCounts, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteData, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteError, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteErrors, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteResponse, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteResponses, DlqBatchRetryResponse, DlqMessageDetail, DlqMessageDiscardedEvent, DlqMessageReceivedEvent, DlqMessageResponse, DlqMessageRetriedEvent, DlqMessagesResponse, DlqMessageStatus, DlqRetryResult, DlqStats, DlqTopicSummaryResponse, EditorSettings, EndpointGroup, EndpointUsageStats, Environment, EventAggregationRequest, EventBrowseRequest, EventBrowseResponse, EventDeleteResponse, EventDetailResponse, EventFilter, EventFilterRequest, EventListResponse, EventMetadata, EventReplayRequest, EventReplayResponse, EventReplayStatusResponse, EventReplayStatusResponseWritable, EventStatistics, EventStatsResponse, EventSummary, EventType, EventTypeCountSchema, EventTypeStatistic, ExampleScripts, ExecutionAcceptedEvent, ExecutionCancelledEvent, ExecutionCompletedEvent, ExecutionErrorType, ExecutionEventsApiV1EventsExecutionsExecutionIdGetData, ExecutionEventsApiV1EventsExecutionsExecutionIdGetError, ExecutionEventsApiV1EventsExecutionsExecutionIdGetErrors, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponse, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponses, ExecutionFailedEvent, ExecutionLimitsSchema, ExecutionListResponse, ExecutionQueuedEvent, ExecutionRequest, ExecutionRequestedEvent, ExecutionResponse, ExecutionResult, ExecutionRunningEvent, ExecutionStartedEvent, ExecutionStatus, ExecutionTimeoutEvent, ExportEventsCsvApiV1AdminEventsExportCsvGetData, ExportEventsCsvApiV1AdminEventsExportCsvGetError, ExportEventsCsvApiV1AdminEventsExportCsvGetErrors, ExportEventsCsvApiV1AdminEventsExportCsvGetResponses, ExportEventsJsonApiV1AdminEventsExportJsonGetData, ExportEventsJsonApiV1AdminEventsExportJsonGetError, ExportEventsJsonApiV1AdminEventsExportJsonGetErrors, ExportEventsJsonApiV1AdminEventsExportJsonGetResponses, GetCurrentRequestEventsApiV1EventsCurrentRequestGetData, GetCurrentRequestEventsApiV1EventsCurrentRequestGetError, GetCurrentRequestEventsApiV1EventsCurrentRequestGetErrors, GetCurrentRequestEventsApiV1EventsCurrentRequestGetResponse, GetCurrentRequestEventsApiV1EventsCurrentRequestGetResponses, GetCurrentUserProfileApiV1AuthMeGetData, GetCurrentUserProfileApiV1AuthMeGetResponse, GetCurrentUserProfileApiV1AuthMeGetResponses, GetDlqMessageApiV1DlqMessagesEventIdGetData, GetDlqMessageApiV1DlqMessagesEventIdGetError, GetDlqMessageApiV1DlqMessagesEventIdGetErrors, GetDlqMessageApiV1DlqMessagesEventIdGetResponse, GetDlqMessageApiV1DlqMessagesEventIdGetResponses, GetDlqMessagesApiV1DlqMessagesGetData, GetDlqMessagesApiV1DlqMessagesGetError, GetDlqMessagesApiV1DlqMessagesGetErrors, GetDlqMessagesApiV1DlqMessagesGetResponse, GetDlqMessagesApiV1DlqMessagesGetResponses, GetDlqStatisticsApiV1DlqStatsGetData, GetDlqStatisticsApiV1DlqStatsGetResponse, GetDlqStatisticsApiV1DlqStatsGetResponses, GetDlqTopicsApiV1DlqTopicsGetData, GetDlqTopicsApiV1DlqTopicsGetResponse, GetDlqTopicsApiV1DlqTopicsGetResponses, GetEventApiV1EventsEventIdGetData, GetEventApiV1EventsEventIdGetError, GetEventApiV1EventsEventIdGetErrors, GetEventApiV1EventsEventIdGetResponse, GetEventApiV1EventsEventIdGetResponses, GetEventDetailApiV1AdminEventsEventIdGetData, GetEventDetailApiV1AdminEventsEventIdGetError, GetEventDetailApiV1AdminEventsEventIdGetErrors, GetEventDetailApiV1AdminEventsEventIdGetResponse, GetEventDetailApiV1AdminEventsEventIdGetResponses, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetData, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetError, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetErrors, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetResponse, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetResponses, GetEventStatisticsApiV1EventsStatisticsGetData, GetEventStatisticsApiV1EventsStatisticsGetError, GetEventStatisticsApiV1EventsStatisticsGetErrors, GetEventStatisticsApiV1EventsStatisticsGetResponse, GetEventStatisticsApiV1EventsStatisticsGetResponses, GetEventStatsApiV1AdminEventsStatsGetData, GetEventStatsApiV1AdminEventsStatsGetError, GetEventStatsApiV1AdminEventsStatsGetErrors, GetEventStatsApiV1AdminEventsStatsGetResponse, GetEventStatsApiV1AdminEventsStatsGetResponses, GetExampleScriptsApiV1ExampleScriptsGetData, GetExampleScriptsApiV1ExampleScriptsGetResponse, GetExampleScriptsApiV1ExampleScriptsGetResponses, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetData, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetError, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetErrors, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetResponse, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetResponses, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetData, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetError, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetErrors, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetResponse, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetResponses, GetExecutionSagasApiV1SagasExecutionExecutionIdGetData, GetExecutionSagasApiV1SagasExecutionExecutionIdGetError, GetExecutionSagasApiV1SagasExecutionExecutionIdGetErrors, GetExecutionSagasApiV1SagasExecutionExecutionIdGetResponse, GetExecutionSagasApiV1SagasExecutionExecutionIdGetResponses, GetK8sResourceLimitsApiV1K8sLimitsGetData, GetK8sResourceLimitsApiV1K8sLimitsGetResponse, GetK8sResourceLimitsApiV1K8sLimitsGetResponses, GetNotificationsApiV1NotificationsGetData, GetNotificationsApiV1NotificationsGetError, GetNotificationsApiV1NotificationsGetErrors, GetNotificationsApiV1NotificationsGetResponse, GetNotificationsApiV1NotificationsGetResponses, GetReplaySessionApiV1ReplaySessionsSessionIdGetData, GetReplaySessionApiV1ReplaySessionsSessionIdGetError, GetReplaySessionApiV1ReplaySessionsSessionIdGetErrors, GetReplaySessionApiV1ReplaySessionsSessionIdGetResponse, GetReplaySessionApiV1ReplaySessionsSessionIdGetResponses, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetData, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetError, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetErrors, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetResponse, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetResponses, GetResultApiV1ExecutionsExecutionIdResultGetData, GetResultApiV1ExecutionsExecutionIdResultGetError, GetResultApiV1ExecutionsExecutionIdResultGetErrors, GetResultApiV1ExecutionsExecutionIdResultGetResponse, GetResultApiV1ExecutionsExecutionIdResultGetResponses, GetSagaStatusApiV1SagasSagaIdGetData, GetSagaStatusApiV1SagasSagaIdGetError, GetSagaStatusApiV1SagasSagaIdGetErrors, GetSagaStatusApiV1SagasSagaIdGetResponse, GetSagaStatusApiV1SagasSagaIdGetResponses, GetSavedScriptApiV1ScriptsScriptIdGetData, GetSavedScriptApiV1ScriptsScriptIdGetError, GetSavedScriptApiV1ScriptsScriptIdGetErrors, GetSavedScriptApiV1ScriptsScriptIdGetResponse, GetSavedScriptApiV1ScriptsScriptIdGetResponses, GetSettingsHistoryApiV1UserSettingsHistoryGetData, GetSettingsHistoryApiV1UserSettingsHistoryGetError, GetSettingsHistoryApiV1UserSettingsHistoryGetErrors, GetSettingsHistoryApiV1UserSettingsHistoryGetResponse, GetSettingsHistoryApiV1UserSettingsHistoryGetResponses, GetSubscriptionsApiV1NotificationsSubscriptionsGetData, GetSubscriptionsApiV1NotificationsSubscriptionsGetResponse, GetSubscriptionsApiV1NotificationsSubscriptionsGetResponses, GetSystemSettingsApiV1AdminSettingsGetData, GetSystemSettingsApiV1AdminSettingsGetResponse, GetSystemSettingsApiV1AdminSettingsGetResponses, GetUnreadCountApiV1NotificationsUnreadCountGetData, GetUnreadCountApiV1NotificationsUnreadCountGetResponse, GetUnreadCountApiV1NotificationsUnreadCountGetResponses, GetUserApiV1AdminUsersUserIdGetData, GetUserApiV1AdminUsersUserIdGetError, GetUserApiV1AdminUsersUserIdGetErrors, GetUserApiV1AdminUsersUserIdGetResponse, GetUserApiV1AdminUsersUserIdGetResponses, GetUserEventsApiV1EventsUserGetData, GetUserEventsApiV1EventsUserGetError, GetUserEventsApiV1EventsUserGetErrors, GetUserEventsApiV1EventsUserGetResponse, GetUserEventsApiV1EventsUserGetResponses, GetUserExecutionsApiV1UserExecutionsGetData, GetUserExecutionsApiV1UserExecutionsGetError, GetUserExecutionsApiV1UserExecutionsGetErrors, GetUserExecutionsApiV1UserExecutionsGetResponse, GetUserExecutionsApiV1UserExecutionsGetResponses, GetUserOverviewApiV1AdminUsersUserIdOverviewGetData, GetUserOverviewApiV1AdminUsersUserIdOverviewGetError, GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponse, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponses, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetData, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetError, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetErrors, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponse, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponses, GetUserSettingsApiV1UserSettingsGetData, GetUserSettingsApiV1UserSettingsGetResponse, GetUserSettingsApiV1UserSettingsGetResponses, GrafanaAlertItem, GrafanaWebhook, HourlyEventCountSchema, HttpValidationError, KafkaTopic, LanguageInfo, ListEventTypesApiV1EventsTypesListGetData, ListEventTypesApiV1EventsTypesListGetResponse, ListEventTypesApiV1EventsTypesListGetResponses, ListReplaySessionsApiV1ReplaySessionsGetData, ListReplaySessionsApiV1ReplaySessionsGetError, ListReplaySessionsApiV1ReplaySessionsGetErrors, ListReplaySessionsApiV1ReplaySessionsGetResponse, ListReplaySessionsApiV1ReplaySessionsGetResponses, ListSagasApiV1SagasGetData, ListSagasApiV1SagasGetError, ListSagasApiV1SagasGetErrors, ListSagasApiV1SagasGetResponse, ListSagasApiV1SagasGetResponses, ListSavedScriptsApiV1ScriptsGetData, ListSavedScriptsApiV1ScriptsGetResponse, ListSavedScriptsApiV1ScriptsGetResponses, ListUsersApiV1AdminUsersGetData, ListUsersApiV1AdminUsersGetError, ListUsersApiV1AdminUsersGetErrors, ListUsersApiV1AdminUsersGetResponse, ListUsersApiV1AdminUsersGetResponses, LivenessApiV1HealthLiveGetData, LivenessApiV1HealthLiveGetResponse, LivenessApiV1HealthLiveGetResponses, LivenessResponse, LoginApiV1AuthLoginPostData, LoginApiV1AuthLoginPostError, LoginApiV1AuthLoginPostErrors, LoginApiV1AuthLoginPostResponse, LoginApiV1AuthLoginPostResponses, LoginMethod, LoginResponse, LogoutApiV1AuthLogoutPostData, LogoutApiV1AuthLogoutPostResponse, LogoutApiV1AuthLogoutPostResponses, ManualRetryRequest, MarkAllReadApiV1NotificationsMarkAllReadPostData, MarkAllReadApiV1NotificationsMarkAllReadPostResponse, MarkAllReadApiV1NotificationsMarkAllReadPostResponses, MarkNotificationReadApiV1NotificationsNotificationIdReadPutData, MarkNotificationReadApiV1NotificationsNotificationIdReadPutError, MarkNotificationReadApiV1NotificationsNotificationIdReadPutErrors, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponse, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponses, MessageResponse, MonitoringSettingsSchema, NotificationAllReadEvent, NotificationChannel, NotificationClickedEvent, NotificationCreatedEvent, NotificationDeliveredEvent, NotificationFailedEvent, NotificationListResponse, NotificationPreferencesUpdatedEvent, NotificationReadEvent, NotificationResponse, NotificationSentEvent, NotificationSettings, NotificationSeverity, NotificationStatus, NotificationStreamApiV1EventsNotificationsStreamGetData, NotificationStreamApiV1EventsNotificationsStreamGetResponse, NotificationStreamApiV1EventsNotificationsStreamGetResponses, NotificationSubscription, PasswordResetRequest, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostData, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostError, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostErrors, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostResponse, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostResponses, PodCreatedEvent, PodDeletedEvent, PodFailedEvent, PodRunningEvent, PodScheduledEvent, PodSucceededEvent, PodTerminatedEvent, PublishCustomEventApiV1EventsPublishPostData, PublishCustomEventApiV1EventsPublishPostError, PublishCustomEventApiV1EventsPublishPostErrors, PublishCustomEventApiV1EventsPublishPostResponse, PublishCustomEventApiV1EventsPublishPostResponses, PublishEventRequest, PublishEventResponse, QueryEventsApiV1EventsQueryPostData, QueryEventsApiV1EventsQueryPostError, QueryEventsApiV1EventsQueryPostErrors, QueryEventsApiV1EventsQueryPostResponse, QueryEventsApiV1EventsQueryPostResponses, QueuePriority, QuotaExceededEvent, RateLimitAlgorithm, RateLimitExceededEvent, RateLimitRuleRequest, RateLimitRuleResponse, RateLimitSummary, RateLimitUpdateRequest, RateLimitUpdateResponse, ReadinessApiV1HealthReadyGetData, ReadinessApiV1HealthReadyGetResponse, ReadinessApiV1HealthReadyGetResponses, ReadinessResponse, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostData, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostError, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostErrors, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostResponse, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostResponses, RegisterApiV1AuthRegisterPostData, RegisterApiV1AuthRegisterPostError, RegisterApiV1AuthRegisterPostErrors, RegisterApiV1AuthRegisterPostResponse, RegisterApiV1AuthRegisterPostResponses, ReleaseResourcesCommandEvent, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostData, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostError, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostErrors, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostResponse, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostResponses, ReplayAggregateResponse, ReplayConfigSchema, ReplayError, ReplayEventsApiV1AdminEventsReplayPostData, ReplayEventsApiV1AdminEventsReplayPostError, ReplayEventsApiV1AdminEventsReplayPostErrors, ReplayEventsApiV1AdminEventsReplayPostResponse, ReplayEventsApiV1AdminEventsReplayPostResponses, ReplayFilter, ReplayFilterSchema, ReplayRequest, ReplayResponse, ReplaySession, ReplayStatus, ReplayTarget, ReplayType, ResetSystemSettingsApiV1AdminSettingsResetPostData, ResetSystemSettingsApiV1AdminSettingsResetPostResponse, ResetSystemSettingsApiV1AdminSettingsResetPostResponses, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostData, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostError, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostErrors, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostResponse, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostResponses, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostData, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostError, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostErrors, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostResponse, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostResponses, ResourceLimitExceededEvent, ResourceLimits, ResourceUsage, ResourceUsageDomain, RestoreSettingsApiV1UserSettingsRestorePostData, RestoreSettingsApiV1UserSettingsRestorePostError, RestoreSettingsApiV1UserSettingsRestorePostErrors, RestoreSettingsApiV1UserSettingsRestorePostResponse, RestoreSettingsApiV1UserSettingsRestorePostResponses, RestoreSettingsRequest, ResultFailedEvent, ResultStoredEvent, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostData, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostError, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostErrors, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostResponse, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostResponses, RetryDlqMessagesApiV1DlqRetryPostData, RetryDlqMessagesApiV1DlqRetryPostError, RetryDlqMessagesApiV1DlqRetryPostErrors, RetryDlqMessagesApiV1DlqRetryPostResponse, RetryDlqMessagesApiV1DlqRetryPostResponses, RetryExecutionApiV1ExecutionsExecutionIdRetryPostData, RetryExecutionApiV1ExecutionsExecutionIdRetryPostError, RetryExecutionApiV1ExecutionsExecutionIdRetryPostErrors, RetryExecutionApiV1ExecutionsExecutionIdRetryPostResponse, RetryExecutionApiV1ExecutionsExecutionIdRetryPostResponses, RetryExecutionRequest, RetryPolicyRequest, RetryStrategy, SagaCancellationResponse, SagaCancelledEvent, SagaCompensatedEvent, SagaCompensatingEvent, SagaCompletedEvent, SagaFailedEvent, SagaListResponse, SagaStartedEvent, SagaState, SagaStatusResponse, SavedScriptCreateRequest, SavedScriptResponse, SavedScriptUpdate, ScriptDeletedEvent, ScriptSavedEvent, ScriptSharedEvent, SecuritySettingsSchema, SecurityViolationEvent, ServiceEventCountSchema, ServiceRecoveredEvent, ServiceUnhealthyEvent, SessionSummary, SessionSummaryWritable, SetRetryPolicyApiV1DlqRetryPolicyPostData, SetRetryPolicyApiV1DlqRetryPolicyPostError, SetRetryPolicyApiV1DlqRetryPolicyPostErrors, SetRetryPolicyApiV1DlqRetryPolicyPostResponse, SetRetryPolicyApiV1DlqRetryPolicyPostResponses, SettingsHistoryEntry, SettingsHistoryResponse, SortOrder, SseControlEvent, SseExecutionEventData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostError, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostErrors, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponse, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponses, StorageType, SubscriptionsResponse, SubscriptionUpdate, SystemErrorEvent, SystemSettings, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetData, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetResponse, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetResponses, Theme, ThemeUpdateRequest, TokenValidationResponse, TopicStatistic, UnreadCountResponse, UpdateCustomSettingApiV1UserSettingsCustomKeyPutData, UpdateCustomSettingApiV1UserSettingsCustomKeyPutError, UpdateCustomSettingApiV1UserSettingsCustomKeyPutErrors, UpdateCustomSettingApiV1UserSettingsCustomKeyPutResponse, UpdateCustomSettingApiV1UserSettingsCustomKeyPutResponses, UpdateEditorSettingsApiV1UserSettingsEditorPutData, UpdateEditorSettingsApiV1UserSettingsEditorPutError, UpdateEditorSettingsApiV1UserSettingsEditorPutErrors, UpdateEditorSettingsApiV1UserSettingsEditorPutResponse, UpdateEditorSettingsApiV1UserSettingsEditorPutResponses, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutData, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutError, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutErrors, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutResponse, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutResponses, UpdateSavedScriptApiV1ScriptsScriptIdPutData, UpdateSavedScriptApiV1ScriptsScriptIdPutError, UpdateSavedScriptApiV1ScriptsScriptIdPutErrors, UpdateSavedScriptApiV1ScriptsScriptIdPutResponse, UpdateSavedScriptApiV1ScriptsScriptIdPutResponses, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutData, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutError, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutErrors, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutResponse, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutResponses, UpdateSystemSettingsApiV1AdminSettingsPutData, UpdateSystemSettingsApiV1AdminSettingsPutError, UpdateSystemSettingsApiV1AdminSettingsPutErrors, UpdateSystemSettingsApiV1AdminSettingsPutResponse, UpdateSystemSettingsApiV1AdminSettingsPutResponses, UpdateThemeApiV1UserSettingsThemePutData, UpdateThemeApiV1UserSettingsThemePutError, UpdateThemeApiV1UserSettingsThemePutErrors, UpdateThemeApiV1UserSettingsThemePutResponse, UpdateThemeApiV1UserSettingsThemePutResponses, UpdateUserApiV1AdminUsersUserIdPutData, UpdateUserApiV1AdminUsersUserIdPutError, UpdateUserApiV1AdminUsersUserIdPutErrors, UpdateUserApiV1AdminUsersUserIdPutResponse, UpdateUserApiV1AdminUsersUserIdPutResponses, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutData, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutError, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutErrors, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutResponse, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutResponses, UpdateUserSettingsApiV1UserSettingsPutData, UpdateUserSettingsApiV1UserSettingsPutError, UpdateUserSettingsApiV1UserSettingsPutErrors, UpdateUserSettingsApiV1UserSettingsPutResponse, UpdateUserSettingsApiV1UserSettingsPutResponses, UserCreate, UserDeletedEvent, UserEventCountSchema, UserListResponse, UserLoggedInEvent, UserLoggedOutEvent, UserLoginEvent, UserRateLimitConfigResponse, UserRateLimitsResponse, UserRegisteredEvent, UserResponse, UserRole, UserSettings, UserSettingsUpdate, UserSettingsUpdatedEvent, UserUpdate, UserUpdatedEvent, ValidationError, VerifyTokenApiV1AuthVerifyTokenGetData, VerifyTokenApiV1AuthVerifyTokenGetResponse, VerifyTokenApiV1AuthVerifyTokenGetResponses } from './types.gen'; +export type { AdminUserOverview, AgeStatistics, AggregateEventsApiV1EventsAggregatePostData, AggregateEventsApiV1EventsAggregatePostError, AggregateEventsApiV1EventsAggregatePostErrors, AggregateEventsApiV1EventsAggregatePostResponse, AggregateEventsApiV1EventsAggregatePostResponses, AlertResponse, AllocateResourcesCommandEvent, AuthFailedEvent, BodyLoginApiV1AuthLoginPost, BrowseEventsApiV1AdminEventsBrowsePostData, BrowseEventsApiV1AdminEventsBrowsePostError, BrowseEventsApiV1AdminEventsBrowsePostErrors, BrowseEventsApiV1AdminEventsBrowsePostResponse, BrowseEventsApiV1AdminEventsBrowsePostResponses, CancelExecutionApiV1ExecutionsExecutionIdCancelPostData, CancelExecutionApiV1ExecutionsExecutionIdCancelPostError, CancelExecutionApiV1ExecutionsExecutionIdCancelPostErrors, CancelExecutionApiV1ExecutionsExecutionIdCancelPostResponse, CancelExecutionApiV1ExecutionsExecutionIdCancelPostResponses, CancelExecutionRequest, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostData, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostError, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostErrors, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostResponse, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostResponses, CancelResponse, CancelSagaApiV1SagasSagaIdCancelPostData, CancelSagaApiV1SagasSagaIdCancelPostError, CancelSagaApiV1SagasSagaIdCancelPostErrors, CancelSagaApiV1SagasSagaIdCancelPostResponse, CancelSagaApiV1SagasSagaIdCancelPostResponses, CleanupOldSessionsApiV1ReplayCleanupPostData, CleanupOldSessionsApiV1ReplayCleanupPostError, CleanupOldSessionsApiV1ReplayCleanupPostErrors, CleanupOldSessionsApiV1ReplayCleanupPostResponse, CleanupOldSessionsApiV1ReplayCleanupPostResponses, CleanupResponse, ClientOptions, ContainerStatusInfo, CreateExecutionApiV1ExecutePostData, CreateExecutionApiV1ExecutePostError, CreateExecutionApiV1ExecutePostErrors, CreateExecutionApiV1ExecutePostResponse, CreateExecutionApiV1ExecutePostResponses, CreatePodCommandEvent, CreateReplaySessionApiV1ReplaySessionsPostData, CreateReplaySessionApiV1ReplaySessionsPostError, CreateReplaySessionApiV1ReplaySessionsPostErrors, CreateReplaySessionApiV1ReplaySessionsPostResponse, CreateReplaySessionApiV1ReplaySessionsPostResponses, CreateSavedScriptApiV1ScriptsPostData, CreateSavedScriptApiV1ScriptsPostError, CreateSavedScriptApiV1ScriptsPostErrors, CreateSavedScriptApiV1ScriptsPostResponse, CreateSavedScriptApiV1ScriptsPostResponses, CreateUserApiV1AdminUsersPostData, CreateUserApiV1AdminUsersPostError, CreateUserApiV1AdminUsersPostErrors, CreateUserApiV1AdminUsersPostResponse, CreateUserApiV1AdminUsersPostResponses, DeleteEventApiV1AdminEventsEventIdDeleteData, DeleteEventApiV1AdminEventsEventIdDeleteError, DeleteEventApiV1AdminEventsEventIdDeleteErrors, DeleteEventApiV1AdminEventsEventIdDeleteResponse, DeleteEventApiV1AdminEventsEventIdDeleteResponses, DeleteEventApiV1EventsEventIdDeleteData, DeleteEventApiV1EventsEventIdDeleteError, DeleteEventApiV1EventsEventIdDeleteErrors, DeleteEventApiV1EventsEventIdDeleteResponse, DeleteEventApiV1EventsEventIdDeleteResponses, DeleteEventResponse, DeleteExecutionApiV1ExecutionsExecutionIdDeleteData, DeleteExecutionApiV1ExecutionsExecutionIdDeleteError, DeleteExecutionApiV1ExecutionsExecutionIdDeleteErrors, DeleteExecutionApiV1ExecutionsExecutionIdDeleteResponse, DeleteExecutionApiV1ExecutionsExecutionIdDeleteResponses, DeleteNotificationApiV1NotificationsNotificationIdDeleteData, DeleteNotificationApiV1NotificationsNotificationIdDeleteError, DeleteNotificationApiV1NotificationsNotificationIdDeleteErrors, DeleteNotificationApiV1NotificationsNotificationIdDeleteResponse, DeleteNotificationApiV1NotificationsNotificationIdDeleteResponses, DeleteNotificationResponse, DeletePodCommandEvent, DeleteResponse, DeleteSavedScriptApiV1ScriptsScriptIdDeleteData, DeleteSavedScriptApiV1ScriptsScriptIdDeleteError, DeleteSavedScriptApiV1ScriptsScriptIdDeleteErrors, DeleteSavedScriptApiV1ScriptsScriptIdDeleteResponse, DeleteSavedScriptApiV1ScriptsScriptIdDeleteResponses, DeleteUserApiV1AdminUsersUserIdDeleteData, DeleteUserApiV1AdminUsersUserIdDeleteError, DeleteUserApiV1AdminUsersUserIdDeleteErrors, DeleteUserApiV1AdminUsersUserIdDeleteResponse, DeleteUserApiV1AdminUsersUserIdDeleteResponses, DeleteUserResponse, DerivedCounts, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteData, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteError, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteErrors, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteResponse, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteResponses, DlqBatchRetryResponse, DlqMessageDetail, DlqMessageDiscardedEvent, DlqMessageReceivedEvent, DlqMessageResponse, DlqMessageRetriedEvent, DlqMessagesResponse, DlqMessageStatus, DlqRetryResult, DlqStats, DlqTopicSummaryResponse, EditorSettings, EndpointGroup, EndpointUsageStats, Environment, ErrorResponse, EventAggregationRequest, EventBrowseRequest, EventBrowseResponse, EventDeleteResponse, EventDetailResponse, EventFilter, EventFilterRequest, EventListResponse, EventMetadata, EventReplayRequest, EventReplayResponse, EventReplayStatusResponse, EventReplayStatusResponseWritable, EventStatistics, EventStatsResponse, EventSummary, EventType, EventTypeCountSchema, EventTypeStatistic, ExampleScripts, ExecutionAcceptedEvent, ExecutionCancelledEvent, ExecutionCompletedEvent, ExecutionErrorType, ExecutionEventsApiV1EventsExecutionsExecutionIdGetData, ExecutionEventsApiV1EventsExecutionsExecutionIdGetError, ExecutionEventsApiV1EventsExecutionsExecutionIdGetErrors, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponse, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponses, ExecutionFailedEvent, ExecutionLimitsSchema, ExecutionListResponse, ExecutionQueuedEvent, ExecutionRequest, ExecutionRequestedEvent, ExecutionResponse, ExecutionResult, ExecutionRunningEvent, ExecutionStartedEvent, ExecutionStatus, ExecutionTimeoutEvent, ExportEventsCsvApiV1AdminEventsExportCsvGetData, ExportEventsCsvApiV1AdminEventsExportCsvGetError, ExportEventsCsvApiV1AdminEventsExportCsvGetErrors, ExportEventsCsvApiV1AdminEventsExportCsvGetResponses, ExportEventsJsonApiV1AdminEventsExportJsonGetData, ExportEventsJsonApiV1AdminEventsExportJsonGetError, ExportEventsJsonApiV1AdminEventsExportJsonGetErrors, ExportEventsJsonApiV1AdminEventsExportJsonGetResponses, GetCurrentRequestEventsApiV1EventsCurrentRequestGetData, GetCurrentRequestEventsApiV1EventsCurrentRequestGetError, GetCurrentRequestEventsApiV1EventsCurrentRequestGetErrors, GetCurrentRequestEventsApiV1EventsCurrentRequestGetResponse, GetCurrentRequestEventsApiV1EventsCurrentRequestGetResponses, GetCurrentUserProfileApiV1AuthMeGetData, GetCurrentUserProfileApiV1AuthMeGetResponse, GetCurrentUserProfileApiV1AuthMeGetResponses, GetDlqMessageApiV1DlqMessagesEventIdGetData, GetDlqMessageApiV1DlqMessagesEventIdGetError, GetDlqMessageApiV1DlqMessagesEventIdGetErrors, GetDlqMessageApiV1DlqMessagesEventIdGetResponse, GetDlqMessageApiV1DlqMessagesEventIdGetResponses, GetDlqMessagesApiV1DlqMessagesGetData, GetDlqMessagesApiV1DlqMessagesGetError, GetDlqMessagesApiV1DlqMessagesGetErrors, GetDlqMessagesApiV1DlqMessagesGetResponse, GetDlqMessagesApiV1DlqMessagesGetResponses, GetDlqStatisticsApiV1DlqStatsGetData, GetDlqStatisticsApiV1DlqStatsGetResponse, GetDlqStatisticsApiV1DlqStatsGetResponses, GetDlqTopicsApiV1DlqTopicsGetData, GetDlqTopicsApiV1DlqTopicsGetResponse, GetDlqTopicsApiV1DlqTopicsGetResponses, GetEventApiV1EventsEventIdGetData, GetEventApiV1EventsEventIdGetError, GetEventApiV1EventsEventIdGetErrors, GetEventApiV1EventsEventIdGetResponse, GetEventApiV1EventsEventIdGetResponses, GetEventDetailApiV1AdminEventsEventIdGetData, GetEventDetailApiV1AdminEventsEventIdGetError, GetEventDetailApiV1AdminEventsEventIdGetErrors, GetEventDetailApiV1AdminEventsEventIdGetResponse, GetEventDetailApiV1AdminEventsEventIdGetResponses, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetData, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetError, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetErrors, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetResponse, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetResponses, GetEventStatisticsApiV1EventsStatisticsGetData, GetEventStatisticsApiV1EventsStatisticsGetError, GetEventStatisticsApiV1EventsStatisticsGetErrors, GetEventStatisticsApiV1EventsStatisticsGetResponse, GetEventStatisticsApiV1EventsStatisticsGetResponses, GetEventStatsApiV1AdminEventsStatsGetData, GetEventStatsApiV1AdminEventsStatsGetError, GetEventStatsApiV1AdminEventsStatsGetErrors, GetEventStatsApiV1AdminEventsStatsGetResponse, GetEventStatsApiV1AdminEventsStatsGetResponses, GetExampleScriptsApiV1ExampleScriptsGetData, GetExampleScriptsApiV1ExampleScriptsGetResponse, GetExampleScriptsApiV1ExampleScriptsGetResponses, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetData, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetError, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetErrors, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetResponse, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetResponses, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetData, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetError, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetErrors, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetResponse, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetResponses, GetExecutionSagasApiV1SagasExecutionExecutionIdGetData, GetExecutionSagasApiV1SagasExecutionExecutionIdGetError, GetExecutionSagasApiV1SagasExecutionExecutionIdGetErrors, GetExecutionSagasApiV1SagasExecutionExecutionIdGetResponse, GetExecutionSagasApiV1SagasExecutionExecutionIdGetResponses, GetK8sResourceLimitsApiV1K8sLimitsGetData, GetK8sResourceLimitsApiV1K8sLimitsGetError, GetK8sResourceLimitsApiV1K8sLimitsGetErrors, GetK8sResourceLimitsApiV1K8sLimitsGetResponse, GetK8sResourceLimitsApiV1K8sLimitsGetResponses, GetNotificationsApiV1NotificationsGetData, GetNotificationsApiV1NotificationsGetError, GetNotificationsApiV1NotificationsGetErrors, GetNotificationsApiV1NotificationsGetResponse, GetNotificationsApiV1NotificationsGetResponses, GetReplaySessionApiV1ReplaySessionsSessionIdGetData, GetReplaySessionApiV1ReplaySessionsSessionIdGetError, GetReplaySessionApiV1ReplaySessionsSessionIdGetErrors, GetReplaySessionApiV1ReplaySessionsSessionIdGetResponse, GetReplaySessionApiV1ReplaySessionsSessionIdGetResponses, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetData, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetError, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetErrors, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetResponse, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetResponses, GetResultApiV1ExecutionsExecutionIdResultGetData, GetResultApiV1ExecutionsExecutionIdResultGetError, GetResultApiV1ExecutionsExecutionIdResultGetErrors, GetResultApiV1ExecutionsExecutionIdResultGetResponse, GetResultApiV1ExecutionsExecutionIdResultGetResponses, GetSagaStatusApiV1SagasSagaIdGetData, GetSagaStatusApiV1SagasSagaIdGetError, GetSagaStatusApiV1SagasSagaIdGetErrors, GetSagaStatusApiV1SagasSagaIdGetResponse, GetSagaStatusApiV1SagasSagaIdGetResponses, GetSavedScriptApiV1ScriptsScriptIdGetData, GetSavedScriptApiV1ScriptsScriptIdGetError, GetSavedScriptApiV1ScriptsScriptIdGetErrors, GetSavedScriptApiV1ScriptsScriptIdGetResponse, GetSavedScriptApiV1ScriptsScriptIdGetResponses, GetSettingsHistoryApiV1UserSettingsHistoryGetData, GetSettingsHistoryApiV1UserSettingsHistoryGetError, GetSettingsHistoryApiV1UserSettingsHistoryGetErrors, GetSettingsHistoryApiV1UserSettingsHistoryGetResponse, GetSettingsHistoryApiV1UserSettingsHistoryGetResponses, GetSubscriptionsApiV1NotificationsSubscriptionsGetData, GetSubscriptionsApiV1NotificationsSubscriptionsGetResponse, GetSubscriptionsApiV1NotificationsSubscriptionsGetResponses, GetSystemSettingsApiV1AdminSettingsGetData, GetSystemSettingsApiV1AdminSettingsGetError, GetSystemSettingsApiV1AdminSettingsGetErrors, GetSystemSettingsApiV1AdminSettingsGetResponse, GetSystemSettingsApiV1AdminSettingsGetResponses, GetUnreadCountApiV1NotificationsUnreadCountGetData, GetUnreadCountApiV1NotificationsUnreadCountGetResponse, GetUnreadCountApiV1NotificationsUnreadCountGetResponses, GetUserApiV1AdminUsersUserIdGetData, GetUserApiV1AdminUsersUserIdGetError, GetUserApiV1AdminUsersUserIdGetErrors, GetUserApiV1AdminUsersUserIdGetResponse, GetUserApiV1AdminUsersUserIdGetResponses, GetUserEventsApiV1EventsUserGetData, GetUserEventsApiV1EventsUserGetError, GetUserEventsApiV1EventsUserGetErrors, GetUserEventsApiV1EventsUserGetResponse, GetUserEventsApiV1EventsUserGetResponses, GetUserExecutionsApiV1UserExecutionsGetData, GetUserExecutionsApiV1UserExecutionsGetError, GetUserExecutionsApiV1UserExecutionsGetErrors, GetUserExecutionsApiV1UserExecutionsGetResponse, GetUserExecutionsApiV1UserExecutionsGetResponses, GetUserOverviewApiV1AdminUsersUserIdOverviewGetData, GetUserOverviewApiV1AdminUsersUserIdOverviewGetError, GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponse, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponses, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetData, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetError, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetErrors, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponse, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponses, GetUserSettingsApiV1UserSettingsGetData, GetUserSettingsApiV1UserSettingsGetResponse, GetUserSettingsApiV1UserSettingsGetResponses, GrafanaAlertItem, GrafanaWebhook, HourlyEventCountSchema, HttpValidationError, KafkaTopic, LanguageInfo, ListEventTypesApiV1EventsTypesListGetData, ListEventTypesApiV1EventsTypesListGetResponse, ListEventTypesApiV1EventsTypesListGetResponses, ListReplaySessionsApiV1ReplaySessionsGetData, ListReplaySessionsApiV1ReplaySessionsGetError, ListReplaySessionsApiV1ReplaySessionsGetErrors, ListReplaySessionsApiV1ReplaySessionsGetResponse, ListReplaySessionsApiV1ReplaySessionsGetResponses, ListSagasApiV1SagasGetData, ListSagasApiV1SagasGetError, ListSagasApiV1SagasGetErrors, ListSagasApiV1SagasGetResponse, ListSagasApiV1SagasGetResponses, ListSavedScriptsApiV1ScriptsGetData, ListSavedScriptsApiV1ScriptsGetResponse, ListSavedScriptsApiV1ScriptsGetResponses, ListUsersApiV1AdminUsersGetData, ListUsersApiV1AdminUsersGetError, ListUsersApiV1AdminUsersGetErrors, ListUsersApiV1AdminUsersGetResponse, ListUsersApiV1AdminUsersGetResponses, LivenessApiV1HealthLiveGetData, LivenessApiV1HealthLiveGetResponse, LivenessApiV1HealthLiveGetResponses, LivenessResponse, LoginApiV1AuthLoginPostData, LoginApiV1AuthLoginPostError, LoginApiV1AuthLoginPostErrors, LoginApiV1AuthLoginPostResponse, LoginApiV1AuthLoginPostResponses, LoginMethod, LoginResponse, LogoutApiV1AuthLogoutPostData, LogoutApiV1AuthLogoutPostResponse, LogoutApiV1AuthLogoutPostResponses, ManualRetryRequest, MarkAllReadApiV1NotificationsMarkAllReadPostData, MarkAllReadApiV1NotificationsMarkAllReadPostResponse, MarkAllReadApiV1NotificationsMarkAllReadPostResponses, MarkNotificationReadApiV1NotificationsNotificationIdReadPutData, MarkNotificationReadApiV1NotificationsNotificationIdReadPutError, MarkNotificationReadApiV1NotificationsNotificationIdReadPutErrors, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponse, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponses, MessageResponse, MonitoringSettingsSchema, NotificationAllReadEvent, NotificationChannel, NotificationClickedEvent, NotificationCreatedEvent, NotificationDeliveredEvent, NotificationFailedEvent, NotificationListResponse, NotificationPreferencesUpdatedEvent, NotificationReadEvent, NotificationResponse, NotificationSentEvent, NotificationSettings, NotificationSeverity, NotificationStatus, NotificationStreamApiV1EventsNotificationsStreamGetData, NotificationStreamApiV1EventsNotificationsStreamGetResponse, NotificationStreamApiV1EventsNotificationsStreamGetResponses, NotificationSubscription, PasswordResetRequest, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostData, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostError, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostErrors, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostResponse, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostResponses, PodCreatedEvent, PodDeletedEvent, PodFailedEvent, PodRunningEvent, PodScheduledEvent, PodSucceededEvent, PodTerminatedEvent, PublishCustomEventApiV1EventsPublishPostData, PublishCustomEventApiV1EventsPublishPostError, PublishCustomEventApiV1EventsPublishPostErrors, PublishCustomEventApiV1EventsPublishPostResponse, PublishCustomEventApiV1EventsPublishPostResponses, PublishEventRequest, PublishEventResponse, QueryEventsApiV1EventsQueryPostData, QueryEventsApiV1EventsQueryPostError, QueryEventsApiV1EventsQueryPostErrors, QueryEventsApiV1EventsQueryPostResponse, QueryEventsApiV1EventsQueryPostResponses, QueuePriority, QuotaExceededEvent, RateLimitAlgorithm, RateLimitExceededEvent, RateLimitRuleRequest, RateLimitRuleResponse, RateLimitSummary, RateLimitUpdateRequest, RateLimitUpdateResponse, ReadinessApiV1HealthReadyGetData, ReadinessApiV1HealthReadyGetResponse, ReadinessApiV1HealthReadyGetResponses, ReadinessResponse, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostData, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostError, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostErrors, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostResponse, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostResponses, RegisterApiV1AuthRegisterPostData, RegisterApiV1AuthRegisterPostError, RegisterApiV1AuthRegisterPostErrors, RegisterApiV1AuthRegisterPostResponse, RegisterApiV1AuthRegisterPostResponses, ReleaseResourcesCommandEvent, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostData, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostError, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostErrors, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostResponse, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostResponses, ReplayAggregateResponse, ReplayConfigSchema, ReplayError, ReplayEventsApiV1AdminEventsReplayPostData, ReplayEventsApiV1AdminEventsReplayPostError, ReplayEventsApiV1AdminEventsReplayPostErrors, ReplayEventsApiV1AdminEventsReplayPostResponse, ReplayEventsApiV1AdminEventsReplayPostResponses, ReplayFilter, ReplayFilterSchema, ReplayRequest, ReplayResponse, ReplaySession, ReplayStatus, ReplayTarget, ReplayType, ResetSystemSettingsApiV1AdminSettingsResetPostData, ResetSystemSettingsApiV1AdminSettingsResetPostError, ResetSystemSettingsApiV1AdminSettingsResetPostErrors, ResetSystemSettingsApiV1AdminSettingsResetPostResponse, ResetSystemSettingsApiV1AdminSettingsResetPostResponses, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostData, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostError, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostErrors, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostResponse, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostResponses, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostData, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostError, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostErrors, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostResponse, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostResponses, ResourceLimitExceededEvent, ResourceLimits, ResourceUsage, ResourceUsageDomain, RestoreSettingsApiV1UserSettingsRestorePostData, RestoreSettingsApiV1UserSettingsRestorePostError, RestoreSettingsApiV1UserSettingsRestorePostErrors, RestoreSettingsApiV1UserSettingsRestorePostResponse, RestoreSettingsApiV1UserSettingsRestorePostResponses, RestoreSettingsRequest, ResultFailedEvent, ResultStoredEvent, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostData, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostError, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostErrors, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostResponse, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostResponses, RetryDlqMessagesApiV1DlqRetryPostData, RetryDlqMessagesApiV1DlqRetryPostError, RetryDlqMessagesApiV1DlqRetryPostErrors, RetryDlqMessagesApiV1DlqRetryPostResponse, RetryDlqMessagesApiV1DlqRetryPostResponses, RetryExecutionApiV1ExecutionsExecutionIdRetryPostData, RetryExecutionApiV1ExecutionsExecutionIdRetryPostError, RetryExecutionApiV1ExecutionsExecutionIdRetryPostErrors, RetryExecutionApiV1ExecutionsExecutionIdRetryPostResponse, RetryExecutionApiV1ExecutionsExecutionIdRetryPostResponses, RetryExecutionRequest, RetryPolicyRequest, RetryStrategy, SagaCancellationResponse, SagaCancelledEvent, SagaCompensatedEvent, SagaCompensatingEvent, SagaCompletedEvent, SagaFailedEvent, SagaListResponse, SagaStartedEvent, SagaState, SagaStatusResponse, SavedScriptCreateRequest, SavedScriptResponse, SavedScriptUpdate, ScriptDeletedEvent, ScriptSavedEvent, ScriptSharedEvent, SecuritySettingsSchema, SecurityViolationEvent, ServiceEventCountSchema, ServiceRecoveredEvent, ServiceUnhealthyEvent, SessionSummary, SessionSummaryWritable, SetRetryPolicyApiV1DlqRetryPolicyPostData, SetRetryPolicyApiV1DlqRetryPolicyPostError, SetRetryPolicyApiV1DlqRetryPolicyPostErrors, SetRetryPolicyApiV1DlqRetryPolicyPostResponse, SetRetryPolicyApiV1DlqRetryPolicyPostResponses, SettingsHistoryEntry, SettingsHistoryResponse, SortOrder, SseControlEvent, SseExecutionEventData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostError, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostErrors, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponse, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponses, StorageType, SubscriptionsResponse, SubscriptionUpdate, SystemErrorEvent, SystemSettings, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetData, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetResponse, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetResponses, Theme, ThemeUpdateRequest, TokenValidationResponse, TopicStatistic, UnreadCountResponse, UpdateCustomSettingApiV1UserSettingsCustomKeyPutData, UpdateCustomSettingApiV1UserSettingsCustomKeyPutError, UpdateCustomSettingApiV1UserSettingsCustomKeyPutErrors, UpdateCustomSettingApiV1UserSettingsCustomKeyPutResponse, UpdateCustomSettingApiV1UserSettingsCustomKeyPutResponses, UpdateEditorSettingsApiV1UserSettingsEditorPutData, UpdateEditorSettingsApiV1UserSettingsEditorPutError, UpdateEditorSettingsApiV1UserSettingsEditorPutErrors, UpdateEditorSettingsApiV1UserSettingsEditorPutResponse, UpdateEditorSettingsApiV1UserSettingsEditorPutResponses, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutData, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutError, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutErrors, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutResponse, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutResponses, UpdateSavedScriptApiV1ScriptsScriptIdPutData, UpdateSavedScriptApiV1ScriptsScriptIdPutError, UpdateSavedScriptApiV1ScriptsScriptIdPutErrors, UpdateSavedScriptApiV1ScriptsScriptIdPutResponse, UpdateSavedScriptApiV1ScriptsScriptIdPutResponses, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutData, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutError, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutErrors, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutResponse, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutResponses, UpdateSystemSettingsApiV1AdminSettingsPutData, UpdateSystemSettingsApiV1AdminSettingsPutError, UpdateSystemSettingsApiV1AdminSettingsPutErrors, UpdateSystemSettingsApiV1AdminSettingsPutResponse, UpdateSystemSettingsApiV1AdminSettingsPutResponses, UpdateThemeApiV1UserSettingsThemePutData, UpdateThemeApiV1UserSettingsThemePutError, UpdateThemeApiV1UserSettingsThemePutErrors, UpdateThemeApiV1UserSettingsThemePutResponse, UpdateThemeApiV1UserSettingsThemePutResponses, UpdateUserApiV1AdminUsersUserIdPutData, UpdateUserApiV1AdminUsersUserIdPutError, UpdateUserApiV1AdminUsersUserIdPutErrors, UpdateUserApiV1AdminUsersUserIdPutResponse, UpdateUserApiV1AdminUsersUserIdPutResponses, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutData, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutError, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutErrors, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutResponse, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutResponses, UpdateUserSettingsApiV1UserSettingsPutData, UpdateUserSettingsApiV1UserSettingsPutError, UpdateUserSettingsApiV1UserSettingsPutErrors, UpdateUserSettingsApiV1UserSettingsPutResponse, UpdateUserSettingsApiV1UserSettingsPutResponses, UserCreate, UserDeletedEvent, UserEventCountSchema, UserListResponse, UserLoggedInEvent, UserLoggedOutEvent, UserLoginEvent, UserRateLimitConfigResponse, UserRateLimitsResponse, UserRegisteredEvent, UserResponse, UserRole, UserSettings, UserSettingsUpdate, UserSettingsUpdatedEvent, UserUpdate, UserUpdatedEvent, ValidationError, VerifyTokenApiV1AuthVerifyTokenGetData, VerifyTokenApiV1AuthVerifyTokenGetError, VerifyTokenApiV1AuthVerifyTokenGetErrors, VerifyTokenApiV1AuthVerifyTokenGetResponse, VerifyTokenApiV1AuthVerifyTokenGetResponses } from './types.gen'; diff --git a/frontend/src/lib/api/sdk.gen.ts b/frontend/src/lib/api/sdk.gen.ts index c37eb49f..5dda9a3f 100644 --- a/frontend/src/lib/api/sdk.gen.ts +++ b/frontend/src/lib/api/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, type Options as Options2, type TDataShape, urlSearchParamsBodySerializer } from './client'; import { client } from './client.gen'; -import type { AggregateEventsApiV1EventsAggregatePostData, AggregateEventsApiV1EventsAggregatePostErrors, AggregateEventsApiV1EventsAggregatePostResponses, BrowseEventsApiV1AdminEventsBrowsePostData, BrowseEventsApiV1AdminEventsBrowsePostErrors, BrowseEventsApiV1AdminEventsBrowsePostResponses, CancelExecutionApiV1ExecutionsExecutionIdCancelPostData, CancelExecutionApiV1ExecutionsExecutionIdCancelPostErrors, CancelExecutionApiV1ExecutionsExecutionIdCancelPostResponses, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostData, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostErrors, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostResponses, CancelSagaApiV1SagasSagaIdCancelPostData, CancelSagaApiV1SagasSagaIdCancelPostErrors, CancelSagaApiV1SagasSagaIdCancelPostResponses, CleanupOldSessionsApiV1ReplayCleanupPostData, CleanupOldSessionsApiV1ReplayCleanupPostErrors, CleanupOldSessionsApiV1ReplayCleanupPostResponses, CreateExecutionApiV1ExecutePostData, CreateExecutionApiV1ExecutePostErrors, CreateExecutionApiV1ExecutePostResponses, CreateReplaySessionApiV1ReplaySessionsPostData, CreateReplaySessionApiV1ReplaySessionsPostErrors, CreateReplaySessionApiV1ReplaySessionsPostResponses, CreateSavedScriptApiV1ScriptsPostData, CreateSavedScriptApiV1ScriptsPostErrors, CreateSavedScriptApiV1ScriptsPostResponses, CreateUserApiV1AdminUsersPostData, CreateUserApiV1AdminUsersPostErrors, CreateUserApiV1AdminUsersPostResponses, DeleteEventApiV1AdminEventsEventIdDeleteData, DeleteEventApiV1AdminEventsEventIdDeleteErrors, DeleteEventApiV1AdminEventsEventIdDeleteResponses, DeleteEventApiV1EventsEventIdDeleteData, DeleteEventApiV1EventsEventIdDeleteErrors, DeleteEventApiV1EventsEventIdDeleteResponses, DeleteExecutionApiV1ExecutionsExecutionIdDeleteData, DeleteExecutionApiV1ExecutionsExecutionIdDeleteErrors, DeleteExecutionApiV1ExecutionsExecutionIdDeleteResponses, DeleteNotificationApiV1NotificationsNotificationIdDeleteData, DeleteNotificationApiV1NotificationsNotificationIdDeleteErrors, DeleteNotificationApiV1NotificationsNotificationIdDeleteResponses, DeleteSavedScriptApiV1ScriptsScriptIdDeleteData, DeleteSavedScriptApiV1ScriptsScriptIdDeleteErrors, DeleteSavedScriptApiV1ScriptsScriptIdDeleteResponses, DeleteUserApiV1AdminUsersUserIdDeleteData, DeleteUserApiV1AdminUsersUserIdDeleteErrors, DeleteUserApiV1AdminUsersUserIdDeleteResponses, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteData, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteErrors, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteResponses, ExecutionEventsApiV1EventsExecutionsExecutionIdGetData, ExecutionEventsApiV1EventsExecutionsExecutionIdGetErrors, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponses, ExportEventsCsvApiV1AdminEventsExportCsvGetData, ExportEventsCsvApiV1AdminEventsExportCsvGetErrors, ExportEventsCsvApiV1AdminEventsExportCsvGetResponses, ExportEventsJsonApiV1AdminEventsExportJsonGetData, ExportEventsJsonApiV1AdminEventsExportJsonGetErrors, ExportEventsJsonApiV1AdminEventsExportJsonGetResponses, GetCurrentRequestEventsApiV1EventsCurrentRequestGetData, GetCurrentRequestEventsApiV1EventsCurrentRequestGetErrors, GetCurrentRequestEventsApiV1EventsCurrentRequestGetResponses, GetCurrentUserProfileApiV1AuthMeGetData, GetCurrentUserProfileApiV1AuthMeGetResponses, GetDlqMessageApiV1DlqMessagesEventIdGetData, GetDlqMessageApiV1DlqMessagesEventIdGetErrors, GetDlqMessageApiV1DlqMessagesEventIdGetResponses, GetDlqMessagesApiV1DlqMessagesGetData, GetDlqMessagesApiV1DlqMessagesGetErrors, GetDlqMessagesApiV1DlqMessagesGetResponses, GetDlqStatisticsApiV1DlqStatsGetData, GetDlqStatisticsApiV1DlqStatsGetResponses, GetDlqTopicsApiV1DlqTopicsGetData, GetDlqTopicsApiV1DlqTopicsGetResponses, GetEventApiV1EventsEventIdGetData, GetEventApiV1EventsEventIdGetErrors, GetEventApiV1EventsEventIdGetResponses, GetEventDetailApiV1AdminEventsEventIdGetData, GetEventDetailApiV1AdminEventsEventIdGetErrors, GetEventDetailApiV1AdminEventsEventIdGetResponses, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetData, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetErrors, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetResponses, GetEventStatisticsApiV1EventsStatisticsGetData, GetEventStatisticsApiV1EventsStatisticsGetErrors, GetEventStatisticsApiV1EventsStatisticsGetResponses, GetEventStatsApiV1AdminEventsStatsGetData, GetEventStatsApiV1AdminEventsStatsGetErrors, GetEventStatsApiV1AdminEventsStatsGetResponses, GetExampleScriptsApiV1ExampleScriptsGetData, GetExampleScriptsApiV1ExampleScriptsGetResponses, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetData, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetErrors, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetResponses, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetData, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetErrors, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetResponses, GetExecutionSagasApiV1SagasExecutionExecutionIdGetData, GetExecutionSagasApiV1SagasExecutionExecutionIdGetErrors, GetExecutionSagasApiV1SagasExecutionExecutionIdGetResponses, GetK8sResourceLimitsApiV1K8sLimitsGetData, GetK8sResourceLimitsApiV1K8sLimitsGetResponses, GetNotificationsApiV1NotificationsGetData, GetNotificationsApiV1NotificationsGetErrors, GetNotificationsApiV1NotificationsGetResponses, GetReplaySessionApiV1ReplaySessionsSessionIdGetData, GetReplaySessionApiV1ReplaySessionsSessionIdGetErrors, GetReplaySessionApiV1ReplaySessionsSessionIdGetResponses, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetData, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetErrors, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetResponses, GetResultApiV1ExecutionsExecutionIdResultGetData, GetResultApiV1ExecutionsExecutionIdResultGetErrors, GetResultApiV1ExecutionsExecutionIdResultGetResponses, GetSagaStatusApiV1SagasSagaIdGetData, GetSagaStatusApiV1SagasSagaIdGetErrors, GetSagaStatusApiV1SagasSagaIdGetResponses, GetSavedScriptApiV1ScriptsScriptIdGetData, GetSavedScriptApiV1ScriptsScriptIdGetErrors, GetSavedScriptApiV1ScriptsScriptIdGetResponses, GetSettingsHistoryApiV1UserSettingsHistoryGetData, GetSettingsHistoryApiV1UserSettingsHistoryGetErrors, GetSettingsHistoryApiV1UserSettingsHistoryGetResponses, GetSubscriptionsApiV1NotificationsSubscriptionsGetData, GetSubscriptionsApiV1NotificationsSubscriptionsGetResponses, GetSystemSettingsApiV1AdminSettingsGetData, GetSystemSettingsApiV1AdminSettingsGetResponses, GetUnreadCountApiV1NotificationsUnreadCountGetData, GetUnreadCountApiV1NotificationsUnreadCountGetResponses, GetUserApiV1AdminUsersUserIdGetData, GetUserApiV1AdminUsersUserIdGetErrors, GetUserApiV1AdminUsersUserIdGetResponses, GetUserEventsApiV1EventsUserGetData, GetUserEventsApiV1EventsUserGetErrors, GetUserEventsApiV1EventsUserGetResponses, GetUserExecutionsApiV1UserExecutionsGetData, GetUserExecutionsApiV1UserExecutionsGetErrors, GetUserExecutionsApiV1UserExecutionsGetResponses, GetUserOverviewApiV1AdminUsersUserIdOverviewGetData, GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponses, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetData, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetErrors, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponses, GetUserSettingsApiV1UserSettingsGetData, GetUserSettingsApiV1UserSettingsGetResponses, ListEventTypesApiV1EventsTypesListGetData, ListEventTypesApiV1EventsTypesListGetResponses, ListReplaySessionsApiV1ReplaySessionsGetData, ListReplaySessionsApiV1ReplaySessionsGetErrors, ListReplaySessionsApiV1ReplaySessionsGetResponses, ListSagasApiV1SagasGetData, ListSagasApiV1SagasGetErrors, ListSagasApiV1SagasGetResponses, ListSavedScriptsApiV1ScriptsGetData, ListSavedScriptsApiV1ScriptsGetResponses, ListUsersApiV1AdminUsersGetData, ListUsersApiV1AdminUsersGetErrors, ListUsersApiV1AdminUsersGetResponses, LivenessApiV1HealthLiveGetData, LivenessApiV1HealthLiveGetResponses, LoginApiV1AuthLoginPostData, LoginApiV1AuthLoginPostErrors, LoginApiV1AuthLoginPostResponses, LogoutApiV1AuthLogoutPostData, LogoutApiV1AuthLogoutPostResponses, MarkAllReadApiV1NotificationsMarkAllReadPostData, MarkAllReadApiV1NotificationsMarkAllReadPostResponses, MarkNotificationReadApiV1NotificationsNotificationIdReadPutData, MarkNotificationReadApiV1NotificationsNotificationIdReadPutErrors, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponses, NotificationStreamApiV1EventsNotificationsStreamGetData, NotificationStreamApiV1EventsNotificationsStreamGetResponses, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostData, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostErrors, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostResponses, PublishCustomEventApiV1EventsPublishPostData, PublishCustomEventApiV1EventsPublishPostErrors, PublishCustomEventApiV1EventsPublishPostResponses, QueryEventsApiV1EventsQueryPostData, QueryEventsApiV1EventsQueryPostErrors, QueryEventsApiV1EventsQueryPostResponses, ReadinessApiV1HealthReadyGetData, ReadinessApiV1HealthReadyGetResponses, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostData, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostErrors, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostResponses, RegisterApiV1AuthRegisterPostData, RegisterApiV1AuthRegisterPostErrors, RegisterApiV1AuthRegisterPostResponses, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostData, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostErrors, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostResponses, ReplayEventsApiV1AdminEventsReplayPostData, ReplayEventsApiV1AdminEventsReplayPostErrors, ReplayEventsApiV1AdminEventsReplayPostResponses, ResetSystemSettingsApiV1AdminSettingsResetPostData, ResetSystemSettingsApiV1AdminSettingsResetPostResponses, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostData, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostErrors, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostResponses, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostData, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostErrors, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostResponses, RestoreSettingsApiV1UserSettingsRestorePostData, RestoreSettingsApiV1UserSettingsRestorePostErrors, RestoreSettingsApiV1UserSettingsRestorePostResponses, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostData, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostErrors, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostResponses, RetryDlqMessagesApiV1DlqRetryPostData, RetryDlqMessagesApiV1DlqRetryPostErrors, RetryDlqMessagesApiV1DlqRetryPostResponses, RetryExecutionApiV1ExecutionsExecutionIdRetryPostData, RetryExecutionApiV1ExecutionsExecutionIdRetryPostErrors, RetryExecutionApiV1ExecutionsExecutionIdRetryPostResponses, SetRetryPolicyApiV1DlqRetryPolicyPostData, SetRetryPolicyApiV1DlqRetryPolicyPostErrors, SetRetryPolicyApiV1DlqRetryPolicyPostResponses, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostErrors, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponses, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetData, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetResponses, UpdateCustomSettingApiV1UserSettingsCustomKeyPutData, UpdateCustomSettingApiV1UserSettingsCustomKeyPutErrors, UpdateCustomSettingApiV1UserSettingsCustomKeyPutResponses, UpdateEditorSettingsApiV1UserSettingsEditorPutData, UpdateEditorSettingsApiV1UserSettingsEditorPutErrors, UpdateEditorSettingsApiV1UserSettingsEditorPutResponses, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutData, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutErrors, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutResponses, UpdateSavedScriptApiV1ScriptsScriptIdPutData, UpdateSavedScriptApiV1ScriptsScriptIdPutErrors, UpdateSavedScriptApiV1ScriptsScriptIdPutResponses, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutData, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutErrors, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutResponses, UpdateSystemSettingsApiV1AdminSettingsPutData, UpdateSystemSettingsApiV1AdminSettingsPutErrors, UpdateSystemSettingsApiV1AdminSettingsPutResponses, UpdateThemeApiV1UserSettingsThemePutData, UpdateThemeApiV1UserSettingsThemePutErrors, UpdateThemeApiV1UserSettingsThemePutResponses, UpdateUserApiV1AdminUsersUserIdPutData, UpdateUserApiV1AdminUsersUserIdPutErrors, UpdateUserApiV1AdminUsersUserIdPutResponses, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutData, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutErrors, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutResponses, UpdateUserSettingsApiV1UserSettingsPutData, UpdateUserSettingsApiV1UserSettingsPutErrors, UpdateUserSettingsApiV1UserSettingsPutResponses, VerifyTokenApiV1AuthVerifyTokenGetData, VerifyTokenApiV1AuthVerifyTokenGetResponses } from './types.gen'; +import type { AggregateEventsApiV1EventsAggregatePostData, AggregateEventsApiV1EventsAggregatePostErrors, AggregateEventsApiV1EventsAggregatePostResponses, BrowseEventsApiV1AdminEventsBrowsePostData, BrowseEventsApiV1AdminEventsBrowsePostErrors, BrowseEventsApiV1AdminEventsBrowsePostResponses, CancelExecutionApiV1ExecutionsExecutionIdCancelPostData, CancelExecutionApiV1ExecutionsExecutionIdCancelPostErrors, CancelExecutionApiV1ExecutionsExecutionIdCancelPostResponses, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostData, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostErrors, CancelReplaySessionApiV1ReplaySessionsSessionIdCancelPostResponses, CancelSagaApiV1SagasSagaIdCancelPostData, CancelSagaApiV1SagasSagaIdCancelPostErrors, CancelSagaApiV1SagasSagaIdCancelPostResponses, CleanupOldSessionsApiV1ReplayCleanupPostData, CleanupOldSessionsApiV1ReplayCleanupPostErrors, CleanupOldSessionsApiV1ReplayCleanupPostResponses, CreateExecutionApiV1ExecutePostData, CreateExecutionApiV1ExecutePostErrors, CreateExecutionApiV1ExecutePostResponses, CreateReplaySessionApiV1ReplaySessionsPostData, CreateReplaySessionApiV1ReplaySessionsPostErrors, CreateReplaySessionApiV1ReplaySessionsPostResponses, CreateSavedScriptApiV1ScriptsPostData, CreateSavedScriptApiV1ScriptsPostErrors, CreateSavedScriptApiV1ScriptsPostResponses, CreateUserApiV1AdminUsersPostData, CreateUserApiV1AdminUsersPostErrors, CreateUserApiV1AdminUsersPostResponses, DeleteEventApiV1AdminEventsEventIdDeleteData, DeleteEventApiV1AdminEventsEventIdDeleteErrors, DeleteEventApiV1AdminEventsEventIdDeleteResponses, DeleteEventApiV1EventsEventIdDeleteData, DeleteEventApiV1EventsEventIdDeleteErrors, DeleteEventApiV1EventsEventIdDeleteResponses, DeleteExecutionApiV1ExecutionsExecutionIdDeleteData, DeleteExecutionApiV1ExecutionsExecutionIdDeleteErrors, DeleteExecutionApiV1ExecutionsExecutionIdDeleteResponses, DeleteNotificationApiV1NotificationsNotificationIdDeleteData, DeleteNotificationApiV1NotificationsNotificationIdDeleteErrors, DeleteNotificationApiV1NotificationsNotificationIdDeleteResponses, DeleteSavedScriptApiV1ScriptsScriptIdDeleteData, DeleteSavedScriptApiV1ScriptsScriptIdDeleteErrors, DeleteSavedScriptApiV1ScriptsScriptIdDeleteResponses, DeleteUserApiV1AdminUsersUserIdDeleteData, DeleteUserApiV1AdminUsersUserIdDeleteErrors, DeleteUserApiV1AdminUsersUserIdDeleteResponses, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteData, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteErrors, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteResponses, ExecutionEventsApiV1EventsExecutionsExecutionIdGetData, ExecutionEventsApiV1EventsExecutionsExecutionIdGetErrors, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponses, ExportEventsCsvApiV1AdminEventsExportCsvGetData, ExportEventsCsvApiV1AdminEventsExportCsvGetErrors, ExportEventsCsvApiV1AdminEventsExportCsvGetResponses, ExportEventsJsonApiV1AdminEventsExportJsonGetData, ExportEventsJsonApiV1AdminEventsExportJsonGetErrors, ExportEventsJsonApiV1AdminEventsExportJsonGetResponses, GetCurrentRequestEventsApiV1EventsCurrentRequestGetData, GetCurrentRequestEventsApiV1EventsCurrentRequestGetErrors, GetCurrentRequestEventsApiV1EventsCurrentRequestGetResponses, GetCurrentUserProfileApiV1AuthMeGetData, GetCurrentUserProfileApiV1AuthMeGetResponses, GetDlqMessageApiV1DlqMessagesEventIdGetData, GetDlqMessageApiV1DlqMessagesEventIdGetErrors, GetDlqMessageApiV1DlqMessagesEventIdGetResponses, GetDlqMessagesApiV1DlqMessagesGetData, GetDlqMessagesApiV1DlqMessagesGetErrors, GetDlqMessagesApiV1DlqMessagesGetResponses, GetDlqStatisticsApiV1DlqStatsGetData, GetDlqStatisticsApiV1DlqStatsGetResponses, GetDlqTopicsApiV1DlqTopicsGetData, GetDlqTopicsApiV1DlqTopicsGetResponses, GetEventApiV1EventsEventIdGetData, GetEventApiV1EventsEventIdGetErrors, GetEventApiV1EventsEventIdGetResponses, GetEventDetailApiV1AdminEventsEventIdGetData, GetEventDetailApiV1AdminEventsEventIdGetErrors, GetEventDetailApiV1AdminEventsEventIdGetResponses, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetData, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetErrors, GetEventsByCorrelationApiV1EventsCorrelationCorrelationIdGetResponses, GetEventStatisticsApiV1EventsStatisticsGetData, GetEventStatisticsApiV1EventsStatisticsGetErrors, GetEventStatisticsApiV1EventsStatisticsGetResponses, GetEventStatsApiV1AdminEventsStatsGetData, GetEventStatsApiV1AdminEventsStatsGetErrors, GetEventStatsApiV1AdminEventsStatsGetResponses, GetExampleScriptsApiV1ExampleScriptsGetData, GetExampleScriptsApiV1ExampleScriptsGetResponses, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetData, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetErrors, GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetResponses, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetData, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetErrors, GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetResponses, GetExecutionSagasApiV1SagasExecutionExecutionIdGetData, GetExecutionSagasApiV1SagasExecutionExecutionIdGetErrors, GetExecutionSagasApiV1SagasExecutionExecutionIdGetResponses, GetK8sResourceLimitsApiV1K8sLimitsGetData, GetK8sResourceLimitsApiV1K8sLimitsGetErrors, GetK8sResourceLimitsApiV1K8sLimitsGetResponses, GetNotificationsApiV1NotificationsGetData, GetNotificationsApiV1NotificationsGetErrors, GetNotificationsApiV1NotificationsGetResponses, GetReplaySessionApiV1ReplaySessionsSessionIdGetData, GetReplaySessionApiV1ReplaySessionsSessionIdGetErrors, GetReplaySessionApiV1ReplaySessionsSessionIdGetResponses, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetData, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetErrors, GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetResponses, GetResultApiV1ExecutionsExecutionIdResultGetData, GetResultApiV1ExecutionsExecutionIdResultGetErrors, GetResultApiV1ExecutionsExecutionIdResultGetResponses, GetSagaStatusApiV1SagasSagaIdGetData, GetSagaStatusApiV1SagasSagaIdGetErrors, GetSagaStatusApiV1SagasSagaIdGetResponses, GetSavedScriptApiV1ScriptsScriptIdGetData, GetSavedScriptApiV1ScriptsScriptIdGetErrors, GetSavedScriptApiV1ScriptsScriptIdGetResponses, GetSettingsHistoryApiV1UserSettingsHistoryGetData, GetSettingsHistoryApiV1UserSettingsHistoryGetErrors, GetSettingsHistoryApiV1UserSettingsHistoryGetResponses, GetSubscriptionsApiV1NotificationsSubscriptionsGetData, GetSubscriptionsApiV1NotificationsSubscriptionsGetResponses, GetSystemSettingsApiV1AdminSettingsGetData, GetSystemSettingsApiV1AdminSettingsGetErrors, GetSystemSettingsApiV1AdminSettingsGetResponses, GetUnreadCountApiV1NotificationsUnreadCountGetData, GetUnreadCountApiV1NotificationsUnreadCountGetResponses, GetUserApiV1AdminUsersUserIdGetData, GetUserApiV1AdminUsersUserIdGetErrors, GetUserApiV1AdminUsersUserIdGetResponses, GetUserEventsApiV1EventsUserGetData, GetUserEventsApiV1EventsUserGetErrors, GetUserEventsApiV1EventsUserGetResponses, GetUserExecutionsApiV1UserExecutionsGetData, GetUserExecutionsApiV1UserExecutionsGetErrors, GetUserExecutionsApiV1UserExecutionsGetResponses, GetUserOverviewApiV1AdminUsersUserIdOverviewGetData, GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponses, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetData, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetErrors, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponses, GetUserSettingsApiV1UserSettingsGetData, GetUserSettingsApiV1UserSettingsGetResponses, ListEventTypesApiV1EventsTypesListGetData, ListEventTypesApiV1EventsTypesListGetResponses, ListReplaySessionsApiV1ReplaySessionsGetData, ListReplaySessionsApiV1ReplaySessionsGetErrors, ListReplaySessionsApiV1ReplaySessionsGetResponses, ListSagasApiV1SagasGetData, ListSagasApiV1SagasGetErrors, ListSagasApiV1SagasGetResponses, ListSavedScriptsApiV1ScriptsGetData, ListSavedScriptsApiV1ScriptsGetResponses, ListUsersApiV1AdminUsersGetData, ListUsersApiV1AdminUsersGetErrors, ListUsersApiV1AdminUsersGetResponses, LivenessApiV1HealthLiveGetData, LivenessApiV1HealthLiveGetResponses, LoginApiV1AuthLoginPostData, LoginApiV1AuthLoginPostErrors, LoginApiV1AuthLoginPostResponses, LogoutApiV1AuthLogoutPostData, LogoutApiV1AuthLogoutPostResponses, MarkAllReadApiV1NotificationsMarkAllReadPostData, MarkAllReadApiV1NotificationsMarkAllReadPostResponses, MarkNotificationReadApiV1NotificationsNotificationIdReadPutData, MarkNotificationReadApiV1NotificationsNotificationIdReadPutErrors, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponses, NotificationStreamApiV1EventsNotificationsStreamGetData, NotificationStreamApiV1EventsNotificationsStreamGetResponses, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostData, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostErrors, PauseReplaySessionApiV1ReplaySessionsSessionIdPausePostResponses, PublishCustomEventApiV1EventsPublishPostData, PublishCustomEventApiV1EventsPublishPostErrors, PublishCustomEventApiV1EventsPublishPostResponses, QueryEventsApiV1EventsQueryPostData, QueryEventsApiV1EventsQueryPostErrors, QueryEventsApiV1EventsQueryPostResponses, ReadinessApiV1HealthReadyGetData, ReadinessApiV1HealthReadyGetResponses, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostData, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostErrors, ReceiveGrafanaAlertsApiV1AlertsGrafanaPostResponses, RegisterApiV1AuthRegisterPostData, RegisterApiV1AuthRegisterPostErrors, RegisterApiV1AuthRegisterPostResponses, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostData, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostErrors, ReplayAggregateEventsApiV1EventsReplayAggregateIdPostResponses, ReplayEventsApiV1AdminEventsReplayPostData, ReplayEventsApiV1AdminEventsReplayPostErrors, ReplayEventsApiV1AdminEventsReplayPostResponses, ResetSystemSettingsApiV1AdminSettingsResetPostData, ResetSystemSettingsApiV1AdminSettingsResetPostErrors, ResetSystemSettingsApiV1AdminSettingsResetPostResponses, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostData, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostErrors, ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostResponses, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostData, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostErrors, ResetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPostResponses, RestoreSettingsApiV1UserSettingsRestorePostData, RestoreSettingsApiV1UserSettingsRestorePostErrors, RestoreSettingsApiV1UserSettingsRestorePostResponses, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostData, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostErrors, ResumeReplaySessionApiV1ReplaySessionsSessionIdResumePostResponses, RetryDlqMessagesApiV1DlqRetryPostData, RetryDlqMessagesApiV1DlqRetryPostErrors, RetryDlqMessagesApiV1DlqRetryPostResponses, RetryExecutionApiV1ExecutionsExecutionIdRetryPostData, RetryExecutionApiV1ExecutionsExecutionIdRetryPostErrors, RetryExecutionApiV1ExecutionsExecutionIdRetryPostResponses, SetRetryPolicyApiV1DlqRetryPolicyPostData, SetRetryPolicyApiV1DlqRetryPolicyPostErrors, SetRetryPolicyApiV1DlqRetryPolicyPostResponses, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostErrors, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponses, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetData, TestGrafanaAlertEndpointApiV1AlertsGrafanaTestGetResponses, UpdateCustomSettingApiV1UserSettingsCustomKeyPutData, UpdateCustomSettingApiV1UserSettingsCustomKeyPutErrors, UpdateCustomSettingApiV1UserSettingsCustomKeyPutResponses, UpdateEditorSettingsApiV1UserSettingsEditorPutData, UpdateEditorSettingsApiV1UserSettingsEditorPutErrors, UpdateEditorSettingsApiV1UserSettingsEditorPutResponses, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutData, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutErrors, UpdateNotificationSettingsApiV1UserSettingsNotificationsPutResponses, UpdateSavedScriptApiV1ScriptsScriptIdPutData, UpdateSavedScriptApiV1ScriptsScriptIdPutErrors, UpdateSavedScriptApiV1ScriptsScriptIdPutResponses, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutData, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutErrors, UpdateSubscriptionApiV1NotificationsSubscriptionsChannelPutResponses, UpdateSystemSettingsApiV1AdminSettingsPutData, UpdateSystemSettingsApiV1AdminSettingsPutErrors, UpdateSystemSettingsApiV1AdminSettingsPutResponses, UpdateThemeApiV1UserSettingsThemePutData, UpdateThemeApiV1UserSettingsThemePutErrors, UpdateThemeApiV1UserSettingsThemePutResponses, UpdateUserApiV1AdminUsersUserIdPutData, UpdateUserApiV1AdminUsersUserIdPutErrors, UpdateUserApiV1AdminUsersUserIdPutResponses, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutData, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutErrors, UpdateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPutResponses, UpdateUserSettingsApiV1UserSettingsPutData, UpdateUserSettingsApiV1UserSettingsPutErrors, UpdateUserSettingsApiV1UserSettingsPutResponses, VerifyTokenApiV1AuthVerifyTokenGetData, VerifyTokenApiV1AuthVerifyTokenGetErrors, VerifyTokenApiV1AuthVerifyTokenGetResponses } from './types.gen'; export type Options = Options2 & { /** @@ -20,6 +20,8 @@ export type Options(options: Options) => (options.client ?? client).post({ ...urlSearchParamsBodySerializer, @@ -33,6 +35,8 @@ export const loginApiV1AuthLoginPost = (op /** * Register + * + * Register a new user account. */ export const registerApiV1AuthRegisterPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/auth/register', @@ -45,21 +49,29 @@ export const registerApiV1AuthRegisterPost = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/auth/me', ...options }); /** * Verify Token + * + * Verify the current access token. */ -export const verifyTokenApiV1AuthVerifyTokenGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/auth/verify-token', ...options }); +export const verifyTokenApiV1AuthVerifyTokenGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/auth/verify-token', ...options }); /** * Logout + * + * Log out and clear session cookies. */ export const logoutApiV1AuthLogoutPost = (options?: Options) => (options?.client ?? client).post({ url: '/api/v1/auth/logout', ...options }); /** * Create Execution + * + * Submit a script for execution in an isolated Kubernetes pod. */ export const createExecutionApiV1ExecutePost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/execute', @@ -72,11 +84,15 @@ export const createExecutionApiV1ExecutePost = (options: Options) => (options.client ?? client).get({ url: '/api/v1/executions/{execution_id}/result', ...options }); /** * Cancel Execution + * + * Cancel a running or queued execution. */ export const cancelExecutionApiV1ExecutionsExecutionIdCancelPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/executions/{execution_id}/cancel', @@ -117,13 +133,17 @@ export const getUserExecutionsApiV1UserExecutionsGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/example-scripts', ...options }); /** * Get K8S Resource Limits + * + * Get Kubernetes resource limits for script execution. */ -export const getK8sResourceLimitsApiV1K8sLimitsGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/k8s-limits', ...options }); +export const getK8sResourceLimitsApiV1K8sLimitsGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/k8s-limits', ...options }); /** * Delete Execution @@ -134,11 +154,15 @@ export const deleteExecutionApiV1ExecutionsExecutionIdDelete = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/scripts', ...options }); /** * Create Saved Script + * + * Save a new script to the user's collection. */ export const createSavedScriptApiV1ScriptsPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/scripts', @@ -151,16 +175,22 @@ export const createSavedScriptApiV1ScriptsPost = (options: Options) => (options.client ?? client).delete({ url: '/api/v1/scripts/{script_id}', ...options }); /** * Get Saved Script + * + * Get a saved script by ID. */ export const getSavedScriptApiV1ScriptsScriptIdGet = (options: Options) => (options.client ?? client).get({ url: '/api/v1/scripts/{script_id}', ...options }); /** * Update Saved Script + * + * Update an existing saved script. */ export const updateSavedScriptApiV1ScriptsScriptIdPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/scripts/{script_id}', @@ -173,11 +203,15 @@ export const updateSavedScriptApiV1ScriptsScriptIdPut = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/replay/sessions', ...options }); /** * Create Replay Session + * + * Create a new event replay session from a configuration. */ export const createReplaySessionApiV1ReplaySessionsPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/replay/sessions', @@ -190,31 +224,43 @@ export const createReplaySessionApiV1ReplaySessionsPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/replay/sessions/{session_id}/start', ...options }); /** * Pause Replay Session + * + * Pause a running replay session. */ export const pauseReplaySessionApiV1ReplaySessionsSessionIdPausePost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/replay/sessions/{session_id}/pause', ...options }); /** * Resume Replay Session + * + * Resume a paused replay session. */ export const resumeReplaySessionApiV1ReplaySessionsSessionIdResumePost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/replay/sessions/{session_id}/resume', ...options }); /** * Cancel Replay Session + * + * Cancel and stop a replay session. */ export const cancelReplaySessionApiV1ReplaySessionsSessionIdCancelPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/replay/sessions/{session_id}/cancel', ...options }); /** * Get Replay Session + * + * Get full details of a replay session. */ export const getReplaySessionApiV1ReplaySessionsSessionIdGet = (options: Options) => (options.client ?? client).get({ url: '/api/v1/replay/sessions/{session_id}', ...options }); /** * Cleanup Old Sessions + * + * Remove replay sessions older than the specified threshold. */ export const cleanupOldSessionsApiV1ReplayCleanupPost = (options?: Options) => (options?.client ?? client).post({ url: '/api/v1/replay/cleanup', ...options }); @@ -234,26 +280,36 @@ export const readinessApiV1HealthReadyGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/dlq/stats', ...options }); /** * Get Dlq Messages + * + * List DLQ messages with optional filtering. */ export const getDlqMessagesApiV1DlqMessagesGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/dlq/messages', ...options }); /** * Discard Dlq Message + * + * Permanently discard a DLQ message with a reason. */ export const discardDlqMessageApiV1DlqMessagesEventIdDelete = (options: Options) => (options.client ?? client).delete({ url: '/api/v1/dlq/messages/{event_id}', ...options }); /** * Get Dlq Message + * + * Get details of a specific DLQ message. */ export const getDlqMessageApiV1DlqMessagesEventIdGet = (options: Options) => (options.client ?? client).get({ url: '/api/v1/dlq/messages/{event_id}', ...options }); /** * Retry Dlq Messages + * + * Retry a batch of DLQ messages by their event IDs. */ export const retryDlqMessagesApiV1DlqRetryPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/dlq/retry', @@ -266,6 +322,8 @@ export const retryDlqMessagesApiV1DlqRetryPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/dlq/retry-policy', @@ -278,6 +336,8 @@ export const setRetryPolicyApiV1DlqRetryPolicyPost = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/dlq/topics', ...options }); @@ -297,18 +357,22 @@ export const executionEventsApiV1EventsExecutionsExecutionIdGet = (options: Options) => (options.client ?? client).get({ url: '/api/v1/events/executions/{execution_id}/events', ...options }); /** * Get User Events * - * Get events for the current user + * Get events for the current user. */ export const getUserEventsApiV1EventsUserGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/events/user', ...options }); /** * Query Events + * + * Query events with advanced filters. */ export const queryEventsApiV1EventsQueryPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/events/query', @@ -321,33 +385,43 @@ export const queryEventsApiV1EventsQueryPost = (options: Options) => (options.client ?? client).get({ url: '/api/v1/events/correlation/{correlation_id}', ...options }); /** * Get Current Request Events + * + * Get events associated with the current HTTP request's correlation ID. */ export const getCurrentRequestEventsApiV1EventsCurrentRequestGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/events/current-request', ...options }); /** * Get Event Statistics + * + * Get aggregated event statistics for a time range. */ export const getEventStatisticsApiV1EventsStatisticsGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/events/statistics', ...options }); /** * Delete Event + * + * Delete and archive an event (admin only). */ export const deleteEventApiV1EventsEventIdDelete = (options: Options) => (options.client ?? client).delete({ url: '/api/v1/events/{event_id}', ...options }); /** * Get Event * - * Get a specific event by ID + * Get a specific event by ID. */ export const getEventApiV1EventsEventIdGet = (options: Options) => (options.client ?? client).get({ url: '/api/v1/events/{event_id}', ...options }); /** * Publish Custom Event + * + * Publish a custom event to Kafka (admin only). */ export const publishCustomEventApiV1EventsPublishPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/events/publish', @@ -360,6 +434,8 @@ export const publishCustomEventApiV1EventsPublishPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/events/aggregate', @@ -372,16 +448,22 @@ export const aggregateEventsApiV1EventsAggregatePost = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/events/types/list', ...options }); /** * Replay Aggregate Events + * + * Replay all events for an aggregate (admin only). */ export const replayAggregateEventsApiV1EventsReplayAggregateIdPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/events/replay/{aggregate_id}', ...options }); /** * Browse Events + * + * Browse events with filtering, sorting, and pagination. */ export const browseEventsApiV1AdminEventsBrowsePost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/admin/events/browse', @@ -394,11 +476,15 @@ export const browseEventsApiV1AdminEventsBrowsePost = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/admin/events/stats', ...options }); /** * Export Events Csv + * + * Export filtered events as a downloadable CSV file. */ export const exportEventsCsvApiV1AdminEventsExportCsvGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/admin/events/export/csv', ...options }); @@ -411,16 +497,22 @@ export const exportEventsJsonApiV1AdminEventsExportJsonGet = (options: Options) => (options.client ?? client).delete({ url: '/api/v1/admin/events/{event_id}', ...options }); /** * Get Event Detail + * + * Get detailed information about a single event, including related events and timeline. */ export const getEventDetailApiV1AdminEventsEventIdGet = (options: Options) => (options.client ?? client).get({ url: '/api/v1/admin/events/{event_id}', ...options }); /** * Replay Events + * + * Replay events by filter criteria, with optional dry-run mode. */ export const replayEventsApiV1AdminEventsReplayPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/admin/events/replay', @@ -433,16 +525,22 @@ export const replayEventsApiV1AdminEventsReplayPost = (options: Options) => (options.client ?? client).get({ url: '/api/v1/admin/events/replay/{session_id}/status', ...options }); /** * Get System Settings + * + * Get the current system-wide settings. */ -export const getSystemSettingsApiV1AdminSettingsGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/admin/settings/', ...options }); +export const getSystemSettingsApiV1AdminSettingsGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/admin/settings/', ...options }); /** * Update System Settings + * + * Replace system-wide settings. */ export const updateSystemSettingsApiV1AdminSettingsPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/admin/settings/', @@ -455,11 +553,15 @@ export const updateSystemSettingsApiV1AdminSettingsPut = (options?: Options) => (options?.client ?? client).post({ url: '/api/v1/admin/settings/reset', ...options }); +export const resetSystemSettingsApiV1AdminSettingsResetPost = (options?: Options) => (options?.client ?? client).post({ url: '/api/v1/admin/settings/reset', ...options }); /** * List Users + * + * List all users with optional search and role filtering. */ export const listUsersApiV1AdminUsersGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/admin/users/', ...options }); @@ -479,16 +581,22 @@ export const createUserApiV1AdminUsersPost = (options: Options) => (options.client ?? client).delete({ url: '/api/v1/admin/users/{user_id}', ...options }); /** * Get User + * + * Get a user by ID. */ export const getUserApiV1AdminUsersUserIdGet = (options: Options) => (options.client ?? client).get({ url: '/api/v1/admin/users/{user_id}', ...options }); /** * Update User + * + * Update a user's profile fields. */ export const updateUserApiV1AdminUsersUserIdPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/admin/users/{user_id}', @@ -501,11 +609,15 @@ export const updateUserApiV1AdminUsersUserIdPut = (options: Options) => (options.client ?? client).get({ url: '/api/v1/admin/users/{user_id}/overview', ...options }); /** * Reset User Password + * + * Reset a user's password. */ export const resetUserPasswordApiV1AdminUsersUserIdResetPasswordPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/admin/users/{user_id}/reset-password', @@ -518,11 +630,15 @@ export const resetUserPasswordApiV1AdminUsersUserIdResetPasswordPost = (options: Options) => (options.client ?? client).get({ url: '/api/v1/admin/users/{user_id}/rate-limits', ...options }); /** * Update User Rate Limits + * + * Update rate limit rules for a user. */ export const updateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/admin/users/{user_id}/rate-limits', @@ -535,16 +651,22 @@ export const updateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPut = (options: Options) => (options.client ?? client).post({ url: '/api/v1/admin/users/{user_id}/rate-limits/reset', ...options }); /** * Get User Settings + * + * Get the authenticated user's settings. */ export const getUserSettingsApiV1UserSettingsGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/user/settings/', ...options }); /** * Update User Settings + * + * Update the authenticated user's settings. */ export const updateUserSettingsApiV1UserSettingsPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/user/settings/', @@ -557,6 +679,8 @@ export const updateUserSettingsApiV1UserSettingsPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/user/settings/theme', @@ -569,6 +693,8 @@ export const updateThemeApiV1UserSettingsThemePut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/user/settings/notifications', @@ -581,6 +707,8 @@ export const updateNotificationSettingsApiV1UserSettingsNotificationsPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/user/settings/editor', @@ -593,11 +721,15 @@ export const updateEditorSettingsApiV1UserSettingsEditorPut = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/user/settings/history', ...options }); /** * Restore Settings + * + * Restore settings to a previous point in time. */ export const restoreSettingsApiV1UserSettingsRestorePost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/user/settings/restore', @@ -610,6 +742,8 @@ export const restoreSettingsApiV1UserSettingsRestorePost = (options: Options) => (options.client ?? client).put({ url: '/api/v1/user/settings/custom/{key}', @@ -622,26 +756,36 @@ export const updateCustomSettingApiV1UserSettingsCustomKeyPut = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/notifications', ...options }); /** * Mark Notification Read + * + * Mark a single notification as read. */ export const markNotificationReadApiV1NotificationsNotificationIdReadPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/notifications/{notification_id}/read', ...options }); /** * Mark All Read + * + * Mark all notifications as read. */ export const markAllReadApiV1NotificationsMarkAllReadPost = (options?: Options) => (options?.client ?? client).post({ url: '/api/v1/notifications/mark-all-read', ...options }); /** * Get Subscriptions + * + * Get all notification channel subscriptions for the authenticated user. */ export const getSubscriptionsApiV1NotificationsSubscriptionsGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/notifications/subscriptions', ...options }); /** * Update Subscription + * + * Update subscription settings for a notification channel. */ export const updateSubscriptionApiV1NotificationsSubscriptionsChannelPut = (options: Options) => (options.client ?? client).put({ url: '/api/v1/notifications/subscriptions/{channel}', @@ -654,11 +798,15 @@ export const updateSubscriptionApiV1NotificationsSubscriptionsChannelPut = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/notifications/unread-count', ...options }); /** * Delete Notification + * + * Delete a notification. */ export const deleteNotificationApiV1NotificationsNotificationIdDelete = (options: Options) => (options.client ?? client).delete({ url: '/api/v1/notifications/{notification_id}', ...options }); @@ -742,6 +890,8 @@ export const cancelSagaApiV1SagasSagaIdCancelPost = (options: Options) => (options.client ?? client).post({ url: '/api/v1/alerts/grafana', @@ -754,5 +904,7 @@ export const receiveGrafanaAlertsApiV1AlertsGrafanaPost = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/alerts/grafana/test', ...options }); diff --git a/frontend/src/lib/api/types.gen.ts b/frontend/src/lib/api/types.gen.ts index 9ea4efc6..5e01806f 100644 --- a/frontend/src/lib/api/types.gen.ts +++ b/frontend/src/lib/api/types.gen.ts @@ -1299,6 +1299,24 @@ export type EndpointUsageStats = { */ export type Environment = 'development' | 'staging' | 'production' | 'test'; +/** + * ErrorResponse + */ +export type ErrorResponse = { + /** + * Detail + * + * Human-readable error message + */ + detail: string; + /** + * Type + * + * Error type identifier + */ + type?: string | null; +}; + /** * EventAggregationRequest * @@ -3321,7 +3339,7 @@ export type NotificationResponse = { /** * Action Url */ - action_url: string | null; + action_url: string; /** * Created At */ @@ -3329,7 +3347,7 @@ export type NotificationResponse = { /** * Read At */ - read_at: string | null; + read_at?: string | null; severity: NotificationSeverity; /** * Tags @@ -6619,6 +6637,10 @@ export type LoginApiV1AuthLoginPostData = { }; export type LoginApiV1AuthLoginPostErrors = { + /** + * Unauthorized + */ + 401: ErrorResponse; /** * Validation Error */ @@ -6644,10 +6666,22 @@ export type RegisterApiV1AuthRegisterPostData = { }; export type RegisterApiV1AuthRegisterPostErrors = { + /** + * Bad Request + */ + 400: ErrorResponse; + /** + * Conflict + */ + 409: ErrorResponse; /** * Validation Error */ 422: HttpValidationError; + /** + * Internal Server Error + */ + 500: ErrorResponse; }; export type RegisterApiV1AuthRegisterPostError = RegisterApiV1AuthRegisterPostErrors[keyof RegisterApiV1AuthRegisterPostErrors]; @@ -6684,6 +6718,15 @@ export type VerifyTokenApiV1AuthVerifyTokenGetData = { url: '/api/v1/auth/verify-token'; }; +export type VerifyTokenApiV1AuthVerifyTokenGetErrors = { + /** + * Unauthorized + */ + 401: ErrorResponse; +}; + +export type VerifyTokenApiV1AuthVerifyTokenGetError = VerifyTokenApiV1AuthVerifyTokenGetErrors[keyof VerifyTokenApiV1AuthVerifyTokenGetErrors]; + export type VerifyTokenApiV1AuthVerifyTokenGetResponses = { /** * Successful Response @@ -6727,6 +6770,10 @@ export type CreateExecutionApiV1ExecutePostErrors = { * Validation Error */ 422: HttpValidationError; + /** + * Internal Server Error + */ + 500: ErrorResponse; }; export type CreateExecutionApiV1ExecutePostError = CreateExecutionApiV1ExecutePostErrors[keyof CreateExecutionApiV1ExecutePostErrors]; @@ -6753,6 +6800,10 @@ export type GetResultApiV1ExecutionsExecutionIdResultGetData = { }; export type GetResultApiV1ExecutionsExecutionIdResultGetErrors = { + /** + * Forbidden + */ + 403: ErrorResponse; /** * Validation Error */ @@ -6783,6 +6834,14 @@ export type CancelExecutionApiV1ExecutionsExecutionIdCancelPostData = { }; export type CancelExecutionApiV1ExecutionsExecutionIdCancelPostErrors = { + /** + * Bad Request + */ + 400: ErrorResponse; + /** + * Forbidden + */ + 403: ErrorResponse; /** * Validation Error */ @@ -6813,6 +6872,14 @@ export type RetryExecutionApiV1ExecutionsExecutionIdRetryPostData = { }; export type RetryExecutionApiV1ExecutionsExecutionIdRetryPostErrors = { + /** + * Bad Request + */ + 400: ErrorResponse; + /** + * Forbidden + */ + 403: ErrorResponse; /** * Validation Error */ @@ -6854,6 +6921,10 @@ export type GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetData = { }; export type GetExecutionEventsApiV1ExecutionsExecutionIdEventsGetErrors = { + /** + * Forbidden + */ + 403: ErrorResponse; /** * Validation Error */ @@ -6993,18 +7064,26 @@ export type GetUserExecutionsApiV1UserExecutionsGetData = { query?: { /** * Status + * + * Filter by execution status */ status?: ExecutionStatus | null; /** * Lang + * + * Filter by programming language */ lang?: string | null; /** * Start Time + * + * Filter executions created after this time */ start_time?: string | null; /** * End Time + * + * Filter executions created before this time */ end_time?: string | null; /** @@ -7060,6 +7139,15 @@ export type GetK8sResourceLimitsApiV1K8sLimitsGetData = { url: '/api/v1/k8s-limits'; }; +export type GetK8sResourceLimitsApiV1K8sLimitsGetErrors = { + /** + * Internal Server Error + */ + 500: ErrorResponse; +}; + +export type GetK8sResourceLimitsApiV1K8sLimitsGetError = GetK8sResourceLimitsApiV1K8sLimitsGetErrors[keyof GetK8sResourceLimitsApiV1K8sLimitsGetErrors]; + export type GetK8sResourceLimitsApiV1K8sLimitsGetResponses = { /** * Successful Response @@ -7155,6 +7243,10 @@ export type DeleteSavedScriptApiV1ScriptsScriptIdDeleteData = { }; export type DeleteSavedScriptApiV1ScriptsScriptIdDeleteErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -7185,6 +7277,10 @@ export type GetSavedScriptApiV1ScriptsScriptIdGetData = { }; export type GetSavedScriptApiV1ScriptsScriptIdGetErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -7215,6 +7311,10 @@ export type UpdateSavedScriptApiV1ScriptsScriptIdPutData = { }; export type UpdateSavedScriptApiV1ScriptsScriptIdPutErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -7238,6 +7338,8 @@ export type ListReplaySessionsApiV1ReplaySessionsGetData = { query?: { /** * Status + * + * Filter by replay session status */ status?: ReplayStatus | null; /** @@ -7449,6 +7551,8 @@ export type CleanupOldSessionsApiV1ReplayCleanupPostData = { query?: { /** * Older Than Hours + * + * Delete sessions older than this many hours */ older_than_hours?: number; }; @@ -7527,14 +7631,20 @@ export type GetDlqMessagesApiV1DlqMessagesGetData = { query?: { /** * Status + * + * Filter by message status */ status?: DlqMessageStatus | null; /** * Topic + * + * Filter by source Kafka topic */ topic?: string | null; /** * Event Type + * + * Filter by event type */ event_type?: EventType | null; /** @@ -7587,6 +7697,10 @@ export type DiscardDlqMessageApiV1DlqMessagesEventIdDeleteData = { }; export type DiscardDlqMessageApiV1DlqMessagesEventIdDeleteErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -7617,6 +7731,10 @@ export type GetDlqMessageApiV1DlqMessagesEventIdGetData = { }; export type GetDlqMessageApiV1DlqMessagesEventIdGetErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -7776,6 +7894,10 @@ export type GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetData = { }; export type GetExecutionEventsApiV1EventsExecutionsExecutionIdEventsGetErrors = { + /** + * Forbidden + */ + 403: ErrorResponse; /** * Validation Error */ @@ -7799,14 +7921,20 @@ export type GetUserEventsApiV1EventsUserGetData = { query?: { /** * Event Types + * + * Filter by event types */ event_types?: Array | null; /** * Start Time + * + * Filter events after this time */ start_time?: string | null; /** * End Time + * + * Filter events before this time */ end_time?: string | null; /** @@ -7817,6 +7945,9 @@ export type GetUserEventsApiV1EventsUserGetData = { * Skip */ skip?: number; + /** + * Sort order by timestamp + */ sort_order?: SortOrder; }; url: '/api/v1/events/user'; @@ -7848,6 +7979,10 @@ export type QueryEventsApiV1EventsQueryPostData = { }; export type QueryEventsApiV1EventsQueryPostErrors = { + /** + * Forbidden + */ + 403: ErrorResponse; /** * Validation Error */ @@ -8001,6 +8136,10 @@ export type DeleteEventApiV1EventsEventIdDeleteData = { }; export type DeleteEventApiV1EventsEventIdDeleteErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -8031,6 +8170,10 @@ export type GetEventApiV1EventsEventIdGetData = { }; export type GetEventApiV1EventsEventIdGetErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -8262,6 +8405,10 @@ export type ReplayAggregateEventsApiV1EventsReplayAggregateIdPostData = { }; export type ReplayAggregateEventsApiV1EventsReplayAggregateIdPostErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -8310,6 +8457,8 @@ export type GetEventStatsApiV1AdminEventsStatsGetData = { query?: { /** * Hours + * + * Lookback window in hours (max 168) */ hours?: number; }; @@ -8467,6 +8616,10 @@ export type DeleteEventApiV1AdminEventsEventIdDeleteErrors = { * Validation Error */ 422: HttpValidationError; + /** + * Internal Server Error + */ + 500: ErrorResponse; }; export type DeleteEventApiV1AdminEventsEventIdDeleteError = DeleteEventApiV1AdminEventsEventIdDeleteErrors[keyof DeleteEventApiV1AdminEventsEventIdDeleteErrors]; @@ -8493,6 +8646,10 @@ export type GetEventDetailApiV1AdminEventsEventIdGetData = { }; export type GetEventDetailApiV1AdminEventsEventIdGetErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -8518,6 +8675,14 @@ export type ReplayEventsApiV1AdminEventsReplayPostData = { }; export type ReplayEventsApiV1AdminEventsReplayPostErrors = { + /** + * Bad Request + */ + 400: ErrorResponse; + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -8548,6 +8713,10 @@ export type GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetData = { }; export type GetReplayStatusApiV1AdminEventsReplaySessionIdStatusGetErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -8572,6 +8741,15 @@ export type GetSystemSettingsApiV1AdminSettingsGetData = { url: '/api/v1/admin/settings/'; }; +export type GetSystemSettingsApiV1AdminSettingsGetErrors = { + /** + * Internal Server Error + */ + 500: ErrorResponse; +}; + +export type GetSystemSettingsApiV1AdminSettingsGetError = GetSystemSettingsApiV1AdminSettingsGetErrors[keyof GetSystemSettingsApiV1AdminSettingsGetErrors]; + export type GetSystemSettingsApiV1AdminSettingsGetResponses = { /** * Successful Response @@ -8590,9 +8768,17 @@ export type UpdateSystemSettingsApiV1AdminSettingsPutData = { export type UpdateSystemSettingsApiV1AdminSettingsPutErrors = { /** - * Validation Error + * Bad Request */ - 422: HttpValidationError; + 400: ErrorResponse; + /** + * Unprocessable Entity + */ + 422: ErrorResponse; + /** + * Internal Server Error + */ + 500: ErrorResponse; }; export type UpdateSystemSettingsApiV1AdminSettingsPutError = UpdateSystemSettingsApiV1AdminSettingsPutErrors[keyof UpdateSystemSettingsApiV1AdminSettingsPutErrors]; @@ -8613,6 +8799,15 @@ export type ResetSystemSettingsApiV1AdminSettingsResetPostData = { url: '/api/v1/admin/settings/reset'; }; +export type ResetSystemSettingsApiV1AdminSettingsResetPostErrors = { + /** + * Internal Server Error + */ + 500: ErrorResponse; +}; + +export type ResetSystemSettingsApiV1AdminSettingsResetPostError = ResetSystemSettingsApiV1AdminSettingsResetPostErrors[keyof ResetSystemSettingsApiV1AdminSettingsResetPostErrors]; + export type ResetSystemSettingsApiV1AdminSettingsResetPostResponses = { /** * Successful Response @@ -8636,10 +8831,14 @@ export type ListUsersApiV1AdminUsersGetData = { offset?: number; /** * Search + * + * Search by username or email */ search?: string | null; /** * Role + * + * Filter by user role */ role?: UserRole | null; }; @@ -8672,6 +8871,10 @@ export type CreateUserApiV1AdminUsersPostData = { }; export type CreateUserApiV1AdminUsersPostErrors = { + /** + * Bad Request + */ + 400: ErrorResponse; /** * Validation Error */ @@ -8709,6 +8912,10 @@ export type DeleteUserApiV1AdminUsersUserIdDeleteData = { }; export type DeleteUserApiV1AdminUsersUserIdDeleteErrors = { + /** + * Bad Request + */ + 400: ErrorResponse; /** * Validation Error */ @@ -8739,6 +8946,10 @@ export type GetUserApiV1AdminUsersUserIdGetData = { }; export type GetUserApiV1AdminUsersUserIdGetErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -8769,10 +8980,18 @@ export type UpdateUserApiV1AdminUsersUserIdPutData = { }; export type UpdateUserApiV1AdminUsersUserIdPutErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ 422: HttpValidationError; + /** + * Internal Server Error + */ + 500: ErrorResponse; }; export type UpdateUserApiV1AdminUsersUserIdPutError = UpdateUserApiV1AdminUsersUserIdPutErrors[keyof UpdateUserApiV1AdminUsersUserIdPutErrors]; @@ -8799,6 +9018,10 @@ export type GetUserOverviewApiV1AdminUsersUserIdOverviewGetData = { }; export type GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors = { + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -8833,6 +9056,10 @@ export type ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostErrors = { * Validation Error */ 422: HttpValidationError; + /** + * Internal Server Error + */ + 500: ErrorResponse; }; export type ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostError = ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostErrors[keyof ResetUserPasswordApiV1AdminUsersUserIdResetPasswordPostErrors]; @@ -9058,6 +9285,8 @@ export type GetSettingsHistoryApiV1UserSettingsHistoryGetData = { query?: { /** * Limit + * + * Maximum number of history entries */ limit?: number; }; @@ -9346,6 +9575,14 @@ export type GetSagaStatusApiV1SagasSagaIdGetData = { }; export type GetSagaStatusApiV1SagasSagaIdGetErrors = { + /** + * Forbidden + */ + 403: ErrorResponse; + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ @@ -9391,6 +9628,10 @@ export type GetExecutionSagasApiV1SagasExecutionExecutionIdGetData = { }; export type GetExecutionSagasApiV1SagasExecutionExecutionIdGetErrors = { + /** + * Forbidden + */ + 403: ErrorResponse; /** * Validation Error */ @@ -9461,6 +9702,18 @@ export type CancelSagaApiV1SagasSagaIdCancelPostData = { }; export type CancelSagaApiV1SagasSagaIdCancelPostErrors = { + /** + * Bad Request + */ + 400: ErrorResponse; + /** + * Forbidden + */ + 403: ErrorResponse; + /** + * Not Found + */ + 404: ErrorResponse; /** * Validation Error */ From a07f6d02f66c7a4ba0d655e7216d95b70ddc1f3d Mon Sep 17 00:00:00 2001 From: HardMax71 Date: Sun, 8 Feb 2026 15:22:22 +0100 Subject: [PATCH 5/6] fix: admin/settings - direct conversion, removed try-catches --- backend/app/api/routes/admin/settings.py | 78 ++++-------------------- 1 file changed, 13 insertions(+), 65 deletions(-) diff --git a/backend/app/api/routes/admin/settings.py b/backend/app/api/routes/admin/settings.py index c58efc4f..48ba3268 100644 --- a/backend/app/api/routes/admin/settings.py +++ b/backend/app/api/routes/admin/settings.py @@ -2,46 +2,15 @@ from dishka import FromDishka from dishka.integrations.fastapi import DishkaRoute -from fastapi import APIRouter, Depends, HTTPException -from pydantic import ValidationError +from fastapi import APIRouter, Depends from app.api.dependencies import admin_user -from app.domain.admin import ( - ExecutionLimits, - LogLevel, - MonitoringSettings, - SecuritySettings, -) -from app.domain.admin import ( - SystemSettings as DomainSystemSettings, -) +from app.domain.admin import SystemSettings as DomainSystemSettings from app.schemas_pydantic.admin_settings import SystemSettings from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.user import UserResponse from app.services.admin import AdminSettingsService - -def _domain_to_pydantic(domain: DomainSystemSettings) -> SystemSettings: - """Convert domain SystemSettings to Pydantic schema.""" - return SystemSettings.model_validate(domain, from_attributes=True) - - -def _pydantic_to_domain(schema: SystemSettings) -> DomainSystemSettings: - """Convert Pydantic schema to domain SystemSettings.""" - data = schema.model_dump() - mon = data.get("monitoring_settings", {}) - return DomainSystemSettings( - execution_limits=ExecutionLimits(**data.get("execution_limits", {})), - security_settings=SecuritySettings(**data.get("security_settings", {})), - monitoring_settings=MonitoringSettings( - metrics_retention_days=mon.get("metrics_retention_days", 30), - log_level=LogLevel(mon.get("log_level", "INFO")), - enable_tracing=mon.get("enable_tracing", True), - sampling_rate=mon.get("sampling_rate", 0.1), - ), - ) - - router = APIRouter( prefix="/admin/settings", tags=["admin", "settings"], route_class=DishkaRoute, dependencies=[Depends(admin_user)] ) @@ -53,17 +22,12 @@ async def get_system_settings( service: FromDishka[AdminSettingsService], ) -> SystemSettings: """Get the current system-wide settings.""" - try: - domain_settings = await service.get_system_settings(admin.username) - return _domain_to_pydantic(domain_settings) - - except Exception: - raise HTTPException(status_code=500, detail="Failed to retrieve settings") + domain_settings = await service.get_system_settings(admin.username) + return SystemSettings.model_validate(domain_settings, from_attributes=True) @router.put( "/", - response_model=SystemSettings, responses={400: {"model": ErrorResponse}, 422: {"model": ErrorResponse}, 500: {"model": ErrorResponse}}, ) async def update_system_settings( @@ -72,25 +36,13 @@ async def update_system_settings( service: FromDishka[AdminSettingsService], ) -> SystemSettings: """Replace system-wide settings.""" - try: - domain_settings = _pydantic_to_domain(settings) - except (ValueError, ValidationError, KeyError) as e: - raise HTTPException(status_code=422, detail=f"Invalid settings: {str(e)}") - except Exception: - raise HTTPException(status_code=400, detail="Invalid settings format") - - # Perform the update - try: - updated_domain_settings = await service.update_system_settings( - domain_settings, - updated_by=admin.username, - user_id=admin.user_id, - ) - - return _domain_to_pydantic(updated_domain_settings) - - except Exception: - raise HTTPException(status_code=500, detail="Failed to update settings") + domain_settings = DomainSystemSettings(**settings.model_dump()) + updated = await service.update_system_settings( + domain_settings, + updated_by=admin.username, + user_id=admin.user_id, + ) + return SystemSettings.model_validate(updated, from_attributes=True) @router.post("/reset", response_model=SystemSettings, responses={500: {"model": ErrorResponse}}) @@ -99,9 +51,5 @@ async def reset_system_settings( service: FromDishka[AdminSettingsService], ) -> SystemSettings: """Reset system-wide settings to defaults.""" - try: - reset_domain_settings = await service.reset_system_settings(admin.username, admin.user_id) - return _domain_to_pydantic(reset_domain_settings) - - except Exception: - raise HTTPException(status_code=500, detail="Failed to reset settings") + reset = await service.reset_system_settings(admin.username, admin.user_id) + return SystemSettings.model_validate(reset, from_attributes=True) From cf5cc8cb9427ca8f6794a29ca76e74f71fa0119f Mon Sep 17 00:00:00 2001 From: HardMax71 Date: Sun, 8 Feb 2026 15:28:04 +0100 Subject: [PATCH 6/6] fix: detected problems --- backend/app/api/routes/admin/events.py | 10 +++++----- backend/app/api/routes/admin/users.py | 2 +- docs/reference/openapi.json | 8 ++++++-- frontend/src/lib/api/types.gen.ts | 8 ++++---- frontend/src/stores/auth.svelte.ts | 2 +- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/backend/app/api/routes/admin/events.py b/backend/app/api/routes/admin/events.py index 11918db0..20d76f70 100644 --- a/backend/app/api/routes/admin/events.py +++ b/backend/app/api/routes/admin/events.py @@ -54,7 +54,7 @@ async def browse_events(request: EventBrowseRequest, service: FromDishka[AdminEv @router.get("/stats") async def get_event_stats( service: FromDishka[AdminEventsService], - hours: Annotated[int, Query(le=168, description="Lookback window in hours (max 168)")] = 24, + hours: Annotated[int, Query(ge=1, le=168, description="Lookback window in hours (max 168)")] = 24, ) -> EventStatsResponse: """Get event statistics for a given lookback window.""" stats = await service.get_event_stats(hours=hours) @@ -67,7 +67,7 @@ async def export_events_csv( event_types: Annotated[list[EventType] | None, Query(description="Event types (repeat param for multiple)")] = None, start_time: Annotated[datetime | None, Query(description="Start time")] = None, end_time: Annotated[datetime | None, Query(description="End time")] = None, - limit: Annotated[int, Query(le=50000)] = 10000, + limit: Annotated[int, Query(ge=1, le=50000)] = 10000, ) -> StreamingResponse: """Export filtered events as a downloadable CSV file.""" export_filter = EventFilter( @@ -93,7 +93,7 @@ async def export_events_json( service_name: Annotated[str | None, Query(description="Service name filter")] = None, start_time: Annotated[datetime | None, Query(description="Start time")] = None, end_time: Annotated[datetime | None, Query(description="End time")] = None, - limit: Annotated[int, Query(le=50000)] = 10000, + limit: Annotated[int, Query(ge=1, le=50000)] = 10000, ) -> StreamingResponse: """Export events as JSON with comprehensive filtering.""" export_filter = EventFilter( @@ -190,13 +190,13 @@ async def get_replay_status(session_id: str, service: FromDishka[AdminEventsServ ) -@router.delete("/{event_id}", responses={500: {"model": ErrorResponse}}) +@router.delete("/{event_id}", responses={404: {"model": ErrorResponse}}) async def delete_event( event_id: str, admin: Annotated[UserResponse, Depends(admin_user)], service: FromDishka[AdminEventsService] ) -> EventDeleteResponse: """Delete and archive an event by ID.""" deleted = await service.delete_event(event_id=event_id, deleted_by=admin.email) if not deleted: - raise HTTPException(status_code=500, detail="Failed to delete event") + raise HTTPException(status_code=404, detail="Event not found") return EventDeleteResponse(message="Event deleted and archived", event_id=event_id) diff --git a/backend/app/api/routes/admin/users.py b/backend/app/api/routes/admin/users.py index b4d4079c..d3bb7c1b 100644 --- a/backend/app/api/routes/admin/users.py +++ b/backend/app/api/routes/admin/users.py @@ -39,7 +39,7 @@ async def list_users( admin: Annotated[UserResponse, Depends(admin_user)], admin_user_service: FromDishka[AdminUserService], - limit: Annotated[int, Query(le=1000)] = 100, + limit: Annotated[int, Query(ge=1, le=1000)] = 100, offset: Annotated[int, Query(ge=0)] = 0, search: Annotated[str | None, Query(description="Search by username or email")] = None, role: Annotated[UserRole | None, Query(description="Filter by user role")] = None, diff --git a/docs/reference/openapi.json b/docs/reference/openapi.json index f37fd970..ca5a04e1 100644 --- a/docs/reference/openapi.json +++ b/docs/reference/openapi.json @@ -3167,6 +3167,7 @@ "schema": { "type": "integer", "maximum": 168, + "minimum": 1, "description": "Lookback window in hours (max 168)", "default": 24, "title": "Hours" @@ -3273,6 +3274,7 @@ "schema": { "type": "integer", "maximum": 50000, + "minimum": 1, "default": 10000, "title": "Limit" } @@ -3447,6 +3449,7 @@ "schema": { "type": "integer", "maximum": 50000, + "minimum": 1, "default": 10000, "title": "Limit" } @@ -3555,7 +3558,7 @@ } } }, - "500": { + "404": { "content": { "application/json": { "schema": { @@ -3563,7 +3566,7 @@ } } }, - "description": "Internal Server Error" + "description": "Not Found" }, "422": { "description": "Validation Error", @@ -3837,6 +3840,7 @@ "schema": { "type": "integer", "maximum": 1000, + "minimum": 1, "default": 100, "title": "Limit" } diff --git a/frontend/src/lib/api/types.gen.ts b/frontend/src/lib/api/types.gen.ts index 5e01806f..169b296b 100644 --- a/frontend/src/lib/api/types.gen.ts +++ b/frontend/src/lib/api/types.gen.ts @@ -8613,13 +8613,13 @@ export type DeleteEventApiV1AdminEventsEventIdDeleteData = { export type DeleteEventApiV1AdminEventsEventIdDeleteErrors = { /** - * Validation Error + * Not Found */ - 422: HttpValidationError; + 404: ErrorResponse; /** - * Internal Server Error + * Validation Error */ - 500: ErrorResponse; + 422: HttpValidationError; }; export type DeleteEventApiV1AdminEventsEventIdDeleteError = DeleteEventApiV1AdminEventsEventIdDeleteErrors[keyof DeleteEventApiV1AdminEventsEventIdDeleteErrors]; diff --git a/frontend/src/stores/auth.svelte.ts b/frontend/src/stores/auth.svelte.ts index f0607799..8fe76591 100644 --- a/frontend/src/stores/auth.svelte.ts +++ b/frontend/src/stores/auth.svelte.ts @@ -207,7 +207,7 @@ class AuthStore { this.#verifyPromise = (async () => { try { const { data, error } = await verifyTokenApiV1AuthVerifyTokenGet({}); - if (error || !data?.valid) { + if (error || !data.valid) { this.clearAuth(); this.#authCache = { valid: false, timestamp: Date.now() }; return false;