3
0
Files
corteza/auth/handlers/handle_dev.go
2022-05-09 19:58:20 +02:00

118 lines
2.3 KiB
Go

package handlers
// Handlers dev-view for templates & scenarios
//
// See auth/README.adoc for details on how this works
import (
"fmt"
"net/http"
"os"
"github.com/cortezaproject/corteza-server/auth/request"
"github.com/cortezaproject/corteza-server/pkg/y7s"
"gopkg.in/yaml.v3"
)
type (
devScenariosDoc []*devTemplate
devTemplate struct {
Template string
Scenes devScenes
}
devScenes []*devScene
devScene struct {
Name string
Template string
Data map[string]interface{}
}
)
func (h *AuthHandlers) devView(req *request.AuthReq) (err error) {
req.Template = "template-dev.html.tpl"
req.Data["templates"], err = getScenes(h.Opt.AssetsPath)
return
}
func (h *AuthHandlers) devSceneView(w http.ResponseWriter, r *http.Request) {
s, err := findScenario(
h.Opt.AssetsPath,
r.URL.Query().Get("template"),
r.URL.Query().Get("scene"),
)
if err == nil && s != nil {
err = h.Templates.ExecuteTemplate(w, s.Template+".html.tpl", s.Data)
return
}
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func findScenario(assetsPath, template, scene string) (*devScene, error) {
templates, err := getScenes(assetsPath)
if err != nil {
return nil, err
}
for _, t := range templates {
if t.Template != template {
continue
}
for _, s := range t.Scenes {
if s.Name != scene {
continue
}
return s, nil
}
}
return nil, nil
}
func getScenes(assetsPath string) (devScenariosDoc, error) {
if assetsPath == "" {
return nil, fmt.Errorf("can not load scenarios without AUTH_ASSETS_PATH and exported assets")
}
f, err := os.Open(assetsPath + "/templates/scenarios.yaml")
if err != nil {
return nil, err
}
aux := devScenariosDoc{}
return aux, yaml.NewDecoder(f).Decode(&aux)
}
func (doc *devScenariosDoc) UnmarshalYAML(n *yaml.Node) error {
return y7s.EachMap(n, func(k *yaml.Node, v *yaml.Node) (err error) {
dt := &devTemplate{Template: k.Value, Scenes: devScenes{}}
err = y7s.EachMap(v, func(k *yaml.Node, v *yaml.Node) (err error) {
s := &devScene{
Name: k.Value,
Template: dt.Template,
Data: make(map[string]interface{}),
}
if err = v.Decode(s.Data); err != nil {
return
}
dt.Scenes = append(dt.Scenes, s)
return nil
})
if err != nil {
return
}
*doc = append(*doc, dt)
return nil
})
}