mirror of
https://github.com/fosrl/pangolin.git
synced 2025-08-01 16:45:40 +02:00
Fix resource new id number
This commit is contained in:
parent
c6d4c4db20
commit
261b3c7e31
19 changed files with 31 additions and 28 deletions
|
@ -38,7 +38,7 @@ export const resources = sqliteTable("resources", {
|
||||||
|
|
||||||
export const targets = sqliteTable("targets", {
|
export const targets = sqliteTable("targets", {
|
||||||
targetId: integer("targetId").primaryKey({ autoIncrement: true }),
|
targetId: integer("targetId").primaryKey({ autoIncrement: true }),
|
||||||
resourceId: text("resourceId").references(() => resources.resourceId, {
|
resourceId: integer("resourceId").references(() => resources.resourceId, {
|
||||||
onDelete: "cascade",
|
onDelete: "cascade",
|
||||||
}),
|
}),
|
||||||
ip: text("ip").notNull(),
|
ip: text("ip").notNull(),
|
||||||
|
@ -188,7 +188,7 @@ export const roleResources = sqliteTable("roleResources", {
|
||||||
roleId: integer("roleId")
|
roleId: integer("roleId")
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => roles.roleId, { onDelete: "cascade" }),
|
.references(() => roles.roleId, { onDelete: "cascade" }),
|
||||||
resourceId: text("resourceId")
|
resourceId: integer("resourceId")
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => resources.resourceId, { onDelete: "cascade" }),
|
.references(() => resources.resourceId, { onDelete: "cascade" }),
|
||||||
});
|
});
|
||||||
|
@ -197,7 +197,7 @@ export const userResources = sqliteTable("userResources", {
|
||||||
userId: text("userId")
|
userId: text("userId")
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => users.userId, { onDelete: "cascade" }),
|
.references(() => users.userId, { onDelete: "cascade" }),
|
||||||
resourceId: text("resourceId")
|
resourceId: integer("resourceId")
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => resources.resourceId, { onDelete: "cascade" }),
|
.references(() => resources.resourceId, { onDelete: "cascade" }),
|
||||||
});
|
});
|
||||||
|
|
|
@ -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({
|
const newOrg = await db.insert(orgs).values({
|
||||||
orgId,
|
orgId,
|
||||||
name,
|
name,
|
||||||
domain: config.app.base_domain
|
domain
|
||||||
}).returning();
|
}).returning();
|
||||||
|
|
||||||
const roleId = await createSuperuserRole(newOrg[0].orgId);
|
const roleId = await createSuperuserRole(newOrg[0].orgId);
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { eq, and } from 'drizzle-orm';
|
||||||
import stoi from '@server/utils/stoi';
|
import stoi from '@server/utils/stoi';
|
||||||
|
|
||||||
const createResourceParamsSchema = z.object({
|
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()
|
orgId: z.string()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ export async function createResource(req: Request, res: Response, next: NextFunc
|
||||||
.from(orgs)
|
.from(orgs)
|
||||||
.where(eq(orgs.orgId, orgId))
|
.where(eq(orgs.orgId, orgId))
|
||||||
.limit(1);
|
.limit(1);
|
||||||
|
|
||||||
if (org.length === 0) {
|
if (org.length === 0) {
|
||||||
return next(
|
return next(
|
||||||
createHttpError(
|
createHttpError(
|
||||||
|
@ -75,11 +75,11 @@ export async function createResource(req: Request, res: Response, next: NextFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate a unique resourceId
|
// 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
|
// Create new resource in the database
|
||||||
const newResource = await db.insert(resources).values({
|
const newResource = await db.insert(resources).values({
|
||||||
resourceId,
|
fullDomain,
|
||||||
siteId,
|
siteId,
|
||||||
orgId,
|
orgId,
|
||||||
name,
|
name,
|
||||||
|
|
|
@ -11,7 +11,7 @@ import logger from '@server/logger';
|
||||||
|
|
||||||
// Define Zod schema for request parameters validation
|
// Define Zod schema for request parameters validation
|
||||||
const deleteResourceSchema = z.object({
|
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<any> {
|
export async function deleteResource(req: Request, res: Response, next: NextFunction): Promise<any> {
|
||||||
|
|
|
@ -11,11 +11,11 @@ import logger from '@server/logger';
|
||||||
|
|
||||||
// Define Zod schema for request parameters validation
|
// Define Zod schema for request parameters validation
|
||||||
const getResourceSchema = z.object({
|
const getResourceSchema = z.object({
|
||||||
resourceId: z.string()
|
resourceId: z.string().transform(Number).pipe(z.number().int().positive()),
|
||||||
});
|
});
|
||||||
|
|
||||||
export type GetResourceResponse = {
|
export type GetResourceResponse = {
|
||||||
resourceId: string;
|
resourceId: number;
|
||||||
siteId: number;
|
siteId: number;
|
||||||
orgId: string;
|
orgId: string;
|
||||||
name: string;
|
name: string;
|
||||||
|
|
|
@ -10,7 +10,7 @@ import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
|
||||||
import logger from '@server/logger';
|
import logger from '@server/logger';
|
||||||
|
|
||||||
const listResourceRolesSchema = z.object({
|
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<any> {
|
export async function listResourceRoles(req: Request, res: Response, next: NextFunction): Promise<any> {
|
||||||
|
|
|
@ -41,7 +41,7 @@ const listResourcesSchema = z.object({
|
||||||
});
|
});
|
||||||
|
|
||||||
function queryResources(
|
function queryResources(
|
||||||
accessibleResourceIds: string[],
|
accessibleResourceIds: number[],
|
||||||
siteId?: number,
|
siteId?: number,
|
||||||
orgId?: string,
|
orgId?: string,
|
||||||
) {
|
) {
|
||||||
|
@ -141,7 +141,7 @@ export async function listResources(
|
||||||
// Get the list of resources the user has access to
|
// Get the list of resources the user has access to
|
||||||
const accessibleResources = await db
|
const accessibleResources = await db
|
||||||
.select({
|
.select({
|
||||||
resourceId: sql<string>`COALESCE(${userResources.resourceId}, ${roleResources.resourceId})`,
|
resourceId: sql<number>`COALESCE(${userResources.resourceId}, ${roleResources.resourceId})`,
|
||||||
})
|
})
|
||||||
.from(userResources)
|
.from(userResources)
|
||||||
.fullJoin(
|
.fullJoin(
|
||||||
|
|
|
@ -11,7 +11,7 @@ import logger from '@server/logger';
|
||||||
|
|
||||||
// Define Zod schema for request parameters validation
|
// Define Zod schema for request parameters validation
|
||||||
const updateResourceParamsSchema = z.object({
|
const updateResourceParamsSchema = z.object({
|
||||||
resourceId: z.string()
|
resourceId: z.string().transform(Number).pipe(z.number().int().positive()),
|
||||||
});
|
});
|
||||||
|
|
||||||
// Define Zod schema for request body validation
|
// Define Zod schema for request body validation
|
||||||
|
|
|
@ -13,7 +13,7 @@ const addRoleResourceParamsSchema = z.object({
|
||||||
});
|
});
|
||||||
|
|
||||||
const addRoleResourceSchema = 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<any> {
|
export async function addRoleResource(req: Request, res: Response, next: NextFunction): Promise<any> {
|
||||||
|
|
|
@ -14,7 +14,7 @@ const removeRoleResourceParamsSchema = z.object({
|
||||||
});
|
});
|
||||||
|
|
||||||
const removeRoleResourceSchema = 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<any> {
|
export async function removeRoleResource(req: Request, res: Response, next: NextFunction): Promise<any> {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
|
||||||
import logger from '@server/logger';
|
import logger from '@server/logger';
|
||||||
|
|
||||||
const createTargetParamsSchema = z.object({
|
const createTargetParamsSchema = z.object({
|
||||||
resourceId: z.string(),
|
resourceId: z.string().transform(Number).pipe(z.number().int().positive()),
|
||||||
});
|
});
|
||||||
|
|
||||||
const createTargetSchema = z.object({
|
const createTargetSchema = z.object({
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error";
|
||||||
import logger from "@server/logger";
|
import logger from "@server/logger";
|
||||||
|
|
||||||
const listTargetsParamsSchema = z.object({
|
const listTargetsParamsSchema = z.object({
|
||||||
resourceId: z.string()
|
resourceId: z.string().transform(Number).pipe(z.number().int().positive()),
|
||||||
});
|
});
|
||||||
|
|
||||||
const listTargetsSchema = z.object({
|
const listTargetsSchema = z.object({
|
||||||
|
@ -29,7 +29,7 @@ const listTargetsSchema = z.object({
|
||||||
.pipe(z.number().int().nonnegative()),
|
.pipe(z.number().int().nonnegative()),
|
||||||
});
|
});
|
||||||
|
|
||||||
function queryTargets(resourceId: string) {
|
function queryTargets(resourceId: number) {
|
||||||
let baseQuery = db
|
let baseQuery = db
|
||||||
.select({
|
.select({
|
||||||
targetId: targets.targetId,
|
targetId: targets.targetId,
|
||||||
|
|
|
@ -10,7 +10,7 @@ import logger from '@server/logger';
|
||||||
|
|
||||||
const addUserResourceSchema = z.object({
|
const addUserResourceSchema = z.object({
|
||||||
userId: z.string(),
|
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<any> {
|
export async function addUserResource(req: Request, res: Response, next: NextFunction): Promise<any> {
|
||||||
|
|
|
@ -11,7 +11,7 @@ import logger from '@server/logger';
|
||||||
|
|
||||||
const removeUserResourceSchema = z.object({
|
const removeUserResourceSchema = z.object({
|
||||||
userId: z.string(),
|
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<any> {
|
export async function removeUserResource(req: Request, res: Response, next: NextFunction): Promise<any> {
|
||||||
|
|
|
@ -22,7 +22,7 @@ export const metadata: Metadata = {
|
||||||
|
|
||||||
interface SettingsLayoutProps {
|
interface SettingsLayoutProps {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
params: Promise<{ resourceId: string; orgId: string }>;
|
params: Promise<{ resourceId: number | string; orgId: string }>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function SettingsLayout(props: SettingsLayoutProps) {
|
export default async function SettingsLayout(props: SettingsLayoutProps) {
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { GeneralForm } from "./components/GeneralForm";
|
||||||
|
|
||||||
export default async function SettingsPage(
|
export default async function SettingsPage(
|
||||||
props: {
|
props: {
|
||||||
params: Promise<{ resourceId: string }>;
|
params: Promise<{ resourceId: number | string }>;
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
const params = await props.params;
|
const params = await props.params;
|
||||||
|
|
|
@ -27,7 +27,7 @@ const isValidIPAddress = (ip: string) => {
|
||||||
|
|
||||||
export default function ReverseProxyTargets(
|
export default function ReverseProxyTargets(
|
||||||
props: {
|
props: {
|
||||||
params: Promise<{ resourceId: string }>;
|
params: Promise<{ resourceId: number }>;
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
const params = use(props.params);
|
const params = use(props.params);
|
||||||
|
|
|
@ -15,7 +15,7 @@ import { useRouter } from "next/navigation";
|
||||||
import api from "@app/api";
|
import api from "@app/api";
|
||||||
|
|
||||||
export type ResourceRow = {
|
export type ResourceRow = {
|
||||||
id: string;
|
id: number;
|
||||||
name: string;
|
name: string;
|
||||||
orgId: string;
|
orgId: string;
|
||||||
domain: string;
|
domain: string;
|
||||||
|
@ -66,7 +66,7 @@ export const columns: ColumnDef<ResourceRow>[] = [
|
||||||
|
|
||||||
const resourceRow = row.original;
|
const resourceRow = row.original;
|
||||||
|
|
||||||
const deleteResource = (resourceId: string) => {
|
const deleteResource = (resourceId: number) => {
|
||||||
api.delete(`/resource/${resourceId}`)
|
api.delete(`/resource/${resourceId}`)
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
console.error("Error deleting resource", e);
|
console.error("Error deleting resource", e);
|
||||||
|
|
|
@ -23,7 +23,7 @@ export default async function Page(props: ResourcesPageProps) {
|
||||||
|
|
||||||
const resourceRows: ResourceRow[] = resources.map((resource) => {
|
const resourceRows: ResourceRow[] = resources.map((resource) => {
|
||||||
return {
|
return {
|
||||||
id: resource.resourceId.toString(),
|
id: resource.resourceId,
|
||||||
name: resource.name,
|
name: resource.name,
|
||||||
orgId: params.orgId,
|
orgId: params.orgId,
|
||||||
domain: resource.subdomain || "",
|
domain: resource.subdomain || "",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue