1
0
forked from baron/baron-sso

devfront biome 오류 수정

This commit is contained in:
2026-06-09 17:52:55 +09:00
parent b919f600e1
commit 2234986abd
6 changed files with 36 additions and 29 deletions

View File

@@ -9,8 +9,8 @@ import ClientDetailsPage from "../features/clients/ClientDetailsPage";
import ClientGeneralPage from "../features/clients/ClientGeneralPage"; import ClientGeneralPage from "../features/clients/ClientGeneralPage";
import ClientRelationsPage from "../features/clients/ClientRelationsPage"; import ClientRelationsPage from "../features/clients/ClientRelationsPage";
import ClientsPage from "../features/clients/ClientsPage"; import ClientsPage from "../features/clients/ClientsPage";
import DeveloperRequestPage from "../features/developer-request/DeveloperRequestPage";
import DeveloperGrantsPage from "../features/developer-grants/DeveloperGrantsPage"; import DeveloperGrantsPage from "../features/developer-grants/DeveloperGrantsPage";
import DeveloperRequestPage from "../features/developer-request/DeveloperRequestPage";
import GlobalOverviewPage from "../features/overview/GlobalOverviewPage"; import GlobalOverviewPage from "../features/overview/GlobalOverviewPage";
import ProfilePage from "../features/profile/ProfilePage"; import ProfilePage from "../features/profile/ProfilePage";
import { DEVFRONT_AUTH_CALLBACK_PATH } from "../lib/authConfig"; import { DEVFRONT_AUTH_CALLBACK_PATH } from "../lib/authConfig";

View File

@@ -2,9 +2,9 @@ import { useQuery } from "@tanstack/react-query";
import { import {
ChevronDown, ChevronDown,
ClipboardCheck, ClipboardCheck,
KeyRound,
LayoutDashboard, LayoutDashboard,
LogOut, LogOut,
KeyRound,
Moon, Moon,
NotebookTabs, NotebookTabs,
ShieldHalf, ShieldHalf,
@@ -351,17 +351,18 @@ function AppLayout() {
auth.user?.profile as Record<string, unknown> | undefined, auth.user?.profile as Record<string, unknown> | undefined,
); );
const displayRoleKey = profile?.role || currentRole; const displayRoleKey = profile?.role || currentRole;
const navItems = displayRoleKey === "super_admin" const navItems =
? [ displayRoleKey === "super_admin"
...baseNavItems, ? [
{ ...baseNavItems,
labelKey: "ui.dev.nav.developer_grants", {
labelFallback: "Developer Access Grants", labelKey: "ui.dev.nav.developer_grants",
to: "/developer-grants", labelFallback: "Developer Access Grants",
icon: KeyRound, to: "/developer-grants",
}, icon: KeyRound,
] },
: baseNavItems; ]
: baseNavItems;
const handleSessionExpiryToggle = () => { const handleSessionExpiryToggle = () => {
setIsSessionExpiryEnabled((prev) => { setIsSessionExpiryEnabled((prev) => {
const next = !prev; const next = !prev;

View File

@@ -31,7 +31,9 @@ export function resolveClientCreateAccess({
return "can_create"; return "can_create";
} }
if (hasDeveloperAccessForPages(accessStatus?.approvedPages, ["client_create"])) { if (
hasDeveloperAccessForPages(accessStatus?.approvedPages, ["client_create"])
) {
return "can_create"; return "can_create";
} }

View File

@@ -35,10 +35,14 @@ describe("developer access gate", () => {
}); });
expect( expect(
resolveDeveloperAccessGate("user", { resolveDeveloperAccessGate(
status: "pending", "user",
pendingPages: ["audit"], {
}, ["audit"]), status: "pending",
pendingPages: ["audit"],
},
["audit"],
),
).toEqual({ ).toEqual({
hasDeveloperAccess: false, hasDeveloperAccess: false,
isDeveloperRequestPending: true, isDeveloperRequestPending: true,
@@ -46,10 +50,14 @@ describe("developer access gate", () => {
}); });
expect( expect(
resolveDeveloperAccessGate("user", { resolveDeveloperAccessGate(
status: "approved", "user",
approvedPages: ["overview"], {
}, ["audit"]), status: "approved",
approvedPages: ["overview"],
},
["audit"],
),
).toEqual({ ).toEqual({
hasDeveloperAccess: false, hasDeveloperAccess: false,
isDeveloperRequestPending: false, isDeveloperRequestPending: false,

View File

@@ -4,9 +4,9 @@ import {
fetchDeveloperRequestStatus, fetchDeveloperRequestStatus,
} from "../../lib/devApi"; } from "../../lib/devApi";
import { import {
type DeveloperAccessPage,
hasDeveloperAccessForPages, hasDeveloperAccessForPages,
isDeveloperRequestPendingForPages, isDeveloperRequestPendingForPages,
type DeveloperAccessPage,
} from "./developerAccessPages"; } from "./developerAccessPages";
export type DeveloperAccessGateState = { export type DeveloperAccessGateState = {
@@ -33,9 +33,7 @@ export function resolveDeveloperAccessGate(
requiredPages, requiredPages,
); );
const canRequestDeveloperAccess = const canRequestDeveloperAccess =
profileRole === "user" && profileRole === "user" && !hasDeveloperAccess && !isDeveloperRequestPending;
!hasDeveloperAccess &&
!isDeveloperRequestPending;
return { return {
hasDeveloperAccess, hasDeveloperAccess,

View File

@@ -59,9 +59,7 @@ test.describe("DevFront security and isolation", () => {
await expect(page.getByText("Server side App")).not.toBeVisible(); await expect(page.getByText("Server side App")).not.toBeVisible();
}); });
test("user can enter DevFront and sees empty RP list", async ({ test("user can enter DevFront and sees empty RP list", async ({ page }) => {
page,
}) => {
await seedAuth(page, "user"); await seedAuth(page, "user");
const state = { const state = {
clients: [] as ReturnType<typeof makeClient>[], clients: [] as ReturnType<typeof makeClient>[],