package controllers import ( "net/http" "s-class-backend/config" "s-class-backend/models" "github.com/gin-gonic/gin" ) // Struktur data untuk menerima input dari Frontend (Form Modal) type ScheduleInput struct { KodeMK string `json:"kode_mk" binding:"required"` NamaMK string `json:"nama_mk" binding:"required"` RoomID int `json:"room_id" binding:"required"` // 🌟 PERBAIKAN: Ubah uint menjadi int Hari string `json:"hari" binding:"required"` JamMulai string `json:"jam_mulai" binding:"required"` JamSelesai string `json:"jam_selesai" binding:"required"` JumlahSks int `json:"jumlah_sks" binding:"required"` } // ========================================================= // 1. GET SCHEDULES (Menampilkan Data ke Tabel/Kalender) // ========================================================= func GetSchedules(c *gin.Context) { var schedules []models.ClassSchedule // Mengambil semua data jadwal dan diurutkan berdasarkan Hari dan Jam Mulai if err := config.DB.Order("hari, jam_mulai").Find(&schedules).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Gagal mengambil data jadwal kuliah"}) return } c.JSON(http.StatusOK, gin.H{ "data": schedules, }) } // ========================================================= // 2. CREATE SCHEDULE (Menambah Jadwal Baru) // ========================================================= func CreateSchedule(c *gin.Context) { var input ScheduleInput if err := c.ShouldBindJSON(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Format data tidak valid: " + err.Error()}) return } newSchedule := models.ClassSchedule{ KodeMK: input.KodeMK, NamaMK: input.NamaMK, RoomID: input.RoomID, Hari: input.Hari, JamMulai: input.JamMulai, JamSelesai: input.JamSelesai, JumlahSks: input.JumlahSks, } if err := config.DB.Create(&newSchedule).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Gagal menyimpan jadwal baru ke database"}) return } c.JSON(http.StatusCreated, gin.H{ "message": "Jadwal berhasil ditambahkan", "data": newSchedule, }) } // ========================================================= // 3. UPDATE SCHEDULE (Mengedit Jadwal Saat UTS/Berubah) // ========================================================= func UpdateSchedule(c *gin.Context) { scheduleID := c.Param("id") var input ScheduleInput if err := c.ShouldBindJSON(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Format data tidak valid"}) return } var schedule models.ClassSchedule // Cari jadwal lama di database berdasarkan ID if err := config.DB.First(&schedule, scheduleID).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Jadwal tidak ditemukan"}) return } // Timpa data lama dengan inputan baru dari Admin schedule.KodeMK = input.KodeMK schedule.NamaMK = input.NamaMK schedule.RoomID = input.RoomID schedule.Hari = input.Hari schedule.JamMulai = input.JamMulai schedule.JamSelesai = input.JamSelesai schedule.JumlahSks = input.JumlahSks // Simpan perubahan ke database if err := config.DB.Save(&schedule).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Gagal memperbarui jadwal"}) return } c.JSON(http.StatusOK, gin.H{ "message": "Jadwal berhasil diperbarui", "data": schedule, }) } // ========================================================= // 4. DELETE SCHEDULE (Menghapus Jadwal) // ========================================================= func DeleteSchedule(c *gin.Context) { scheduleID := c.Param("id") var schedule models.ClassSchedule // Pastikan data yang mau dihapus itu memang ada if err := config.DB.First(&schedule, scheduleID).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Jadwal tidak ditemukan"}) return } // Hapus secara permanen dari database if err := config.DB.Delete(&schedule).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Gagal menghapus jadwal"}) return } c.JSON(http.StatusOK, gin.H{"message": "Jadwal berhasil dihapus"}) }