diff --git a/backend/controllers/bookingcontroller.go b/backend/controllers/bookingcontroller.go index 9a7dadc..7be7ab8 100644 --- a/backend/controllers/bookingcontroller.go +++ b/backend/controllers/bookingcontroller.go @@ -164,34 +164,80 @@ func UpdateBookingStatus(c *gin.Context) { } // INPUT UNTUK ESP32 -type RedeemInput struct { - RedeemCode string `json:"redeem_code" binding:"required"` +type TokenInput struct { + Token string `json:"token" binding:"required"` // Berubah menjadi 'token' menyesuaikan payload ESP32 } -// VERIFIKASI KODE DARI ESP32 +// VERIFIKASI KODE DARI ESP32 (Booking & Jadwal Kuliah) func VerifyRedeemCode(c *gin.Context) { - var input RedeemInput + var input TokenInput if err := c.ShouldBindJSON(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Format data salah"}) return } - var booking models.Booking + currentTime := time.Now() + var endTime time.Time + var roomName string - if err := config.DB.Preload("Room").First(&booking, "redeem_code = ? AND status = 'Approved'", input.RedeemCode).Error; err != nil { - c.JSON(http.StatusUnauthorized, gin.H{"error": "Kode tidak valid, belum disetujui, atau sudah digunakan!"}) - return + // 1. CARI DI TABEL BOOKING (REDEEM CODE) + var booking models.Booking + errBooking := config.DB.Preload("Room").First(&booking, "redeem_code = ? AND status = 'Approved'", input.Token).Error + + if errBooking == nil { + // LOGIKA BOOKING (Sudah menggunakan time.Time) + if currentTime.Before(booking.StartTime) { + c.JSON(http.StatusForbidden, gin.H{"error": "Belum waktunya peminjaman!"}) + return + } + if currentTime.After(booking.EndTime) { + c.JSON(http.StatusForbidden, gin.H{"error": "Waktu peminjaman sudah habis!"}) + return + } + endTime = booking.EndTime + roomName = booking.Room.Name + + } else { + // 2. JIKA TIDAK KETEMU, CARI DI TABEL JADWAL KELAS (KODE MK) + var schedule models.ClassSchedule + errSchedule := config.DB.Preload("Room").First(&schedule, "kode_mk = ?", input.Token).Error + + if errSchedule != nil { + c.JSON(http.StatusUnauthorized, gin.H{"error": "Token atau Kode MK tidak valid!"}) + return + } + + // LOGIKA JADWAL KULIAH (Konversi String Jam ke time.Time hari ini) + todayStr := currentTime.Format("2006-01-02") + // Gabungkan tanggal hari ini dengan jam dari database (JamMulai & JamSelesai) + startTime, _ := time.Parse("2006-01-02 15:04:05", todayStr+" "+schedule.JamMulai) + endTimeParsed, _ := time.Parse("2006-01-02 15:04:05", todayStr+" "+schedule.JamSelesai) + + if currentTime.Before(startTime) { + c.JSON(http.StatusForbidden, gin.H{"error": "Belum waktunya jadwal kuliah!"}) + return + } + if currentTime.After(endTimeParsed) { + c.JSON(http.StatusForbidden, gin.H{"error": "Waktu perkuliahan sudah habis!"}) + return + } + + endTime = endTimeParsed + roomName = schedule.Room.Name } - booking.Status = "Completed" - booking.RedeemCode = "" - config.DB.Save(&booking) + // 3. HITUNG SISA WAKTU + sisaWaktuMenit := int(endTime.Sub(currentTime).Minutes()) + if sisaWaktuMenit < 1 { + sisaWaktuMenit = 1 + } c.JSON(http.StatusOK, gin.H{ - "message": "Kode valid!", - "room": booking.Room.Name, - "status": "success", + "status": "success", + "message": "Token valid!", + "room": roomName, + "duration_minutes": sisaWaktuMenit, }) } @@ -208,4 +254,4 @@ func GetAllBookings(c *gin.Context) { "status": "success", "data": bookings, }) -} \ No newline at end of file +}