99 lines
2.7 KiB
Go
99 lines
2.7 KiB
Go
package controllers
|
|
|
|
import (
|
|
"net/http"
|
|
"s-class-backend/config"
|
|
"s-class-backend/models"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// GET ALL ROOMS
|
|
func GetRooms(c *gin.Context) {
|
|
var rooms []models.Room
|
|
if err := config.DB.Find(&rooms).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Gagal mengambil data ruangan"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"data": rooms})
|
|
}
|
|
|
|
// CREATE ROOM
|
|
func CreateRoom(c *gin.Context) {
|
|
var input models.Room
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
if err := config.DB.Create(&input).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Gagal membuat ruangan"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"message": "Ruangan berhasil ditambahkan!", "data": input})
|
|
}
|
|
|
|
// --- STRUKTUR DATA UNTUK MENERIMA JSON ---
|
|
|
|
type UpdateRoomStatusInput struct {
|
|
Status string `json:"status" binding:"required"`
|
|
}
|
|
|
|
type EnergySensorInput struct {
|
|
RoomID int `json:"room_id" binding:"required"`
|
|
Power float64 `json:"power" binding:"required"`
|
|
}
|
|
|
|
// --- FUNGSI HANDLER ---
|
|
|
|
// UPDATE ROOM STATUS (Admin: Available <-> Maintenance)
|
|
func UpdateRoomStatus(c *gin.Context) {
|
|
roomID := c.Param("id")
|
|
var input UpdateRoomStatusInput
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
var room models.Room
|
|
// KUNCI PERBAIKANNYA: Cukup masukkan `roomID` langsung.
|
|
// GORM akan otomatis mencari berdasarkan Primary Key tanpa peduli nama kolomnya.
|
|
if err := config.DB.First(&room, roomID).Error; err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "Ruangan tidak ditemukan di tabel"})
|
|
return
|
|
}
|
|
|
|
// Ubah status dan simpan
|
|
room.Status = input.Status
|
|
if err := config.DB.Save(&room).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Gagal menyimpan perubahan"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "Status ruangan berhasil diperbarui",
|
|
"data": room,
|
|
})
|
|
}
|
|
|
|
// UPDATE ROOM POWER (Menerima data Watt dari ESP32 / Tuya)
|
|
func UpdateRoomPower(c *gin.Context) {
|
|
var input EnergySensorInput
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Format data sensor salah"})
|
|
return
|
|
}
|
|
|
|
var room models.Room
|
|
if err := config.DB.First(&room, "room_id = ?", input.RoomID).Error; err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "Ruangan tidak ditemukan"})
|
|
return
|
|
}
|
|
|
|
// Pastikan kolom ini sesuai dengan nama di models.Room milikmu (misal: PowerConsumption)
|
|
room.PowerConsumption = input.Power
|
|
config.DB.Save(&room)
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "Data daya ESP32 berhasil disimpan"})
|
|
}
|