diff --git a/app/(customer)/dashboard/agents/[agentId]/page.tsx b/app/(customer)/dashboard/agents/[agentId]/page.tsx index da0a3bf6..69211bc6 100644 --- a/app/(customer)/dashboard/agents/[agentId]/page.tsx +++ b/app/(customer)/dashboard/agents/[agentId]/page.tsx @@ -3,12 +3,28 @@ import {Page, PageActions, PageContent, PageDescription, PageHeader, PageTitle} import {Button} from "@/components/ui/button"; import {Tabs, TabsContent, TabsList, TabsTrigger} from "@/components/ui/tabs"; import {Card, CardContent, CardHeader} from "@/components/ui/card"; -import {TablePagination} from "@/components/wrappers/table/table-pagination"; -import {columns} from "@/features/backup/columns"; +import {backupColumns} from "@/features/backup/columns"; +import {restoreColumns} from "@/features/restore/columns"; import {DataTableWithPagination} from "@/components/wrappers/table/data-table-with-pagination"; +import {prisma} from "@/prisma"; +import {GearIcon} from "@radix-ui/react-icons"; +import Link from "next/link"; -export default async function RoutePage(props: PageParams<{}>) { +export default async function RoutePage(props: PageParams<{ agentId: string }>) { + + // const agent = await prisma.agent.findUnique({ + // where: { + // id: props.params.agentId, + // }, + // }) + + const agent = { + "id": props.params.agentId, + "name": "Agent 1", + "description": "My beautiful project!", + "lastContact": null, + } const backups = [ {'id': 'backup-1', 'createdAt': '2023-11-27T11:26:54.870914Z', 'status': 'pending'}, @@ -46,55 +62,81 @@ export default async function RoutePage(props: PageParams<{}>) { {'id': 'restore-10', 'backupId': 'backup-10', 'createdAt': '2023-11-25T11:26:54.871000Z', 'status': 'failed'} ] + const databaseId = 'db-123'; + + const totalBackups = await prisma.backup.count({ + where: { + databaseId: databaseId, + }, + }); + + const successfulBackups = await prisma.backup.count({ + where: { + databaseId: databaseId, + status: 'success', + }, + }); + + const successRate = totalBackups > 0 ? (successfulBackups / totalBackups) * 100 : null + + return ( - Agent 1 + {agent.name} + + + + - My beautiful project! + {agent.description} - -
+ +
- + Backups - + Success rate - + + {successRate ?? "Unavailable for now."} + - + Last contact - + + {agent.lastContact?.toDateString() ?? "Never connected"} +
- + + Backup - Restore + Backup - - + + - - + + -
diff --git a/app/(customer)/dashboard/agents/page.tsx b/app/(customer)/dashboard/agents/page.tsx index f4b25e03..38c883d5 100644 --- a/app/(customer)/dashboard/agents/page.tsx +++ b/app/(customer)/dashboard/agents/page.tsx @@ -36,7 +36,7 @@ export default async function RoutePage(props: PageParams<{}>) { - +
-
+
{children}
diff --git a/prisma/migrations/20241111091911_2024_11_11/migration.sql b/prisma/migrations/20241111091911_2024_11_11/migration.sql deleted file mode 100644 index 37a8421c..00000000 --- a/prisma/migrations/20241111091911_2024_11_11/migration.sql +++ /dev/null @@ -1,46 +0,0 @@ --- CreateEnum -CREATE TYPE "Status" AS ENUM ('waiting', 'ongoing', 'failed', 'success'); - --- CreateTable -CREATE TABLE "Agent" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT, - "last_contact" TIMESTAMP(3), - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Agent_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Database" ( - "id" TEXT NOT NULL, - "agent_id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT, - "backup_policy" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Database_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Backup" ( - "id" TEXT NOT NULL, - "database_id" TEXT NOT NULL, - "status" "Status" NOT NULL DEFAULT 'waiting', - "file" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Backup_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Restore" ( - "id" TEXT NOT NULL, - "backup_id" TEXT NOT NULL, - "status" "Status" NOT NULL DEFAULT 'waiting', - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Restore_pkey" PRIMARY KEY ("id") -); diff --git a/prisma/migrations/20241111110357_/migration.sql b/prisma/migrations/20241111110357_/migration.sql deleted file mode 100644 index cab955a3..00000000 --- a/prisma/migrations/20241111110357_/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[slug]` on the table `Agent` will be added. If there are existing duplicate values, this will fail. - - Added the required column `slug` to the `Agent` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Agent" ADD COLUMN "slug" TEXT NOT NULL; - --- CreateIndex -CREATE UNIQUE INDEX "Agent_slug_key" ON "Agent"("slug"); diff --git a/prisma/migrations/20241111112810_2024_11_11/migration.sql b/prisma/migrations/20241111112810_2024_11_11/migration.sql deleted file mode 100644 index b4621b56..00000000 --- a/prisma/migrations/20241111112810_2024_11_11/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AddForeignKey -ALTER TABLE "Database" ADD CONSTRAINT "Database_agent_id_fkey" FOREIGN KEY ("agent_id") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index de672dd0..f44dc634 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -61,35 +61,39 @@ model User { image String? role String? password String? + authMethod String? @map("auth_method") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime? @updatedAt @map("updated_at") - accounts Account[] - sessions Session[] - authMethod String? - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime? @updatedAt @map("updated_at") + accounts Account[] + sessions Session[] @@map("users") } model Agent { - id String @id @default(cuid()) - slug String @unique + id String @id @default(cuid()) + slug String @unique name String description String? - lastContact DateTime? @map("last_contact") - createdAt DateTime @default(now()) @map("created_at") - databases Database[] + lastContact DateTime? @map("last_contact") + createdAt DateTime @default(now()) @map("created_at") + + databases Database[] } model Database { - id String @id @default(cuid()) - agentId String @map("agent_id") - agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade) - + id String @id @default(cuid()) name String description String? backupPolicy String? @map("backup_policy") createdAt DateTime @default(now()) @map("created_at") + + agentId String @map("agent_id") + agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade) + + backups Backup[] + restaurations Restauration[] } enum Status { @@ -100,16 +104,25 @@ enum Status { } model Backup { - id String @id @default(cuid()) + id String @id @default(cuid()) + status Status @default(waiting) + file String? + createdAt DateTime @default(now()) @map("created_at") + databaseId String @map("database_id") - status Status @default(waiting) - file String? - createdAt DateTime @default(now()) @map("created_at") + database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade) + + restaurations Restauration[] } -model Restore { +model Restauration { id String @id @default(cuid()) - backupId String @map("backup_id") status Status @default(waiting) createdAt DateTime @default(now()) @map("created_at") + + backupId String @map("backup_id") + backup Backup @relation(fields: [backupId], references: [id], onDelete: Cascade) + + databaseId String? @map("database_id") + database Database? @relation(fields: [databaseId], references: [id], onDelete: Cascade) } diff --git a/src/components/wrappers/cards-with-pagination.tsx b/src/components/wrappers/cards-with-pagination.tsx index e3c2e892..4c78ed2a 100644 --- a/src/components/wrappers/cards-with-pagination.tsx +++ b/src/components/wrappers/cards-with-pagination.tsx @@ -42,14 +42,14 @@ export const CardsWithPagination = (props: cardsWithPaginationProps) => { return ( -
-
+
+
{currentCards.map((card, key) => ( ))}
{ const {className, totalPages, currentPage, goToPage, goToPrevPage, goToNextPage, maxVisiblePages = 3} = props return ( - + diff --git a/src/components/wrappers/table/data-table-with-pagination.tsx b/src/components/wrappers/table/data-table-with-pagination.tsx index b3f39fea..b1e68d38 100644 --- a/src/components/wrappers/table/data-table-with-pagination.tsx +++ b/src/components/wrappers/table/data-table-with-pagination.tsx @@ -30,9 +30,9 @@ export function DataTableWithPagination({columns, data}: DataTabl }) return ( -
+
- +
) } diff --git a/src/components/wrappers/table/table-pagination-size.tsx b/src/components/wrappers/table/table-pagination-size.tsx index 071ede60..f9a20a7d 100644 --- a/src/components/wrappers/table/table-pagination-size.tsx +++ b/src/components/wrappers/table/table-pagination-size.tsx @@ -1,3 +1,4 @@ +import {useEffect} from "react"; import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from "@/components/ui/select"; import {cn} from "@/lib/utils"; @@ -12,8 +13,12 @@ export const TablePaginationSize = (props: tablePaginationSizeProps) => { const {className, table, pageSizeOptions = [10, 20, 30, 40, 50]} = props + useEffect(() => { + table.setPageSize(Number(pageSizeOptions[0])) + }, []); + return ( -
+

Rows per page