From 9cd0f8640a4a38c88bb6ff7be020731ffb764446 Mon Sep 17 00:00:00 2001 From: Tudor Golubenco Date: Tue, 18 Feb 2025 18:23:56 +0100 Subject: [PATCH 01/12] Adding monitoring pages (wip) --- .../src/app/(main)/monitoring/page.tsx | 17 ++ .../(main)/monitoring/schedule/[id]/page.tsx | 8 + .../src/components/monitoring/actions.ts | 48 ++++++ .../components/monitoring/conn-selector.tsx | 37 +++++ .../components/monitoring/schedule-form.tsx | 150 ++++++++++++++++++ .../components/monitoring/schedules-table.tsx | 70 ++++++++ 6 files changed, 330 insertions(+) create mode 100644 apps/dbagent/src/app/(main)/monitoring/page.tsx create mode 100644 apps/dbagent/src/app/(main)/monitoring/schedule/[id]/page.tsx create mode 100644 apps/dbagent/src/components/monitoring/actions.ts create mode 100644 apps/dbagent/src/components/monitoring/conn-selector.tsx create mode 100644 apps/dbagent/src/components/monitoring/schedule-form.tsx create mode 100644 apps/dbagent/src/components/monitoring/schedules-table.tsx diff --git a/apps/dbagent/src/app/(main)/monitoring/page.tsx b/apps/dbagent/src/app/(main)/monitoring/page.tsx new file mode 100644 index 00000000..c4b63f53 --- /dev/null +++ b/apps/dbagent/src/app/(main)/monitoring/page.tsx @@ -0,0 +1,17 @@ +import { MonitoringScheduleTable } from '~/components/monitoring/schedules-table'; +import { listConnections } from '~/lib/db/connections'; + +async function getConnections() { + const connections = await listConnections(); + return connections; +} + +export default async function Page() { + const connections = await getConnections(); + + return ( +
+ +
+ ); +} diff --git a/apps/dbagent/src/app/(main)/monitoring/schedule/[id]/page.tsx b/apps/dbagent/src/app/(main)/monitoring/schedule/[id]/page.tsx new file mode 100644 index 00000000..22d5d222 --- /dev/null +++ b/apps/dbagent/src/app/(main)/monitoring/schedule/[id]/page.tsx @@ -0,0 +1,8 @@ +import { ScheduleForm } from '~/components/monitoring/schedule-form'; +export default async function Page({ params }: { params: { id: string } }) { + return ( +
+ +
+ ); +} diff --git a/apps/dbagent/src/components/monitoring/actions.ts b/apps/dbagent/src/components/monitoring/actions.ts new file mode 100644 index 00000000..39b6ac09 --- /dev/null +++ b/apps/dbagent/src/components/monitoring/actions.ts @@ -0,0 +1,48 @@ +'use server'; + +export type Schedule = { + id: string; + schedule: string; + playbook: string; + lastRun: string; + failures: number; + enabled: boolean; +}; + +export async function getSchedules(): Promise { + // TODO: Replace with actual database query + return [ + { + id: '1', + schedule: 'Every hour', + playbook: 'Check API Status', + lastRun: '2023-05-01 14:30', + failures: 0, + enabled: true + }, + { + id: '2', + schedule: 'Daily at 00:00', + playbook: 'Database Backup', + lastRun: '2023-05-01 00:00', + failures: 1, + enabled: true + }, + { + id: '3', + schedule: 'Weekly on Sunday', + playbook: 'Generate Reports', + lastRun: '2023-04-30 01:00', + failures: 0, + enabled: false + }, + { + id: '4', + schedule: 'Every 15 minutes', + playbook: 'Monitor Server Load', + lastRun: '2023-05-01 14:45', + failures: 2, + enabled: true + } + ]; +} diff --git a/apps/dbagent/src/components/monitoring/conn-selector.tsx b/apps/dbagent/src/components/monitoring/conn-selector.tsx new file mode 100644 index 00000000..f971d4b6 --- /dev/null +++ b/apps/dbagent/src/components/monitoring/conn-selector.tsx @@ -0,0 +1,37 @@ +'use client'; + +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@internal/components'; +import { DbConnection } from '~/lib/db/connections'; + +interface DatabaseSelectorProps { + connections: DbConnection[]; + value: DbConnection | null; + onChange: (value: DbConnection) => void; +} + +export function ConnectionSelector({ connections, value, onChange }: DatabaseSelectorProps) { + return ( +
+ +
+ ); +} diff --git a/apps/dbagent/src/components/monitoring/schedule-form.tsx b/apps/dbagent/src/components/monitoring/schedule-form.tsx new file mode 100644 index 00000000..d9dca320 --- /dev/null +++ b/apps/dbagent/src/components/monitoring/schedule-form.tsx @@ -0,0 +1,150 @@ +'use client'; + +import { Button, Input, Label, Textarea } from '@internal/components'; +import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; +import { Controller, useForm } from 'react-hook-form'; + +type FormData = { + name: string; + cronExpression: string; + playbook: string; + description: string; + database: string; + enabled: boolean; +}; + +export function ScheduleForm({ action, scheduleId }: { action: string; scheduleId: string }) { + const router = useRouter(); + const isEditMode = action !== 'add'; + + const { control, handleSubmit, reset } = useForm({ + defaultValues: { + name: '', + cronExpression: '', + playbook: '', + description: '', + database: 'Prod', + enabled: true + } + }); + + useEffect(() => { + if (isEditMode) { + // TODO: Fetch schedule data from API or database + // For now, we'll just simulate fetching data + reset({ + name: 'Example Schedule', + cronExpression: '0 * * * *', + playbook: 'Check API Status', + description: 'Hourly check of API endpoints', + database: 'Prod', + enabled: true + }); + } + }, [isEditMode, reset]); + + const onSubmit = async (data: FormData) => { + // TODO: Save schedule to API or database + console.log('Saving schedule:', data); + router.push('/monitoring'); + }; + + return ( +
+

{isEditMode ? 'Edit Schedule' : 'Add New Schedule'}

+
+
+ + ( + <> + + {error &&

{error.message}

} + + )} + /> +
+
+ + ( + <> + + {error &&

{error.message}

} + + )} + /> +
+
+ + ( + <> + + {error &&

{error.message}

} + + )} + /> +
+
+ +