Some checks failed
CI / Unit & Component Tests (push) Has been cancelled
CI / Backend Unit Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Unit & Component Tests (pull_request) Failing after 1m36s
CI / Backend Unit Tests (pull_request) Failing after 2m36s
CI / E2E Tests (pull_request) Failing after 1h49m0s
Blockers (14): - B1: fix senderName/receiverName to use $derived instead of $state + sync $effect - B2: migrate all korrespondenz components from messages-extra shim to paraglide m.* - B3: i18n CorrespondenzEmptyState (heading, subtext, search placeholder) - B4: add response.ok checks to admin layout server load - B5: add response.ok checks to korrespondenz page server load - B6: add page.server.spec.ts with 5 test suites for korrespondenz load function - B7: add axe-core accessibility checks to all e2e korrespondenz tests - B8: add Testcontainers JPQL tests for findSinglePersonCorrespondence (DISTINCT + sender) - B9: hide auth reset-token endpoint from OpenAPI spec; remove from generated api.ts - B11: replace amber hardcoded hex colors in SinglePersonHintBar with brand tokens - B12: replace clipboard emoji with Heroicons SVG in SinglePersonHintBar - B13: create DateInput component (German dd.mm.yyyy); use it in CorrespondenzFilterControls - B14: add Paraglide compile step to CI workflow before lint/test Suggestions (11): - S1: make CorrespondentSuggestionsDropdown a pure display component; lift fetch to PersonBar - S2: fix leftover messages-extra import in ConversationTimeline; use brand tokens for status dots - S3: add intent comment to EntityNav openFlyout behavior - S4: rename canManageGroups → canManagePermissions throughout admin - S6: remove domFlush helper from DateInput spec; use expect.poll instead - S7: replace test.skip with throw new Error in bilateral e2e tests - S8: add inverse aria-disabled test for filter strip - S9: remove sm:min-h-0 from sort button to preserve 44px touch target - S10: add title attributes to tablet trigger buttons in EntityNav - S11: delete messages-extra.ts shim entirely Also: fix admin pages revealing blank strip at bottom (-mb-6 on admin layout) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
58 lines
2.0 KiB
TypeScript
58 lines
2.0 KiB
TypeScript
import { error } from '@sveltejs/kit';
|
|
import { createApiClient } from '$lib/api.server';
|
|
import { getErrorMessage } from '$lib/errors';
|
|
import type { components } from '$lib/generated/api';
|
|
|
|
type UserGroup = components['schemas']['UserGroup'];
|
|
|
|
function hasPerm(user: { groups?: UserGroup[] } | undefined, perm: string): boolean {
|
|
return user?.groups?.some((g) => g.permissions.includes(perm)) ?? false;
|
|
}
|
|
|
|
function hasAnyAdminPerm(user: { groups?: UserGroup[] } | undefined): boolean {
|
|
return (
|
|
hasPerm(user, 'ADMIN') ||
|
|
hasPerm(user, 'ADMIN_USER') ||
|
|
hasPerm(user, 'ADMIN_TAG') ||
|
|
hasPerm(user, 'ADMIN_PERMISSION')
|
|
);
|
|
}
|
|
|
|
export async function load({ fetch, locals }) {
|
|
const user = locals.user;
|
|
if (!hasAnyAdminPerm(user)) throw error(403, getErrorMessage('FORBIDDEN'));
|
|
|
|
const api = createApiClient(fetch);
|
|
|
|
// TODO: replace with a dedicated /api/admin/stats endpoint that returns counts only,
|
|
// so the System page does not load full entity lists it does not render.
|
|
const [usersResult, groupsResult, tagsResult] = await Promise.all([
|
|
api.GET('/api/users'),
|
|
api.GET('/api/groups'),
|
|
api.GET('/api/tags')
|
|
]);
|
|
|
|
if (!usersResult.response.ok) {
|
|
const code = (usersResult.error as unknown as { code?: string })?.code;
|
|
throw error(usersResult.response.status, getErrorMessage(code));
|
|
}
|
|
if (!groupsResult.response.ok) {
|
|
const code = (groupsResult.error as unknown as { code?: string })?.code;
|
|
throw error(groupsResult.response.status, getErrorMessage(code));
|
|
}
|
|
if (!tagsResult.response.ok) {
|
|
const code = (tagsResult.error as unknown as { code?: string })?.code;
|
|
throw error(tagsResult.response.status, getErrorMessage(code));
|
|
}
|
|
|
|
return {
|
|
userCount: (usersResult.data ?? []).length,
|
|
groupCount: (groupsResult.data ?? []).length,
|
|
tagCount: (tagsResult.data ?? []).length,
|
|
canManageUsers: hasPerm(user, 'ADMIN_USER'),
|
|
canManageTags: hasPerm(user, 'ADMIN_TAG'),
|
|
canManagePermissions: hasPerm(user, 'ADMIN_PERMISSION'),
|
|
canRunMaintenance: hasPerm(user, 'ADMIN')
|
|
};
|
|
}
|