Files
lightController/backend/scenes/scenes.go
2025-06-19 19:33:13 +02:00

196 lines
3.5 KiB
Go

package secenes
import (
"backend/models"
"backend/utils"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"path"
"path/filepath"
"sort"
"github.com/gin-gonic/gin"
)
type ScenesHandler struct {
dir string
}
func NewScenesHandler(dir string) *ScenesHandler {
if dir == "" {
dir = "./scenes"
}
return &ScenesHandler{
dir: dir,
}
}
func (sh *ScenesHandler) SaveScene(c *gin.Context) {
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
var scene models.Scene
err = json.Unmarshal(body, &scene)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
if _, err := os.Stat(path.Join(sh.dir)); err != nil {
os.MkdirAll(sh.dir, 666)
}
f, err := os.OpenFile(path.Join(sh.dir, scene.Name+".scene"), os.O_CREATE|os.O_TRUNC|os.O_RDWR, 666)
_, err = f.Write(body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
defer f.Close()
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("Scene '%s' saved", scene.Name),
})
}
func (sh *ScenesHandler) DeleteScene(c *gin.Context) {
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
var scene models.Scene
err = json.Unmarshal(body, &scene)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
err = os.Remove(path.Join(sh.dir, scene.Name+".scene"))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("Scene '%s' deleted", scene.Name),
})
}
func (sh *ScenesHandler) LoadScenes(c *gin.Context) {
sceneMap := make(map[string]models.Scene)
files, err := utils.FindAllFiles("./scenes", ".scene")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
for _, f := range files {
content, err := os.ReadFile(f)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
var scene models.Scene
err = json.Unmarshal(content, &scene)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
sceneMap[scene.Name] = scene
}
//sort scenes alphabetacally by name
keys := make([]string, 0, len(sceneMap))
for key := range sceneMap {
keys = append(keys, key)
}
// Sort keys alphabetically
sort.Strings(keys)
var scenes []models.Scene
// Iterate over sorted keys
for _, key := range keys {
scenes = append(scenes, sceneMap[key])
}
c.JSON(http.StatusOK, scenes)
}
func (sh *ScenesHandler) LoadScene(c *gin.Context) {
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
var scene models.Scene
err = json.Unmarshal(body, &scene)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
files, err := utils.FindAllFiles("./scenes", ".scene")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
for _, f := range files {
if filepath.Base(f) != scene.Name+".scene" {
continue
}
content, err := os.ReadFile(f)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
err = json.Unmarshal(content, &scene)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
}
c.JSON(http.StatusOK, scene)
}