🎉 Complete AI-Enhanced University Portal - Ready for Production

 Major Features Added:
- AI Chat with conversation memory and university-specific knowledge base
- Multi-tenant university support with white-label capabilities
- Professional admin interface for knowledge base management
- Advanced database schema with Prisma ORM
- Comprehensive documentation and guides
- Modern Next.js 15 + React 19 architecture
- Bilingual support (English/Arabic)
- Role-based access control
- Real-time chat interface with loading states

🔧 Technical Improvements:
- Fixed all linter errors and TypeScript issues
- Cleaned up codebase and removed legacy files
- Added comprehensive .gitignore
- Updated README with detailed setup instructions
- Optimized database schema and migrations
- Enhanced error handling and user experience

📚 Documentation:
- AI Conversation Memory Guide
- AI Enhancement Summary
- Developer Guide
- User Guide
- Complete setup and deployment instructions

🚀 Ready for GitHub deployment and production use!
This commit is contained in:
Krikorios
2025-07-20 08:26:25 +04:00
parent 868c9b252c
commit aa459f4bd6
159 changed files with 25019 additions and 16607 deletions
+55
View File
@@ -0,0 +1,55 @@
import { NextRequest, NextResponse } from 'next/server';
import { loginUser, generateToken, createUserSession } from '@/lib/auth';
import { cookies } from 'next/headers';
export async function POST(request: NextRequest) {
try {
const { email, password } = await request.json();
if (!email || !password) {
return NextResponse.json(
{ error: 'Email and password are required' },
{ status: 400 }
);
}
const user = await loginUser(email, password);
if (!user) {
return NextResponse.json(
{ error: 'Invalid email or password' },
{ status: 401 }
);
}
const token = generateToken(user);
await createUserSession(user.id, token);
// Set cookie
const cookieStore = await cookies();
cookieStore.set('auth-token', token, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
maxAge: 7 * 24 * 60 * 60, // 7 days
});
return NextResponse.json({
user: {
id: user.id,
email: user.email,
name: user.name,
role: user.role,
universityId: user.universityId,
},
message: 'Login successful',
});
} catch (error) {
console.error('Login error:', error);
return NextResponse.json(
{ error: 'Internal server error' },
{ status: 500 }
);
}
}
+28
View File
@@ -0,0 +1,28 @@
import { NextRequest, NextResponse } from 'next/server';
import { deleteUserSession } from '@/lib/auth';
import { cookies } from 'next/headers';
export async function POST(request: NextRequest) {
try {
const cookieStore = await cookies();
const token = cookieStore.get('auth-token')?.value;
if (token) {
await deleteUserSession(token);
}
// Clear cookie
cookieStore.delete('auth-token');
return NextResponse.json({
message: 'Logout successful',
});
} catch (error) {
console.error('Logout error:', error);
return NextResponse.json(
{ error: 'Internal server error' },
{ status: 500 }
);
}
}
+32
View File
@@ -0,0 +1,32 @@
import { NextRequest, NextResponse } from 'next/server';
import { getCurrentUser } from '@/lib/auth';
export async function GET(request: NextRequest) {
try {
const user = await getCurrentUser();
if (!user) {
return NextResponse.json(
{ error: 'Not authenticated' },
{ status: 401 }
);
}
return NextResponse.json({
user: {
id: user.id,
email: user.email,
name: user.name,
role: user.role,
universityId: user.universityId,
},
});
} catch (error) {
console.error('Auth check error:', error);
return NextResponse.json(
{ error: 'Internal server error' },
{ status: 500 }
);
}
}
+74
View File
@@ -0,0 +1,74 @@
import { NextRequest, NextResponse } from 'next/server';
import { registerUser, generateToken, createUserSession } from '@/lib/auth';
import { cookies } from 'next/headers';
import { prisma } from '@/lib/prisma';
export async function POST(request: NextRequest) {
try {
const { email, name, password, role, universityId } = await request.json();
if (!email || !name || !password) {
return NextResponse.json(
{ error: 'Email, name, and password are required' },
{ status: 400 }
);
}
if (password.length < 6) {
return NextResponse.json(
{ error: 'Password must be at least 6 characters long' },
{ status: 400 }
);
}
// Check if user already exists
const existingUser = await prisma.user.findUnique({
where: { email },
});
if (existingUser) {
return NextResponse.json(
{ error: 'User with this email already exists' },
{ status: 409 }
);
}
const user = await registerUser({
email,
name,
password,
role,
universityId,
});
const token = generateToken(user);
await createUserSession(user.id, token);
// Set cookie
const cookieStore = await cookies();
cookieStore.set('auth-token', token, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
maxAge: 7 * 24 * 60 * 60, // 7 days
});
return NextResponse.json({
user: {
id: user.id,
email: user.email,
name: user.name,
role: user.role,
universityId: user.universityId,
},
message: 'Registration successful',
});
} catch (error) {
console.error('Registration error:', error);
return NextResponse.json(
{ error: 'Internal server error' },
{ status: 500 }
);
}
}