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:
@@ -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 [];
|
||||
}
|
||||
Reference in New Issue
Block a user