From 0a8ced6490b884d2c8053be1213c8f1045a2d270 Mon Sep 17 00:00:00 2001 From: "[Valentino Heman Budiarto]" <[hemanvalentino@gmail.com]> Date: Fri, 5 Jun 2026 18:47:32 +0700 Subject: [PATCH] . --- backend/controllers/hardwarecontroller.go | 61 ++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/backend/controllers/hardwarecontroller.go b/backend/controllers/hardwarecontroller.go index 1198175..4c9e5f3 100644 --- a/backend/controllers/hardwarecontroller.go +++ b/backend/controllers/hardwarecontroller.go @@ -18,15 +18,61 @@ type DeviceControlRequest struct { Action string `json:"action"` } +// Struct baru untuk menangkap input Token dari layar ESP32 +type VerifyRequest struct { + Token string `json:"token"` +} + // ========================================================================= -// FUNGSI 1: VERIFIKASI HARDWARE (Mengatasi Error undefined di main.go) +// FUNGSI 1: VERIFIKASI HARDWARE & HITUNG SISA WAKTU DINAMIS // ========================================================================= func VerifyHardwareCode(c *gin.Context) { - // Ini adalah fungsi bawaan yang mengembalikan status verified - // agar main.go tidak error saat memanggilnya. + var req VerifyRequest + + // 1. Tangkap JSON { "token": "..." } dari ESP32 + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Format token tidak valid"}) + return + } + + tokenInput := req.Token + sekarang := time.Now() + + // --------------------------------------------------------------------- + // 2. LOGIKA DATABASE PENGGANTI (Silakan sesuaikan dengan model GORM-mu) + // --------------------------------------------------------------------- + /* // CONTOH ASLI JIKA SUDAH MENGHUBUNGKAN KE DATABASE: + var jadwal models.Booking + if err := db.Where("token = ?", tokenInput).First(&jadwal).Error; err != nil { + c.JSON(http.StatusUnauthorized, gin.H{"error": "Token salah atau tidak ditemukan"}) + return + } + jamSelesai := jadwal.JamSelesai + */ + + // SIMULASI SEMENTARA (Hapus bagian ini jika query DB di atas sudah aktif): + // Mengatur jam selesai kelas pada jam 19:00:00 di hari ini sebagai sampel waktu + jamSelesai := time.Date(sekarang.Year(), sekarang.Month(), sekarang.Day(), 19, 0, 0, 0, sekarang.Location()) + + // Tampilkan log di terminal backend + fmt.Printf("[VERIFY] Token masuk: %s | Jam Selesai: %v\n", tokenInput, jamSelesai) + // --------------------------------------------------------------------- + + // 3. Kalkulasi Selisih Waktu + selisihWaktu := jamSelesai.Sub(sekarang) + sisaMenit := int(selisihWaktu.Minutes()) + + // 4. Proteksi Jika Waktu Sudah Habis / Kelas Selesai + if sisaMenit <= 0 { + c.JSON(http.StatusForbidden, gin.H{"error": "Waktu peminjaman sudah habis"}) + return + } + + // 5. Kirim balasan ke ESP32 beserta nilai duration_minutes c.JSON(http.StatusOK, gin.H{ - "status": "success", - "message": "Hardware terverifikasi", + "status": "success", + "message": "Token Valid, Akses Diberikan", + "duration_minutes": sisaMenit, }) } @@ -127,6 +173,9 @@ func ControlHardware(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"error": "Device tidak dikenali sistem"}) } +// ========================================================================= +// FUNGSI 3: MENDAPATKAN STATUS DAYA DARI HOME ASSISTANT +// ========================================================================= func GetPowerStatus(c *gin.Context) { haURL := os.Getenv("HA_URL") haToken := os.Getenv("HA_TOKEN") @@ -158,4 +207,4 @@ func GetPowerStatus(c *gin.Context) { } c.JSON(http.StatusOK, gin.H{"power": powerStr}) -} +} \ No newline at end of file