Files
portabase/src/features/database/backup-get-data.action.ts
T

83 lines
3.0 KiB
TypeScript
Raw Normal View History

2026-02-10 11:44:45 +01:00
"use server"
import {userAction} from "@/lib/safe-actions/actions";
import {z} from "zod";
import {db} from "@/db";
import {eq} from "drizzle-orm";
import * as drizzleDb from "@/db";
import {BackupWith, Restoration} from "@/db/schema/07_database";
2026-02-13 11:24:53 +01:00
import {getOrganizationChannels} from "@/db/services/notification-channel";
import {getOrganizationStorageChannels} from "@/db/services/storage-channel";
2026-03-28 16:35:02 +01:00
import {getHealthLast12hLogs} from "@/db/services/healthcheck";
2026-02-10 11:44:45 +01:00
export const getDatabaseDataAction = userAction
.schema(
z.object({
databaseId: z.string(),
})
)
.action(async ({parsedInput}) => {
const {databaseId} = parsedInput;
const database = await db.query.database.findFirst({
where: eq(drizzleDb.schemas.database.id, databaseId),
with: {
project: true,
2026-02-13 11:24:53 +01:00
retentionPolicy: true,
alertPolicies: true,
storagePolicies: true
2026-02-10 11:44:45 +01:00
}
});
const backups = await db.query.backup.findMany({
where: eq(drizzleDb.schemas.backup.databaseId, databaseId),
with: {
restorations: true,
storages: {
with: {
storageChannel: true
}
}
},
orderBy: (b, {desc}) => [desc(b.createdAt)],
}) as BackupWith[];
const restorations = await db.query.restoration.findMany({
where: eq(drizzleDb.schemas.restoration.databaseId, databaseId),
orderBy: (r, {desc}) => [desc(r.createdAt)],
}) as Restoration[];
const totalBackups = backups.length;
const availableBackups = backups.filter(b => !b.deletedAt).length;
const successfulBackups = backups.filter(b => b.status === "success").length;
const successRate = totalBackups > 0 ? (successfulBackups / totalBackups) * 100 : null;
2026-03-28 16:35:02 +01:00
// @ts-ignore
2026-02-13 11:24:53 +01:00
let activeOrganizationChannels = [];
2026-03-28 16:35:02 +01:00
// @ts-ignore
2026-02-13 11:24:53 +01:00
let activeOrganizationStorageChannels = [];
if (database?.project?.organizationId) {
const organizationChannels = await getOrganizationChannels(database.project.organizationId);
activeOrganizationChannels = organizationChannels.filter(channel => channel.enabled);
const organizationStorageChannels = await getOrganizationStorageChannels(database.project.organizationId);
activeOrganizationStorageChannels = organizationStorageChannels.filter(channel => channel.enabled);
}
2026-03-28 16:35:02 +01:00
2026-02-10 11:44:45 +01:00
return {
database,
backups,
restorations,
2026-03-28 16:35:02 +01:00
// @ts-ignore
2026-02-13 11:24:53 +01:00
activeOrganizationChannels,
2026-03-28 16:35:02 +01:00
// @ts-ignore
2026-02-13 11:24:53 +01:00
activeOrganizationStorageChannels,
2026-02-10 11:44:45 +01:00
stats: {
totalBackups,
availableBackups,
successRate
2026-03-28 16:35:02 +01:00
},
health: database ? await getHealthLast12hLogs({ id: database.id }) : []
2026-02-10 11:44:45 +01:00
};
});