// Status page helpers — components, incidents, subscribers. // Backend: /api/v1/admin/status-page/* (admin CRUD). import type { ArcadiaClient } from "@crema/arcadia-core-client" export type ComponentStatus = | "operational" | "degraded_performance" | "partial_outage" | "major_outage" | "maintenance" | string export interface StatusComponent { id: string name: string description: string | null status: ComponentStatus display_order: number group_name: string | null inserted_at: string updated_at: string } export type IncidentStatus = | "investigating" | "identified" | "monitoring" | "resolved" | string export type IncidentImpact = "none" | "minor" | "major" | "critical" | string export interface IncidentUpdate { id: string status: IncidentStatus body: string inserted_at: string } export interface Incident { id: string title: string status: IncidentStatus impact: IncidentImpact resolved_at: string | null metadata: Record updates: IncidentUpdate[] components: StatusComponent[] inserted_at: string updated_at: string } export interface Subscriber { id: string email: string confirmed_at: string | null inserted_at: string } export interface ComponentInput { name: string description?: string status?: ComponentStatus display_order?: number group_name?: string | null } export interface IncidentInput { title: string status?: IncidentStatus impact?: IncidentImpact /** IDs of affected components. */ component_ids?: string[] metadata?: Record } export interface IncidentUpdateInput { status: IncidentStatus body: string } const BASE = "/api/v1/admin/status-page" // --- Components --------------------------------------------------------- export async function listComponents(arcadia: ArcadiaClient): Promise { const res = await arcadia.GET<{ data: StatusComponent[] }>(`${BASE}/components`) return res.data } export async function createComponent( arcadia: ArcadiaClient, input: ComponentInput, ): Promise { const res = await arcadia.POST<{ data: StatusComponent }>(`${BASE}/components`, { body: { component: input }, }) return res.data } export async function updateComponent( arcadia: ArcadiaClient, id: string, input: Partial, ): Promise { const res = await arcadia.PUT<{ data: StatusComponent }>(`${BASE}/components/${id}`, { body: { component: input }, }) return res.data } export async function deleteComponent(arcadia: ArcadiaClient, id: string): Promise { await arcadia.DELETE(`${BASE}/components/${id}`) } // --- Incidents ---------------------------------------------------------- export async function listIncidents(arcadia: ArcadiaClient): Promise { const res = await arcadia.GET<{ data: Incident[] }>(`${BASE}/incidents`) return res.data } export async function getIncident(arcadia: ArcadiaClient, id: string): Promise { const res = await arcadia.GET<{ data: Incident }>(`${BASE}/incidents/${id}`) return res.data } export async function createIncident( arcadia: ArcadiaClient, input: IncidentInput, ): Promise { const res = await arcadia.POST<{ data: Incident }>(`${BASE}/incidents`, { body: { incident: input }, }) return res.data } export async function updateIncident( arcadia: ArcadiaClient, id: string, input: Partial, ): Promise { const res = await arcadia.PUT<{ data: Incident }>(`${BASE}/incidents/${id}`, { body: { incident: input }, }) return res.data } export async function resolveIncident(arcadia: ArcadiaClient, id: string): Promise { const res = await arcadia.POST<{ data: Incident }>(`${BASE}/incidents/${id}/resolve`) return res.data } export async function addIncidentUpdate( arcadia: ArcadiaClient, incidentId: string, input: IncidentUpdateInput, ): Promise { const res = await arcadia.POST<{ data: IncidentUpdate }>( `${BASE}/incidents/${incidentId}/updates`, { body: { update: input } }, ) return res.data } // --- Subscribers -------------------------------------------------------- export async function listSubscribers(arcadia: ArcadiaClient): Promise { const res = await arcadia.GET<{ data: Subscriber[] }>(`${BASE}/subscribers`) return res.data }