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 // INPUT UNTUK ESP32
type RedeemInput struct { type TokenInput struct {
RedeemCode string `json:"redeem_code" binding:"required"` 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) { func VerifyRedeemCode(c *gin.Context) {
var input RedeemInput var input TokenInput
if err := c.ShouldBindJSON(&input); err != nil { if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Format data salah"}) c.JSON(http.StatusBadRequest, gin.H{"error": "Format data salah"})
return 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 { // 1. CARI DI TABEL BOOKING (REDEEM CODE)
c.JSON(http.StatusUnauthorized, gin.H{"error": "Kode tidak valid, belum disetujui, atau sudah digunakan!"}) var booking models.Booking
return 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" // 3. HITUNG SISA WAKTU
booking.RedeemCode = "" sisaWaktuMenit := int(endTime.Sub(currentTime).Minutes())
config.DB.Save(&booking) if sisaWaktuMenit < 1 {
sisaWaktuMenit = 1
}
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"message": "Kode valid!", "status": "success",
"room": booking.Room.Name, "message": "Token valid!",
"status": "success", "room": roomName,
"duration_minutes": sisaWaktuMenit,
}) })
} }
@ -208,4 +254,4 @@ func GetAllBookings(c *gin.Context) {
"status": "success", "status": "success",
"data": bookings, "data": bookings,
}) })
} }