diff --git a/server/db/schema.ts b/server/db/schema.ts index 4ddb7f13..0f0f05b3 100644 --- a/server/db/schema.ts +++ b/server/db/schema.ts @@ -38,7 +38,7 @@ export const resources = sqliteTable("resources", { export const targets = sqliteTable("targets", { targetId: integer("targetId").primaryKey({ autoIncrement: true }), - resourceId: text("resourceId").references(() => resources.resourceId, { + resourceId: integer("resourceId").references(() => resources.resourceId, { onDelete: "cascade", }), ip: text("ip").notNull(), @@ -188,7 +188,7 @@ export const roleResources = sqliteTable("roleResources", { roleId: integer("roleId") .notNull() .references(() => roles.roleId, { onDelete: "cascade" }), - resourceId: text("resourceId") + resourceId: integer("resourceId") .notNull() .references(() => resources.resourceId, { onDelete: "cascade" }), }); @@ -197,7 +197,7 @@ export const userResources = sqliteTable("userResources", { userId: text("userId") .notNull() .references(() => users.userId, { onDelete: "cascade" }), - resourceId: text("resourceId") + resourceId: integer("resourceId") .notNull() .references(() => resources.resourceId, { onDelete: "cascade" }), }); diff --git a/server/routers/org/createOrg.ts b/server/routers/org/createOrg.ts index 5aefbe2b..2c504660 100644 --- a/server/routers/org/createOrg.ts +++ b/server/routers/org/createOrg.ts @@ -65,10 +65,13 @@ export async function createOrg(req: Request, res: Response, next: NextFunction) ); } + // create a url from config.app.base_url and get the hostname + const domain = new URL(config.app.base_url).hostname; + const newOrg = await db.insert(orgs).values({ orgId, name, - domain: config.app.base_domain + domain }).returning(); const roleId = await createSuperuserRole(newOrg[0].orgId); diff --git a/server/routers/resource/createResource.ts b/server/routers/resource/createResource.ts index fbdca68a..9b447ad1 100644 --- a/server/routers/resource/createResource.ts +++ b/server/routers/resource/createResource.ts @@ -11,7 +11,7 @@ import { eq, and } from 'drizzle-orm'; import stoi from '@server/utils/stoi'; const createResourceParamsSchema = z.object({ - siteId: z.string().optional().transform(stoi).pipe(z.number().int().positive().optional()), + siteId: z.string().optional().transform(stoi).pipe(z.number().int().positive().optional()), orgId: z.string() }); @@ -64,7 +64,7 @@ export async function createResource(req: Request, res: Response, next: NextFunc .from(orgs) .where(eq(orgs.orgId, orgId)) .limit(1); - + if (org.length === 0) { return next( createHttpError( @@ -75,11 +75,11 @@ export async function createResource(req: Request, res: Response, next: NextFunc } // Generate a unique resourceId - const resourceId = `${subdomain}.${org[0].orgId}.${org[0].domain}`; + const fullDomain = `${subdomain}.${org[0].orgId}.${org[0].domain}`; // Create new resource in the database const newResource = await db.insert(resources).values({ - resourceId, + fullDomain, siteId, orgId, name, diff --git a/server/routers/resource/deleteResource.ts b/server/routers/resource/deleteResource.ts index cf939cdc..ffb15286 100644 --- a/server/routers/resource/deleteResource.ts +++ b/server/routers/resource/deleteResource.ts @@ -11,7 +11,7 @@ import logger from '@server/logger'; // Define Zod schema for request parameters validation const deleteResourceSchema = z.object({ - resourceId: z.string() + resourceId: z.string().transform(Number).pipe(z.number().int().positive()), }); export async function deleteResource(req: Request, res: Response, next: NextFunction): Promise { diff --git a/server/routers/resource/getResource.ts b/server/routers/resource/getResource.ts index fe8c223f..21b361e0 100644 --- a/server/routers/resource/getResource.ts +++ b/server/routers/resource/getResource.ts @@ -11,11 +11,11 @@ import logger from '@server/logger'; // Define Zod schema for request parameters validation const getResourceSchema = z.object({ - resourceId: z.string() + resourceId: z.string().transform(Number).pipe(z.number().int().positive()), }); export type GetResourceResponse = { - resourceId: string; + resourceId: number; siteId: number; orgId: string; name: string; diff --git a/server/routers/resource/listResourceRoles.ts b/server/routers/resource/listResourceRoles.ts index 56711710..4883be49 100644 --- a/server/routers/resource/listResourceRoles.ts +++ b/server/routers/resource/listResourceRoles.ts @@ -10,7 +10,7 @@ import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import logger from '@server/logger'; const listResourceRolesSchema = z.object({ - resourceId: z.string(), + resourceId: z.string().transform(Number).pipe(z.number().int().positive()), }); export async function listResourceRoles(req: Request, res: Response, next: NextFunction): Promise { diff --git a/server/routers/resource/listResources.ts b/server/routers/resource/listResources.ts index 215f579a..0fe9de3e 100644 --- a/server/routers/resource/listResources.ts +++ b/server/routers/resource/listResources.ts @@ -41,7 +41,7 @@ const listResourcesSchema = z.object({ }); function queryResources( - accessibleResourceIds: string[], + accessibleResourceIds: number[], siteId?: number, orgId?: string, ) { @@ -141,7 +141,7 @@ export async function listResources( // Get the list of resources the user has access to const accessibleResources = await db .select({ - resourceId: sql`COALESCE(${userResources.resourceId}, ${roleResources.resourceId})`, + resourceId: sql`COALESCE(${userResources.resourceId}, ${roleResources.resourceId})`, }) .from(userResources) .fullJoin( diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 53dab40a..a03ef573 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -11,7 +11,7 @@ import logger from '@server/logger'; // Define Zod schema for request parameters validation const updateResourceParamsSchema = z.object({ - resourceId: z.string() + resourceId: z.string().transform(Number).pipe(z.number().int().positive()), }); // Define Zod schema for request body validation diff --git a/server/routers/role/addRoleResource.ts b/server/routers/role/addRoleResource.ts index 9c70e7ae..93bd244f 100644 --- a/server/routers/role/addRoleResource.ts +++ b/server/routers/role/addRoleResource.ts @@ -13,7 +13,7 @@ const addRoleResourceParamsSchema = z.object({ }); const addRoleResourceSchema = z.object({ - resourceId: z.string(), + resourceId: z.string().transform(Number).pipe(z.number().int().positive()), }); export async function addRoleResource(req: Request, res: Response, next: NextFunction): Promise { diff --git a/server/routers/role/removeRoleResource.ts b/server/routers/role/removeRoleResource.ts index d164be2d..3ec19263 100644 --- a/server/routers/role/removeRoleResource.ts +++ b/server/routers/role/removeRoleResource.ts @@ -14,7 +14,7 @@ const removeRoleResourceParamsSchema = z.object({ }); const removeRoleResourceSchema = z.object({ - resourceId: z.string(), + resourceId: z.string().transform(Number).pipe(z.number().int().positive()), }); export async function removeRoleResource(req: Request, res: Response, next: NextFunction): Promise { diff --git a/server/routers/target/createTarget.ts b/server/routers/target/createTarget.ts index c244c74b..f776e3b1 100644 --- a/server/routers/target/createTarget.ts +++ b/server/routers/target/createTarget.ts @@ -9,7 +9,7 @@ import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import logger from '@server/logger'; const createTargetParamsSchema = z.object({ - resourceId: z.string(), + resourceId: z.string().transform(Number).pipe(z.number().int().positive()), }); const createTargetSchema = z.object({ diff --git a/server/routers/target/listTargets.ts b/server/routers/target/listTargets.ts index e172bfdd..82421983 100644 --- a/server/routers/target/listTargets.ts +++ b/server/routers/target/listTargets.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import logger from "@server/logger"; const listTargetsParamsSchema = z.object({ - resourceId: z.string() + resourceId: z.string().transform(Number).pipe(z.number().int().positive()), }); const listTargetsSchema = z.object({ @@ -29,7 +29,7 @@ const listTargetsSchema = z.object({ .pipe(z.number().int().nonnegative()), }); -function queryTargets(resourceId: string) { +function queryTargets(resourceId: number) { let baseQuery = db .select({ targetId: targets.targetId, diff --git a/server/routers/user/addUserResource.ts b/server/routers/user/addUserResource.ts index f62eefbf..65c13000 100644 --- a/server/routers/user/addUserResource.ts +++ b/server/routers/user/addUserResource.ts @@ -10,7 +10,7 @@ import logger from '@server/logger'; const addUserResourceSchema = z.object({ userId: z.string(), - resourceId: z.string(), + resourceId: z.string().transform(Number).pipe(z.number().int().positive()) }); export async function addUserResource(req: Request, res: Response, next: NextFunction): Promise { diff --git a/server/routers/user/removeUserResource.ts b/server/routers/user/removeUserResource.ts index 925d4ee1..3599b37b 100644 --- a/server/routers/user/removeUserResource.ts +++ b/server/routers/user/removeUserResource.ts @@ -11,7 +11,7 @@ import logger from '@server/logger'; const removeUserResourceSchema = z.object({ userId: z.string(), - resourceId: z.string(), + resourceId: z.string().transform(Number).pipe(z.number().int().positive()) }); export async function removeUserResource(req: Request, res: Response, next: NextFunction): Promise { diff --git a/src/app/[orgId]/resources/[resourceId]/layout.tsx b/src/app/[orgId]/resources/[resourceId]/layout.tsx index 2d29769c..83bb9df2 100644 --- a/src/app/[orgId]/resources/[resourceId]/layout.tsx +++ b/src/app/[orgId]/resources/[resourceId]/layout.tsx @@ -22,7 +22,7 @@ export const metadata: Metadata = { interface SettingsLayoutProps { children: React.ReactNode; - params: Promise<{ resourceId: string; orgId: string }>; + params: Promise<{ resourceId: number | string; orgId: string }>; } export default async function SettingsLayout(props: SettingsLayoutProps) { diff --git a/src/app/[orgId]/resources/[resourceId]/page.tsx b/src/app/[orgId]/resources/[resourceId]/page.tsx index aa0720d9..1487d406 100644 --- a/src/app/[orgId]/resources/[resourceId]/page.tsx +++ b/src/app/[orgId]/resources/[resourceId]/page.tsx @@ -5,7 +5,7 @@ import { GeneralForm } from "./components/GeneralForm"; export default async function SettingsPage( props: { - params: Promise<{ resourceId: string }>; + params: Promise<{ resourceId: number | string }>; } ) { const params = await props.params; diff --git a/src/app/[orgId]/resources/[resourceId]/targets/page.tsx b/src/app/[orgId]/resources/[resourceId]/targets/page.tsx index a1e8415a..9a108941 100644 --- a/src/app/[orgId]/resources/[resourceId]/targets/page.tsx +++ b/src/app/[orgId]/resources/[resourceId]/targets/page.tsx @@ -27,7 +27,7 @@ const isValidIPAddress = (ip: string) => { export default function ReverseProxyTargets( props: { - params: Promise<{ resourceId: string }>; + params: Promise<{ resourceId: number }>; } ) { const params = use(props.params); diff --git a/src/app/[orgId]/resources/components/ResourcesTable.tsx b/src/app/[orgId]/resources/components/ResourcesTable.tsx index f4e579f8..47ef7148 100644 --- a/src/app/[orgId]/resources/components/ResourcesTable.tsx +++ b/src/app/[orgId]/resources/components/ResourcesTable.tsx @@ -15,7 +15,7 @@ import { useRouter } from "next/navigation"; import api from "@app/api"; export type ResourceRow = { - id: string; + id: number; name: string; orgId: string; domain: string; @@ -66,7 +66,7 @@ export const columns: ColumnDef[] = [ const resourceRow = row.original; - const deleteResource = (resourceId: string) => { + const deleteResource = (resourceId: number) => { api.delete(`/resource/${resourceId}`) .catch((e) => { console.error("Error deleting resource", e); diff --git a/src/app/[orgId]/resources/page.tsx b/src/app/[orgId]/resources/page.tsx index e50804ec..018368f2 100644 --- a/src/app/[orgId]/resources/page.tsx +++ b/src/app/[orgId]/resources/page.tsx @@ -23,7 +23,7 @@ export default async function Page(props: ResourcesPageProps) { const resourceRows: ResourceRow[] = resources.map((resource) => { return { - id: resource.resourceId.toString(), + id: resource.resourceId, name: resource.name, orgId: params.orgId, domain: resource.subdomain || "",