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 { const { data } = await apiClient.get('/admin/data-management/agent/health') return data } export async function getConfig(): Promise { const { data } = await apiClient.get('/admin/data-management/config') return data } export async function updateConfig(request: DataManagementConfig): Promise { const { data } = await apiClient.put('/admin/data-management/config', request) return data } export async function testS3(request: TestS3Request): Promise { const { data } = await apiClient.post('/admin/data-management/s3/test', request) return data } export async function listSourceProfiles(sourceType: SourceType): Promise { const { data } = await apiClient.get(`/admin/data-management/sources/${sourceType}/profiles`) return data } export async function createSourceProfile(sourceType: SourceType, request: CreateSourceProfileRequest): Promise { const { data } = await apiClient.post(`/admin/data-management/sources/${sourceType}/profiles`, request) return data } export async function updateSourceProfile(sourceType: SourceType, profileID: string, request: UpdateSourceProfileRequest): Promise { const { data } = await apiClient.put(`/admin/data-management/sources/${sourceType}/profiles/${profileID}`, request) return data } export async function deleteSourceProfile(sourceType: SourceType, profileID: string): Promise { await apiClient.delete(`/admin/data-management/sources/${sourceType}/profiles/${profileID}`) } export async function setActiveSourceProfile(sourceType: SourceType, profileID: string): Promise { const { data } = await apiClient.post(`/admin/data-management/sources/${sourceType}/profiles/${profileID}/activate`) return data } export async function listS3Profiles(): Promise { const { data } = await apiClient.get('/admin/data-management/s3/profiles') return data } export async function createS3Profile(request: CreateS3ProfileRequest): Promise { const { data } = await apiClient.post('/admin/data-management/s3/profiles', request) return data } export async function updateS3Profile(profileID: string, request: UpdateS3ProfileRequest): Promise { const { data } = await apiClient.put(`/admin/data-management/s3/profiles/${profileID}`, request) return data } export async function deleteS3Profile(profileID: string): Promise { await apiClient.delete(`/admin/data-management/s3/profiles/${profileID}`) } export async function setActiveS3Profile(profileID: string): Promise { const { data } = await apiClient.post(`/admin/data-management/s3/profiles/${profileID}/activate`) return data } export async function createBackupJob(request: CreateBackupJobRequest): Promise { const headers = request.idempotency_key ? { 'X-Idempotency-Key': request.idempotency_key } : undefined const { data } = await apiClient.post( '/admin/data-management/backups', request, { headers } ) return data } export async function listBackupJobs(request?: ListBackupJobsRequest): Promise { const { data } = await apiClient.get('/admin/data-management/backups', { params: request }) return data } export async function getBackupJob(jobID: string): Promise { const { data } = await apiClient.get(`/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