aboutsummaryrefslogtreecommitdiff
path: root/internal/admin/api_triggers.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/admin/api_triggers.go')
-rw-r--r--internal/admin/api_triggers.go60
1 files changed, 8 insertions, 52 deletions
diff --git a/internal/admin/api_triggers.go b/internal/admin/api_triggers.go
index ccfd52d..749f5a1 100644
--- a/internal/admin/api_triggers.go
+++ b/internal/admin/api_triggers.go
@@ -13,23 +13,22 @@ import (
"thehouseoficarus/internal/behavior"
)
-type triggerEntry struct {
- ID string `json:"id"`
- Kind string `json:"kind"`
-}
-
func (s *AdminServer) handleTriggers(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
- entries, err := listTriggerEntries(s.dataDir)
+ tree, err := listYAMLTree(s.dataDir, "triggers")
if err != nil {
+ if os.IsNotExist(err) {
+ writeJSON(w, &YAMLTree{Root: []string{}, Dirs: map[string][]string{}})
+ return
+ }
writeJSON(w, map[string]any{"error": err.Error()})
return
}
- if entries == nil {
- entries = []triggerEntry{}
+ if tree == nil {
+ tree = &YAMLTree{Root: []string{}, Dirs: map[string][]string{}}
}
- writeJSON(w, entries)
+ writeJSON(w, tree)
case http.MethodPost:
var m map[string]any
if err := readJSON(r, &m); err != nil {
@@ -200,49 +199,6 @@ func kindToSubdir(kind string) string {
return "player_flag"
}
-func listTriggerEntries(dataDir string) ([]triggerEntry, error) {
- root := filepath.Join(dataDir, "triggers")
- if _, err := os.Stat(root); os.IsNotExist(err) {
- return []triggerEntry{}, nil
- }
- var entries []triggerEntry
- var walk func(p string) error
- walk = func(p string) error {
- dirs, err := os.ReadDir(p)
- if err != nil {
- return err
- }
- for _, entry := range dirs {
- full := filepath.Join(p, entry.Name())
- if entry.IsDir() {
- if err := walk(full); err != nil {
- return err
- }
- continue
- }
- ext := filepath.Ext(entry.Name())
- if ext != ".yaml" && ext != ".yml" {
- continue
- }
- id := strings.TrimSuffix(entry.Name(), ext)
- // Determine kind from the parent directory name.
- parent := filepath.Base(filepath.Dir(full))
- kind := ""
- if parent == "global_flag" {
- kind = "global"
- } else if parent == "player_flag" {
- kind = "player"
- }
- entries = append(entries, triggerEntry{ID: id, Kind: kind})
- }
- return nil
- }
- if err := walk(root); err != nil {
- return nil, err
- }
- return entries, nil
-}
-
// findTriggerFile searches for a trigger file in the triggers directory tree
// and returns its full path and the parent directory name (relative to the
// triggers root). Searches player_flag/ then global_flag/ then root.