add scene save and load in quasar backend
This commit is contained in:
195
backend/scenes/scenes.go
Normal file
195
backend/scenes/scenes.go
Normal file
@@ -0,0 +1,195 @@
|
||||
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)
|
||||
}
|
Reference in New Issue
Block a user