/
vlad82098
/
PRACTIC2
Обзор
Документация
Войти
/
vlad82098
/
PRACTIC2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
server/server.js
134 строки
5 KB
влад
first commit
19 дек 2025, 06:16
19 дек 2025, 06:16
6bb42b0
Код
Авторство
О чём код?
import express from "express"; import cors from "cors"; import path from "path"; import { fileURLToPath } from "url"; import jwt from "jsonwebtoken"; import multer from "multer"; import { PrismaClient } from "@prisma/client"; import fs from "fs"; import crypto from "crypto"; import dotenv from "dotenv"; dotenv.config(); const prisma = new PrismaClient(); const app = express(); app.use(cors()); app.use(express.json()); const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // ====== Авторизация ====== const signToken = (payload) => jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: "12h" }); const verifyToken = (req, res, next) => { const raw = req.headers.authorization || ""; const token = raw.startsWith("Bearer ") ? raw.slice(7) : null; if (!token) return res.status(401).json({ error: "Нет токена" }); try { req.user = jwt.verify(token, process.env.JWT_SECRET); next(); } catch { return res.status(401).json({ error: "Некорректный токен" }); } }; // ====== Логин по логину и паролю ====== app.post("/api/login", async (req, res) => { const { login, password } = req.body; const user = await prisma.user.findUnique({ where: { login } }); if (!user) { return res.status(401).json({ error: "Пользователь не найден" }); } if (user.passwordHash !== password) { return res.status(401).json({ error: "Неверный пароль" }); } const token = signToken({ userId: user.id, role: user.role }); res.json({ token }); }); // ====== Профиль ====== app.get("/api/users/profile", verifyToken, async (req, res) => { const user = await prisma.user.findUnique({ where: { id: req.user.userId } }); res.json(user || { login: "demo", role: "student" }); }); // ====== Курсы ====== app.get("/api/courses/:id", verifyToken, async (req, res) => { const id = Number(req.params.id); const course = await prisma.course.findUnique({ where: { id }, include: { lessons: { orderBy: { order: "asc" } } }, }); if (!course) return res.status(404).json({ error: "Курс не найден" }); res.json(course); }); // ====== Прогресс ====== app.post("/api/progress", verifyToken, async (req, res) => { const { lessonId, status } = req.body; await prisma.progress.upsert({ where: { userId_lessonId: { userId: req.user.userId, lessonId } }, update: { status }, create: { userId: req.user.userId, lessonId, status }, }); res.json({ ok: true }); }); // ====== Сертификаты ====== app.post("/api/courses/:id/certificate", verifyToken, async (req, res) => { const id = Number(req.params.id); const lessons = await prisma.lesson.findMany({ where: { courseId: id } }); const progress = await prisma.progress.findMany({ where: { userId: req.user.userId, lessonId: { in: lessons.map((l) => l.id) }, status: "done" }, }); if (progress.length !== lessons.length) { return res.status(400).json({ error: "Курс завершите полностью" }); } const number = `CERT-${id}-${Date.now()}`; const cert = await prisma.certificate.create({ data: { userId: req.user.userId, courseId: id, number }, }); res.json({ number: cert.number }); }); // ====== Домашние задания ====== const upload = multer({ dest: path.join(__dirname, "uploads") }); app.post("/api/homework/upload", verifyToken, upload.single("file"), async (req, res) => { const { courseId, lessonId } = req.body; if (!req.file) return res.status(400).json({ error: "Файл не получен" }); const url = `/uploads/${req.file.filename}`; await prisma.homework.create({ data: { userId: req.user.userId, courseId: Number(courseId), lessonId: Number(lessonId), url }, }); res.json({ ok: true, url }); }); app.use("/uploads", express.static(path.join(__dirname, "uploads"))); app.get("/api/homework/:courseId/:lessonId", verifyToken, async (req, res) => { const { courseId, lessonId } = req.params; const list = await prisma.homework.findMany({ where: { userId: req.user.userId, courseId: Number(courseId), lessonId: Number(lessonId) }, orderBy: { createdAt: "desc" }, }); res.json(list); }); app.delete("/api/homework/:id", verifyToken, async (req, res) => { const id = Number(req.params.id); const hw = await prisma.homework.findUnique({ where: { id } }); if (hw?.userId !== req.user.userId) return res.status(403).json({ error: "Нет прав" }); await prisma.homework.delete({ where: { id } }); res.json({ ok: true }); }); // ====== Запуск ====== const PORT = 4000; app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`));