Fix Next.js 15 compatibility and TypeScript errors

- Update API route handlers to use async params for Next.js 15 compatibility
- Fix MUI DataGrid deprecated props (pageSize -> initialState.pagination)
- Replace Material-UI Grid components with Box for better compatibility
- Fix admin authentication system with proper request parameters
- Update permission constants to match available AdminPermission enum values
- Add missing properties to Page interface for type safety
- Update .gitignore to exclude venv/, import logs, and large data directories
- Optimize Next.js config to reduce memory usage during builds

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-24 09:54:13 +00:00
parent b0dd6c1a4b
commit 4303e48fac
25 changed files with 269 additions and 91 deletions

View File

@@ -1,9 +1,25 @@
import { NextRequest } from 'next/server';
import { verify } from 'jsonwebtoken';
import { verify, sign } from 'jsonwebtoken';
import { prisma } from '@/lib/db';
const JWT_SECRET = process.env.JWT_SECRET || 'fallback-secret-key';
export enum AdminPermission {
READ_USERS = 'read_users',
WRITE_USERS = 'write_users',
DELETE_USERS = 'delete_users',
READ_CONTENT = 'read_content',
WRITE_CONTENT = 'write_content',
DELETE_CONTENT = 'delete_content',
READ_ANALYTICS = 'read_analytics',
READ_CHAT = 'read_chat',
WRITE_CHAT = 'write_chat',
DELETE_CHAT = 'delete_chat',
SYSTEM_BACKUP = 'system_backup',
SYSTEM_HEALTH = 'system_health',
SUPER_ADMIN = 'super_admin'
}
export interface AdminUser {
id: string;
email: string;
@@ -61,4 +77,75 @@ export function hasAdminAccess(user: AdminUser | null): boolean {
export function isSuperAdmin(user: AdminUser | null): boolean {
return user?.role === 'admin';
}
// Generate JWT token for admin authentication
export function generateAdminToken(user: AdminUser): string {
return sign(
{
userId: user.id,
email: user.email,
role: user.role,
type: 'admin'
},
JWT_SECRET,
{ expiresIn: '24h' }
);
}
// Get current admin from request
export async function getCurrentAdmin(request: NextRequest): Promise<AdminUser | null> {
return await verifyAdminAuth(request);
}
// Check if user has specific permission
export function hasPermission(user: AdminUser | null, permission: AdminPermission): boolean {
if (!user) return false;
// Super admin has all permissions
if (user.role === 'admin') return true;
// Define moderator permissions
const moderatorPermissions = [
AdminPermission.READ_USERS,
AdminPermission.WRITE_USERS,
AdminPermission.READ_CONTENT,
AdminPermission.WRITE_CONTENT,
AdminPermission.DELETE_CONTENT,
AdminPermission.READ_ANALYTICS,
AdminPermission.READ_CHAT,
AdminPermission.WRITE_CHAT
];
// Check if moderator has the requested permission
if (user.role === 'moderator') {
return moderatorPermissions.includes(permission);
}
return false;
}
// Get user permissions based on role
export function getUserPermissions(user: AdminUser | null): AdminPermission[] {
if (!user) return [];
if (user.role === 'admin') {
// Admin has all permissions
return Object.values(AdminPermission);
}
if (user.role === 'moderator') {
return [
AdminPermission.READ_USERS,
AdminPermission.WRITE_USERS,
AdminPermission.READ_CONTENT,
AdminPermission.WRITE_CONTENT,
AdminPermission.DELETE_CONTENT,
AdminPermission.READ_ANALYTICS,
AdminPermission.READ_CHAT,
AdminPermission.WRITE_CHAT
];
}
return [];
}