198 lines
6.9 KiB
TypeScript
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; |