From 01c7263ab9149eb291bb8ba038239fb9879aef97 Mon Sep 17 00:00:00 2001 From: biersoeckli Date: Thu, 24 Oct 2024 14:29:24 +0000 Subject: [PATCH] fixed some bugs --- src/app/project/app/[tabName]/app-tabs.tsx | 2 -- .../project/app/[tabName]/domains/domains.tsx | 31 +++++++++++++++++-- .../app/[tabName]/environment/env-edit.tsx | 1 - .../project/app/[tabName]/general/actions.ts | 11 +++++-- .../app/[tabName]/general/app-rate-limits.tsx | 22 +++++++++++-- src/app/project/app/[tabName]/page.tsx | 10 ++++++ src/app/project/app/route.ts | 7 +++++ src/app/project/apps-table.tsx | 10 ++++-- src/model/app-rate-limits.model.ts | 10 +++--- src/model/server-action-error-return.model.ts | 2 +- 10 files changed, 89 insertions(+), 17 deletions(-) create mode 100644 src/app/project/app/route.ts diff --git a/src/app/project/app/[tabName]/app-tabs.tsx b/src/app/project/app/[tabName]/app-tabs.tsx index 1a9027c..0f84fe4 100644 --- a/src/app/project/app/[tabName]/app-tabs.tsx +++ b/src/app/project/app/[tabName]/app-tabs.tsx @@ -30,7 +30,6 @@ export default function AppTabs({ Environment Domains Storage - Logs Domains, Logs, etc. @@ -44,7 +43,6 @@ export default function AppTabs({ storage - logs ) } diff --git a/src/app/project/app/[tabName]/domains/domains.tsx b/src/app/project/app/[tabName]/domains/domains.tsx index 490ce33..85d8bdd 100644 --- a/src/app/project/app/[tabName]/domains/domains.tsx +++ b/src/app/project/app/[tabName]/domains/domains.tsx @@ -20,6 +20,9 @@ import { toast } from "sonner"; import { AppEnvVariablesModel, appEnvVariablesZodModel } from "@/model/env-edit.model"; import { Textarea } from "@/components/ui/textarea"; import { AppExtendedModel } from "@/model/app-extended.model"; +import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; +import { Button } from "@/components/ui/button"; +import { CheckIcon, CrossIcon } from "lucide-react"; export default function DomainsList({ app }: { @@ -31,8 +34,32 @@ export default function DomainsList({ app }: { Domains Add custom domains to your application. If your app has a domain configured, it will be public and accessible via the internet. - - + + + {app.appDomains.length} Domains + + + Name + Port + SSL + Action + + + + {app.appDomains.map(domain => ( + + {domain.hostname} + {domain.port} + {domain.useSsl ? : } + + + ))} + +
+
+ + + ; diff --git a/src/app/project/app/[tabName]/environment/env-edit.tsx b/src/app/project/app/[tabName]/environment/env-edit.tsx index 4fe688f..367b9c7 100644 --- a/src/app/project/app/[tabName]/environment/env-edit.tsx +++ b/src/app/project/app/[tabName]/environment/env-edit.tsx @@ -70,6 +70,5 @@ export default function EnvEdit({ app }: { - ; } \ No newline at end of file diff --git a/src/app/project/app/[tabName]/general/actions.ts b/src/app/project/app/[tabName]/general/actions.ts index 36091cd..aab7773 100644 --- a/src/app/project/app/[tabName]/general/actions.ts +++ b/src/app/project/app/[tabName]/general/actions.ts @@ -40,7 +40,14 @@ export const saveGeneralAppSourceInfo = async (prevState: any, inputData: AppSou export const saveGeneralAppRateLimits = async (prevState: any, inputData: AppRateLimitsModel, appId: string) => saveFormAction(inputData, appRateLimitsZodModel, async (validatedData) => { - console.log(validatedData) + if (validatedData.replicas < 1) { + throw new ServiceException('Replica Count must be at least 1'); + } await getAuthUserSession(); - + const existingApp = await appService.getById(appId); + await appService.save({ + ...existingApp, + ...validatedData, + id: appId, + }); }); diff --git a/src/app/project/app/[tabName]/general/app-rate-limits.tsx b/src/app/project/app/[tabName]/general/app-rate-limits.tsx index 5e17773..c3c3d8d 100644 --- a/src/app/project/app/[tabName]/general/app-rate-limits.tsx +++ b/src/app/project/app/[tabName]/general/app-rate-limits.tsx @@ -36,11 +36,10 @@ export default function GeneralAppRateLimits({ app }: { FormUtils.mapValidationErrorsToForm(state, form); }, [state]); - const sourceTypeField = form.watch(); return <> - Rate Limits + Container Configuration Provide optional rate Limits per running container instance.
@@ -48,6 +47,22 @@ export default function GeneralAppRateLimits({ app }: { return formAction(data); })()}> +
+ + ( + + Replica Count + + + + + + )} + /> +
- + Save +

{state?.message}

diff --git a/src/app/project/app/[tabName]/page.tsx b/src/app/project/app/[tabName]/page.tsx index 4b8dda5..e2cd919 100644 --- a/src/app/project/app/[tabName]/page.tsx +++ b/src/app/project/app/[tabName]/page.tsx @@ -10,6 +10,9 @@ import { import projectService from "@/server/services/project.service"; import PageTitle from "@/components/custom/page-title"; import AppTabs from "./app-tabs"; +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { SubmitButton } from "@/components/custom/submit-button"; +import { Button } from "@/components/ui/button"; export default async function AppPage({ searchParams, @@ -46,6 +49,13 @@ export default async function AppPage({ title={app.name} subtitle={`App ID: "${app.id}"`}> + + + + + + + ) diff --git a/src/app/project/app/route.ts b/src/app/project/app/route.ts new file mode 100644 index 0000000..7a13f64 --- /dev/null +++ b/src/app/project/app/route.ts @@ -0,0 +1,7 @@ +import { redirect } from "next/navigation"; + +// redirects to default route "general" for the app +export async function GET(request: Request) { + const url = new URL(request.url); + redirect(`/project/app/general?appId=${url.searchParams.get("appId")}`); +} \ No newline at end of file diff --git a/src/app/project/apps-table.tsx b/src/app/project/apps-table.tsx index 488877b..dc2c174 100644 --- a/src/app/project/apps-table.tsx +++ b/src/app/project/apps-table.tsx @@ -8,17 +8,23 @@ import { formatDateTime } from "@/lib/format.utils"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { MoreHorizontal } from "lucide-react"; import { Toast } from "@/lib/toast.utils"; -import { Project } from "@prisma/client"; +import { App, Project } from "@prisma/client"; import { deleteApp } from "./actions"; -export default function AppTable({ data }: { data: Project[] }) { +export default function AppTable({ data }: { data: App[] }) { return <> item.sourceType === 'GIT' ? 'Git' : 'Container'], + ['replicas', 'Replica Count', false], + ['memoryLimit', 'Memory Limit', false], + ['memoryReservation', 'Memory Reservation', false], + ['cpuLimit', 'CPU Limit', false], + ['cpuReservation', 'CPU Reservation', false], ["createdAt", "Created At", true, (item) => formatDateTime(item.createdAt)], ["updatedAt", "Updated At", false, (item) => formatDateTime(item.updatedAt)], ]} diff --git a/src/model/app-rate-limits.model.ts b/src/model/app-rate-limits.model.ts index 13521a6..0256136 100644 --- a/src/model/app-rate-limits.model.ts +++ b/src/model/app-rate-limits.model.ts @@ -1,10 +1,12 @@ +import { stringToNumber, stringToOptionalNumber } from "@/lib/zod.utils"; import { z } from "zod"; export const appRateLimitsZodModel = z.object({ - memoryReservation: z.number().nullish(), - memoryLimit: z.number().nullish(), - cpuReservation: z.number().nullish(), - cpuLimit: z.number().nullish(), + memoryReservation: stringToOptionalNumber, + memoryLimit: stringToOptionalNumber, + cpuReservation: stringToOptionalNumber, + cpuLimit: stringToOptionalNumber, + replicas: stringToNumber, }) export type AppRateLimitsModel = z.infer; \ No newline at end of file diff --git a/src/model/server-action-error-return.model.ts b/src/model/server-action-error-return.model.ts index e2661f3..5770b46 100644 --- a/src/model/server-action-error-return.model.ts +++ b/src/model/server-action-error-return.model.ts @@ -17,7 +17,7 @@ export class SuccessActionResult extends ServerActionResult { } export class ErrorActionResult extends ServerActionResult { - constructor(errors: FormZodErrorValidationCallback, message?: string) { + constructor(errors?: FormZodErrorValidationCallback, message?: string) { super('error', undefined, message, errors); } } \ No newline at end of file