UNPKG

@defikitdotnet/education-module-ai

Version:
219 lines (218 loc) 14.1 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var express_1 = __importDefault(require("express")); var cors_1 = __importDefault(require("cors")); var body_parser_1 = __importDefault(require("body-parser")); var cookie_parser_1 = __importDefault(require("cookie-parser")); var dotenv_1 = __importDefault(require("dotenv")); var SqliteAdapter_1 = require("./database/SqliteAdapter"); var aiContentRoutes_1 = require("./routes/aiContentRoutes"); var userRoutes_1 = require("./routes/userRoutes"); var h5pRoutes_1 = require("./routes/h5pRoutes"); var authRoutes_1 = require("./routes/authRoutes"); var errorHandler_1 = require("./middleware/errorHandler"); var controller_registry_1 = require("./utils/controller-registry"); var createTestAccounts_1 = require("./utils/createTestAccounts"); // Controllers var CourseController_1 = require("./controllers/CourseController"); var CourseService_1 = require("./services/CourseService"); var CourseRepository_1 = require("./repositories/CourseRepository"); var SectionRepository_1 = require("./repositories/SectionRepository"); var LectureRepository_1 = require("./repositories/LectureRepository"); var QuizRepository_1 = require("./repositories/QuizRepository"); var QuizQuestionRepository_1 = require("./repositories/QuizQuestionRepository"); var CategoryRepository_1 = require("./repositories/CategoryRepository"); var CategoryController_1 = require("./controllers/CategoryController"); var CategoryService_1 = require("./services/CategoryService"); var FileUploadController_1 = require("./controllers/FileUploadController"); // Add imports for missing services var SectionService_1 = require("./services/SectionService"); var LectureService_1 = require("./services/LectureService"); var QuizService_1 = require("./services/QuizService"); var QuizQuestionService_1 = require("./services/QuizQuestionService"); // Import Student Controller var StudentController_1 = require("./controllers/StudentController"); // --> Add these imports var QuizSubmissionRepository_1 = require("./repositories/QuizSubmissionRepository"); var QuizSubmissionService_1 = require("./services/QuizSubmissionService"); // Import Student Repository (if not already imported for other controllers) var StudentRepository_1 = require("./repositories/StudentRepository"); // Import EnrollmentController var EnrollmentController_1 = require("./controllers/EnrollmentController"); // Import EnrollmentRepository var EnrollmentRepository_1 = require("./repositories/EnrollmentRepository"); // Import ProgressRepository var ProgressRepository_1 = require("./repositories/ProgressRepository"); // Import EnrollmentService var EnrollmentService_1 = require("./services/EnrollmentService"); // Import TeacherRepository var TeacherRepository_1 = require("./repositories/TeacherRepository"); // Import TeacherController var TeacherController_1 = require("./controllers/TeacherController"); // Import TeacherService var TeacherService_1 = require("./services/TeacherService"); var teacherRoutes_1 = __importDefault(require("./routes/teacherRoutes")); // Load environment variables dotenv_1.default.config(); /** * Initialize and start the education module server */ function startServer() { return __awaiter(this, void 0, void 0, function () { var app, dbAdapter, error_1, courseRepository, sectionRepository, lectureRepository, quizRepository, quizQuestionRepository, categoryRepository, quizSubmissionRepository, enrollmentRepository, studentRepository, progressRepository, teacherRepository, courseService, categoryService, sectionService, lectureService, quizService, quizQuestionService, quizSubmissionService, enrollmentService, teacherService, PORT; return __generator(this, function (_a) { switch (_a.label) { case 0: app = (0, express_1.default)(); // Apply base middleware // CORS Disabled app.use((0, cors_1.default)({ origin: process.env.FRONTEND_URL || "http://localhost:3008", credentials: true, methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'], })); app.use(body_parser_1.default.json({ limit: "50mb" })); // Increased limit for larger content app.use(body_parser_1.default.urlencoded({ extended: true, limit: "50mb" })); // Use type assertion to explicitly mark cookieParser() as a RequestHandler app.use((0, cookie_parser_1.default)()); dbAdapter = new SqliteAdapter_1.SqliteAdapter(); if (!(process.env.NODE_ENV !== 'production')) return [3 /*break*/, 5]; _a.label = 1; case 1: _a.trys.push([1, 4, , 5]); // Create test student accounts return [4 /*yield*/, (0, createTestAccounts_1.createTestStudentAccounts)(dbAdapter)]; case 2: // Create test student accounts _a.sent(); // Create test teacher accounts return [4 /*yield*/, (0, createTestAccounts_1.createTestTeacherAccounts)(dbAdapter)]; case 3: // Create test teacher accounts _a.sent(); return [3 /*break*/, 5]; case 4: error_1 = _a.sent(); console.error('Error creating test accounts:', error_1); return [3 /*break*/, 5]; case 5: courseRepository = new CourseRepository_1.CourseRepository(dbAdapter); sectionRepository = new SectionRepository_1.SectionRepository(dbAdapter); lectureRepository = new LectureRepository_1.LectureRepository(dbAdapter); quizRepository = new QuizRepository_1.QuizRepository(dbAdapter); quizQuestionRepository = new QuizQuestionRepository_1.QuizQuestionRepository(dbAdapter); categoryRepository = new CategoryRepository_1.CategoryRepository(dbAdapter); quizSubmissionRepository = new QuizSubmissionRepository_1.QuizSubmissionRepository(dbAdapter.getDb()); enrollmentRepository = new EnrollmentRepository_1.EnrollmentRepository(dbAdapter); studentRepository = new StudentRepository_1.StudentRepository(dbAdapter); progressRepository = new ProgressRepository_1.ProgressRepository(dbAdapter); teacherRepository = new TeacherRepository_1.TeacherRepository(dbAdapter); courseService = new CourseService_1.CourseService(courseRepository, sectionRepository, lectureRepository, quizRepository, quizQuestionRepository, categoryRepository, enrollmentRepository, dbAdapter); categoryService = new CategoryService_1.CategoryService(categoryRepository); sectionService = new SectionService_1.SectionService(sectionRepository); lectureService = new LectureService_1.LectureService(lectureRepository); quizService = new QuizService_1.QuizService(quizRepository); quizQuestionService = new QuizQuestionService_1.QuizQuestionService(quizQuestionRepository); quizSubmissionService = new QuizSubmissionService_1.QuizSubmissionService(quizSubmissionRepository); enrollmentService = new EnrollmentService_1.EnrollmentService(enrollmentRepository, progressRepository, dbAdapter); teacherService = new TeacherService_1.TeacherService(teacherRepository); // Register decorated controllers (0, controller_registry_1.registerControllers)(app, [ new CourseController_1.CourseController(courseRepository, sectionRepository, lectureRepository, quizRepository, quizQuestionRepository, courseService, sectionService, lectureService, quizService, quizQuestionService, teacherService // Thêm teacherService vào đây ), new CategoryController_1.CategoryController(categoryService), new FileUploadController_1.FileUploadController(), // Pass StudentRepository as the last argument new StudentController_1.StudentController(dbAdapter, quizService, quizQuestionService, quizSubmissionService, studentRepository), // Add EnrollmentController new EnrollmentController_1.EnrollmentController(enrollmentService), // Add TeacherController new TeacherController_1.TeacherController(teacherService) ]); // Mount legacy routes that haven't been converted to decorators yet app.use("/api/ai-content", (0, aiContentRoutes_1.createAiContentRoutes)(dbAdapter)); app.use("/api/users", (0, userRoutes_1.createUserRoutes)(dbAdapter)); app.use("/api/h5p", (0, h5pRoutes_1.createH5PRoutes)()); app.use("/api/auth", (0, authRoutes_1.createAuthRoutes)(dbAdapter)); // Add new teacher routes app.use("/api/teachers", teacherRoutes_1.default); // Serve static files from public directory app.use(express_1.default.static("public")); // Home route app.get("/", function (req, res) { res.json({ name: "Education Module API", version: "1.0.0", description: "API for the Education Module with AI-driven content generation", }); }); // Add error handling middleware app.use(errorHandler_1.errorHandler); PORT = process.env.PORT || 3009; app.listen(PORT, function () { console.log("Server running on port ".concat(PORT)); console.log("Available authentication routes:"); console.log("- Student login: POST /api/auth/student/login"); console.log("- Teacher registration: POST /api/auth/teacher/register"); console.log("- Teacher login: POST /api/auth/teacher/login"); }); // Handle graceful shutdown process.on("SIGINT", function () { console.log("Shutting down server..."); dbAdapter.close(); process.exit(0); }); return [2 /*return*/, app]; } }); }); } // If this file is run directly, start the server if (require.main === module) { startServer().catch(function (error) { console.error("Failed to start server:", error); process.exit(1); }); } // Export the startServer function as default exports.default = startServer;