2026-01-30 13:41:32 +01:00
|
|
|
import { redirect } from 'next/navigation'
|
|
|
|
|
import type { Route } from 'next'
|
|
|
|
|
import { auth } from '@/lib/auth'
|
|
|
|
|
import type { UserRole } from '@prisma/client'
|
|
|
|
|
|
|
|
|
|
const ROLE_DASHBOARDS: Record<string, string> = {
|
|
|
|
|
SUPER_ADMIN: '/admin',
|
|
|
|
|
PROGRAM_ADMIN: '/admin',
|
|
|
|
|
JURY_MEMBER: '/jury',
|
|
|
|
|
MENTOR: '/mentor',
|
|
|
|
|
OBSERVER: '/observer',
|
Performance optimization, applicant portal, and missing DB migration
Performance:
- Convert admin dashboard from SSR to client-side tRPC (fixes 503/ChunkLoadError)
- New dashboard.getStats tRPC endpoint batches 16 queries into single response
- Parallelize jury dashboard queries (assignments + gracePeriods via Promise.all)
- Add project.getFullDetail combined endpoint (project + assignments + stats)
- Configure Prisma connection pool (connection_limit=20, pool_timeout=10)
- Add optimizePackageImports for lucide-react tree-shaking
- Increase React Query staleTime from 1min to 5min
Applicant portal:
- Add applicant layout, nav, dashboard, documents, team, and mentor pages
- Add applicant router with document and team management endpoints
- Add chunk error recovery utility
- Update role nav and auth redirect for applicant role
Database:
- Add migration for missing schema elements (SpecialAward job tracking
columns, WizardTemplate table, missing indexes)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 11:04:26 +01:00
|
|
|
APPLICANT: '/applicant',
|
2026-01-30 13:41:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function requireRole(...allowedRoles: UserRole[]) {
|
|
|
|
|
const session = await auth()
|
|
|
|
|
|
|
|
|
|
if (!session?.user) {
|
|
|
|
|
redirect('/login')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const userRole = session.user.role
|
|
|
|
|
|
|
|
|
|
if (!allowedRoles.includes(userRole)) {
|
|
|
|
|
const dashboard = ROLE_DASHBOARDS[userRole]
|
|
|
|
|
redirect((dashboard || '/login') as Route)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return session
|
|
|
|
|
}
|