({
resolver: zodResolver(appSourceInfoInputZodModel),
diff --git a/src/app/project/app/[tabName]/page.tsx b/src/app/project/app/[tabName]/page.tsx
new file mode 100644
index 0000000..4b8dda5
--- /dev/null
+++ b/src/app/project/app/[tabName]/page.tsx
@@ -0,0 +1,52 @@
+import { getAuthUserSession } from "@/server/utils/action-wrapper.utils";
+import appService from "@/server/services/app.service";
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbSeparator,
+} from "@/components/ui/breadcrumb"
+import projectService from "@/server/services/project.service";
+import PageTitle from "@/components/custom/page-title";
+import AppTabs from "./app-tabs";
+
+export default async function AppPage({
+ searchParams,
+ params
+}: {
+ searchParams?: { [key: string]: string | undefined };
+ params: { tabName: string };
+}) {
+ await getAuthUserSession();
+ const appId = searchParams?.appId;
+ if (!appId) {
+ return Could not find app with id {appId}
+ }
+ const app = await appService.getExtendedById(appId);
+
+ return (
+
+
+
+
+ Projects
+
+
+
+ {app.project.name}
+
+
+
+ {app.name}
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/project/app/page.tsx b/src/app/project/app/page.tsx
deleted file mode 100644
index c0ca86e..0000000
--- a/src/app/project/app/page.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import userService from "@/server/services/user.service";
-import { getAuthUserSession, getUserSession } from "@/server/utils/action-wrapper.utils";
-import { redirect } from "next/navigation";
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
-import GeneralAppRateLimits from "./general/app-rate-limits";
-import GeneralAppSource from "./general/app-source";
-import appService from "@/server/services/app.service";
-import {
- Breadcrumb,
- BreadcrumbItem,
- BreadcrumbLink,
- BreadcrumbList,
- BreadcrumbPage,
- BreadcrumbSeparator,
-} from "@/components/ui/breadcrumb"
-import projectService from "@/server/services/project.service";
-
-export default async function AppPage({
- searchParams,
-}: {
- searchParams?: { [key: string]: string | undefined };
-}) {
- await getAuthUserSession();
- const appId = searchParams?.appId;
- if (!appId) {
- return Could not find app with id {appId}
- }
- const app = await appService.getById(appId);
- const project = await projectService.getById(app.projectId);
-
- return (
-
-
-
-
- Projects
-
-
-
- {project.name}
-
-
-
- {app.name}
-
-
-
-
-
App
-
-
-
- Overview
- General
- Environment
- Domains
- Storage
- Logs
-
- Domains, Logs, etc.
-
-
-
-
- environment
- domains
- storage
- logs
-
-
- )
-}
diff --git a/src/app/project/page.tsx b/src/app/project/page.tsx
index 4afa831..672e0e6 100644
--- a/src/app/project/page.tsx
+++ b/src/app/project/page.tsx
@@ -16,6 +16,7 @@ import {
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb"
+import PageTitle from "@/components/custom/page-title";
export default async function AppsPage({
@@ -44,10 +45,11 @@ export default async function AppsPage({
-
+
)
diff --git a/src/components/custom/page-title.tsx b/src/components/custom/page-title.tsx
new file mode 100644
index 0000000..ba95186
--- /dev/null
+++ b/src/components/custom/page-title.tsx
@@ -0,0 +1,15 @@
+'use client'
+
+export default function PageTitle({ title, subtitle, children }: {
+ title: string;
+ subtitle?: string;
+ children?: React.ReactNode;
+}) {
+ return
+}
\ No newline at end of file
diff --git a/src/model/app-extended.model.ts b/src/model/app-extended.model.ts
new file mode 100644
index 0000000..2b00c82
--- /dev/null
+++ b/src/model/app-extended.model.ts
@@ -0,0 +1,11 @@
+import { z } from "zod";
+import { AppDomainModel, AppModel, AppVolumeModel, ProjectModel, RelatedAppModel } from "./generated-zod";
+
+
+export const AppExtendedZodModel= z.lazy(() => AppModel.extend({
+ project: ProjectModel,
+ appDomains: AppDomainModel.array(),
+ appVolumes: AppVolumeModel.array(),
+ }))
+
+export type AppExtendedModel = z.infer;
\ No newline at end of file
diff --git a/src/model/env-edit.model.ts b/src/model/env-edit.model.ts
new file mode 100644
index 0000000..6f4bb8a
--- /dev/null
+++ b/src/model/env-edit.model.ts
@@ -0,0 +1,7 @@
+import { z } from "zod";
+
+export const appEnvVariablesZodModel = z.object({
+ envVars: z.string(),
+})
+
+export type AppEnvVariablesModel = z.infer;
\ No newline at end of file
diff --git a/src/server/services/app.service.ts b/src/server/services/app.service.ts
index 645d7e3..d51f516 100644
--- a/src/server/services/app.service.ts
+++ b/src/server/services/app.service.ts
@@ -3,6 +3,7 @@ import dataAccess from "../adapter/db.client";
import { Tags } from "../utils/cache-tag-generator.utils";
import { App, Prisma, Project } from "@prisma/client";
import { DefaultArgs } from "@prisma/client/runtime/library";
+import { AppExtendedModel } from "@/model/app-extended.model";
class AppService {
@@ -20,7 +21,7 @@ class AppService {
}
async getAllAppsByProjectID(projectId: string) {
- return await unstable_cache(async (projectId:string) => await dataAccess.client.app.findMany({
+ return await unstable_cache(async (projectId: string) => await dataAccess.client.app.findMany({
where: {
projectId
}
@@ -30,6 +31,18 @@ class AppService {
})(projectId as string);
}
+ async getExtendedById(id: string): Promise {
+ return dataAccess.client.app.findFirstOrThrow({
+ where: {
+ id
+ }, include: {
+ project: true,
+ appDomains: true,
+ appVolumes: true,
+ }
+ });
+ }
+
async getById(id: string) {
return dataAccess.client.app.findFirstOrThrow({
where: {