333 lines
8.7 KiB
TypeScript
333 lines
8.7 KiB
TypeScript
import { apiClient } from '../client'
|
|
|
|
export type BackupType = 'postgres' | 'redis' | 'full'
|
|
export type BackupJobStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'partial_succeeded'
|
|
|
|
export interface BackupAgentInfo {
|
|
status: string
|
|
version: string
|
|
uptime_seconds: number
|
|
}
|
|
|
|
export interface BackupAgentHealth {
|
|
enabled: boolean
|
|
reason: string
|
|
socket_path: string
|
|
agent?: BackupAgentInfo
|
|
}
|
|
|
|
export interface DataManagementPostgresConfig {
|
|
host: string
|
|
port: number
|
|
user: string
|
|
password?: string
|
|
password_configured?: boolean
|
|
database: string
|
|
ssl_mode: string
|
|
container_name: string
|
|
}
|
|
|
|
export interface DataManagementRedisConfig {
|
|
addr: string
|
|
username: string
|
|
password?: string
|
|
password_configured?: boolean
|
|
db: number
|
|
container_name: string
|
|
}
|
|
|
|
export interface DataManagementS3Config {
|
|
enabled: boolean
|
|
endpoint: string
|
|
region: string
|
|
bucket: string
|
|
access_key_id: string
|
|
secret_access_key?: string
|
|
secret_access_key_configured?: boolean
|
|
prefix: string
|
|
force_path_style: boolean
|
|
use_ssl: boolean
|
|
}
|
|
|
|
export interface DataManagementConfig {
|
|
source_mode: 'direct' | 'docker_exec'
|
|
backup_root: string
|
|
sqlite_path?: string
|
|
retention_days: number
|
|
keep_last: number
|
|
active_postgres_profile_id?: string
|
|
active_redis_profile_id?: string
|
|
active_s3_profile_id?: string
|
|
postgres: DataManagementPostgresConfig
|
|
redis: DataManagementRedisConfig
|
|
s3: DataManagementS3Config
|
|
}
|
|
|
|
export type SourceType = 'postgres' | 'redis'
|
|
|
|
export interface DataManagementSourceConfig {
|
|
host: string
|
|
port: number
|
|
user: string
|
|
password?: string
|
|
database: string
|
|
ssl_mode: string
|
|
addr: string
|
|
username: string
|
|
db: number
|
|
container_name: string
|
|
}
|
|
|
|
export interface DataManagementSourceProfile {
|
|
source_type: SourceType
|
|
profile_id: string
|
|
name: string
|
|
is_active: boolean
|
|
password_configured?: boolean
|
|
config: DataManagementSourceConfig
|
|
created_at?: string
|
|
updated_at?: string
|
|
}
|
|
|
|
export interface TestS3Request {
|
|
endpoint: string
|
|
region: string
|
|
bucket: string
|
|
access_key_id: string
|
|
secret_access_key: string
|
|
prefix?: string
|
|
force_path_style?: boolean
|
|
use_ssl?: boolean
|
|
}
|
|
|
|
export interface TestS3Response {
|
|
ok: boolean
|
|
message: string
|
|
}
|
|
|
|
export interface CreateBackupJobRequest {
|
|
backup_type: BackupType
|
|
upload_to_s3?: boolean
|
|
s3_profile_id?: string
|
|
postgres_profile_id?: string
|
|
redis_profile_id?: string
|
|
idempotency_key?: string
|
|
}
|
|
|
|
export interface CreateBackupJobResponse {
|
|
job_id: string
|
|
status: BackupJobStatus
|
|
}
|
|
|
|
export interface BackupArtifactInfo {
|
|
local_path: string
|
|
size_bytes: number
|
|
sha256: string
|
|
}
|
|
|
|
export interface BackupS3Info {
|
|
bucket: string
|
|
key: string
|
|
etag: string
|
|
}
|
|
|
|
export interface BackupJob {
|
|
job_id: string
|
|
backup_type: BackupType
|
|
status: BackupJobStatus
|
|
triggered_by: string
|
|
s3_profile_id?: string
|
|
postgres_profile_id?: string
|
|
redis_profile_id?: string
|
|
started_at?: string
|
|
finished_at?: string
|
|
error_message?: string
|
|
artifact?: BackupArtifactInfo
|
|
s3?: BackupS3Info
|
|
}
|
|
|
|
export interface ListSourceProfilesResponse {
|
|
items: DataManagementSourceProfile[]
|
|
}
|
|
|
|
export interface CreateSourceProfileRequest {
|
|
profile_id: string
|
|
name: string
|
|
config: DataManagementSourceConfig
|
|
set_active?: boolean
|
|
}
|
|
|
|
export interface UpdateSourceProfileRequest {
|
|
name: string
|
|
config: DataManagementSourceConfig
|
|
}
|
|
|
|
export interface DataManagementS3Profile {
|
|
profile_id: string
|
|
name: string
|
|
is_active: boolean
|
|
s3: DataManagementS3Config
|
|
secret_access_key_configured?: boolean
|
|
created_at?: string
|
|
updated_at?: string
|
|
}
|
|
|
|
export interface ListS3ProfilesResponse {
|
|
items: DataManagementS3Profile[]
|
|
}
|
|
|
|
export interface CreateS3ProfileRequest {
|
|
profile_id: string
|
|
name: string
|
|
enabled: boolean
|
|
endpoint: string
|
|
region: string
|
|
bucket: string
|
|
access_key_id: string
|
|
secret_access_key?: string
|
|
prefix?: string
|
|
force_path_style?: boolean
|
|
use_ssl?: boolean
|
|
set_active?: boolean
|
|
}
|
|
|
|
export interface UpdateS3ProfileRequest {
|
|
name: string
|
|
enabled: boolean
|
|
endpoint: string
|
|
region: string
|
|
bucket: string
|
|
access_key_id: string
|
|
secret_access_key?: string
|
|
prefix?: string
|
|
force_path_style?: boolean
|
|
use_ssl?: boolean
|
|
}
|
|
|
|
export interface ListBackupJobsRequest {
|
|
page_size?: number
|
|
page_token?: string
|
|
status?: BackupJobStatus
|
|
backup_type?: BackupType
|
|
}
|
|
|
|
export interface ListBackupJobsResponse {
|
|
items: BackupJob[]
|
|
next_page_token?: string
|
|
}
|
|
|
|
export async function getAgentHealth(): Promise<BackupAgentHealth> {
|
|
const { data } = await apiClient.get<BackupAgentHealth>('/admin/data-management/agent/health')
|
|
return data
|
|
}
|
|
|
|
export async function getConfig(): Promise<DataManagementConfig> {
|
|
const { data } = await apiClient.get<DataManagementConfig>('/admin/data-management/config')
|
|
return data
|
|
}
|
|
|
|
export async function updateConfig(request: DataManagementConfig): Promise<DataManagementConfig> {
|
|
const { data } = await apiClient.put<DataManagementConfig>('/admin/data-management/config', request)
|
|
return data
|
|
}
|
|
|
|
export async function testS3(request: TestS3Request): Promise<TestS3Response> {
|
|
const { data } = await apiClient.post<TestS3Response>('/admin/data-management/s3/test', request)
|
|
return data
|
|
}
|
|
|
|
export async function listSourceProfiles(sourceType: SourceType): Promise<ListSourceProfilesResponse> {
|
|
const { data } = await apiClient.get<ListSourceProfilesResponse>(`/admin/data-management/sources/${sourceType}/profiles`)
|
|
return data
|
|
}
|
|
|
|
export async function createSourceProfile(sourceType: SourceType, request: CreateSourceProfileRequest): Promise<DataManagementSourceProfile> {
|
|
const { data } = await apiClient.post<DataManagementSourceProfile>(`/admin/data-management/sources/${sourceType}/profiles`, request)
|
|
return data
|
|
}
|
|
|
|
export async function updateSourceProfile(sourceType: SourceType, profileID: string, request: UpdateSourceProfileRequest): Promise<DataManagementSourceProfile> {
|
|
const { data } = await apiClient.put<DataManagementSourceProfile>(`/admin/data-management/sources/${sourceType}/profiles/${profileID}`, request)
|
|
return data
|
|
}
|
|
|
|
export async function deleteSourceProfile(sourceType: SourceType, profileID: string): Promise<void> {
|
|
await apiClient.delete(`/admin/data-management/sources/${sourceType}/profiles/${profileID}`)
|
|
}
|
|
|
|
export async function setActiveSourceProfile(sourceType: SourceType, profileID: string): Promise<DataManagementSourceProfile> {
|
|
const { data } = await apiClient.post<DataManagementSourceProfile>(`/admin/data-management/sources/${sourceType}/profiles/${profileID}/activate`)
|
|
return data
|
|
}
|
|
|
|
export async function listS3Profiles(): Promise<ListS3ProfilesResponse> {
|
|
const { data } = await apiClient.get<ListS3ProfilesResponse>('/admin/data-management/s3/profiles')
|
|
return data
|
|
}
|
|
|
|
export async function createS3Profile(request: CreateS3ProfileRequest): Promise<DataManagementS3Profile> {
|
|
const { data } = await apiClient.post<DataManagementS3Profile>('/admin/data-management/s3/profiles', request)
|
|
return data
|
|
}
|
|
|
|
export async function updateS3Profile(profileID: string, request: UpdateS3ProfileRequest): Promise<DataManagementS3Profile> {
|
|
const { data } = await apiClient.put<DataManagementS3Profile>(`/admin/data-management/s3/profiles/${profileID}`, request)
|
|
return data
|
|
}
|
|
|
|
export async function deleteS3Profile(profileID: string): Promise<void> {
|
|
await apiClient.delete(`/admin/data-management/s3/profiles/${profileID}`)
|
|
}
|
|
|
|
export async function setActiveS3Profile(profileID: string): Promise<DataManagementS3Profile> {
|
|
const { data } = await apiClient.post<DataManagementS3Profile>(`/admin/data-management/s3/profiles/${profileID}/activate`)
|
|
return data
|
|
}
|
|
|
|
export async function createBackupJob(request: CreateBackupJobRequest): Promise<CreateBackupJobResponse> {
|
|
const headers = request.idempotency_key
|
|
? { 'X-Idempotency-Key': request.idempotency_key }
|
|
: undefined
|
|
|
|
const { data } = await apiClient.post<CreateBackupJobResponse>(
|
|
'/admin/data-management/backups',
|
|
request,
|
|
{ headers }
|
|
)
|
|
return data
|
|
}
|
|
|
|
export async function listBackupJobs(request?: ListBackupJobsRequest): Promise<ListBackupJobsResponse> {
|
|
const { data } = await apiClient.get<ListBackupJobsResponse>('/admin/data-management/backups', {
|
|
params: request
|
|
})
|
|
return data
|
|
}
|
|
|
|
export async function getBackupJob(jobID: string): Promise<BackupJob> {
|
|
const { data } = await apiClient.get<BackupJob>(`/admin/data-management/backups/${jobID}`)
|
|
return data
|
|
}
|
|
|
|
export const dataManagementAPI = {
|
|
getAgentHealth,
|
|
getConfig,
|
|
updateConfig,
|
|
listSourceProfiles,
|
|
createSourceProfile,
|
|
updateSourceProfile,
|
|
deleteSourceProfile,
|
|
setActiveSourceProfile,
|
|
testS3,
|
|
listS3Profiles,
|
|
createS3Profile,
|
|
updateS3Profile,
|
|
deleteS3Profile,
|
|
setActiveS3Profile,
|
|
createBackupJob,
|
|
listBackupJobs,
|
|
getBackupJob
|
|
}
|
|
|
|
export default dataManagementAPI
|