Add Databases management page and roadmap coverage audit

/databases page (new nav item): expandable managed-DB cards with
connection URL + copy, start/stop/restart actions, metrics summary, and
backup list with create/restore. Verified e2e against a real postgres:16
container — provision, psql connect, stop/start, seed, 6.4MB backup,
drop, restore with data recovered.

ROADMAP: marked databases/cron/git-connect/agents done with evidence,
corrected stale inventory rows (frontend now consumes 52 API ops),
added uncovered items — GitHub App install surfacing, database→service
binding, backup export + scheduled backups, service exec console,
OAuth e2e w/ real creds, remaining sqlc port, demo-data parity.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Tomas DvorakandDevin committed 2026-09-17 17:15:11 +02:00
1 parent a1e43524f5
commit 18fe56f948
5 files changed
+285 -15

No files matched your search

+31
View File
@@ -1277,6 +1277,37 @@ export async function listGitBranches(
export type CreateDatabaseInput = components['schemas']['CreateDatabaseRequest'];
export type DatabaseEntity = components['schemas']['Database'];
export type DatabaseBackupEntity = components['schemas']['DatabaseBackup'];
export async function listDatabases(): Promise<DatabaseEntity[]> {
const payload = await requestJson<{ databases?: DatabaseEntity[] }>('/databases');
return payload.databases ?? [];
}
export async function getDatabase(id: string): Promise<DatabaseEntity> {
return requestJson<DatabaseEntity>(`/databases/${encodeURIComponent(id)}`);
}
export async function databaseAction(id: string, action: 'start' | 'stop' | 'restart'): Promise<void> {
await requestJson(`/databases/${encodeURIComponent(id)}/action`, {
method: 'POST',
body: JSON.stringify({ action }),
});
}
export async function createDatabaseBackup(id: string): Promise<void> {
await requestJson(`/databases/${encodeURIComponent(id)}/backup`, {
method: 'POST',
body: JSON.stringify({ database_id: id }),
});
}
export async function restoreDatabaseBackup(id: string, backupId: string): Promise<void> {
await requestJson(`/databases/${encodeURIComponent(id)}/restore`, {
method: 'POST',
body: JSON.stringify({ database_id: id, backup_id: backupId }),
});
}
export async function createManagedDatabase(
input: CreateDatabaseInput,