Files
supabase/apps/studio/components/interfaces/Database/Replication/Pipeline.utils.ts
2026-05-12 11:54:16 +02:00

138 lines
4.0 KiB
TypeScript

import { PipelineStatusName } from './Replication.constants'
import { ReplicationPipelineStatusData } from '@/data/replication/pipeline-status-query'
import { PipelineStatusRequestStatus } from '@/state/replication-pipeline-request-status'
export const getStatusName = (
status: ReplicationPipelineStatusData['status'] | undefined
): PipelineStatusName | undefined => {
if (!status || typeof status !== 'object' || !('name' in status)) return undefined
return normalizePipelineStatusName(status.name)
}
export const normalizePipelineStatusName = (statusName?: string): PipelineStatusName | undefined =>
typeof statusName === 'string' &&
(Object.values(PipelineStatusName) as string[]).includes(statusName)
? (statusName as PipelineStatusName)
: undefined
export const PIPELINE_ENABLE_ALLOWED_FROM: PipelineStatusName[] = [PipelineStatusName.STOPPED]
export const PIPELINE_DISABLE_ALLOWED_FROM: PipelineStatusName[] = [
PipelineStatusName.STARTED,
PipelineStatusName.FAILED,
]
export const PIPELINE_ACTIONABLE_STATES: PipelineStatusName[] = [
PipelineStatusName.FAILED,
PipelineStatusName.STARTED,
PipelineStatusName.STOPPED,
]
export type PipelineDisplayStateKey =
| 'starting'
| 'stopping'
| 'restarting'
| 'failed'
| 'stopped'
| 'running'
| 'unknown'
export type PipelineDisplayType = 'failure' | 'loading' | 'success' | 'idle'
export interface PipelineDisplayState {
key: PipelineDisplayStateKey
label: string
title: string
message: string
badge: string
type: PipelineDisplayType
}
const PIPELINE_DISPLAY_STATES: Record<PipelineDisplayStateKey, PipelineDisplayState> = {
starting: {
key: 'starting',
label: 'Starting',
title: 'Starting pipeline',
message: 'Starting the pipeline. Replication will resume once running.',
badge: 'Starting',
type: 'loading',
},
stopping: {
key: 'stopping',
label: 'Stopping',
title: 'Stopping pipeline',
message: 'Stopping replication. Data transfer will be paused once stopped.',
badge: 'Stopping',
type: 'loading',
},
restarting: {
key: 'restarting',
label: 'Restarting',
title: 'Restarting pipeline',
message: 'Applying settings and restarting the pipeline.',
badge: 'Restarting',
type: 'loading',
},
failed: {
key: 'failed',
label: 'Failed',
title: 'Pipeline failed',
message: 'Replication has encountered an error.',
badge: 'Failed',
type: 'failure',
},
stopped: {
key: 'stopped',
label: 'Stopped',
title: 'Pipeline stopped',
message: 'Replication is paused. Start the pipeline to resume data synchronization.',
badge: 'Stopped',
type: 'idle',
},
running: {
key: 'running',
label: 'Running',
title: 'Pipeline running',
message: 'Replication is active and processing changes.',
badge: 'Running',
type: 'success',
},
unknown: {
key: 'unknown',
label: 'Unknown',
title: 'Pipeline status unknown',
message: 'Unable to determine pipeline status.',
badge: 'Unknown',
type: 'idle',
},
}
export const getPipelineDisplayState = (
requestStatus?: PipelineStatusRequestStatus,
statusName?: PipelineStatusName
): PipelineDisplayState => {
if (requestStatus === PipelineStatusRequestStatus.RestartRequested) {
return PIPELINE_DISPLAY_STATES.restarting
}
if (requestStatus === PipelineStatusRequestStatus.StartRequested) {
return PIPELINE_DISPLAY_STATES.starting
}
if (requestStatus === PipelineStatusRequestStatus.StopRequested) {
return PIPELINE_DISPLAY_STATES.stopping
}
switch (statusName) {
case PipelineStatusName.STARTING:
return PIPELINE_DISPLAY_STATES.starting
case PipelineStatusName.FAILED:
return PIPELINE_DISPLAY_STATES.failed
case PipelineStatusName.STOPPED:
return PIPELINE_DISPLAY_STATES.stopped
case PipelineStatusName.STARTED:
return PIPELINE_DISPLAY_STATES.running
case PipelineStatusName.STOPPING:
return PIPELINE_DISPLAY_STATES.stopping
case PipelineStatusName.UNKNOWN:
default:
return PIPELINE_DISPLAY_STATES.unknown
}
}