diff --git a/messages/en-US.json b/messages/en-US.json index 84dad51a2..d50073f1f 100644 --- a/messages/en-US.json +++ b/messages/en-US.json @@ -170,6 +170,7 @@ "resourcePoliciesDescription": "Create and manage authentication policies to control access to your resources", "resourcePoliciesSearch": "Search policies...", "resourcePoliciesAdd": "Add Policy", + "resourcePoliciesDefaultBadgeText": "Default policy", "authentication": "Authentication", "protected": "Protected", "notProtected": "Not Protected", diff --git a/server/private/routers/resource/listResourcePolicies.ts b/server/private/routers/resource/listResourcePolicies.ts index 940a4b781..0f2089bbc 100644 --- a/server/private/routers/resource/listResourcePolicies.ts +++ b/server/private/routers/resource/listResourcePolicies.ts @@ -11,32 +11,17 @@ * This file is not licensed under the AGPLv3. */ -import { Request, Response, NextFunction } from "express"; -import { z } from "zod"; -import { - db, - resourceHeaderAuth, - resourceHeaderAuthExtendedCompatibility, - resourcePolicies -} from "@server/db"; -import { - resources, - userResources, - roleResources, - resourcePassword, - resourcePincode, - targets, - targetHealthCheck -} from "@server/db"; +import { db, resourcePolicies, roleResources, userResources } from "@server/db"; import response from "@server/lib/response"; -import HttpCode from "@server/types/HttpCode"; -import createHttpError from "http-errors"; -import { sql, eq, or, inArray, and, count, ilike, asc } from "drizzle-orm"; import logger from "@server/logger"; -import { fromZodError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -import type { PaginatedResponse } from "@server/types/Pagination"; import type { ListResourcePoliciesResponse } from "@server/routers/resource/types"; +import HttpCode from "@server/types/HttpCode"; +import { and, asc, eq, inArray, like, or, sql } from "drizzle-orm"; +import { NextFunction, Request, Response } from "express"; +import createHttpError from "http-errors"; +import { z } from "zod"; +import { fromZodError } from "zod-validation-error"; const listResourcePoliciesParamsSchema = z.strictObject({ orgId: z.string() @@ -66,7 +51,8 @@ function queryResourcePoliciesBase() { resourcePolicyId: resourcePolicies.resourcePolicyId, name: resourcePolicies.name, niceId: resourcePolicies.niceId, - orgId: resourcePolicies.orgId + orgId: resourcePolicies.orgId, + isDefault: resourcePolicies.isDefault }) .from(resourcePolicies); } @@ -180,8 +166,14 @@ export async function listResourcePolicies( if (query) { conditions.push( or( - ilike(resourcePolicies.name, "%" + query + "%"), - ilike(resourcePolicies.niceId, "%" + query + "%") + like( + sql`LOWER(${resourcePolicies.name})`, + "%" + query.toLowerCase() + "%" + ), + like( + sql`LOWER(${resourcePolicies.niceId})`, + "%" + query.toLowerCase() + "%" + ) ) ); } diff --git a/server/routers/resource/types.ts b/server/routers/resource/types.ts index 223154a01..6e0ea3d50 100644 --- a/server/routers/resource/types.ts +++ b/server/routers/resource/types.ts @@ -14,6 +14,9 @@ export type GetMaintenanceInfoResponse = { export type ListResourcePoliciesResponse = PaginatedResponse<{ policies: Array< - Pick + Pick< + ResourcePolicy, + "resourcePolicyId" | "niceId" | "name" | "orgId" | "isDefault" + > >; }>; diff --git a/src/components/ResourcePoliciesTable.tsx b/src/components/ResourcePoliciesTable.tsx index 0d348b2a3..1473f72d4 100644 --- a/src/components/ResourcePoliciesTable.tsx +++ b/src/components/ResourcePoliciesTable.tsx @@ -20,6 +20,7 @@ import { MoreHorizontal, ArrowRight } from "lucide-react"; import Link from "next/link"; import { ControlledDataTable } from "./ui/controlled-data-table"; import { useDebouncedCallback } from "use-debounce"; +import { Badge } from "./ui/badge"; type ResourcePolicyRow = ListResourcePoliciesResponse["policies"][number]; @@ -70,7 +71,25 @@ export function ResourcePoliciesTable({ accessorKey: "name", enableHiding: false, friendlyName: t("name"), - header: () => {t("name")} + header: () => {t("name")}, + cell({ row }) { + const r = row.original; + return ( +
+ {r.name} + {r.isDefault && ( + <> + + {t("resourcePoliciesDefaultBadgeText")} + + + )} +
+ ); + } }, { id: "niceId",