This commit is contained in:
[Valentino Heman Budiarto] 2026-06-02 20:12:20 +07:00
parent 8164d7c1db
commit 51a0939a10

View File

@ -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,
})
}
}