🎉 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:
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- Added the required column `password` to the `users` table without a default value. This is not possible if the table is not empty.
|
||||
|
||||
*/
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_sessions" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"token" TEXT NOT NULL,
|
||||
"expiresAt" DATETIME NOT NULL,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "user_sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- RedefineTables
|
||||
PRAGMA defer_foreign_keys=ON;
|
||||
PRAGMA foreign_keys=OFF;
|
||||
CREATE TABLE "new_academic_programs" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"universityId" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"titleAr" TEXT,
|
||||
"description" TEXT,
|
||||
"descriptionAr" TEXT,
|
||||
"level" TEXT NOT NULL,
|
||||
"duration" TEXT,
|
||||
"fees" TEXT,
|
||||
"entryRequirements" TEXT,
|
||||
"campusLocations" JSONB,
|
||||
"totalCredits" INTEGER NOT NULL DEFAULT 120,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "academic_programs_universityId_fkey" FOREIGN KEY ("universityId") REFERENCES "universities" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_academic_programs" ("campusLocations", "createdAt", "description", "descriptionAr", "duration", "entryRequirements", "fees", "id", "isActive", "level", "title", "titleAr", "universityId", "updatedAt") SELECT "campusLocations", "createdAt", "description", "descriptionAr", "duration", "entryRequirements", "fees", "id", "isActive", "level", "title", "titleAr", "universityId", "updatedAt" FROM "academic_programs";
|
||||
DROP TABLE "academic_programs";
|
||||
ALTER TABLE "new_academic_programs" RENAME TO "academic_programs";
|
||||
CREATE TABLE "new_courses" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"universityId" TEXT,
|
||||
"programId" TEXT,
|
||||
"code" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"credits" INTEGER NOT NULL,
|
||||
"semester" TEXT NOT NULL,
|
||||
"schedule" TEXT,
|
||||
"prerequisites" TEXT,
|
||||
"isRequired" BOOLEAN NOT NULL DEFAULT true,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "courses_universityId_fkey" FOREIGN KEY ("universityId") REFERENCES "universities" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT "courses_programId_fkey" FOREIGN KEY ("programId") REFERENCES "academic_programs" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_courses" ("code", "createdAt", "credits", "description", "id", "name", "schedule", "semester", "universityId", "updatedAt") SELECT "code", "createdAt", "credits", "description", "id", "name", "schedule", "semester", "universityId", "updatedAt" FROM "courses";
|
||||
DROP TABLE "courses";
|
||||
ALTER TABLE "new_courses" RENAME TO "courses";
|
||||
CREATE UNIQUE INDEX "courses_code_key" ON "courses"("code");
|
||||
CREATE TABLE "new_users" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"universityId" TEXT,
|
||||
"email" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"password" TEXT NOT NULL,
|
||||
"role" TEXT NOT NULL DEFAULT 'STUDENT',
|
||||
"year" INTEGER,
|
||||
"faculty" TEXT,
|
||||
"balance" REAL,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"lastLogin" DATETIME,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
"advisorId" TEXT,
|
||||
CONSTRAINT "users_universityId_fkey" FOREIGN KEY ("universityId") REFERENCES "universities" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT "users_advisorId_fkey" FOREIGN KEY ("advisorId") REFERENCES "users" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_users" ("advisorId", "balance", "createdAt", "email", "faculty", "id", "name", "role", "universityId", "updatedAt", "year") SELECT "advisorId", "balance", "createdAt", "email", "faculty", "id", "name", "role", "universityId", "updatedAt", "year" FROM "users";
|
||||
DROP TABLE "users";
|
||||
ALTER TABLE "new_users" RENAME TO "users";
|
||||
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
||||
PRAGMA foreign_keys=ON;
|
||||
PRAGMA defer_foreign_keys=OFF;
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_sessions_token_key" ON "user_sessions"("token");
|
||||
Reference in New Issue
Block a user