diff --git a/backend/controllers/hardwarecontroller.go b/backend/controllers/hardwarecontroller.go index 1573563..ab81294 100644 --- a/backend/controllers/hardwarecontroller.go +++ b/backend/controllers/hardwarecontroller.go @@ -34,12 +34,6 @@ var DeviceStatusCache = map[string]string{ "projector": "off", } -// ========================================================================= -// FUNGSI 1: VERIFIKASI HARDWARE & HITUNG SISA WAKTU DINAMIS -// ========================================================================= -// ========================================================================= -// FUNGSI 1: VERIFIKASI HARDWARE & HITUNG SISA WAKTU DINAMIS -// ========================================================================= func VerifyHardwareCode(c *gin.Context) { var req VerifyRequest @@ -51,7 +45,7 @@ func VerifyHardwareCode(c *gin.Context) { tokenInput := req.Token sekarang := time.Now() - // 1. Token Master CS + // 1. Token Master CS (Cleaning Service) if tokenInput == "CS2026" { fmt.Printf("[VERIFY] Master Token CS digunakan\n") c.JSON(http.StatusOK, gin.H{ @@ -70,15 +64,15 @@ func VerifyHardwareCode(c *gin.Context) { } // ------------------------------------------------------------- - // 🌟 PERBAIKAN DATABASE CASTING BUG (Menggunakan String) + // TARIK DATA START_TIME & END_TIME MENGGUNAKAN time.Time // ------------------------------------------------------------- - var jamMulaiStr string - var jamSelesaiStr string + var jamMulai time.Time + var jamSelesai time.Time isTokenValid := false type ResultTime struct { - JamMulai string `gorm:"column:start_time"` - JamSelesai string `gorm:"column:end_time"` + JamMulai time.Time `gorm:"column:start_time"` + JamSelesai time.Time `gorm:"column:end_time"` } var result ResultTime @@ -87,9 +81,9 @@ func VerifyHardwareCode(c *gin.Context) { Where("redeem_code = ?", tokenInput). Scan(&result).Error - if errBooking == nil && result.JamSelesai != "" { - jamMulaiStr = result.JamMulai - jamSelesaiStr = result.JamSelesai + if errBooking == nil && !result.JamSelesai.IsZero() { + jamMulai = result.JamMulai + jamSelesai = result.JamSelesai isTokenValid = true } else { errSchedule := config.DB.Table("class_schedules"). @@ -97,9 +91,9 @@ func VerifyHardwareCode(c *gin.Context) { Where("kode_mk = ?", tokenInput). Scan(&result).Error - if errSchedule == nil && result.JamSelesai != "" { - jamMulaiStr = result.JamMulai - jamSelesaiStr = result.JamSelesai + if errSchedule == nil && !result.JamSelesai.IsZero() { + jamMulai = result.JamMulai + jamSelesai = result.JamSelesai isTokenValid = true } } @@ -109,34 +103,40 @@ func VerifyHardwareCode(c *gin.Context) { return } - // Memisahkan Jam dan Menit secara manual agar kebal terhadap error format - var startHour, startMin, endHour, endMin int - fmt.Sscanf(jamMulaiStr, "%d:%d", &startHour, &startMin) - fmt.Sscanf(jamSelesaiStr, "%d:%d", &endHour, &endMin) - + // Ekstrak Jam, Menit, Detik langsung dari objek Time (Sangat Aman & Akurat) jamMulaiHariIni := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(), - startHour, startMin, 0, 0, sekarang.Location()) + jamMulai.Hour(), jamMulai.Minute(), jamMulai.Second(), 0, sekarang.Location()) jamSelesaiHariIni := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(), - endHour, endMin, 0, 0, sekarang.Location()) + jamSelesai.Hour(), jamSelesai.Minute(), jamSelesai.Second(), 0, sekarang.Location()) - // Toleransi masuk kelas: 15 Menit sebelum jam dimulai + // ------------------------------------------------------------- + // LOGIKA PENOLAKAN TOKEN MASA DEPAN + // ------------------------------------------------------------- + // Toleransi masuk: Hanya bisa masuk 15 menit sebelum jadwal. batasMasukAwal := jamMulaiHariIni.Add(-15 * time.Minute) if sekarang.Before(batasMasukAwal) { + fmt.Printf("[VERIFY] Ditolak: Kelas %s belum mulai\n", tokenInput) c.JSON(http.StatusForbidden, gin.H{"error": "Jadwal kelas belum dimulai"}) return } - // Cek sisa waktu kelas + // ------------------------------------------------------------- + // LOGIKA PENOLAKAN TOKEN KADALUARSA + // ------------------------------------------------------------- selisihWaktu := jamSelesaiHariIni.Sub(sekarang) sisaMenit := int(selisihWaktu.Minutes()) if sisaMenit <= 0 { + fmt.Printf("[VERIFY] Ditolak: Waktu kelas %s sudah habis\n", tokenInput) c.JSON(http.StatusForbidden, gin.H{"error": "Waktu peminjaman sudah habis"}) return } + // ------------------------------------------------------------- + // JIKA LOLOS SEMUA UJIAN: IZINKAN MASUK + // ------------------------------------------------------------- DeviceStatusCache["lampu1"] = "on" DeviceStatusCache["lampu2"] = "on"