mirror of
https://codeberg.org/PLG-Development/PLG-MuDiCS
synced 2026-07-06 00:47:09 +00:00
feat(control): store api (#3)
This commit is contained in:
+22
-1
@@ -6,6 +6,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"plg-mudics/control/frontend"
|
||||
"plg-mudics/shared"
|
||||
"time"
|
||||
@@ -14,7 +15,25 @@ import (
|
||||
"github.com/labstack/echo/v4/middleware"
|
||||
)
|
||||
|
||||
var storageFile string
|
||||
|
||||
func main() {
|
||||
var err error
|
||||
|
||||
path, err := getStoragePath()
|
||||
if err != nil {
|
||||
slog.Error("Failed to initialize storage path", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
storageFile = filepath.Join(path, "storage.json")
|
||||
// Ensure storage.json exists
|
||||
if _, err := os.Stat(storageFile); os.IsNotExist(err) {
|
||||
if err := os.WriteFile(storageFile, []byte("{}"), 0644); err != nil {
|
||||
slog.Error("Failed to initialize storage.json", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
e := echo.New()
|
||||
|
||||
// Serve the embedded SvelteKit frontend
|
||||
@@ -26,6 +45,8 @@ func main() {
|
||||
// Servers all API endpoints, e.g. our custom logic
|
||||
apiGroup := e.Group("/api")
|
||||
apiGroup.GET("/ping", pingRoute)
|
||||
apiGroup.GET("/storage", getStorageRoute)
|
||||
apiGroup.POST("/storage", setStorageRoute)
|
||||
|
||||
port := "8080"
|
||||
|
||||
@@ -38,7 +59,7 @@ func main() {
|
||||
os.Exit(1)
|
||||
}
|
||||
}()
|
||||
err := shared.OpenBrowserWindow("http://localhost:"+port, false, false)
|
||||
err = shared.OpenBrowserWindow("http://localhost:"+port, false, false)
|
||||
if err != nil {
|
||||
slog.Error("Failed to open browser window", "error", err)
|
||||
os.Exit(1)
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
meta {
|
||||
name: Get Store
|
||||
type: http
|
||||
seq: 2
|
||||
}
|
||||
|
||||
get {
|
||||
url: http://localhost:8080/api/storage
|
||||
body: none
|
||||
auth: inherit
|
||||
}
|
||||
|
||||
settings {
|
||||
encodeUrl: true
|
||||
timeout: 0
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
meta {
|
||||
name: Set Store
|
||||
type: http
|
||||
seq: 3
|
||||
}
|
||||
|
||||
post {
|
||||
url: http://localhost:8080/api/storage
|
||||
body: json
|
||||
auth: inherit
|
||||
}
|
||||
|
||||
body:json {
|
||||
{
|
||||
"key": "value"
|
||||
}
|
||||
}
|
||||
|
||||
settings {
|
||||
encodeUrl: true
|
||||
timeout: 0
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"plg-mudics/shared"
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
func getStorageRoute(ctx echo.Context) error {
|
||||
data, err := os.ReadFile(storageFile)
|
||||
if err != nil {
|
||||
slog.Error("Could not read storage file", "error", err)
|
||||
return ctx.JSON(http.StatusInternalServerError, shared.ErrorResponse{Error: "Could not read storage file"})
|
||||
}
|
||||
|
||||
var content interface{}
|
||||
if err := json.Unmarshal(data, &content); err != nil {
|
||||
slog.Error("Could not parse storage file", "error", err)
|
||||
return ctx.JSON(http.StatusInternalServerError, shared.ErrorResponse{Error: "Could not parse storage file"})
|
||||
}
|
||||
|
||||
return ctx.JSON(http.StatusOK, content)
|
||||
}
|
||||
|
||||
func setStorageRoute(ctx echo.Context) error {
|
||||
var payload interface{}
|
||||
if err := ctx.Bind(&payload); err != nil {
|
||||
return ctx.JSON(http.StatusBadRequest, shared.ErrorResponse{Error: "Invalid JSON payload"})
|
||||
}
|
||||
|
||||
data, err := json.MarshalIndent(payload, "", " ")
|
||||
if err != nil {
|
||||
return ctx.JSON(http.StatusInternalServerError, shared.ErrorResponse{Error: "Failed to marshal storage file"})
|
||||
}
|
||||
if err := os.WriteFile(storageFile, data, 0644); err != nil {
|
||||
return ctx.JSON(http.StatusInternalServerError, shared.ErrorResponse{Error: "Failed to write storage file"})
|
||||
}
|
||||
|
||||
return ctx.JSON(http.StatusOK, map[string]interface{}{})
|
||||
}
|
||||
|
||||
func getStoragePath() (string, error) {
|
||||
var storagePath string
|
||||
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("unable to determine user home directory: %w", err)
|
||||
}
|
||||
storagePath = filepath.Join(home, ".local", "share", "plg-mudics", "control")
|
||||
if err := os.MkdirAll(storagePath, os.ModePerm); err != nil {
|
||||
return "", fmt.Errorf("failed to create local config directory: %w", err)
|
||||
}
|
||||
|
||||
return storagePath, nil
|
||||
}
|
||||
Reference in New Issue
Block a user