import { getSessionUser } from '$lib/server/auth/session'; import { getPermissions } from '$lib/server/auth/authorization'; import { redirect } from '@sveltejs/kit'; import { getDatabase } from '$lib/server/database'; import type { LayoutServerLoad } from './$types'; import { getContributorMode } from '$lib/server/contributor-mode'; export const load: LayoutServerLoad = async ({ cookies }) => { const user = await getSessionUser(cookies); if (!user) redirect(303, '/sign-in'); const permissions = await getPermissions(user); if (!permissions.includes('*') && !permissions.includes('isac.access')) redirect(303, '/account'); const canSeeData = permissions.includes('*') || ['data.view','data.manage','data.propose','data.approve'].some((permission) => permissions.includes(permission)); const canManageData = permissions.includes('*') || permissions.includes('data.manage'); const canProposeData = permissions.includes('*') || permissions.includes('data.propose'); const canApproveData = permissions.includes('*') || permissions.includes('data.approve'); const canReviewAvatars = permissions.includes('*') || permissions.includes('avatars.review'); const contributorMode = !canManageData && canProposeData ? await getContributorMode(user.id) : null; const database = canSeeData || canReviewAvatars ? await getDatabase() : null; const pendingRows = canSeeData ? await (await database!.prepare("SELECT module,COUNT(*) AS count FROM data_change_proposals WHERE status='pending' GROUP BY module")).all() : []; const pendingProposalTotal = pendingRows.reduce((total, row) => total + Number(row.count), 0); const pendingAvatarReviews = canReviewAvatars ? Number((await (await database!.prepare("SELECT COUNT(*) AS count FROM avatar_reviews WHERE status='pending'")).get())?.count ?? 0) : 0; const configuredBuildNumber = process.env.SHD_BUILD_NUMBER?.trim() || '0'; const buildNumber = /^\d+$/.test(configuredBuildNumber) ? configuredBuildNumber : '0'; return { permissions, contributorMode, buildNumber, pendingProposals: Object.fromEntries(pendingRows.map((row) => [String(row.module), Number(row.count)])), oversightReviewCounts: { data: canApproveData ? pendingProposalTotal : 0, avatars: pendingAvatarReviews } }; };