This commit is contained in:
[Valentino Heman Budiarto] 2026-06-08 19:54:55 +07:00
parent 3c1a979e17
commit d9522437ec

View File

@ -34,12 +34,6 @@ var DeviceStatusCache = map[string]string{
"projector": "off", "projector": "off",
} }
// =========================================================================
// FUNGSI 1: VERIFIKASI HARDWARE & HITUNG SISA WAKTU DINAMIS
// =========================================================================
// =========================================================================
// FUNGSI 1: VERIFIKASI HARDWARE & HITUNG SISA WAKTU DINAMIS
// =========================================================================
func VerifyHardwareCode(c *gin.Context) { func VerifyHardwareCode(c *gin.Context) {
var req VerifyRequest var req VerifyRequest
@ -51,7 +45,7 @@ func VerifyHardwareCode(c *gin.Context) {
tokenInput := req.Token tokenInput := req.Token
sekarang := time.Now() sekarang := time.Now()
// 1. Token Master CS // 1. Token Master CS (Cleaning Service)
if tokenInput == "CS2026" { if tokenInput == "CS2026" {
fmt.Printf("[VERIFY] Master Token CS digunakan\n") fmt.Printf("[VERIFY] Master Token CS digunakan\n")
c.JSON(http.StatusOK, gin.H{ 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 jamMulai time.Time
var jamSelesaiStr string var jamSelesai time.Time
isTokenValid := false isTokenValid := false
type ResultTime struct { type ResultTime struct {
JamMulai string `gorm:"column:start_time"` JamMulai time.Time `gorm:"column:start_time"`
JamSelesai string `gorm:"column:end_time"` JamSelesai time.Time `gorm:"column:end_time"`
} }
var result ResultTime var result ResultTime
@ -87,9 +81,9 @@ func VerifyHardwareCode(c *gin.Context) {
Where("redeem_code = ?", tokenInput). Where("redeem_code = ?", tokenInput).
Scan(&result).Error Scan(&result).Error
if errBooking == nil && result.JamSelesai != "" { if errBooking == nil && !result.JamSelesai.IsZero() {
jamMulaiStr = result.JamMulai jamMulai = result.JamMulai
jamSelesaiStr = result.JamSelesai jamSelesai = result.JamSelesai
isTokenValid = true isTokenValid = true
} else { } else {
errSchedule := config.DB.Table("class_schedules"). errSchedule := config.DB.Table("class_schedules").
@ -97,9 +91,9 @@ func VerifyHardwareCode(c *gin.Context) {
Where("kode_mk = ?", tokenInput). Where("kode_mk = ?", tokenInput).
Scan(&result).Error Scan(&result).Error
if errSchedule == nil && result.JamSelesai != "" { if errSchedule == nil && !result.JamSelesai.IsZero() {
jamMulaiStr = result.JamMulai jamMulai = result.JamMulai
jamSelesaiStr = result.JamSelesai jamSelesai = result.JamSelesai
isTokenValid = true isTokenValid = true
} }
} }
@ -109,34 +103,40 @@ func VerifyHardwareCode(c *gin.Context) {
return return
} }
// Memisahkan Jam dan Menit secara manual agar kebal terhadap error format // Ekstrak Jam, Menit, Detik langsung dari objek Time (Sangat Aman & Akurat)
var startHour, startMin, endHour, endMin int
fmt.Sscanf(jamMulaiStr, "%d:%d", &startHour, &startMin)
fmt.Sscanf(jamSelesaiStr, "%d:%d", &endHour, &endMin)
jamMulaiHariIni := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(), 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(), 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) batasMasukAwal := jamMulaiHariIni.Add(-15 * time.Minute)
if sekarang.Before(batasMasukAwal) { 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"}) c.JSON(http.StatusForbidden, gin.H{"error": "Jadwal kelas belum dimulai"})
return return
} }
// Cek sisa waktu kelas // -------------------------------------------------------------
// LOGIKA PENOLAKAN TOKEN KADALUARSA
// -------------------------------------------------------------
selisihWaktu := jamSelesaiHariIni.Sub(sekarang) selisihWaktu := jamSelesaiHariIni.Sub(sekarang)
sisaMenit := int(selisihWaktu.Minutes()) sisaMenit := int(selisihWaktu.Minutes())
if sisaMenit <= 0 { 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"}) c.JSON(http.StatusForbidden, gin.H{"error": "Waktu peminjaman sudah habis"})
return return
} }
// -------------------------------------------------------------
// JIKA LOLOS SEMUA UJIAN: IZINKAN MASUK
// -------------------------------------------------------------
DeviceStatusCache["lampu1"] = "on" DeviceStatusCache["lampu1"] = "on"
DeviceStatusCache["lampu2"] = "on" DeviceStatusCache["lampu2"] = "on"