Files
aplikasi-pembelajaran-inter…/routes/siswa_router.ts
2025-10-26 22:53:17 +08:00

198 lines
6.9 KiB
TypeScript

import express from 'express';
import type { Request, Response } from 'express';
// di bawah import saja
import type { UploadedFile } from 'express-fileupload';
import path from 'path';
import fs from 'fs';
import axios from 'axios';
// dibawah import model
import { SiswaModel } from '../models/siswa_model'; // import SiswaModel
import { JawabanSoalModel } from '../models/jawaban_model'; // import JawabanSoalModel
// Function to calculate time conditions
interface TimeCheckResult {
isBefore: boolean;
isWithin: boolean;
isAfter: boolean;
secondsLeft?: number; // Optional, only present if isWithin is true
}
function checkTimeRange(
jam_mulai: string,
jam_selesai: string,
tanggal_kerja: Date
): TimeCheckResult {
const now = new Date(); // Current date and time: 01:19 AM WITA on October 08, 2025
const currentDateTime = new Date(now);
// Create start and end Date objects
const startDateTime = new Date(tanggal_kerja);
[startDateTime.setHours(Number(jam_mulai.split(':')[0])), startDateTime.setMinutes(Number(jam_mulai.split(':')[1]))];
const endDateTime = new Date(tanggal_kerja);
[endDateTime.setHours(Number(jam_selesai.split(':')[0])), endDateTime.setMinutes(Number(jam_selesai.split(':')[1]))];
// Check conditions
const isBefore = currentDateTime < startDateTime;
const isWithin = currentDateTime >= startDateTime && currentDateTime <= endDateTime;
const isAfter = currentDateTime > endDateTime;
// Calculate seconds left if within range
let secondsLeft: number | undefined;
if (isWithin) {
const timeDiff = endDateTime.getTime() - currentDateTime.getTime();
secondsLeft = Math.max(0, Math.floor(timeDiff / 1000)); // Ensure non-negative
}
return {
isBefore,
isWithin,
isAfter,
...(secondsLeft !== undefined && { secondsLeft }) // Only include secondsLeft if defined
};
}
const router = express.Router();
router.get('/', (req: Request, res: Response) => {
res.sendFile(path.join(__dirname, '../ui/siswa_pages/index.html'));
});
router.post('/check', async (req: Request, res: Response) => {
const data = req.body;
// console.log(data);
try {
// find on SiswaModel by data because the data container all the data
const siswa = await SiswaModel.findOne({ nis: data.nis, password: data.password, _id: data._id, kelas: data.kelas, jurusan: data.jurusan, jk: data.jk });
console.log("ada data");
return res.status(200).json("data found");
} catch (error) {
console.log(error);
return res.status(400).json("data not found");
}
// res.status(200).json("data not found");
})
router.get('/quiz', (req: Request, res: Response) => {
res.sendFile(path.join(__dirname, '../ui/siswa_pages/quiz.html'));
})
router.post('/submit-answers/:quiz', async (req: Request, res: Response) => {
const { quiz } = req.params;
const { _id, nis, jawaban } = req.body;
console.log(_id, nis, jawaban);
console.log(quiz);
try {
// check if jawaban of this soal and this nis already exist
const jawabanExist = await JawabanSoalModel.findOne({ nis: nis, soal: quiz });
if (jawabanExist) {
return res.status(400).json('Jawaban Sudah di Kirim');
}
await JawabanSoalModel.create({ nis: nis, jawaban: jawaban, soal: quiz, waktu: new Date() });
res.status(200).json('Jawaban Berhasil di Kirim');
} catch (error) {
console.log(error);
res.status(400).json('Jawaban Gagal di Kirim');
}
})
router.get('/check_status_list_soal/:quiz/:nis', async (req: Request, res: Response) => {
const { quiz, nis } = req.params;
// console.log(quiz, nis);
// check if jawaban of this soal and this nis already exist
const jawabanExist = await JawabanSoalModel.findOne({ nis: nis, soal: quiz });
if (jawabanExist) {
return res.status(200).json({ label: "success", status: "Sudah Dijawab", bool: true });
}
if (quiz == "soal1") {
const result = checkTimeRange("8:50", "10:10", new Date("10-15-2025"));
if (result.isBefore)
return res.status(200).json({ label: "default", status: "Belum Waktunya", bool: true });
if (result.isAfter)
return res.status(200).json({ label: "default", status: "Sudah Waktunya", bool: true });
}
res.status(200).json({ label: "info", status: "Belum Dijawab", bool: false });
})
// ini soal1 hardcode
router.get('/soal1', (req: Request, res: Response) => {
const result = checkTimeRange("8:50", "10:10", new Date("10-15-2025"));
// console.log(result);
// if (result.isBefore)
// return res.sendFile(path.join(__dirname, '../ui/first_pages/jam_belum.html'));
// if (result.isAfter)
// return res.sendFile(path.join(__dirname, '../ui/first_pages/jam_sudah.html'));
res.sendFile(path.join(__dirname, '../ui/siswa_pages/soal1.html'));
});
router.get('/check_timer/:waktu_mulai/:waktu_selesai/:tanggal', async (req: Request, res: Response) => {
const { waktu_mulai, waktu_selesai, tanggal } = req.params;
const result = checkTimeRange(waktu_mulai, waktu_selesai, new Date(tanggal));
// console.log(result);
res.status(200).json(result);
})
router.post('/check-jawaban/:quiz', async (req: Request, res: Response) => {
const { quiz } = req.params;
const { nis, _id } = req.body;
// check if jawaban of this soal and this nis already exist
const jawabanExist = await JawabanSoalModel.findOne({ nis: nis, soal: quiz });
if (jawabanExist) {
return res.status(200).json(jawabanExist);
}
res.status(200).json({ label: "info", status: "Belum Dijawab", bool: false });
// console.log(quiz, nis, _id);
// res.status(200).json("data not found");
})
router.post('/datasiswa', async (req: Request, res: Response) => {
const jsonnya = {
"kelas": "3",
"jurusan": "Farmasi",
"siswa": [
{ "nis": "2023011", "nama": "Aril Ramadhan", "jk": "Laki-laki" },
{ "nis": "2023013", "nama": "Erwin", "jk": "Laki-laki" },
{ "nis": "2023005", "nama": "Mardiana", "jk": "Perempuan" },
{ "nis": "2023002", "nama": "Muh. Baim", "jk": "Laki-laki" },
{ "nis": "2023012", "nama": "Muh. Rezki R", "jk": "Laki-laki" },
{ "nis": "2023007", "nama": "Nabila", "jk": "Perempuan" },
{ "nis": "2023006", "nama": "Nasila", "jk": "Perempuan" },
{ "nis": "2023009", "nama": "St. Aini", "jk": "Perempuan" },
{ "nis": "2023010", "nama": "St. Fatimah", "jk": "Perempuan" },
]
}
// insert to siswa
for (let i = 0; i < jsonnya.siswa.length; i++) {
await SiswaModel.create({
nis: jsonnya.siswa[i].nis,
nama: jsonnya.siswa[i].nama,
kelas: jsonnya.kelas,
jurusan: jsonnya.jurusan,
jk: jsonnya.siswa[i].jk,
});
}
res.status(200).json(jsonnya);
});
export default router;