diff --git a/backend/app/api/routes/admin/events.py b/backend/app/api/routes/admin/events.py index 346fd0c0..a2a537c5 100644 --- a/backend/app/api/routes/admin/events.py +++ b/backend/app/api/routes/admin/events.py @@ -8,7 +8,7 @@ from app.api.dependencies import admin_user from app.core.correlation import CorrelationContext -from app.domain.enums import EventType +from app.domain.enums import EventType, ExportFormat from app.domain.events import EventFilter from app.domain.replay import ReplayFilter from app.domain.user import User @@ -23,7 +23,6 @@ EventStatsResponse, ) from app.schemas_pydantic.common import ErrorResponse -from app.schemas_pydantic.execution import ExecutionResult from app.services.admin import AdminEventsService router = APIRouter( @@ -53,30 +52,9 @@ async def get_event_stats( return EventStatsResponse.model_validate(stats) -@router.get("/export/csv") -async def export_events_csv( - service: FromDishka[AdminEventsService], - 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(ge=1, le=50000)] = 10000, -) -> StreamingResponse: - """Export filtered events as a downloadable CSV file.""" - 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") -async def export_events_json( +@router.get("/export/{export_format}") +async def export_events( + export_format: ExportFormat, service: FromDishka[AdminEventsService], 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, @@ -87,7 +65,7 @@ async def export_events_json( end_time: Annotated[datetime | None, Query(description="End time")] = None, limit: Annotated[int, Query(ge=1, le=50000)] = 10000, ) -> StreamingResponse: - """Export events as JSON with comprehensive filtering.""" + """Export filtered events as a downloadable file.""" export_filter = EventFilter( event_types=event_types, aggregate_id=aggregate_id, @@ -97,7 +75,7 @@ async def export_events_json( start_time=start_time, end_time=end_time, ) - result = await service.export_events_json_content(event_filter=export_filter, limit=limit) + result = await service.export_events(event_filter=export_filter, limit=limit, export_format=export_format) return StreamingResponse( iter([result.content]), media_type=result.media_type, @@ -152,14 +130,7 @@ async def get_replay_status(session_id: str, service: FromDishka[AdminEventsServ if not status: raise HTTPException(status_code=404, detail="Replay session not found") - return EventReplayStatusResponse( - **status.session.model_dump(), - estimated_completion=status.estimated_completion, - execution_results=[ - ExecutionResult.model_validate(er) - for er in status.execution_results - ], - ) + return EventReplayStatusResponse.model_validate(status) @router.delete("/{event_id}", responses={404: {"model": ErrorResponse, "description": "Event not found"}}) diff --git a/backend/app/api/routes/admin/settings.py b/backend/app/api/routes/admin/settings.py index ca393825..239a934d 100644 --- a/backend/app/api/routes/admin/settings.py +++ b/backend/app/api/routes/admin/settings.py @@ -26,7 +26,7 @@ async def get_system_settings( service: FromDishka[AdminSettingsService], ) -> SystemSettingsSchema: """Get the current system-wide settings.""" - result = await service.get_system_settings(admin.username) + result = await service.get_system_settings(admin.user_id) return SystemSettingsSchema.model_validate(result) @@ -46,11 +46,7 @@ async def update_system_settings( ) -> SystemSettingsSchema: """Replace system-wide settings.""" domain_settings = SystemSettings.model_validate(settings) - result = await service.update_system_settings( - domain_settings, - updated_by=admin.username, - user_id=admin.user_id, - ) + result = await service.update_system_settings(domain_settings, admin.user_id) return SystemSettingsSchema.model_validate(result) @@ -64,5 +60,5 @@ async def reset_system_settings( service: FromDishka[AdminSettingsService], ) -> SystemSettingsSchema: """Reset system-wide settings to defaults.""" - result = await service.reset_system_settings(admin.username, admin.user_id) + result = await service.reset_system_settings(admin.user_id) return SystemSettingsSchema.model_validate(result) diff --git a/backend/app/api/routes/admin/users.py b/backend/app/api/routes/admin/users.py index 3a374ea8..675dd725 100644 --- a/backend/app/api/routes/admin/users.py +++ b/backend/app/api/routes/admin/users.py @@ -7,7 +7,7 @@ from app.api.dependencies import admin_user from app.db.repositories import AdminUserRepository from app.domain.enums import UserRole -from app.domain.rate_limit import RateLimitRule, UserRateLimit +from app.domain.rate_limit import UserRateLimitUpdate from app.domain.user import User from app.domain.user import UserUpdate as DomainUserUpdate from app.schemas_pydantic.admin_user_overview import AdminUserOverview @@ -44,7 +44,7 @@ async def list_users( ) -> UserListResponse: """List all users with optional search and role filtering.""" result = await admin_user_service.list_users( - admin_username=admin.username, + admin_user_id=admin.user_id, limit=limit, offset=offset, search=search, @@ -64,7 +64,7 @@ async def create_user( admin_user_service: FromDishka[AdminUserService], ) -> UserResponse: """Create a new user (admin only).""" - domain_user = await admin_user_service.create_user(admin_username=admin.username, user_data=user_data) + domain_user = await admin_user_service.create_user(admin_user_id=admin.user_id, user_data=user_data) return UserResponse.model_validate(domain_user) @@ -79,7 +79,7 @@ async def get_user( 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) + user = await admin_user_service.get_user(admin_user_id=admin.user_id, user_id=user_id) if not user: raise HTTPException(status_code=404, detail="User not found") @@ -125,7 +125,7 @@ async def update_user( domain_update = DomainUserUpdate.model_validate(user_update) updated_user = await admin_user_service.update_user( - admin_username=admin.username, user_id=user_id, update=domain_update + admin_user_id=admin.user_id, user_id=user_id, update=domain_update ) if not updated_user: raise HTTPException(status_code=500, detail="Failed to update user") @@ -150,7 +150,7 @@ async def delete_user( raise HTTPException(status_code=400, detail="Cannot delete your own account") result = await admin_user_service.delete_user( - admin_username=admin.username, user_id=user_id, cascade=cascade + admin_user_id=admin.user_id, user_id=user_id, cascade=cascade ) return DeleteUserResponse.model_validate(result) @@ -168,7 +168,7 @@ async def reset_user_password( ) -> 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 + admin_user_id=admin.user_id, user_id=user_id, new_password=password_request.new_password ) if not success: raise HTTPException(status_code=500, detail="Failed to reset password") @@ -182,7 +182,7 @@ async def get_user_rate_limits( 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) + result = await admin_user_service.get_user_rate_limits(admin_user_id=admin.user_id, user_id=user_id) return UserRateLimitsResponse.model_validate(result) @@ -194,13 +194,9 @@ async def update_user_rate_limits( 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], - **request.model_dump(exclude={"rules"}), - ) + update = UserRateLimitUpdate.model_validate(request) result = await admin_user_service.update_user_rate_limits( - admin_username=admin.username, user_id=user_id, config=config + admin_user_id=admin.user_id, user_id=user_id, update=update ) return RateLimitUpdateResponse.model_validate(result) @@ -212,7 +208,7 @@ async def reset_user_rate_limits( 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) + await admin_user_service.reset_user_rate_limits(admin_user_id=admin.user_id, user_id=user_id) return MessageResponse(message=f"Rate limits reset successfully for user {user_id}") @@ -228,7 +224,7 @@ async def unlock_user( lockout_service: FromDishka[LoginLockoutService], ) -> UnlockResponse: """Unlock a user account that was locked due to failed login attempts.""" - user = await admin_user_service.get_user(admin_username=admin.username, user_id=user_id) + user = await admin_user_service.get_user(admin_user_id=admin.user_id, user_id=user_id) if not user: raise HTTPException(status_code=404, detail="User not found") await lockout_service.unlock_user(user.username) diff --git a/backend/app/api/routes/dlq.py b/backend/app/api/routes/dlq.py index 212aa55c..99c27382 100644 --- a/backend/app/api/routes/dlq.py +++ b/backend/app/api/routes/dlq.py @@ -14,7 +14,6 @@ from app.schemas_pydantic.dlq import ( DLQBatchRetryResponse, DLQMessageDetail, - DLQMessageResponse, DLQMessagesResponse, DLQTopicSummaryResponse, ManualRetryRequest, @@ -41,10 +40,7 @@ async def get_dlq_messages( status=status, topic=topic, event_type=event_type, limit=limit, offset=offset ) - # Convert domain messages to response models using model_validate - messages = [DLQMessageResponse.model_validate(msg) for msg in result.messages] - - return DLQMessagesResponse(messages=messages, total=result.total, offset=result.offset, limit=result.limit) + return DLQMessagesResponse.model_validate(result) @router.get( diff --git a/backend/app/api/routes/notifications.py b/backend/app/api/routes/notifications.py index 507606d5..99fb9d72 100644 --- a/backend/app/api/routes/notifications.py +++ b/backend/app/api/routes/notifications.py @@ -2,19 +2,20 @@ from dishka import FromDishka from dishka.integrations.fastapi import DishkaRoute -from fastapi import APIRouter, Query, Request, Response +from fastapi import APIRouter, Depends, Query, Response +from app.api.dependencies import current_user from app.domain.enums import NotificationChannel, NotificationStatus +from app.domain.notification import DomainSubscriptionUpdate +from app.domain.user import User from app.schemas_pydantic.notification import ( DeleteNotificationResponse, NotificationListResponse, - NotificationResponse, NotificationSubscription, SubscriptionsResponse, SubscriptionUpdate, UnreadCountResponse, ) -from app.services.auth_service import AuthService from app.services.notification_service import NotificationService router = APIRouter(prefix="/notifications", tags=["notifications"], route_class=DishkaRoute) @@ -22,9 +23,8 @@ @router.get("", response_model=NotificationListResponse) async def get_notifications( - request: Request, + user: Annotated[User, Depends(current_user)], notification_service: FromDishka[NotificationService], - auth_service: FromDishka[AuthService], 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, @@ -35,9 +35,8 @@ async def get_notifications( 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, + user_id=user.user_id, status=status, limit=limit, offset=offset, @@ -45,90 +44,73 @@ async def get_notifications( exclude_tags=exclude_tags, tag_prefix=tag_prefix, ) - return NotificationListResponse( - notifications=[NotificationResponse.model_validate(n) for n in result.notifications], - total=result.total, - unread_count=result.unread_count, - ) + return NotificationListResponse.model_validate(result) @router.put("/{notification_id}/read", status_code=204) async def mark_notification_read( notification_id: str, + user: Annotated[User, Depends(current_user)], notification_service: FromDishka[NotificationService], - 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) + await notification_service.mark_as_read(notification_id=notification_id, user_id=user.user_id) return Response(status_code=204) @router.post("/mark-all-read", status_code=204) async def mark_all_read( - notification_service: FromDishka[NotificationService], request: Request, auth_service: FromDishka[AuthService] + user: Annotated[User, Depends(current_user)], + notification_service: FromDishka[NotificationService], ) -> Response: """Mark all notifications as read.""" - current_user = await auth_service.get_current_user(request) - await notification_service.mark_all_as_read(current_user.user_id) + await notification_service.mark_all_as_read(user.user_id) return Response(status_code=204) @router.get("/subscriptions", response_model=SubscriptionsResponse) async def get_subscriptions( - notification_service: FromDishka[NotificationService], request: Request, auth_service: FromDishka[AuthService] + user: Annotated[User, Depends(current_user)], + notification_service: FromDishka[NotificationService], ) -> 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( - subscriptions=[NotificationSubscription.model_validate(s) for s in subscriptions_dict.values()] - ) + result = await notification_service.get_subscriptions(user.user_id) + return SubscriptionsResponse.model_validate(result) @router.put("/subscriptions/{channel}", response_model=NotificationSubscription) async def update_subscription( channel: NotificationChannel, subscription: SubscriptionUpdate, + user: Annotated[User, Depends(current_user)], notification_service: FromDishka[NotificationService], - request: Request, - auth_service: FromDishka[AuthService], ) -> NotificationSubscription: """Update subscription settings for a notification channel.""" - current_user = await auth_service.get_current_user(request) + update_data = DomainSubscriptionUpdate.model_validate(subscription) updated_sub = await notification_service.update_subscription( - user_id=current_user.user_id, + user_id=user.user_id, channel=channel, - enabled=subscription.enabled, - webhook_url=subscription.webhook_url, - slack_webhook=subscription.slack_webhook, - severities=subscription.severities, - include_tags=subscription.include_tags, - exclude_tags=subscription.exclude_tags, + update_data=update_data, ) return NotificationSubscription.model_validate(updated_sub) @router.get("/unread-count", response_model=UnreadCountResponse) async def get_unread_count( - notification_service: FromDishka[NotificationService], request: Request, auth_service: FromDishka[AuthService] + user: Annotated[User, Depends(current_user)], + notification_service: FromDishka[NotificationService], ) -> 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) - + count = await notification_service.get_unread_count(user.user_id) return UnreadCountResponse(unread_count=count) @router.delete("/{notification_id}", response_model=DeleteNotificationResponse) async def delete_notification( notification_id: str, + user: Annotated[User, Depends(current_user)], notification_service: FromDishka[NotificationService], - request: Request, - auth_service: FromDishka[AuthService], ) -> DeleteNotificationResponse: """Delete a notification.""" - current_user = await auth_service.get_current_user(request) - await notification_service.delete_notification(user_id=current_user.user_id, notification_id=notification_id) + await notification_service.delete_notification(user_id=user.user_id, notification_id=notification_id) return DeleteNotificationResponse(message="Notification deleted") diff --git a/backend/app/api/routes/saga.py b/backend/app/api/routes/saga.py index 3d5ad650..07b0b292 100644 --- a/backend/app/api/routes/saga.py +++ b/backend/app/api/routes/saga.py @@ -55,14 +55,7 @@ async def get_execution_sagas( ) -> SagaListResponse: """Get all sagas for an execution.""" result = await saga_service.get_execution_sagas(execution_id, user, state, limit=limit, skip=skip) - saga_responses = [SagaStatusResponse.model_validate(s) for s in result.sagas] - return SagaListResponse( - sagas=saga_responses, - total=result.total, - skip=skip, - limit=limit, - has_more=result.has_more, - ) + return SagaListResponse.model_validate(result) @router.get("/", response_model=SagaListResponse) @@ -75,14 +68,7 @@ async def list_sagas( ) -> SagaListResponse: """List sagas accessible by the current user.""" result = await saga_service.list_user_sagas(user, state, limit, skip) - saga_responses = [SagaStatusResponse.model_validate(s) for s in result.sagas] - return SagaListResponse( - sagas=saga_responses, - total=result.total, - skip=skip, - limit=limit, - has_more=result.has_more, - ) + return SagaListResponse.model_validate(result) @router.post( @@ -100,10 +86,5 @@ async def cancel_saga( saga_service: FromDishka[SagaService], ) -> SagaCancellationResponse: """Cancel a running saga.""" - success = await saga_service.cancel_saga(saga_id, user) - - return SagaCancellationResponse( - success=success, - message=("Saga cancelled successfully" if success else "Failed to cancel saga"), - saga_id=saga_id, - ) + result = await saga_service.cancel_saga(saga_id, user) + return SagaCancellationResponse.model_validate(result) diff --git a/backend/app/api/routes/saved_scripts.py b/backend/app/api/routes/saved_scripts.py index 9f89c08b..0416fd05 100644 --- a/backend/app/api/routes/saved_scripts.py +++ b/backend/app/api/routes/saved_scripts.py @@ -10,6 +10,7 @@ from app.schemas_pydantic.common import ErrorResponse from app.schemas_pydantic.saved_script import ( SavedScriptCreateRequest, + SavedScriptListResponse, SavedScriptResponse, SavedScriptUpdate, ) @@ -30,14 +31,14 @@ async def create_saved_script( return SavedScriptResponse.model_validate(domain) -@router.get("/scripts", response_model=list[SavedScriptResponse]) +@router.get("/scripts", response_model=SavedScriptListResponse) async def list_saved_scripts( user: Annotated[User, Depends(current_user)], saved_script_service: FromDishka[SavedScriptService], -) -> list[SavedScriptResponse]: +) -> SavedScriptListResponse: """List all saved scripts for the authenticated user.""" - items = await saved_script_service.list_saved_scripts(user.user_id) - return [SavedScriptResponse.model_validate(item) for item in items] + result = await saved_script_service.list_saved_scripts(user.user_id) + return SavedScriptListResponse.model_validate(result) @router.get( diff --git a/backend/app/db/docs/admin_settings.py b/backend/app/db/docs/admin_settings.py index 8824e78e..fac01566 100644 --- a/backend/app/db/docs/admin_settings.py +++ b/backend/app/db/docs/admin_settings.py @@ -25,7 +25,6 @@ class AuditLogDocument(Document): audit_id: Indexed(str, unique=True) = Field(default_factory=lambda: str(uuid4())) # type: ignore[valid-type] action: AuditAction user_id: Indexed(str) # type: ignore[valid-type] - username: str timestamp: Indexed(datetime) = Field(default_factory=lambda: datetime.now(timezone.utc)) # type: ignore[valid-type] changes: dict[str, Any] = Field(default_factory=dict) reason: str = "" diff --git a/backend/app/db/repositories/admin/admin_settings_repository.py b/backend/app/db/repositories/admin/admin_settings_repository.py index 2859fe07..227a8236 100644 --- a/backend/app/db/repositories/admin/admin_settings_repository.py +++ b/backend/app/db/repositories/admin/admin_settings_repository.py @@ -20,12 +20,7 @@ async def get_system_settings( await doc.insert() return doc.config - async def update_system_settings( - self, - settings: SystemSettings, - updated_by: str, - user_id: str, - ) -> SystemSettings: + async def update_system_settings(self, settings: SystemSettings, user_id: str) -> SystemSettings: doc = await SystemSettingsDocument.find_one(SystemSettingsDocument.settings_id == "global") if not doc: doc = SystemSettingsDocument() @@ -37,14 +32,13 @@ async def update_system_settings( audit_entry = AuditLogDocument( action=AuditAction.SYSTEM_SETTINGS_UPDATED, user_id=user_id, - username=updated_by, changes=settings.model_dump(), ) await audit_entry.insert() return doc.config - async def reset_system_settings(self, username: str, user_id: str) -> SystemSettings: + async def reset_system_settings(self, user_id: str) -> SystemSettings: doc = await SystemSettingsDocument.find_one(SystemSettingsDocument.settings_id == "global") if doc: await doc.delete() @@ -52,7 +46,6 @@ async def reset_system_settings(self, username: str, user_id: str) -> SystemSett audit_entry = AuditLogDocument( action=AuditAction.SYSTEM_SETTINGS_RESET, user_id=user_id, - username=username, ) await audit_entry.insert() diff --git a/backend/app/db/repositories/notification_repository.py b/backend/app/db/repositories/notification_repository.py index 2ad28c7b..ab3ad677 100644 --- a/backend/app/db/repositories/notification_repository.py +++ b/backend/app/db/repositories/notification_repository.py @@ -182,17 +182,17 @@ async def upsert_subscription( await doc.insert() return DomainNotificationSubscription.model_validate(doc) - async def get_all_subscriptions(self, user_id: str) -> dict[NotificationChannel, DomainNotificationSubscription]: - subs: dict[NotificationChannel, DomainNotificationSubscription] = {} + async def get_all_subscriptions(self, user_id: str) -> list[DomainNotificationSubscription]: + subs: list[DomainNotificationSubscription] = [] for channel in NotificationChannel: doc = await NotificationSubscriptionDocument.find_one( NotificationSubscriptionDocument.user_id == user_id, NotificationSubscriptionDocument.channel == channel, ) if doc: - subs[channel] = DomainNotificationSubscription.model_validate(doc) + subs.append(DomainNotificationSubscription.model_validate(doc)) else: - subs[channel] = DomainNotificationSubscription(user_id=user_id, channel=channel, enabled=True) + subs.append(DomainNotificationSubscription(user_id=user_id, channel=channel, enabled=True)) return subs # User query operations diff --git a/backend/app/domain/admin/replay_models.py b/backend/app/domain/admin/replay_models.py index 9d9cf0b4..1e274f3a 100644 --- a/backend/app/domain/admin/replay_models.py +++ b/backend/app/domain/admin/replay_models.py @@ -1,7 +1,7 @@ from dataclasses import field from datetime import datetime -from pydantic import BaseModel, ConfigDict +from pydantic import BaseModel, ConfigDict, Field from pydantic.dataclasses import dataclass from app.domain.enums import ExecutionErrorType, ExecutionStatus, ReplayStatus @@ -27,13 +27,11 @@ class ExecutionResultSummary(BaseModel): error_type: ExecutionErrorType | None = None -@dataclass -class ReplaySessionStatusDetail: +class ReplaySessionStatusDetail(ReplaySessionState): """Status detail with computed metadata for admin API.""" - session: ReplaySessionState estimated_completion: datetime | None = None - execution_results: list[ExecutionResultSummary] = field(default_factory=list) + execution_results: list[ExecutionResultSummary] = Field(default_factory=list) @dataclass diff --git a/backend/app/domain/enums/__init__.py b/backend/app/domain/enums/__init__.py index 53254742..dac9a236 100644 --- a/backend/app/domain/enums/__init__.py +++ b/backend/app/domain/enums/__init__.py @@ -1,5 +1,5 @@ from app.domain.enums.auth import LoginMethod, SettingsType -from app.domain.enums.common import Environment, ErrorType, SortOrder, Theme +from app.domain.enums.common import Environment, ErrorType, ExportFormat, SortOrder, Theme from app.domain.enums.events import EventType from app.domain.enums.execution import CancelStatus, ExecutionStatus, QueuePriority from app.domain.enums.kafka import GroupId, KafkaTopic @@ -21,6 +21,7 @@ # Common "Environment", "ErrorType", + "ExportFormat", "SortOrder", "Theme", # Events diff --git a/backend/app/domain/enums/common.py b/backend/app/domain/enums/common.py index a850ae54..7eec5e91 100644 --- a/backend/app/domain/enums/common.py +++ b/backend/app/domain/enums/common.py @@ -17,6 +17,13 @@ class Theme(StringEnum): AUTO = "auto" +class ExportFormat(StringEnum): + """Supported export file formats.""" + + CSV = "csv" + JSON = "json" + + class SortOrder(StringEnum): """Sort order for queries.""" diff --git a/backend/app/domain/notification/__init__.py b/backend/app/domain/notification/__init__.py index 04dfa3dc..69a94223 100644 --- a/backend/app/domain/notification/__init__.py +++ b/backend/app/domain/notification/__init__.py @@ -9,6 +9,7 @@ DomainNotificationListResult, DomainNotificationSubscription, DomainNotificationUpdate, + DomainSubscriptionListResult, DomainSubscriptionUpdate, ) @@ -18,6 +19,7 @@ "DomainNotificationListResult", "DomainNotificationSubscription", "DomainNotificationUpdate", + "DomainSubscriptionListResult", "DomainSubscriptionUpdate", "NotificationNotFoundError", "NotificationThrottledError", diff --git a/backend/app/domain/notification/models.py b/backend/app/domain/notification/models.py index 9a7ff4e3..cb17297b 100644 --- a/backend/app/domain/notification/models.py +++ b/backend/app/domain/notification/models.py @@ -71,6 +71,12 @@ class DomainNotificationListResult(BaseModel): unread_count: int +class DomainSubscriptionListResult(BaseModel): + model_config = ConfigDict(from_attributes=True) + + subscriptions: list[DomainNotificationSubscription] + + class DomainNotificationCreate(BaseModel): """Data for creating a notification.""" diff --git a/backend/app/domain/rate_limit/__init__.py b/backend/app/domain/rate_limit/__init__.py index 12127df7..c156efbf 100644 --- a/backend/app/domain/rate_limit/__init__.py +++ b/backend/app/domain/rate_limit/__init__.py @@ -9,6 +9,7 @@ UserRateLimit, UserRateLimitsResult, UserRateLimitSummary, + UserRateLimitUpdate, ) __all__ = [ @@ -22,4 +23,5 @@ "UserRateLimit", "UserRateLimitsResult", "UserRateLimitSummary", + "UserRateLimitUpdate", ] diff --git a/backend/app/domain/rate_limit/rate_limit_models.py b/backend/app/domain/rate_limit/rate_limit_models.py index 982ca003..034c388e 100644 --- a/backend/app/domain/rate_limit/rate_limit_models.py +++ b/backend/app/domain/rate_limit/rate_limit_models.py @@ -4,7 +4,7 @@ from dataclasses import field from datetime import datetime, timezone -from pydantic import ConfigDict +from pydantic import BaseModel, ConfigDict, Field from pydantic.dataclasses import dataclass from app.core.utils import StringEnum @@ -35,8 +35,9 @@ class EndpointUsageStats: remaining: int -@dataclass -class RateLimitRule: +class RateLimitRule(BaseModel): + model_config = ConfigDict(from_attributes=True) + endpoint_pattern: str group: EndpointGroup requests: int @@ -45,18 +46,29 @@ class RateLimitRule: algorithm: RateLimitAlgorithm = RateLimitAlgorithm.SLIDING_WINDOW priority: int = 0 enabled: bool = True - # Internal cache for matching speed; not serialized - compiled_pattern: re.Pattern[str] | None = field(default=None, repr=False, compare=False) + compiled_pattern: re.Pattern[str] | None = Field(default=None, exclude=True, repr=False) -@dataclass -class UserRateLimit: +class UserRateLimitUpdate(BaseModel): + """Update payload for user rate limits (excludes user_id and timestamps).""" + + model_config = ConfigDict(from_attributes=True) + + rules: list[RateLimitRule] = Field(default_factory=list) + bypass_rate_limit: bool = False + global_multiplier: float = 1.0 + notes: str | None = None + + +class UserRateLimit(BaseModel): + model_config = ConfigDict(from_attributes=True) + user_id: str - rules: list[RateLimitRule] = field(default_factory=list) + rules: list[RateLimitRule] = Field(default_factory=list) global_multiplier: float = 1.0 bypass_rate_limit: bool = False - created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc)) - updated_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc)) + created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) + updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) notes: str | None = None diff --git a/backend/app/domain/saga/__init__.py b/backend/app/domain/saga/__init__.py index fa795ab8..19b5d482 100644 --- a/backend/app/domain/saga/__init__.py +++ b/backend/app/domain/saga/__init__.py @@ -9,6 +9,7 @@ DomainResourceAllocation, DomainResourceAllocationCreate, Saga, + SagaCancellationResult, SagaConfig, SagaContextData, SagaFilter, @@ -21,6 +22,7 @@ "DomainResourceAllocation", "DomainResourceAllocationCreate", "Saga", + "SagaCancellationResult", "SagaConfig", "SagaContextData", "SagaInstance", diff --git a/backend/app/domain/saga/models.py b/backend/app/domain/saga/models.py index 9fc77449..36ee931b 100644 --- a/backend/app/domain/saga/models.py +++ b/backend/app/domain/saga/models.py @@ -85,6 +85,16 @@ def has_more(self) -> bool: return (self.skip + len(self.sagas)) < self.total +class SagaCancellationResult(BaseModel): + """Result of saga cancellation.""" + + model_config = ConfigDict(from_attributes=True) + + success: bool + message: str + saga_id: str + + class SagaStatistics(BaseModel): """Saga statistics.""" diff --git a/backend/app/domain/saved_script/__init__.py b/backend/app/domain/saved_script/__init__.py index f2bede41..2b65b108 100644 --- a/backend/app/domain/saved_script/__init__.py +++ b/backend/app/domain/saved_script/__init__.py @@ -2,12 +2,14 @@ from .models import ( DomainSavedScript, DomainSavedScriptCreate, + DomainSavedScriptListResult, DomainSavedScriptUpdate, ) __all__ = [ "DomainSavedScript", "DomainSavedScriptCreate", + "DomainSavedScriptListResult", "DomainSavedScriptUpdate", "SavedScriptNotFoundError", ] diff --git a/backend/app/domain/saved_script/models.py b/backend/app/domain/saved_script/models.py index d62328f2..ee4e6a90 100644 --- a/backend/app/domain/saved_script/models.py +++ b/backend/app/domain/saved_script/models.py @@ -28,6 +28,12 @@ class DomainSavedScript(DomainSavedScriptBase): updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) +class DomainSavedScriptListResult(BaseModel): + model_config = ConfigDict(from_attributes=True) + + scripts: list[DomainSavedScript] + + class DomainSavedScriptUpdate(BaseModel): model_config = ConfigDict(from_attributes=True) diff --git a/backend/app/schemas_pydantic/notification.py b/backend/app/schemas_pydantic/notification.py index 99888046..05491c3d 100644 --- a/backend/app/schemas_pydantic/notification.py +++ b/backend/app/schemas_pydantic/notification.py @@ -174,8 +174,8 @@ class SubscriptionUpdate(BaseModel): severities: list[NotificationSeverity] = Field(default_factory=list) include_tags: list[str] = Field(default_factory=list) exclude_tags: list[str] = Field(default_factory=list) - webhook_url: str | None = None - slack_webhook: str | None = None + webhook_url: str | None = Field(default=None, pattern=r"^https://") + slack_webhook: str | None = Field(default=None, pattern=r"^https://hooks\.slack\.com/") quiet_hours_enabled: bool = False quiet_hours_start: str | None = None quiet_hours_end: str | None = None diff --git a/backend/app/schemas_pydantic/saga.py b/backend/app/schemas_pydantic/saga.py index dc6beb19..0aca9488 100644 --- a/backend/app/schemas_pydantic/saga.py +++ b/backend/app/schemas_pydantic/saga.py @@ -27,6 +27,8 @@ class SagaStatusResponse(BaseModel): class SagaListResponse(BaseModel): """Response schema for saga list""" + model_config = ConfigDict(from_attributes=True) + sagas: list[SagaStatusResponse] total: int skip: int @@ -37,6 +39,8 @@ class SagaListResponse(BaseModel): class SagaCancellationResponse(BaseModel): """Response schema for saga cancellation""" + model_config = ConfigDict(from_attributes=True) + success: bool message: str saga_id: str diff --git a/backend/app/services/admin/admin_events_service.py b/backend/app/services/admin/admin_events_service.py index bdea362f..824fd299 100644 --- a/backend/app/services/admin/admin_events_service.py +++ b/backend/app/services/admin/admin_events_service.py @@ -9,7 +9,7 @@ from app.db.docs.replay import ReplaySessionDocument from app.db.repositories import AdminEventsRepository from app.domain.admin import ReplaySessionData, ReplaySessionStatusDetail, ReplaySessionUpdate -from app.domain.enums import ReplayStatus, ReplayTarget, ReplayType +from app.domain.enums import ExportFormat, ReplayStatus, ReplayTarget, ReplayType from app.domain.events import ( EventBrowseResult, EventDetail, @@ -19,7 +19,7 @@ EventSummary, ) from app.domain.exceptions import NotFoundError, ValidationError -from app.domain.replay import ReplayConfig, ReplayFilter, ReplaySessionState +from app.domain.replay import ReplayConfig, ReplayFilter from app.services.event_replay import EventReplayService @@ -196,16 +196,10 @@ async def get_replay_status(self, session_id: str) -> ReplaySessionStatusDetail if not doc: return None - now = datetime.now(timezone.utc) - estimated_completion = self._estimate_completion(doc, now) - session = ReplaySessionState.model_validate(doc) - execution_results = await self._repo.get_execution_results_for_filter(doc.config.filter) - - return ReplaySessionStatusDetail( - session=session, - estimated_completion=estimated_completion, - execution_results=execution_results, - ) + result = ReplaySessionStatusDetail.model_validate(doc) + result.estimated_completion = self._estimate_completion(doc, datetime.now(timezone.utc)) + result.execution_results = await self._repo.get_execution_results_for_filter(doc.config.filter) + return result def _estimate_completion(self, doc: ReplaySessionDocument, now: datetime) -> datetime | None: if not doc.is_running or not doc.started_at or doc.replayed_events <= 0: @@ -217,7 +211,14 @@ def _estimate_completion(self, doc: ReplaySessionDocument, now: datetime) -> dat remaining = doc.total_events - doc.replayed_events return now + timedelta(seconds=remaining / rate) if rate > 0 else None - async def export_events_csv_content(self, *, event_filter: EventFilter, limit: int) -> ExportResult: + async def export_events( + self, *, event_filter: EventFilter, limit: int, export_format: ExportFormat + ) -> ExportResult: + if export_format == ExportFormat.CSV: + return await self._export_csv(event_filter=event_filter, limit=limit) + return await self._export_json(event_filter=event_filter, limit=limit) + + async def _export_csv(self, *, event_filter: EventFilter, limit: int) -> ExportResult: events = await self._repo.get_events(event_filter, skip=0, limit=limit) rows = [EventExportRow.model_validate(e, from_attributes=True) for e in events] output = StringIO() @@ -249,7 +250,7 @@ async def export_events_csv_content(self, *, event_filter: EventFilter, limit: i ) return ExportResult(file_name=filename, content=output.getvalue(), media_type="text/csv") - async def export_events_json_content(self, *, event_filter: EventFilter, limit: int) -> ExportResult: + async def _export_json(self, *, event_filter: EventFilter, limit: int) -> ExportResult: events = await self._repo.get_events(event_filter, skip=0, limit=limit) # mode="json" auto-converts datetime fields to ISO strings events_data = [event.model_dump(mode="json") for event in events] diff --git a/backend/app/services/admin/admin_settings_service.py b/backend/app/services/admin/admin_settings_service.py index ed4d0565..eee352da 100644 --- a/backend/app/services/admin/admin_settings_service.py +++ b/backend/app/services/admin/admin_settings_service.py @@ -16,34 +16,29 @@ def __init__( self._runtime_settings = runtime_settings self.logger = logger - async def get_system_settings(self, admin_username: str) -> SystemSettings: + async def get_system_settings(self, user_id: str) -> SystemSettings: self.logger.info( "Admin retrieving system settings", - extra={"admin_username": admin_username}, + extra={"user_id": user_id}, ) return await self._runtime_settings.get_effective_settings() - async def update_system_settings( - self, - settings: SystemSettings, - updated_by: str, - user_id: str, - ) -> SystemSettings: + async def update_system_settings(self, settings: SystemSettings, user_id: str) -> SystemSettings: self.logger.info( "Admin updating system settings", - extra={"admin_username": updated_by}, + extra={"user_id": user_id}, ) - updated = await self._repo.update_system_settings(settings=settings, updated_by=updated_by, user_id=user_id) + updated = await self._repo.update_system_settings(settings=settings, user_id=user_id) self._runtime_settings.invalidate_cache() self.logger.info("System settings updated successfully") return updated - async def reset_system_settings(self, username: str, user_id: str) -> SystemSettings: + async def reset_system_settings(self, user_id: str) -> SystemSettings: self.logger.info( "Admin resetting system settings to defaults", - extra={"admin_username": username}, + extra={"user_id": user_id}, ) - await self._repo.reset_system_settings(username=username, user_id=user_id) + await self._repo.reset_system_settings(user_id=user_id) self._runtime_settings.invalidate_cache() self.logger.info("System settings reset to defaults") return await self._runtime_settings.get_effective_settings() diff --git a/backend/app/services/admin/admin_user_service.py b/backend/app/services/admin/admin_user_service.py index a04bf7aa..69bca48c 100644 --- a/backend/app/services/admin/admin_user_service.py +++ b/backend/app/services/admin/admin_user_service.py @@ -1,5 +1,4 @@ import logging -from dataclasses import asdict from datetime import datetime, timedelta, timezone from app.core.security import SecurityService @@ -7,7 +6,7 @@ from app.domain.admin import AdminUserOverviewDomain, DerivedCountsDomain, RateLimitSummaryDomain from app.domain.enums import EventType, ExecutionStatus, UserRole from app.domain.exceptions import ConflictError, NotFoundError -from app.domain.rate_limit import RateLimitUpdateResult, UserRateLimit, UserRateLimitsResult +from app.domain.rate_limit import RateLimitUpdateResult, UserRateLimit, UserRateLimitsResult, UserRateLimitUpdate from app.domain.user import DomainUserCreate, PasswordReset, User, UserDeleteResult, UserListResult, UserUpdate from app.schemas_pydantic.user import UserCreate from app.services.event_service import EventService @@ -101,12 +100,12 @@ def _count(status: ExecutionStatus) -> int: ) async def list_users( - self, *, admin_username: str, limit: int, offset: int, search: str | None, role: UserRole | None + self, *, admin_user_id: str, limit: int, offset: int, search: str | None, role: UserRole | None ) -> UserListResult: self.logger.info( "Admin listing users", extra={ - "admin_username": admin_username, + "admin_user_id": admin_user_id, "limit": limit, "offset": offset, "search": search, @@ -129,10 +128,10 @@ async def list_users( return UserListResult(users=enriched_users, total=result.total, offset=result.offset, limit=result.limit) - async def create_user(self, *, admin_username: str, user_data: UserCreate) -> User: + async def create_user(self, *, admin_user_id: str, user_data: UserCreate) -> User: """Create a new user and return domain user.""" self.logger.info( - "Admin creating new user", extra={"admin_username": admin_username, "new_username": user_data.username} + "Admin creating new user", extra={"admin_user_id": admin_user_id, "new_username": user_data.username} ) # Ensure not exists search_result = await self._users.list_users(limit=1, offset=0, search=user_data.username) @@ -152,29 +151,29 @@ async def create_user(self, *, admin_username: str, user_data: UserCreate) -> Us ) created = await self._users.create_user(create_data) self.logger.info( - "User created successfully", extra={"new_username": user_data.username, "admin_username": admin_username} + "User created successfully", extra={"new_username": user_data.username, "admin_user_id": admin_user_id} ) return created - async def get_user(self, *, admin_username: str, user_id: str) -> User | None: + async def get_user(self, *, admin_user_id: str, user_id: str) -> User | None: self.logger.info( - "Admin getting user details", extra={"admin_username": admin_username, "target_user_id": user_id} + "Admin getting user details", extra={"admin_user_id": admin_user_id, "target_user_id": user_id} ) return await self._users.get_user_by_id(user_id) - async def update_user(self, *, admin_username: str, user_id: str, update: UserUpdate) -> User | None: + async def update_user(self, *, admin_user_id: str, user_id: str, update: UserUpdate) -> User | None: self.logger.info( "Admin updating user", - extra={"admin_username": admin_username, "target_user_id": user_id}, + extra={"admin_user_id": admin_user_id, "target_user_id": user_id}, ) if update.password is not None: update = update.model_copy(update={"password": self._security.get_password_hash(update.password)}) return await self._users.update_user(user_id, update) - async def delete_user(self, *, admin_username: str, user_id: str, cascade: bool) -> UserDeleteResult: + async def delete_user(self, *, admin_user_id: str, user_id: str, cascade: bool) -> UserDeleteResult: self.logger.info( "Admin deleting user", - extra={"admin_username": admin_username, "target_user_id": user_id, "cascade": cascade}, + extra={"admin_user_id": admin_user_id, "target_user_id": user_id, "cascade": cascade}, ) # Reset rate limits prior to deletion await self._rate_limits.reset_user_limits(user_id) @@ -183,9 +182,9 @@ async def delete_user(self, *, admin_username: str, user_id: str, cascade: bool) self.logger.info("User deleted successfully", extra={"target_user_id": user_id}) return result - async def reset_user_password(self, *, admin_username: str, user_id: str, new_password: str) -> bool: + async def reset_user_password(self, *, admin_user_id: str, user_id: str, new_password: str) -> bool: self.logger.info( - "Admin resetting user password", extra={"admin_username": admin_username, "target_user_id": user_id} + "Admin resetting user password", extra={"admin_user_id": admin_user_id, "target_user_id": user_id} ) hashed = self._security.get_password_hash(new_password) pr = PasswordReset(user_id=user_id, new_password=hashed) @@ -194,9 +193,9 @@ async def reset_user_password(self, *, admin_username: str, user_id: str, new_pa self.logger.info("User password reset successfully", extra={"target_user_id": user_id}) return ok - async def get_user_rate_limits(self, *, admin_username: str, user_id: str) -> UserRateLimitsResult: + async def get_user_rate_limits(self, *, admin_user_id: str, user_id: str) -> UserRateLimitsResult: self.logger.info( - "Admin getting user rate limits", extra={"admin_username": admin_username, "target_user_id": user_id} + "Admin getting user rate limits", extra={"admin_user_id": admin_user_id, "target_user_id": user_id} ) user_limit = await self._rate_limits.get_user_rate_limit(user_id) usage_stats = await self._rate_limits.get_usage_stats(user_id) @@ -207,19 +206,25 @@ async def get_user_rate_limits(self, *, admin_username: str, user_id: str) -> Us ) async def update_user_rate_limits( - self, *, admin_username: str, user_id: str, config: UserRateLimit + self, *, admin_user_id: str, user_id: str, update: UserRateLimitUpdate ) -> RateLimitUpdateResult: self.logger.info( "Admin updating user rate limits", - extra={"admin_username": admin_username, "target_user_id": user_id, "config": asdict(config)}, + extra={"admin_user_id": admin_user_id, "target_user_id": user_id}, + ) + config = UserRateLimit( + user_id=user_id, + rules=update.rules, + bypass_rate_limit=update.bypass_rate_limit, + global_multiplier=update.global_multiplier, + notes=update.notes, ) - config.user_id = user_id await self._rate_limits.update_user_rate_limit(user_id, config) return RateLimitUpdateResult(user_id=user_id, updated=True, config=config) - async def reset_user_rate_limits(self, *, admin_username: str, user_id: str) -> bool: + async def reset_user_rate_limits(self, *, admin_user_id: str, user_id: str) -> bool: self.logger.info( - "Admin resetting user rate limits", extra={"admin_username": admin_username, "target_user_id": user_id} + "Admin resetting user rate limits", extra={"admin_user_id": admin_user_id, "target_user_id": user_id} ) await self._rate_limits.reset_user_limits(user_id) return True diff --git a/backend/app/services/notification_service.py b/backend/app/services/notification_service.py index 4de201e9..cadde066 100644 --- a/backend/app/services/notification_service.py +++ b/backend/app/services/notification_service.py @@ -24,6 +24,7 @@ DomainNotificationListResult, DomainNotificationSubscription, DomainNotificationUpdate, + DomainSubscriptionListResult, DomainSubscriptionUpdate, NotificationNotFoundError, NotificationThrottledError, @@ -538,35 +539,16 @@ async def update_subscription( self, user_id: str, channel: NotificationChannel, - enabled: bool, - webhook_url: str | None = None, - slack_webhook: str | None = None, - severities: list[NotificationSeverity] | None = None, - include_tags: list[str] | None = None, - exclude_tags: list[str] | None = None, + update_data: DomainSubscriptionUpdate, ) -> DomainNotificationSubscription: """Update notification subscription preferences.""" # Validate channel-specific requirements - if channel == NotificationChannel.WEBHOOK and enabled: - if not webhook_url: + if channel == NotificationChannel.WEBHOOK and update_data.enabled: + if not update_data.webhook_url: raise NotificationValidationError("webhook_url is required when enabling WEBHOOK") - if not (webhook_url.startswith("http://") or webhook_url.startswith("https://")): - raise NotificationValidationError("webhook_url must start with http:// or https://") - if channel == NotificationChannel.SLACK and enabled: - if not slack_webhook: + if channel == NotificationChannel.SLACK and update_data.enabled: + if not update_data.slack_webhook: raise NotificationValidationError("slack_webhook is required when enabling SLACK") - if not slack_webhook.startswith("https://hooks.slack.com/"): - raise NotificationValidationError("slack_webhook must be a valid Slack webhook URL") - - # Build update data - update_data = DomainSubscriptionUpdate( - enabled=enabled, - webhook_url=webhook_url, - slack_webhook=slack_webhook, - severities=severities, - include_tags=include_tags, - exclude_tags=exclude_tags, - ) return await self.repository.upsert_subscription(user_id, channel, update_data) @@ -574,9 +556,10 @@ async def mark_all_as_read(self, user_id: str) -> int: """Mark all notifications as read for a user.""" return await self.repository.mark_all_as_read(user_id) - async def get_subscriptions(self, user_id: str) -> dict[NotificationChannel, DomainNotificationSubscription]: + async def get_subscriptions(self, user_id: str) -> DomainSubscriptionListResult: """Get all notification subscriptions for a user.""" - return await self.repository.get_all_subscriptions(user_id) + subs = await self.repository.get_all_subscriptions(user_id) + return DomainSubscriptionListResult(subscriptions=subs) async def delete_notification(self, user_id: str, notification_id: str) -> None: """Delete a notification.""" diff --git a/backend/app/services/saga/saga_service.py b/backend/app/services/saga/saga_service.py index 0af291d6..dea0f534 100644 --- a/backend/app/services/saga/saga_service.py +++ b/backend/app/services/saga/saga_service.py @@ -5,6 +5,7 @@ from app.domain.saga import ( Saga, SagaAccessDeniedError, + SagaCancellationResult, SagaFilter, SagaInvalidStateError, SagaListResult, @@ -134,7 +135,7 @@ async def list_user_sagas( ) return result - async def cancel_saga(self, saga_id: str, user: User) -> bool: + async def cancel_saga(self, saga_id: str, user: User) -> SagaCancellationResult: """Cancel a saga with permission check.""" self.logger.info( "User requesting saga cancellation", @@ -156,7 +157,8 @@ async def cancel_saga(self, saga_id: str, user: User) -> bool: ) else: self.logger.error("Failed to cancel saga", extra={"saga_id": saga_id, "user_id": user.user_id}) - return success + message = "Saga cancelled successfully" if success else "Failed to cancel saga" + return SagaCancellationResult(success=success, message=message, saga_id=saga_id) async def get_saga_statistics(self, user: User, include_all: bool = False) -> dict[str, object]: """Get saga statistics.""" diff --git a/backend/app/services/saved_script_service.py b/backend/app/services/saved_script_service.py index 8c8343ed..64e5aef1 100644 --- a/backend/app/services/saved_script_service.py +++ b/backend/app/services/saved_script_service.py @@ -4,6 +4,7 @@ from app.domain.saved_script import ( DomainSavedScript, DomainSavedScriptCreate, + DomainSavedScriptListResult, DomainSavedScriptUpdate, SavedScriptNotFoundError, ) @@ -107,7 +108,7 @@ async def delete_saved_script(self, script_id: str, user_id: str) -> None: extra={"script_id": script_id, "user_id": user_id}, ) - async def list_saved_scripts(self, user_id: str) -> list[DomainSavedScript]: + async def list_saved_scripts(self, user_id: str) -> DomainSavedScriptListResult: self.logger.info( "Listing saved scripts", extra={ @@ -121,4 +122,4 @@ async def list_saved_scripts(self, user_id: str) -> list[DomainSavedScript]: "Successfully retrieved saved scripts", extra={"user_id": user_id, "script_count": len(scripts)}, ) - return scripts + return DomainSavedScriptListResult(scripts=scripts) diff --git a/backend/tests/e2e/db/repositories/test_admin_settings_repository.py b/backend/tests/e2e/db/repositories/test_admin_settings_repository.py index 9758d92f..7a5aeea7 100644 --- a/backend/tests/e2e/db/repositories/test_admin_settings_repository.py +++ b/backend/tests/e2e/db/repositories/test_admin_settings_repository.py @@ -29,7 +29,7 @@ async def test_get_system_settings_existing(repo: AdminSettingsRepository) -> No @pytest.mark.asyncio async def test_get_seeds_with_provided_defaults(repo: AdminSettingsRepository) -> None: - await repo.reset_system_settings("test", "test") + await repo.reset_system_settings(user_id="test") custom = SystemSettings(max_timeout_seconds=777, memory_limit="1024Mi") s = await repo.get_system_settings(defaults=custom) assert s.max_timeout_seconds == 777 @@ -39,7 +39,7 @@ async def test_get_seeds_with_provided_defaults(repo: AdminSettingsRepository) - @pytest.mark.asyncio async def test_update_persists_values(repo: AdminSettingsRepository) -> None: updated_settings = SystemSettings(max_timeout_seconds=42, cpu_limit="500m") - result = await repo.update_system_settings(updated_settings, updated_by="admin", user_id="u1") + result = await repo.update_system_settings(updated_settings, user_id="u1") assert result.max_timeout_seconds == 42 assert result.cpu_limit == "500m" @@ -50,23 +50,19 @@ async def test_update_persists_values(repo: AdminSettingsRepository) -> None: @pytest.mark.asyncio async def test_update_creates_audit_log(repo: AdminSettingsRepository) -> None: count_before = await AuditLogDocument.count() - await repo.update_system_settings(SystemSettings(), updated_by="admin", user_id="u1") + await repo.update_system_settings(SystemSettings(), user_id="u1") assert await AuditLogDocument.count() > count_before @pytest.mark.asyncio async def test_reset_deletes_doc_and_returns_defaults(repo: AdminSettingsRepository) -> None: - await repo.update_system_settings( - SystemSettings(max_timeout_seconds=999), - updated_by="admin", - user_id="u1", - ) - result = await repo.reset_system_settings("admin", "u1") + await repo.update_system_settings(SystemSettings(max_timeout_seconds=999), user_id="u1") + result = await repo.reset_system_settings(user_id="u1") assert result.max_timeout_seconds == _DEFAULTS.max_timeout_seconds @pytest.mark.asyncio async def test_reset_creates_audit_log(repo: AdminSettingsRepository) -> None: count_before = await AuditLogDocument.count() - await repo.reset_system_settings("admin", "u1") + await repo.reset_system_settings(user_id="u1") assert await AuditLogDocument.count() > count_before diff --git a/backend/tests/e2e/notifications/test_notification_sse.py b/backend/tests/e2e/notifications/test_notification_sse.py index e9e1f4b7..1b080127 100644 --- a/backend/tests/e2e/notifications/test_notification_sse.py +++ b/backend/tests/e2e/notifications/test_notification_sse.py @@ -3,6 +3,7 @@ import pytest from app.domain.enums import NotificationChannel, NotificationSeverity +from app.domain.notification import DomainSubscriptionUpdate from app.schemas_pydantic.sse import RedisNotificationMessage from app.services.notification_service import NotificationService from app.services.sse import SSERedisBus @@ -21,7 +22,7 @@ async def test_in_app_notification_published_to_sse(scope: AsyncContainer) -> No sub = await bus.open_notification_subscription(user_id) # Enable IN_APP subscription for the user to allow delivery - await svc.update_subscription(user_id, NotificationChannel.IN_APP, True) + await svc.update_subscription(user_id, NotificationChannel.IN_APP, DomainSubscriptionUpdate(enabled=True)) # Create notification via service (IN_APP channel triggers SSE publish) # Delivery is now awaited synchronously - message in Redis immediately diff --git a/backend/tests/e2e/services/notifications/test_notification_service.py b/backend/tests/e2e/services/notifications/test_notification_service.py index 1a6ba243..07740513 100644 --- a/backend/tests/e2e/services/notifications/test_notification_service.py +++ b/backend/tests/e2e/services/notifications/test_notification_service.py @@ -5,6 +5,7 @@ from app.domain.enums import NotificationChannel, NotificationSeverity, NotificationStatus from app.domain.notification import ( DomainNotificationListResult, + DomainSubscriptionUpdate, NotificationNotFoundError, NotificationValidationError, ) @@ -371,7 +372,7 @@ async def test_update_subscription_in_app(self, scope: AsyncContainer) -> None: subscription = await svc.update_subscription( user_id=user_id, channel=NotificationChannel.IN_APP, - enabled=True, + update_data=DomainSubscriptionUpdate(enabled=True), ) assert subscription.channel == NotificationChannel.IN_APP @@ -392,14 +393,14 @@ async def test_update_subscription_disable(self, scope: AsyncContainer) -> None: await svc.update_subscription( user_id=user_id, channel=NotificationChannel.IN_APP, - enabled=True, + update_data=DomainSubscriptionUpdate(enabled=True), ) # Then disable subscription = await svc.update_subscription( user_id=user_id, channel=NotificationChannel.IN_APP, - enabled=False, + update_data=DomainSubscriptionUpdate(enabled=False), ) assert subscription.enabled is False @@ -415,8 +416,10 @@ async def test_update_subscription_with_severities( subscription = await svc.update_subscription( user_id=user_id, channel=NotificationChannel.IN_APP, - enabled=True, - severities=[NotificationSeverity.HIGH, NotificationSeverity.URGENT], + update_data=DomainSubscriptionUpdate( + enabled=True, + severities=[NotificationSeverity.HIGH, NotificationSeverity.URGENT], + ), ) assert subscription.severities is not None @@ -433,8 +436,7 @@ async def test_update_webhook_requires_url(self, scope: AsyncContainer) -> None: await svc.update_subscription( user_id=user_id, channel=NotificationChannel.WEBHOOK, - enabled=True, - # No webhook_url provided + update_data=DomainSubscriptionUpdate(enabled=True), ) @pytest.mark.asyncio @@ -446,8 +448,7 @@ async def test_update_webhook_with_url(self, scope: AsyncContainer) -> None: subscription = await svc.update_subscription( user_id=user_id, channel=NotificationChannel.WEBHOOK, - enabled=True, - webhook_url="https://example.com/webhook", + update_data=DomainSubscriptionUpdate(enabled=True, webhook_url="https://example.com/webhook"), ) assert subscription.enabled is True @@ -463,14 +464,15 @@ async def test_get_all_subscriptions(self, scope: AsyncContainer) -> None: await svc.update_subscription( user_id=user_id, channel=NotificationChannel.IN_APP, - enabled=True, + update_data=DomainSubscriptionUpdate(enabled=True), ) # Get all - subscriptions = await svc.get_subscriptions(user_id) + result = await svc.get_subscriptions(user_id) - assert isinstance(subscriptions, dict) - assert NotificationChannel.IN_APP in subscriptions + assert isinstance(result.subscriptions, list) + channels = [s.channel for s in result.subscriptions] + assert NotificationChannel.IN_APP in channels class TestSystemNotification: @@ -561,8 +563,7 @@ async def test_notification_with_subscription_filter( await svc.update_subscription( user_id=user_id, channel=NotificationChannel.IN_APP, - enabled=True, - severities=[NotificationSeverity.HIGH], + update_data=DomainSubscriptionUpdate(enabled=True, severities=[NotificationSeverity.HIGH]), ) # Create HIGH severity notification - should be delivered diff --git a/backend/tests/e2e/services/saved_script/test_saved_script_service.py b/backend/tests/e2e/services/saved_script/test_saved_script_service.py index 57ce1b91..018fa208 100644 --- a/backend/tests/e2e/services/saved_script/test_saved_script_service.py +++ b/backend/tests/e2e/services/saved_script/test_saved_script_service.py @@ -118,15 +118,15 @@ async def test_create_scripts_different_users_isolated( script2 = await service.create_saved_script(payload2, user2) # List each user's scripts - user1_scripts = await service.list_saved_scripts(user1) - user2_scripts = await service.list_saved_scripts(user2) + user1_result = await service.list_saved_scripts(user1) + user2_result = await service.list_saved_scripts(user2) # Should only see their own - assert any(s.script_id == script1.script_id for s in user1_scripts) - assert not any(s.script_id == script2.script_id for s in user1_scripts) + assert any(s.script_id == script1.script_id for s in user1_result.scripts) + assert not any(s.script_id == script2.script_id for s in user1_result.scripts) - assert any(s.script_id == script2.script_id for s in user2_scripts) - assert not any(s.script_id == script1.script_id for s in user2_scripts) + assert any(s.script_id == script2.script_id for s in user2_result.scripts) + assert not any(s.script_id == script1.script_id for s in user2_result.scripts) class TestGetSavedScript: @@ -325,10 +325,10 @@ async def test_list_saved_scripts_empty(self, scope: AsyncContainer) -> None: service: SavedScriptService = await scope.get(SavedScriptService) user_id = _unique_user_id() - scripts = await service.list_saved_scripts(user_id) + result = await service.list_saved_scripts(user_id) - assert isinstance(scripts, list) - assert len(scripts) == 0 + assert isinstance(result.scripts, list) + assert len(result.scripts) == 0 @pytest.mark.asyncio async def test_list_saved_scripts_multiple(self, scope: AsyncContainer) -> None: @@ -343,10 +343,10 @@ async def test_list_saved_scripts_multiple(self, scope: AsyncContainer) -> None: await service.create_saved_script(payload, user_id) # List - scripts = await service.list_saved_scripts(user_id) + result = await service.list_saved_scripts(user_id) - assert len(scripts) >= 3 - names = [s.name for s in scripts] + assert len(result.scripts) >= 3 + names = [s.name for s in result.scripts] for expected_name in script_names: assert expected_name in names @@ -370,15 +370,15 @@ async def test_list_saved_scripts_user_isolated( await service.create_saved_script(payload, user2) # List user1's scripts - user1_scripts = await service.list_saved_scripts(user1) - assert len(user1_scripts) >= 2 - for script in user1_scripts: + user1_result = await service.list_saved_scripts(user1) + assert len(user1_result.scripts) >= 2 + for script in user1_result.scripts: assert script.user_id == user1 # List user2's scripts - user2_scripts = await service.list_saved_scripts(user2) - assert len(user2_scripts) >= 3 - for script in user2_scripts: + user2_result = await service.list_saved_scripts(user2) + assert len(user2_result.scripts) >= 3 + for script in user2_result.scripts: assert script.user_id == user2 @@ -415,8 +415,8 @@ async def test_full_crud_lifecycle(self, scope: AsyncContainer) -> None: assert updated.script == "print('v2')" # List - should include our script - scripts = await service.list_saved_scripts(user_id) - assert any(s.script_id == created.script_id for s in scripts) + result = await service.list_saved_scripts(user_id) + assert any(s.script_id == created.script_id for s in result.scripts) # Delete await service.delete_saved_script(script_id, user_id) diff --git a/backend/tests/e2e/test_admin_events_routes.py b/backend/tests/e2e/test_admin_events_routes.py index 1d8bae2e..da824f2c 100644 --- a/backend/tests/e2e/test_admin_events_routes.py +++ b/backend/tests/e2e/test_admin_events_routes.py @@ -206,8 +206,8 @@ async def test_get_event_stats_forbidden_for_regular_user( assert response.status_code == 403 -class TestExportEventsCSV: - """Tests for GET /api/v1/admin/events/export/csv.""" +class TestExportEvents: + """Tests for GET /api/v1/admin/events/export/{format}.""" @pytest.mark.asyncio async def test_export_events_csv(self, test_admin: AsyncClient) -> None: @@ -225,34 +225,6 @@ async def test_export_events_csv(self, test_admin: AsyncClient) -> None: assert "Event ID" in body_csv assert "Timestamp" in body_csv - @pytest.mark.asyncio - async def test_export_events_csv_with_filters( - self, test_admin: AsyncClient - ) -> None: - """Export CSV with event type filters.""" - response = await test_admin.get( - "/api/v1/admin/events/export/csv", - params={ - "event_types": [EventType.EXECUTION_REQUESTED], - "limit": 100, - }, - ) - - assert response.status_code == 200 - - @pytest.mark.asyncio - async def test_export_events_csv_forbidden_for_regular_user( - self, test_user: AsyncClient - ) -> None: - """Regular user cannot export events.""" - response = await test_user.get("/api/v1/admin/events/export/csv") - - assert response.status_code == 403 - - -class TestExportEventsJSON: - """Tests for GET /api/v1/admin/events/export/json.""" - @pytest.mark.asyncio async def test_export_events_json(self, test_admin: AsyncClient) -> None: """Admin can export events as JSON.""" @@ -271,29 +243,38 @@ async def test_export_events_json(self, test_admin: AsyncClient) -> None: assert "exported_at" in data["export_metadata"] @pytest.mark.asyncio - async def test_export_events_json_with_filters( - self, test_admin: AsyncClient + @pytest.mark.parametrize("export_format", ["csv", "json"]) + async def test_export_events_with_filters( + self, test_admin: AsyncClient, export_format: str ) -> None: - """Export JSON with comprehensive filters.""" + """Export with event type filters works for both formats.""" response = await test_admin.get( - "/api/v1/admin/events/export/json", + f"/api/v1/admin/events/export/{export_format}", params={ - "event_types": [EventType.EXECUTION_REQUESTED, EventType.EXECUTION_STARTED], - "limit": 500, + "event_types": [EventType.EXECUTION_REQUESTED], + "limit": 100, }, ) assert response.status_code == 200 @pytest.mark.asyncio - async def test_export_events_json_forbidden_for_regular_user( - self, test_user: AsyncClient + @pytest.mark.parametrize("export_format", ["csv", "json"]) + async def test_export_events_forbidden_for_regular_user( + self, test_user: AsyncClient, export_format: str ) -> None: """Regular user cannot export events.""" - response = await test_user.get("/api/v1/admin/events/export/json") + response = await test_user.get(f"/api/v1/admin/events/export/{export_format}") assert response.status_code == 403 + @pytest.mark.asyncio + async def test_export_events_invalid_format(self, test_admin: AsyncClient) -> None: + """Invalid export format returns 422.""" + response = await test_admin.get("/api/v1/admin/events/export/xml") + + assert response.status_code == 422 + class TestGetEventDetail: """Tests for GET /api/v1/admin/events/{event_id}.""" diff --git a/backend/tests/e2e/test_notifications_routes.py b/backend/tests/e2e/test_notifications_routes.py index 7812a0d8..472190dd 100644 --- a/backend/tests/e2e/test_notifications_routes.py +++ b/backend/tests/e2e/test_notifications_routes.py @@ -232,6 +232,51 @@ async def test_update_subscription_with_tags( assert result.exclude_tags == ["debug"] +class TestSubscriptionUrlValidation: + """Tests for URL format validation on subscription updates.""" + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "channel, payload", + [ + ( + NotificationChannel.WEBHOOK, + {"enabled": True, "webhook_url": "http://example.com/hook"}, + ), + ( + NotificationChannel.WEBHOOK, + {"enabled": False, "webhook_url": "not-a-url"}, + ), + ( + NotificationChannel.SLACK, + {"enabled": True, "slack_webhook": "https://evil.com/hook"}, + ), + ( + NotificationChannel.SLACK, + {"enabled": False, "slack_webhook": "http://bad"}, + ), + ], + ids=[ + "webhook_rejects_http_url", + "webhook_rejects_bad_url_when_disabled", + "slack_rejects_invalid_webhook", + "slack_rejects_bad_url_when_disabled", + ], + ) + async def test_update_subscription_rejects_invalid_url( + self, + test_user: AsyncClient, + channel: NotificationChannel, + payload: dict[str, object], + ) -> None: + """Invalid webhook/slack URLs are rejected with 422 regardless of enabled flag.""" + response = await test_user.put( + f"/api/v1/notifications/subscriptions/{channel}", + json=payload, + ) + assert response.status_code == 422 + + class TestUnreadCount: """Tests for GET /api/v1/notifications/unread-count.""" diff --git a/backend/tests/e2e/test_saved_scripts_routes.py b/backend/tests/e2e/test_saved_scripts_routes.py index e06564f9..cf8cad07 100644 --- a/backend/tests/e2e/test_saved_scripts_routes.py +++ b/backend/tests/e2e/test_saved_scripts_routes.py @@ -2,6 +2,7 @@ import pytest from app.schemas_pydantic.saved_script import ( SavedScriptCreateRequest, + SavedScriptListResponse, SavedScriptResponse, SavedScriptUpdate, ) @@ -74,12 +75,10 @@ async def test_list_saved_scripts( response = await test_user.get("/api/v1/scripts") assert response.status_code == 200 - scripts = [ - SavedScriptResponse.model_validate(s) for s in response.json() - ] + result = SavedScriptListResponse.model_validate(response.json()) - assert len(scripts) >= 1 - assert any(new_script_request.name in s.name for s in scripts) + assert len(result.scripts) >= 1 + assert any(new_script_request.name in s.name for s in result.scripts) @pytest.mark.asyncio async def test_list_saved_scripts_only_own( @@ -91,10 +90,10 @@ async def test_list_saved_scripts_only_own( response = await another_user.get("/api/v1/scripts") assert response.status_code == 200 - scripts = response.json() + result = SavedScriptListResponse.model_validate(response.json()) # Should not contain test_user's script - assert not any(new_script_request.name in s["name"] for s in scripts) + assert not any(new_script_request.name in s.name for s in result.scripts) class TestGetSavedScript: diff --git a/backend/tests/unit/services/test_admin_settings_service.py b/backend/tests/unit/services/test_admin_settings_service.py index 329a6bfc..bc553371 100644 --- a/backend/tests/unit/services/test_admin_settings_service.py +++ b/backend/tests/unit/services/test_admin_settings_service.py @@ -31,7 +31,7 @@ async def test_get_delegates_to_runtime_loader() -> None: expected = SystemSettings(max_timeout_seconds=42) service, repo, runtime = _make_service(repo_return=expected) - result = await service.get_system_settings("admin") + result = await service.get_system_settings("u1") runtime.get_effective_settings.assert_called_once() repo.get_system_settings.assert_not_called() @@ -44,9 +44,9 @@ async def test_update_calls_repo_and_invalidates_cache() -> None: service, repo, runtime = _make_service() repo.update_system_settings.return_value = new_settings - result = await service.update_system_settings(new_settings, updated_by="admin", user_id="u1") + result = await service.update_system_settings(new_settings, "u1") - repo.update_system_settings.assert_called_once_with(settings=new_settings, updated_by="admin", user_id="u1") + repo.update_system_settings.assert_called_once_with(settings=new_settings, user_id="u1") runtime.invalidate_cache.assert_called_once() assert result.max_timeout_seconds == 600 @@ -57,9 +57,9 @@ async def test_reset_calls_repo_invalidates_cache_and_reloads() -> None: service, repo, runtime = _make_service() runtime.get_effective_settings.return_value = defaults - result = await service.reset_system_settings("admin", "u1") + result = await service.reset_system_settings("u1") - repo.reset_system_settings.assert_called_once_with(username="admin", user_id="u1") + repo.reset_system_settings.assert_called_once_with(user_id="u1") runtime.invalidate_cache.assert_called_once() # After reset, reads fresh from runtime loader assert runtime.get_effective_settings.call_count == 1 @@ -82,6 +82,6 @@ def _track_invalidate() -> None: repo.update_system_settings.side_effect = _track_update runtime.invalidate_cache.side_effect = _track_invalidate - await service.update_system_settings(SystemSettings(), updated_by="admin", user_id="u1") + await service.update_system_settings(SystemSettings(), "u1") assert call_order == ["repo_update", "invalidate"] diff --git a/docs/reference/openapi.json b/docs/reference/openapi.json index 16ebea1a..bcceab41 100644 --- a/docs/reference/openapi.json +++ b/docs/reference/openapi.json @@ -988,11 +988,7 @@ "content": { "application/json": { "schema": { - "items": { - "$ref": "#/components/schemas/SavedScriptResponse" - }, - "type": "array", - "title": "Response List Saved Scripts Api V1 Scripts Get" + "$ref": "#/components/schemas/SavedScriptListResponse" } } } @@ -2081,118 +2077,23 @@ } } }, - "/api/v1/admin/events/export/csv": { + "/api/v1/admin/events/export/{export_format}": { "get": { "tags": [ "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", + "summary": "Export Events", + "description": "Export filtered events as a downloadable file.", + "operationId": "export_events_api_v1_admin_events_export__export_format__get", "parameters": [ { - "name": "event_types", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "items": { - "$ref": "#/components/schemas/EventType" - } - }, - { - "type": "null" - } - ], - "description": "Event types (repeat param for multiple)", - "title": "Event Types" - }, - "description": "Event types (repeat param for multiple)" - }, - { - "name": "start_time", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "description": "Start time", - "title": "Start Time" - }, - "description": "Start time" - }, - { - "name": "end_time", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "description": "End time", - "title": "End Time" - }, - "description": "End time" - }, - { - "name": "limit", - "in": "query", - "required": false, + "name": "export_format", + "in": "path", + "required": true, "schema": { - "type": "integer", - "maximum": 50000, - "minimum": 1, - "default": 10000, - "title": "Limit" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } + "$ref": "#/components/schemas/ExportFormat" } }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/admin/events/export/json": { - "get": { - "tags": [ - "admin-events" - ], - "summary": "Export Events Json", - "description": "Export events as JSON with comprehensive filtering.", - "operationId": "export_events_json_api_v1_admin_events_export_json_get", - "parameters": [ { "name": "event_types", "in": "query", @@ -8512,6 +8413,15 @@ ], "title": "ExecutionTimeoutEvent" }, + "ExportFormat": { + "type": "string", + "enum": [ + "csv", + "json" + ], + "title": "ExportFormat", + "description": "Supported export file formats." + }, "HTTPValidationError": { "properties": { "detail": { @@ -12311,6 +12221,22 @@ ], "title": "SavedScriptCreateRequest" }, + "SavedScriptListResponse": { + "properties": { + "scripts": { + "items": { + "$ref": "#/components/schemas/SavedScriptResponse" + }, + "type": "array", + "title": "Scripts" + } + }, + "type": "object", + "required": [ + "scripts" + ], + "title": "SavedScriptListResponse" + }, "SavedScriptResponse": { "properties": { "script_id": { @@ -13094,7 +13020,8 @@ "webhook_url": { "anyOf": [ { - "type": "string" + "type": "string", + "pattern": "^https://" }, { "type": "null" @@ -13105,7 +13032,8 @@ "slack_webhook": { "anyOf": [ { - "type": "string" + "type": "string", + "pattern": "^https://hooks\\.slack\\.com/" }, { "type": "null" diff --git a/frontend/src/lib/api/index.ts b/frontend/src/lib/api/index.ts index 47665926..304a48d9 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 { browseEventsApiV1AdminEventsBrowsePost, cancelExecutionApiV1ExecutionsExecutionIdCancelPost, cancelReplaySessionApiV1ReplaySessionsSessionIdCancelPost, cancelSagaApiV1SagasSagaIdCancelPost, cleanupOldSessionsApiV1ReplayCleanupPost, createExecutionApiV1ExecutePost, createReplaySessionApiV1ReplaySessionsPost, createSavedScriptApiV1ScriptsPost, createUserApiV1AdminUsersPost, deleteEventApiV1AdminEventsEventIdDelete, deleteExecutionApiV1ExecutionsExecutionIdDelete, deleteNotificationApiV1NotificationsNotificationIdDelete, deleteSavedScriptApiV1ScriptsScriptIdDelete, deleteUserApiV1AdminUsersUserIdDelete, discardDlqMessageApiV1DlqMessagesEventIdDelete, executionEventsApiV1EventsExecutionsExecutionIdGet, exportEventsCsvApiV1AdminEventsExportCsvGet, exportEventsJsonApiV1AdminEventsExportJsonGet, getCurrentUserProfileApiV1AuthMeGet, getDlqMessageApiV1DlqMessagesEventIdGet, getDlqMessagesApiV1DlqMessagesGet, getDlqTopicsApiV1DlqTopicsGet, getEventDetailApiV1AdminEventsEventIdGet, getEventStatsApiV1AdminEventsStatsGet, getExampleScriptsApiV1ExampleScriptsGet, getExecutionEventsApiV1ExecutionsExecutionIdEventsGet, getExecutionSagasApiV1SagasExecutionExecutionIdGet, getK8sResourceLimitsApiV1K8sLimitsGet, getNotificationsApiV1NotificationsGet, getReplaySessionApiV1ReplaySessionsSessionIdGet, getReplayStatusApiV1AdminEventsReplaySessionIdStatusGet, getResultApiV1ExecutionsExecutionIdResultGet, getSagaStatusApiV1SagasSagaIdGet, getSavedScriptApiV1ScriptsScriptIdGet, getSettingsHistoryApiV1UserSettingsHistoryGet, getSubscriptionsApiV1NotificationsSubscriptionsGet, getSystemSettingsApiV1AdminSettingsGet, getUnreadCountApiV1NotificationsUnreadCountGet, getUserApiV1AdminUsersUserIdGet, getUserExecutionsApiV1UserExecutionsGet, getUserOverviewApiV1AdminUsersUserIdOverviewGet, getUserRateLimitsApiV1AdminUsersUserIdRateLimitsGet, getUserSettingsApiV1UserSettingsGet, listReplaySessionsApiV1ReplaySessionsGet, listSagasApiV1SagasGet, listSavedScriptsApiV1ScriptsGet, listUsersApiV1AdminUsersGet, livenessApiV1HealthLiveGet, loginApiV1AuthLoginPost, logoutApiV1AuthLogoutPost, markAllReadApiV1NotificationsMarkAllReadPost, markNotificationReadApiV1NotificationsNotificationIdReadPut, notificationStreamApiV1EventsNotificationsStreamGet, type Options, pauseReplaySessionApiV1ReplaySessionsSessionIdPausePost, registerApiV1AuthRegisterPost, replayEventsApiV1AdminEventsReplayPost, resetSystemSettingsApiV1AdminSettingsResetPost, resetUserPasswordApiV1AdminUsersUserIdResetPasswordPost, resetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPost, restoreSettingsApiV1UserSettingsRestorePost, resumeReplaySessionApiV1ReplaySessionsSessionIdResumePost, retryDlqMessagesApiV1DlqRetryPost, retryExecutionApiV1ExecutionsExecutionIdRetryPost, setRetryPolicyApiV1DlqRetryPolicyPost, startReplaySessionApiV1ReplaySessionsSessionIdStartPost, unlockUserApiV1AdminUsersUserIdUnlockPost, updateCustomSettingApiV1UserSettingsCustomKeyPut, updateEditorSettingsApiV1UserSettingsEditorPut, updateNotificationSettingsApiV1UserSettingsNotificationsPut, updateSavedScriptApiV1ScriptsScriptIdPut, updateSubscriptionApiV1NotificationsSubscriptionsChannelPut, updateSystemSettingsApiV1AdminSettingsPut, updateThemeApiV1UserSettingsThemePut, updateUserApiV1AdminUsersUserIdPut, updateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPut, updateUserSettingsApiV1UserSettingsPut } from './sdk.gen'; -export type { AdminUserOverview, 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, CancelStatus, 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, 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, DlqTopicSummaryResponse, EditorSettings, EndpointGroup, EndpointUsageStats, Environment, ErrorResponse, EventBrowseRequest, EventBrowseResponse, EventDeleteResponse, EventDetailResponse, EventFilter, EventMetadata, EventReplayRequest, EventReplayResponse, EventReplayStatusResponse, EventReplayStatusResponseWritable, EventStatistics, EventStatsResponse, EventSummary, EventType, EventTypeCountSchema, ExampleScripts, ExecutionAcceptedEvent, ExecutionCancelledEvent, ExecutionCompletedEvent, ExecutionErrorType, ExecutionEventsApiV1EventsExecutionsExecutionIdGetData, ExecutionEventsApiV1EventsExecutionsExecutionIdGetError, ExecutionEventsApiV1EventsExecutionsExecutionIdGetErrors, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponse, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponses, ExecutionFailedEvent, ExecutionListResponse, ExecutionQueuedEvent, ExecutionRequest, ExecutionRequestedEvent, ExecutionResponse, ExecutionResult, ExecutionRunningEvent, ExecutionStartedEvent, ExecutionStatus, ExecutionTimeoutEvent, ExportEventsCsvApiV1AdminEventsExportCsvGetData, ExportEventsCsvApiV1AdminEventsExportCsvGetError, ExportEventsCsvApiV1AdminEventsExportCsvGetErrors, ExportEventsCsvApiV1AdminEventsExportCsvGetResponses, ExportEventsJsonApiV1AdminEventsExportJsonGetData, ExportEventsJsonApiV1AdminEventsExportJsonGetError, ExportEventsJsonApiV1AdminEventsExportJsonGetErrors, ExportEventsJsonApiV1AdminEventsExportJsonGetResponses, GetCurrentUserProfileApiV1AuthMeGetData, GetCurrentUserProfileApiV1AuthMeGetResponse, GetCurrentUserProfileApiV1AuthMeGetResponses, GetDlqMessageApiV1DlqMessagesEventIdGetData, GetDlqMessageApiV1DlqMessagesEventIdGetError, GetDlqMessageApiV1DlqMessagesEventIdGetErrors, GetDlqMessageApiV1DlqMessagesEventIdGetResponse, GetDlqMessageApiV1DlqMessagesEventIdGetResponses, GetDlqMessagesApiV1DlqMessagesGetData, GetDlqMessagesApiV1DlqMessagesGetError, GetDlqMessagesApiV1DlqMessagesGetErrors, GetDlqMessagesApiV1DlqMessagesGetResponse, GetDlqMessagesApiV1DlqMessagesGetResponses, GetDlqTopicsApiV1DlqTopicsGetData, GetDlqTopicsApiV1DlqTopicsGetResponse, GetDlqTopicsApiV1DlqTopicsGetResponses, GetEventDetailApiV1AdminEventsEventIdGetData, GetEventDetailApiV1AdminEventsEventIdGetError, GetEventDetailApiV1AdminEventsEventIdGetErrors, GetEventDetailApiV1AdminEventsEventIdGetResponse, GetEventDetailApiV1AdminEventsEventIdGetResponses, GetEventStatsApiV1AdminEventsStatsGetData, GetEventStatsApiV1AdminEventsStatsGetError, GetEventStatsApiV1AdminEventsStatsGetErrors, GetEventStatsApiV1AdminEventsStatsGetResponse, GetEventStatsApiV1AdminEventsStatsGetResponses, GetExampleScriptsApiV1ExampleScriptsGetData, GetExampleScriptsApiV1ExampleScriptsGetResponse, GetExampleScriptsApiV1ExampleScriptsGetResponses, 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, GetSystemSettingsApiV1AdminSettingsGetError, GetSystemSettingsApiV1AdminSettingsGetErrors, GetSystemSettingsApiV1AdminSettingsGetResponse, GetSystemSettingsApiV1AdminSettingsGetResponses, GetUnreadCountApiV1NotificationsUnreadCountGetData, GetUnreadCountApiV1NotificationsUnreadCountGetResponse, GetUnreadCountApiV1NotificationsUnreadCountGetResponses, GetUserApiV1AdminUsersUserIdGetData, GetUserApiV1AdminUsersUserIdGetError, GetUserApiV1AdminUsersUserIdGetErrors, GetUserApiV1AdminUsersUserIdGetResponse, GetUserApiV1AdminUsersUserIdGetResponses, GetUserExecutionsApiV1UserExecutionsGetData, GetUserExecutionsApiV1UserExecutionsGetError, GetUserExecutionsApiV1UserExecutionsGetErrors, GetUserExecutionsApiV1UserExecutionsGetResponse, GetUserExecutionsApiV1UserExecutionsGetResponses, GetUserOverviewApiV1AdminUsersUserIdOverviewGetData, GetUserOverviewApiV1AdminUsersUserIdOverviewGetError, GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponse, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponses, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetData, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetError, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetErrors, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponse, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponses, GetUserSettingsApiV1UserSettingsGetData, GetUserSettingsApiV1UserSettingsGetResponse, GetUserSettingsApiV1UserSettingsGetResponses, HourlyEventCountSchema, HttpValidationError, KafkaTopic, LanguageInfo, 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, LogLevel, LogoutApiV1AuthLogoutPostData, LogoutApiV1AuthLogoutPostResponse, LogoutApiV1AuthLogoutPostResponses, ManualRetryRequest, MarkAllReadApiV1NotificationsMarkAllReadPostData, MarkAllReadApiV1NotificationsMarkAllReadPostResponse, MarkAllReadApiV1NotificationsMarkAllReadPostResponses, MarkNotificationReadApiV1NotificationsNotificationIdReadPutData, MarkNotificationReadApiV1NotificationsNotificationIdReadPutError, MarkNotificationReadApiV1NotificationsNotificationIdReadPutErrors, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponse, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponses, MessageResponse, 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, QueuePriority, QuotaExceededEvent, RateLimitAlgorithm, RateLimitExceededEvent, RateLimitRuleRequest, RateLimitRuleResponse, RateLimitSummary, RateLimitUpdateRequest, RateLimitUpdateResponse, RegisterApiV1AuthRegisterPostData, RegisterApiV1AuthRegisterPostError, RegisterApiV1AuthRegisterPostErrors, RegisterApiV1AuthRegisterPostResponse, RegisterApiV1AuthRegisterPostResponses, ReleaseResourcesCommandEvent, 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, RetryPolicyRequest, RetryStrategy, SagaCancellationResponse, SagaCancelledEvent, SagaCompensatedEvent, SagaCompensatingEvent, SagaCompletedEvent, SagaFailedEvent, SagaListResponse, SagaStartedEvent, SagaState, SagaStatusResponse, SavedScriptCreateRequest, SavedScriptResponse, SavedScriptUpdate, ScriptDeletedEvent, ScriptSavedEvent, ScriptSharedEvent, SecurityViolationEvent, ServiceEventCountSchema, ServiceRecoveredEvent, ServiceUnhealthyEvent, SessionConfigSummary, SessionSummary, SessionSummaryWritable, SetRetryPolicyApiV1DlqRetryPolicyPostData, SetRetryPolicyApiV1DlqRetryPolicyPostError, SetRetryPolicyApiV1DlqRetryPolicyPostErrors, SetRetryPolicyApiV1DlqRetryPolicyPostResponse, SetRetryPolicyApiV1DlqRetryPolicyPostResponses, SettingsHistoryEntry, SettingsHistoryResponse, SseControlEvent, SseExecutionEventData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostError, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostErrors, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponse, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponses, StorageType, SubscriptionsResponse, SubscriptionUpdate, SystemErrorEvent, SystemSettingsSchema, Theme, ThemeUpdateRequest, UnlockResponse, UnlockUserApiV1AdminUsersUserIdUnlockPostData, UnlockUserApiV1AdminUsersUserIdUnlockPostError, UnlockUserApiV1AdminUsersUserIdUnlockPostErrors, UnlockUserApiV1AdminUsersUserIdUnlockPostResponse, UnlockUserApiV1AdminUsersUserIdUnlockPostResponses, 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 } from './types.gen'; +export { browseEventsApiV1AdminEventsBrowsePost, cancelExecutionApiV1ExecutionsExecutionIdCancelPost, cancelReplaySessionApiV1ReplaySessionsSessionIdCancelPost, cancelSagaApiV1SagasSagaIdCancelPost, cleanupOldSessionsApiV1ReplayCleanupPost, createExecutionApiV1ExecutePost, createReplaySessionApiV1ReplaySessionsPost, createSavedScriptApiV1ScriptsPost, createUserApiV1AdminUsersPost, deleteEventApiV1AdminEventsEventIdDelete, deleteExecutionApiV1ExecutionsExecutionIdDelete, deleteNotificationApiV1NotificationsNotificationIdDelete, deleteSavedScriptApiV1ScriptsScriptIdDelete, deleteUserApiV1AdminUsersUserIdDelete, discardDlqMessageApiV1DlqMessagesEventIdDelete, executionEventsApiV1EventsExecutionsExecutionIdGet, exportEventsApiV1AdminEventsExportExportFormatGet, getCurrentUserProfileApiV1AuthMeGet, getDlqMessageApiV1DlqMessagesEventIdGet, getDlqMessagesApiV1DlqMessagesGet, getDlqTopicsApiV1DlqTopicsGet, getEventDetailApiV1AdminEventsEventIdGet, getEventStatsApiV1AdminEventsStatsGet, getExampleScriptsApiV1ExampleScriptsGet, getExecutionEventsApiV1ExecutionsExecutionIdEventsGet, getExecutionSagasApiV1SagasExecutionExecutionIdGet, getK8sResourceLimitsApiV1K8sLimitsGet, getNotificationsApiV1NotificationsGet, getReplaySessionApiV1ReplaySessionsSessionIdGet, getReplayStatusApiV1AdminEventsReplaySessionIdStatusGet, getResultApiV1ExecutionsExecutionIdResultGet, getSagaStatusApiV1SagasSagaIdGet, getSavedScriptApiV1ScriptsScriptIdGet, getSettingsHistoryApiV1UserSettingsHistoryGet, getSubscriptionsApiV1NotificationsSubscriptionsGet, getSystemSettingsApiV1AdminSettingsGet, getUnreadCountApiV1NotificationsUnreadCountGet, getUserApiV1AdminUsersUserIdGet, getUserExecutionsApiV1UserExecutionsGet, getUserOverviewApiV1AdminUsersUserIdOverviewGet, getUserRateLimitsApiV1AdminUsersUserIdRateLimitsGet, getUserSettingsApiV1UserSettingsGet, listReplaySessionsApiV1ReplaySessionsGet, listSagasApiV1SagasGet, listSavedScriptsApiV1ScriptsGet, listUsersApiV1AdminUsersGet, livenessApiV1HealthLiveGet, loginApiV1AuthLoginPost, logoutApiV1AuthLogoutPost, markAllReadApiV1NotificationsMarkAllReadPost, markNotificationReadApiV1NotificationsNotificationIdReadPut, notificationStreamApiV1EventsNotificationsStreamGet, type Options, pauseReplaySessionApiV1ReplaySessionsSessionIdPausePost, registerApiV1AuthRegisterPost, replayEventsApiV1AdminEventsReplayPost, resetSystemSettingsApiV1AdminSettingsResetPost, resetUserPasswordApiV1AdminUsersUserIdResetPasswordPost, resetUserRateLimitsApiV1AdminUsersUserIdRateLimitsResetPost, restoreSettingsApiV1UserSettingsRestorePost, resumeReplaySessionApiV1ReplaySessionsSessionIdResumePost, retryDlqMessagesApiV1DlqRetryPost, retryExecutionApiV1ExecutionsExecutionIdRetryPost, setRetryPolicyApiV1DlqRetryPolicyPost, startReplaySessionApiV1ReplaySessionsSessionIdStartPost, unlockUserApiV1AdminUsersUserIdUnlockPost, updateCustomSettingApiV1UserSettingsCustomKeyPut, updateEditorSettingsApiV1UserSettingsEditorPut, updateNotificationSettingsApiV1UserSettingsNotificationsPut, updateSavedScriptApiV1ScriptsScriptIdPut, updateSubscriptionApiV1NotificationsSubscriptionsChannelPut, updateSystemSettingsApiV1AdminSettingsPut, updateThemeApiV1UserSettingsThemePut, updateUserApiV1AdminUsersUserIdPut, updateUserRateLimitsApiV1AdminUsersUserIdRateLimitsPut, updateUserSettingsApiV1UserSettingsPut } from './sdk.gen'; +export type { AdminUserOverview, 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, CancelStatus, 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, 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, DlqTopicSummaryResponse, EditorSettings, EndpointGroup, EndpointUsageStats, Environment, ErrorResponse, EventBrowseRequest, EventBrowseResponse, EventDeleteResponse, EventDetailResponse, EventFilter, EventMetadata, EventReplayRequest, EventReplayResponse, EventReplayStatusResponse, EventReplayStatusResponseWritable, EventStatistics, EventStatsResponse, EventSummary, EventType, EventTypeCountSchema, ExampleScripts, ExecutionAcceptedEvent, ExecutionCancelledEvent, ExecutionCompletedEvent, ExecutionErrorType, ExecutionEventsApiV1EventsExecutionsExecutionIdGetData, ExecutionEventsApiV1EventsExecutionsExecutionIdGetError, ExecutionEventsApiV1EventsExecutionsExecutionIdGetErrors, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponse, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponses, ExecutionFailedEvent, ExecutionListResponse, ExecutionQueuedEvent, ExecutionRequest, ExecutionRequestedEvent, ExecutionResponse, ExecutionResult, ExecutionRunningEvent, ExecutionStartedEvent, ExecutionStatus, ExecutionTimeoutEvent, ExportEventsApiV1AdminEventsExportExportFormatGetData, ExportEventsApiV1AdminEventsExportExportFormatGetError, ExportEventsApiV1AdminEventsExportExportFormatGetErrors, ExportEventsApiV1AdminEventsExportExportFormatGetResponses, ExportFormat, GetCurrentUserProfileApiV1AuthMeGetData, GetCurrentUserProfileApiV1AuthMeGetResponse, GetCurrentUserProfileApiV1AuthMeGetResponses, GetDlqMessageApiV1DlqMessagesEventIdGetData, GetDlqMessageApiV1DlqMessagesEventIdGetError, GetDlqMessageApiV1DlqMessagesEventIdGetErrors, GetDlqMessageApiV1DlqMessagesEventIdGetResponse, GetDlqMessageApiV1DlqMessagesEventIdGetResponses, GetDlqMessagesApiV1DlqMessagesGetData, GetDlqMessagesApiV1DlqMessagesGetError, GetDlqMessagesApiV1DlqMessagesGetErrors, GetDlqMessagesApiV1DlqMessagesGetResponse, GetDlqMessagesApiV1DlqMessagesGetResponses, GetDlqTopicsApiV1DlqTopicsGetData, GetDlqTopicsApiV1DlqTopicsGetResponse, GetDlqTopicsApiV1DlqTopicsGetResponses, GetEventDetailApiV1AdminEventsEventIdGetData, GetEventDetailApiV1AdminEventsEventIdGetError, GetEventDetailApiV1AdminEventsEventIdGetErrors, GetEventDetailApiV1AdminEventsEventIdGetResponse, GetEventDetailApiV1AdminEventsEventIdGetResponses, GetEventStatsApiV1AdminEventsStatsGetData, GetEventStatsApiV1AdminEventsStatsGetError, GetEventStatsApiV1AdminEventsStatsGetErrors, GetEventStatsApiV1AdminEventsStatsGetResponse, GetEventStatsApiV1AdminEventsStatsGetResponses, GetExampleScriptsApiV1ExampleScriptsGetData, GetExampleScriptsApiV1ExampleScriptsGetResponse, GetExampleScriptsApiV1ExampleScriptsGetResponses, 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, GetSystemSettingsApiV1AdminSettingsGetError, GetSystemSettingsApiV1AdminSettingsGetErrors, GetSystemSettingsApiV1AdminSettingsGetResponse, GetSystemSettingsApiV1AdminSettingsGetResponses, GetUnreadCountApiV1NotificationsUnreadCountGetData, GetUnreadCountApiV1NotificationsUnreadCountGetResponse, GetUnreadCountApiV1NotificationsUnreadCountGetResponses, GetUserApiV1AdminUsersUserIdGetData, GetUserApiV1AdminUsersUserIdGetError, GetUserApiV1AdminUsersUserIdGetErrors, GetUserApiV1AdminUsersUserIdGetResponse, GetUserApiV1AdminUsersUserIdGetResponses, GetUserExecutionsApiV1UserExecutionsGetData, GetUserExecutionsApiV1UserExecutionsGetError, GetUserExecutionsApiV1UserExecutionsGetErrors, GetUserExecutionsApiV1UserExecutionsGetResponse, GetUserExecutionsApiV1UserExecutionsGetResponses, GetUserOverviewApiV1AdminUsersUserIdOverviewGetData, GetUserOverviewApiV1AdminUsersUserIdOverviewGetError, GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponse, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponses, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetData, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetError, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetErrors, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponse, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponses, GetUserSettingsApiV1UserSettingsGetData, GetUserSettingsApiV1UserSettingsGetResponse, GetUserSettingsApiV1UserSettingsGetResponses, HourlyEventCountSchema, HttpValidationError, KafkaTopic, LanguageInfo, 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, LogLevel, LogoutApiV1AuthLogoutPostData, LogoutApiV1AuthLogoutPostResponse, LogoutApiV1AuthLogoutPostResponses, ManualRetryRequest, MarkAllReadApiV1NotificationsMarkAllReadPostData, MarkAllReadApiV1NotificationsMarkAllReadPostResponse, MarkAllReadApiV1NotificationsMarkAllReadPostResponses, MarkNotificationReadApiV1NotificationsNotificationIdReadPutData, MarkNotificationReadApiV1NotificationsNotificationIdReadPutError, MarkNotificationReadApiV1NotificationsNotificationIdReadPutErrors, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponse, MarkNotificationReadApiV1NotificationsNotificationIdReadPutResponses, MessageResponse, 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, QueuePriority, QuotaExceededEvent, RateLimitAlgorithm, RateLimitExceededEvent, RateLimitRuleRequest, RateLimitRuleResponse, RateLimitSummary, RateLimitUpdateRequest, RateLimitUpdateResponse, RegisterApiV1AuthRegisterPostData, RegisterApiV1AuthRegisterPostError, RegisterApiV1AuthRegisterPostErrors, RegisterApiV1AuthRegisterPostResponse, RegisterApiV1AuthRegisterPostResponses, ReleaseResourcesCommandEvent, 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, RetryPolicyRequest, RetryStrategy, SagaCancellationResponse, SagaCancelledEvent, SagaCompensatedEvent, SagaCompensatingEvent, SagaCompletedEvent, SagaFailedEvent, SagaListResponse, SagaStartedEvent, SagaState, SagaStatusResponse, SavedScriptCreateRequest, SavedScriptListResponse, SavedScriptResponse, SavedScriptUpdate, ScriptDeletedEvent, ScriptSavedEvent, ScriptSharedEvent, SecurityViolationEvent, ServiceEventCountSchema, ServiceRecoveredEvent, ServiceUnhealthyEvent, SessionConfigSummary, SessionSummary, SessionSummaryWritable, SetRetryPolicyApiV1DlqRetryPolicyPostData, SetRetryPolicyApiV1DlqRetryPolicyPostError, SetRetryPolicyApiV1DlqRetryPolicyPostErrors, SetRetryPolicyApiV1DlqRetryPolicyPostResponse, SetRetryPolicyApiV1DlqRetryPolicyPostResponses, SettingsHistoryEntry, SettingsHistoryResponse, SseControlEvent, SseExecutionEventData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostData, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostError, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostErrors, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponse, StartReplaySessionApiV1ReplaySessionsSessionIdStartPostResponses, StorageType, SubscriptionsResponse, SubscriptionUpdate, SystemErrorEvent, SystemSettingsSchema, Theme, ThemeUpdateRequest, UnlockResponse, UnlockUserApiV1AdminUsersUserIdUnlockPostData, UnlockUserApiV1AdminUsersUserIdUnlockPostError, UnlockUserApiV1AdminUsersUserIdUnlockPostErrors, UnlockUserApiV1AdminUsersUserIdUnlockPostResponse, UnlockUserApiV1AdminUsersUserIdUnlockPostResponses, 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 } from './types.gen'; diff --git a/frontend/src/lib/api/sdk.gen.ts b/frontend/src/lib/api/sdk.gen.ts index 743e059c..0443ada6 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 { 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, DeleteExecutionApiV1ExecutionsExecutionIdDeleteData, DeleteExecutionApiV1ExecutionsExecutionIdDeleteErrors, DeleteExecutionApiV1ExecutionsExecutionIdDeleteResponses, DeleteNotificationApiV1NotificationsNotificationIdDeleteData, DeleteNotificationApiV1NotificationsNotificationIdDeleteErrors, DeleteNotificationApiV1NotificationsNotificationIdDeleteResponses, DeleteSavedScriptApiV1ScriptsScriptIdDeleteData, DeleteSavedScriptApiV1ScriptsScriptIdDeleteErrors, DeleteSavedScriptApiV1ScriptsScriptIdDeleteResponses, DeleteUserApiV1AdminUsersUserIdDeleteData, DeleteUserApiV1AdminUsersUserIdDeleteErrors, DeleteUserApiV1AdminUsersUserIdDeleteResponses, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteData, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteErrors, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteResponses, ExecutionEventsApiV1EventsExecutionsExecutionIdGetData, ExecutionEventsApiV1EventsExecutionsExecutionIdGetErrors, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponses, ExportEventsCsvApiV1AdminEventsExportCsvGetData, ExportEventsCsvApiV1AdminEventsExportCsvGetErrors, ExportEventsCsvApiV1AdminEventsExportCsvGetResponses, ExportEventsJsonApiV1AdminEventsExportJsonGetData, ExportEventsJsonApiV1AdminEventsExportJsonGetErrors, ExportEventsJsonApiV1AdminEventsExportJsonGetResponses, GetCurrentUserProfileApiV1AuthMeGetData, GetCurrentUserProfileApiV1AuthMeGetResponses, GetDlqMessageApiV1DlqMessagesEventIdGetData, GetDlqMessageApiV1DlqMessagesEventIdGetErrors, GetDlqMessageApiV1DlqMessagesEventIdGetResponses, GetDlqMessagesApiV1DlqMessagesGetData, GetDlqMessagesApiV1DlqMessagesGetErrors, GetDlqMessagesApiV1DlqMessagesGetResponses, GetDlqTopicsApiV1DlqTopicsGetData, GetDlqTopicsApiV1DlqTopicsGetResponses, GetEventDetailApiV1AdminEventsEventIdGetData, GetEventDetailApiV1AdminEventsEventIdGetErrors, GetEventDetailApiV1AdminEventsEventIdGetResponses, GetEventStatsApiV1AdminEventsStatsGetData, GetEventStatsApiV1AdminEventsStatsGetErrors, GetEventStatsApiV1AdminEventsStatsGetResponses, GetExampleScriptsApiV1ExampleScriptsGetData, GetExampleScriptsApiV1ExampleScriptsGetResponses, 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, GetSystemSettingsApiV1AdminSettingsGetErrors, GetSystemSettingsApiV1AdminSettingsGetResponses, GetUnreadCountApiV1NotificationsUnreadCountGetData, GetUnreadCountApiV1NotificationsUnreadCountGetResponses, GetUserApiV1AdminUsersUserIdGetData, GetUserApiV1AdminUsersUserIdGetErrors, GetUserApiV1AdminUsersUserIdGetResponses, GetUserExecutionsApiV1UserExecutionsGetData, GetUserExecutionsApiV1UserExecutionsGetErrors, GetUserExecutionsApiV1UserExecutionsGetResponses, GetUserOverviewApiV1AdminUsersUserIdOverviewGetData, GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponses, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetData, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetErrors, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponses, GetUserSettingsApiV1UserSettingsGetData, GetUserSettingsApiV1UserSettingsGetResponses, 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, RegisterApiV1AuthRegisterPostData, RegisterApiV1AuthRegisterPostErrors, RegisterApiV1AuthRegisterPostResponses, 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, UnlockUserApiV1AdminUsersUserIdUnlockPostData, UnlockUserApiV1AdminUsersUserIdUnlockPostErrors, UnlockUserApiV1AdminUsersUserIdUnlockPostResponses, 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 } from './types.gen'; +import type { 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, DeleteExecutionApiV1ExecutionsExecutionIdDeleteData, DeleteExecutionApiV1ExecutionsExecutionIdDeleteErrors, DeleteExecutionApiV1ExecutionsExecutionIdDeleteResponses, DeleteNotificationApiV1NotificationsNotificationIdDeleteData, DeleteNotificationApiV1NotificationsNotificationIdDeleteErrors, DeleteNotificationApiV1NotificationsNotificationIdDeleteResponses, DeleteSavedScriptApiV1ScriptsScriptIdDeleteData, DeleteSavedScriptApiV1ScriptsScriptIdDeleteErrors, DeleteSavedScriptApiV1ScriptsScriptIdDeleteResponses, DeleteUserApiV1AdminUsersUserIdDeleteData, DeleteUserApiV1AdminUsersUserIdDeleteErrors, DeleteUserApiV1AdminUsersUserIdDeleteResponses, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteData, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteErrors, DiscardDlqMessageApiV1DlqMessagesEventIdDeleteResponses, ExecutionEventsApiV1EventsExecutionsExecutionIdGetData, ExecutionEventsApiV1EventsExecutionsExecutionIdGetErrors, ExecutionEventsApiV1EventsExecutionsExecutionIdGetResponses, ExportEventsApiV1AdminEventsExportExportFormatGetData, ExportEventsApiV1AdminEventsExportExportFormatGetErrors, ExportEventsApiV1AdminEventsExportExportFormatGetResponses, GetCurrentUserProfileApiV1AuthMeGetData, GetCurrentUserProfileApiV1AuthMeGetResponses, GetDlqMessageApiV1DlqMessagesEventIdGetData, GetDlqMessageApiV1DlqMessagesEventIdGetErrors, GetDlqMessageApiV1DlqMessagesEventIdGetResponses, GetDlqMessagesApiV1DlqMessagesGetData, GetDlqMessagesApiV1DlqMessagesGetErrors, GetDlqMessagesApiV1DlqMessagesGetResponses, GetDlqTopicsApiV1DlqTopicsGetData, GetDlqTopicsApiV1DlqTopicsGetResponses, GetEventDetailApiV1AdminEventsEventIdGetData, GetEventDetailApiV1AdminEventsEventIdGetErrors, GetEventDetailApiV1AdminEventsEventIdGetResponses, GetEventStatsApiV1AdminEventsStatsGetData, GetEventStatsApiV1AdminEventsStatsGetErrors, GetEventStatsApiV1AdminEventsStatsGetResponses, GetExampleScriptsApiV1ExampleScriptsGetData, GetExampleScriptsApiV1ExampleScriptsGetResponses, 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, GetSystemSettingsApiV1AdminSettingsGetErrors, GetSystemSettingsApiV1AdminSettingsGetResponses, GetUnreadCountApiV1NotificationsUnreadCountGetData, GetUnreadCountApiV1NotificationsUnreadCountGetResponses, GetUserApiV1AdminUsersUserIdGetData, GetUserApiV1AdminUsersUserIdGetErrors, GetUserApiV1AdminUsersUserIdGetResponses, GetUserExecutionsApiV1UserExecutionsGetData, GetUserExecutionsApiV1UserExecutionsGetErrors, GetUserExecutionsApiV1UserExecutionsGetResponses, GetUserOverviewApiV1AdminUsersUserIdOverviewGetData, GetUserOverviewApiV1AdminUsersUserIdOverviewGetErrors, GetUserOverviewApiV1AdminUsersUserIdOverviewGetResponses, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetData, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetErrors, GetUserRateLimitsApiV1AdminUsersUserIdRateLimitsGetResponses, GetUserSettingsApiV1UserSettingsGetData, GetUserSettingsApiV1UserSettingsGetResponses, 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, RegisterApiV1AuthRegisterPostData, RegisterApiV1AuthRegisterPostErrors, RegisterApiV1AuthRegisterPostResponses, 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, UnlockUserApiV1AdminUsersUserIdUnlockPostData, UnlockUserApiV1AdminUsersUserIdUnlockPostErrors, UnlockUserApiV1AdminUsersUserIdUnlockPostResponses, 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 } from './types.gen'; export type Options = Options2 & { /** @@ -349,18 +349,11 @@ export const browseEventsApiV1AdminEventsBrowsePost = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/admin/events/stats', ...options }); /** - * Export Events Csv + * Export Events * - * Export filtered events as a downloadable CSV file. + * Export filtered events as a downloadable file. */ -export const exportEventsCsvApiV1AdminEventsExportCsvGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/admin/events/export/csv', ...options }); - -/** - * Export Events Json - * - * Export events as JSON with comprehensive filtering. - */ -export const exportEventsJsonApiV1AdminEventsExportJsonGet = (options?: Options) => (options?.client ?? client).get({ url: '/api/v1/admin/events/export/json', ...options }); +export const exportEventsApiV1AdminEventsExportExportFormatGet = (options: Options) => (options.client ?? client).get({ url: '/api/v1/admin/events/export/{export_format}', ...options }); /** * Delete Event diff --git a/frontend/src/lib/api/types.gen.ts b/frontend/src/lib/api/types.gen.ts index 42ed10f1..c143a77e 100644 --- a/frontend/src/lib/api/types.gen.ts +++ b/frontend/src/lib/api/types.gen.ts @@ -2364,6 +2364,13 @@ export type ExecutionTimeoutEvent = { stderr?: string; }; +/** + * ExportFormat + * + * Supported export file formats. + */ +export type ExportFormat = 'csv' | 'json'; + /** * HTTPValidationError */ @@ -4638,6 +4645,16 @@ export type SavedScriptCreateRequest = { description?: string | null; }; +/** + * SavedScriptListResponse + */ +export type SavedScriptListResponse = { + /** + * Scripts + */ + scripts: Array; +}; + /** * SavedScriptResponse */ @@ -6485,11 +6502,9 @@ export type ListSavedScriptsApiV1ScriptsGetData = { export type ListSavedScriptsApiV1ScriptsGetResponses = { /** - * Response List Saved Scripts Api V1 Scripts Get - * * Successful Response */ - 200: Array; + 200: SavedScriptListResponse; }; export type ListSavedScriptsApiV1ScriptsGetResponse = ListSavedScriptsApiV1ScriptsGetResponses[keyof ListSavedScriptsApiV1ScriptsGetResponses]; @@ -7180,55 +7195,11 @@ export type GetEventStatsApiV1AdminEventsStatsGetResponses = { export type GetEventStatsApiV1AdminEventsStatsGetResponse = GetEventStatsApiV1AdminEventsStatsGetResponses[keyof GetEventStatsApiV1AdminEventsStatsGetResponses]; -export type ExportEventsCsvApiV1AdminEventsExportCsvGetData = { +export type ExportEventsApiV1AdminEventsExportExportFormatGetData = { body?: never; - path?: never; - query?: { - /** - * Event Types - * - * Event types (repeat param for multiple) - */ - event_types?: Array | null; - /** - * Start Time - * - * Start time - */ - start_time?: string | null; - /** - * End Time - * - * End time - */ - end_time?: string | null; - /** - * Limit - */ - limit?: number; + path: { + export_format: ExportFormat; }; - url: '/api/v1/admin/events/export/csv'; -}; - -export type ExportEventsCsvApiV1AdminEventsExportCsvGetErrors = { - /** - * Validation Error - */ - 422: HttpValidationError; -}; - -export type ExportEventsCsvApiV1AdminEventsExportCsvGetError = ExportEventsCsvApiV1AdminEventsExportCsvGetErrors[keyof ExportEventsCsvApiV1AdminEventsExportCsvGetErrors]; - -export type ExportEventsCsvApiV1AdminEventsExportCsvGetResponses = { - /** - * Successful Response - */ - 200: unknown; -}; - -export type ExportEventsJsonApiV1AdminEventsExportJsonGetData = { - body?: never; - path?: never; query?: { /** * Event Types @@ -7277,19 +7248,19 @@ export type ExportEventsJsonApiV1AdminEventsExportJsonGetData = { */ limit?: number; }; - url: '/api/v1/admin/events/export/json'; + url: '/api/v1/admin/events/export/{export_format}'; }; -export type ExportEventsJsonApiV1AdminEventsExportJsonGetErrors = { +export type ExportEventsApiV1AdminEventsExportExportFormatGetErrors = { /** * Validation Error */ 422: HttpValidationError; }; -export type ExportEventsJsonApiV1AdminEventsExportJsonGetError = ExportEventsJsonApiV1AdminEventsExportJsonGetErrors[keyof ExportEventsJsonApiV1AdminEventsExportJsonGetErrors]; +export type ExportEventsApiV1AdminEventsExportExportFormatGetError = ExportEventsApiV1AdminEventsExportExportFormatGetErrors[keyof ExportEventsApiV1AdminEventsExportExportFormatGetErrors]; -export type ExportEventsJsonApiV1AdminEventsExportJsonGetResponses = { +export type ExportEventsApiV1AdminEventsExportExportFormatGetResponses = { /** * Successful Response */ diff --git a/frontend/src/routes/Editor.svelte b/frontend/src/routes/Editor.svelte index 33f9ed36..45bafb91 100644 --- a/frontend/src/routes/Editor.svelte +++ b/frontend/src/routes/Editor.svelte @@ -130,7 +130,7 @@ async function loadSavedScripts() { if (!authenticated) return; const data = unwrapOr(await listSavedScriptsApiV1ScriptsGet({}), null); - savedScripts = (data || []).map((s, i) => ({ ...s, id: s.script_id || `temp_${i}_${Date.now()}` })); + savedScripts = (data?.scripts || []).map((s, i) => ({ ...s, id: s.script_id || `temp_${i}_${Date.now()}` })); } function loadScript(s: SavedScript) { diff --git a/frontend/src/routes/__tests__/Editor.test.ts b/frontend/src/routes/__tests__/Editor.test.ts index 871b7c03..a45d3357 100644 --- a/frontend/src/routes/__tests__/Editor.test.ts +++ b/frontend/src/routes/__tests__/Editor.test.ts @@ -137,7 +137,7 @@ describe('Editor', () => { data: { scripts: { python: ' print("Hello")' } }, error: undefined, }); - mocks.listSavedScriptsApiV1ScriptsGet.mockResolvedValue({ data: [], error: undefined }); + mocks.listSavedScriptsApiV1ScriptsGet.mockResolvedValue({ data: { scripts: [] }, error: undefined }); mocks.createSavedScriptApiV1ScriptsPost.mockResolvedValue({ data: { script_id: 'new-1' }, error: undefined }); mocks.updateSavedScriptApiV1ScriptsScriptIdPut.mockResolvedValue({ data: {}, error: undefined }); mocks.deleteSavedScriptApiV1ScriptsScriptIdDelete.mockResolvedValue({ data: {}, error: undefined }); @@ -226,7 +226,7 @@ describe('Editor', () => { it('falls back to create when update returns 404', async () => { mocks.listSavedScriptsApiV1ScriptsGet.mockResolvedValue({ - data: [{ script_id: 'script-99', name: 'Existing Script', script: 'print(1)', lang: 'python', lang_version: '3.11' }], + data: { scripts: [{ script_id: 'script-99', name: 'Existing Script', script: 'print(1)', lang: 'python', lang_version: '3.11' }] }, error: undefined, }); mocks.updateSavedScriptApiV1ScriptsScriptIdPut.mockResolvedValue({ @@ -284,7 +284,7 @@ describe('Editor', () => { it('calls confirm and delete API when delete button is clicked', async () => { mocks.mockConfirm.mockReturnValue(true); mocks.listSavedScriptsApiV1ScriptsGet.mockResolvedValue({ - data: [{ script_id: 'script-99', name: 'My Script', script: 'print(1)', lang: 'python', lang_version: '3.11' }], + data: { scripts: [{ script_id: 'script-99', name: 'My Script', script: 'print(1)', lang: 'python', lang_version: '3.11' }] }, error: undefined, });