94 lines
2.7 KiB
Go
94 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"net/http"
|
|
"s-class-backend/config"
|
|
"s-class-backend/controllers"
|
|
"s-class-backend/middleware"
|
|
"s-class-backend/models"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func main() {
|
|
// 1. Konek Database
|
|
config.ConnectDatabase()
|
|
|
|
// 2. AutoMigrate (Tambahkan ClassSchedule di sini agar dikenali GORM)
|
|
config.DB.AutoMigrate(&models.User{}, &models.Room{}, &models.Booking{}, &models.ClassSchedule{})
|
|
|
|
r := gin.Default()
|
|
|
|
// 3. CORS Middleware (Agar Frontend bisa masuk)
|
|
r.Use(CORSMiddleware())
|
|
|
|
r.GET("/", func(c *gin.Context) {
|
|
c.JSON(http.StatusOK, gin.H{"message": "Server S-CLASS Backend Berjalan!"})
|
|
})
|
|
|
|
// 4. Routes
|
|
auth := r.Group("/api/auth")
|
|
{
|
|
auth.POST("/register", controllers.Register)
|
|
auth.POST("/login", controllers.Login)
|
|
}
|
|
|
|
r.POST("/api/verify-code", controllers.VerifyRedeemCode)
|
|
|
|
// --- RUTE YANG DILINDUNGI TOKEN (UNTUK WEB) ---
|
|
protected := r.Group("/api")
|
|
protected.Use(middleware.AuthMiddleware())
|
|
{
|
|
protected.GET("/profile", func(c *gin.Context) {
|
|
userID, _ := c.Get("user_id")
|
|
role, _ := c.Get("role")
|
|
c.JSON(http.StatusOK, gin.H{"message": "Masuk!", "user_id": userID, "role": role})
|
|
})
|
|
|
|
// Rooms
|
|
protected.GET("/rooms", controllers.GetRooms)
|
|
protected.POST("/rooms", controllers.CreateRoom)
|
|
|
|
// Bookings
|
|
protected.POST("/bookings", controllers.CreateBooking)
|
|
protected.GET("/bookings", controllers.GetAllBookings)
|
|
protected.PUT("/bookings/:id/status", controllers.UpdateBookingStatus)
|
|
protected.GET("/my-bookings", controllers.GetMyBookings)
|
|
|
|
// Admin (Manage Rooms)
|
|
protected.PUT("/admin/rooms/:id/status", controllers.UpdateRoomStatus)
|
|
|
|
// 🌟 RUTE BARU: Jadwal Kuliah (Untuk Halaman Web Admin)
|
|
protected.GET("/schedules", controllers.GetSchedules)
|
|
}
|
|
// 5. Jalur IoT ESP32
|
|
r.POST("/api/sensor/energy", controllers.UpdateRoomPower)
|
|
|
|
// RUTE BARU: Untuk menerima ketukan pintu dari Hardware ESP32
|
|
r.POST("/api/hardware/verify", controllers.VerifyHardwareCode)
|
|
|
|
// PASTIKAN BARIS INI ADA DI SINI:
|
|
r.POST("/api/hardware/control", controllers.ControlHardware)
|
|
|
|
r.GET("/api/hardware/power-status", controllers.GetPowerStatus)
|
|
|
|
r.Run(":8080")
|
|
}
|
|
|
|
// ... (fungsi CORSMiddleware tetap sama) ...
|
|
|
|
func CORSMiddleware() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
|
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
|
|
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
|
|
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, PATCH")
|
|
|
|
if c.Request.Method == "OPTIONS" {
|
|
c.AbortWithStatus(204)
|
|
return
|
|
}
|
|
c.Next()
|
|
}
|
|
}
|