Server (NestJS): - AcadeniceAuditLogModule: GET /api/acadenice/audit-log (admin/owner, Kysely, paginated + filtered) - AcadeniceApiKeysModule: GET/POST/DELETE /api/acadenice/api-keys (JWT, bcrypt hash, acdk_ prefix) - AcadeniceSecurityModule: GET /api/acadenice/security/oidc-status (admin, no secrets exposed) - Migration 20260510T100000: acadenice_api_key table with token_hash + bcrypt - Permissions catalog: added audit_log:read Client (React 18 + Mantine v7): - Audit log page: paginated table with filters (event, userId, date range) - API keys page: list/create/revoke personal tokens, one-time display modal - Security/OIDC status page: read-only, env-var config reference - Sidebar rewired: Security & SSO, API keys, Audit log -> acadenice/* routes (no EE feature gates) - Prefetch functions for new routes Tests: 36 server (Jest) + client typecheck clean Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
125 lines
3.6 KiB
TypeScript
125 lines
3.6 KiB
TypeScript
import { queryClient } from "@/main.tsx";
|
|
import {
|
|
getBilling,
|
|
getBillingPlans,
|
|
} from "@/ee/billing/services/billing-service.ts";
|
|
import { getAcadeniceAuditLogs } from "@/features/acadenice/audit-log/services/audit-log.service";
|
|
import { listAcadeniceApiKeys } from "@/features/acadenice/api-keys/services/api-key.service";
|
|
import { getSpaces } from "@/features/space/services/space-service.ts";
|
|
import { getGroups } from "@/features/group/services/group-service.ts";
|
|
import { QueryParams } from "@/lib/types.ts";
|
|
import { getWorkspaceMembers } from "@/features/workspace/services/workspace-service.ts";
|
|
import { getLicenseInfo } from "@/ee/licence/services/license-service.ts";
|
|
import { getSsoProviders } from "@/ee/security/services/security-service.ts";
|
|
import { getShares } from "@/features/share/services/share-service.ts";
|
|
import { getApiKeys } from "@/ee/api-key";
|
|
import { getAuditLogs } from "@/ee/audit/services/audit-service";
|
|
import { getVerificationList } from "@/ee/page-verification/services/page-verification-service";
|
|
import { getScimTokens } from "@/ee/scim/services/scim-token-service";
|
|
|
|
export const prefetchWorkspaceMembers = () => {
|
|
const params: QueryParams = { limit: 100, query: "" };
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["workspaceMembers", params],
|
|
queryFn: () => getWorkspaceMembers(params),
|
|
});
|
|
};
|
|
|
|
export const prefetchSpaces = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["spaces", {}],
|
|
queryFn: () => getSpaces({}),
|
|
});
|
|
};
|
|
|
|
export const prefetchGroups = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["groups", {}],
|
|
queryFn: () => getGroups({}),
|
|
});
|
|
};
|
|
|
|
export const prefetchBilling = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["billing"],
|
|
queryFn: () => getBilling(),
|
|
});
|
|
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["billing-plans"],
|
|
queryFn: () => getBillingPlans(),
|
|
});
|
|
};
|
|
|
|
export const prefetchLicense = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["license"],
|
|
queryFn: () => getLicenseInfo(),
|
|
});
|
|
};
|
|
|
|
export const prefetchSsoProviders = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["sso-providers"],
|
|
queryFn: () => getSsoProviders(),
|
|
});
|
|
};
|
|
|
|
export const prefetchShares = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["share-list", {}],
|
|
queryFn: () => getShares({}),
|
|
});
|
|
};
|
|
|
|
export const prefetchApiKeys = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["api-key-list", {}],
|
|
queryFn: () => getApiKeys({}),
|
|
});
|
|
};
|
|
|
|
export const prefetchApiKeyManagement = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["api-key-list", { adminView: true }],
|
|
queryFn: () => getApiKeys({ adminView: true }),
|
|
});
|
|
};
|
|
|
|
export const prefetchAuditLogs = () => {
|
|
const params = { limit: 50 };
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["audit-logs", params],
|
|
queryFn: () => getAuditLogs(params),
|
|
});
|
|
};
|
|
|
|
export const prefetchVerifiedPages = () => {
|
|
const params = { limit: 50 };
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["verification-list", params],
|
|
queryFn: () => getVerificationList(params),
|
|
});
|
|
};
|
|
|
|
export const prefetchScimTokens = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["scim-token-list", { cursor: undefined }],
|
|
queryFn: () => getScimTokens({}),
|
|
});
|
|
};
|
|
|
|
// Acadenice R4.5 — open source prefetch functions
|
|
export const prefetchAcadeniceAuditLogs = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["acadenice-audit-logs", { limit: 50, offset: 0 }],
|
|
queryFn: () => getAcadeniceAuditLogs({ limit: 50, offset: 0 }),
|
|
});
|
|
};
|
|
|
|
export const prefetchAcadeniceApiKeys = () => {
|
|
queryClient.prefetchQuery({
|
|
queryKey: ["acadenice-api-keys"],
|
|
queryFn: () => listAcadeniceApiKeys(),
|
|
});
|
|
};
|