Files
kaidi/frontend/src/api/setup.ts
T
Qiufeng 271eac382e
Release / release (push) Canceled after 0s
fix: harden first-run database setup
2026-08-17 22:05:10 +08:00

68 lines
1.7 KiB
TypeScript

import { request } from '@/utils/request';
const SETUP_COMPLETION_TIMEOUT_MS = 120_000;
export interface SetupStatus {
required: boolean;
locked: boolean;
ready: boolean;
supportedDatabaseTypes: string[];
message: string;
}
export interface SetupDatabaseRequest {
setupCode: string;
databaseType: 'MYSQL' | 'POSTGRESQL';
host: string;
port: number;
database: string;
username: string;
password: string;
}
export interface SetupConnection {
successful: boolean;
databaseType: string;
serverVersion: string;
schemaReady: boolean;
message: string;
}
export interface SetupCompleteRequest extends SetupDatabaseRequest {
adminUsername: string;
adminDisplayName: string;
adminPassword: string;
adminPasswordConfirmation: string;
}
export interface SetupCompleted {
completed: boolean;
username: string;
message: string;
restartAfterSeconds: number;
}
function normalizeStatus(value: SetupStatus): SetupStatus {
return {
required: Boolean(value?.required),
locked: Boolean(value?.locked),
ready: Boolean(value?.ready),
supportedDatabaseTypes: Array.isArray(value?.supportedDatabaseTypes) ? value.supportedDatabaseTypes : [],
message: value?.message || '',
};
}
export function getSetupStatus() {
return request.get<SetupStatus>({ url: '/setup/status' }).then(normalizeStatus);
}
export function testSetupConnection(data: SetupDatabaseRequest) {
return request.post<SetupConnection>({ url: '/setup/test-connection', data }).then((value) => value);
}
export function completeSetup(data: SetupCompleteRequest) {
return request
.post<SetupCompleted>({ url: '/setup/complete', data, timeout: SETUP_COMPLETION_TIMEOUT_MS })
.then((value) => value);
}