[add] editor render API

This commit is contained in:
Max 2023-09-28 10:11:01 +08:00
parent dabc8a0841
commit 2f42e13c04
8 changed files with 101 additions and 12 deletions

View file

@ -22,6 +22,14 @@ var dsl = []byte(`
"process": "sui.Template.Get", "process": "sui.Template.Get",
"in": ["$param.id"], "in": ["$param.id"],
"out": { "status": 200, "type": "application/json" } "out": { "status": 200, "type": "application/json" }
},
{
"path": "/:id/editor/render/:template_id/*route",
"method": "GET",
"process": "sui.Editor.Render",
"in": ["$param.id", "$param.template_id", "$param.route"],
"out": { "status": 200, "type": "application/json" }
} }
], ],
} }

View file

@ -10,6 +10,8 @@ func init() {
process.RegisterGroup("sui", map[string]process.Handler{ process.RegisterGroup("sui", map[string]process.Handler{
"template.get": TemplateGet, "template.get": TemplateGet,
"template.find": TemplateFind, "template.find": TemplateFind,
"editor.render": EditorRender,
}) })
} }
@ -17,6 +19,7 @@ func init() {
// Process sui.<ID>.templates // Process sui.<ID>.templates
func TemplateGet(process *process.Process) interface{} { func TemplateGet(process *process.Process) interface{} {
process.ValidateArgNums(1) process.ValidateArgNums(1)
sui := get(process) sui := get(process)
templates, err := sui.GetTemplates() templates, err := sui.GetTemplates()
if err != nil { if err != nil {
@ -28,6 +31,7 @@ func TemplateGet(process *process.Process) interface{} {
// TemplateFind handle the find Template request // TemplateFind handle the find Template request
func TemplateFind(process *process.Process) interface{} { func TemplateFind(process *process.Process) interface{} {
process.ValidateArgNums(2) process.ValidateArgNums(2)
sui := get(process) sui := get(process)
template, err := sui.GetTemplate(process.ArgsString(1)) template, err := sui.GetTemplate(process.ArgsString(1))
if err != nil { if err != nil {
@ -37,6 +41,44 @@ func TemplateFind(process *process.Process) interface{} {
return template return template
} }
// EditorRender handle the render page request
func EditorRender(process *process.Process) interface{} {
process.ValidateArgNums(3)
sui := get(process)
templateID := process.ArgsString(1)
route := process.ArgsString(2)
query := process.ArgsMap(3, map[string]interface{}{"method": "GET"})
if route == "" {
route = "/index"
}
if route[0] != '/' {
route = "/" + route
}
tmpl, err := sui.GetTemplate(templateID)
if err != nil {
exception.New(err.Error(), 500).Throw()
}
page, err := tmpl.Page(route)
if err != nil {
exception.New(err.Error(), 500).Throw()
}
// Request data
req := &core.Request{Method: query["method"].(string)}
res, err := page.EditorRender(req)
if err != nil {
exception.New(err.Error(), 500).Throw()
}
return res
}
// get the sui // get the sui
func get(process *process.Process) core.SUI { func get(process *process.Process) core.SUI {
sui, has := core.SUIs[process.ArgsString(0)] sui, has := core.SUIs[process.ArgsString(0)]

View file

@ -48,6 +48,25 @@ func TestTemplateFind(t *testing.T) {
assert.Equal(t, "tech-blue", res.(*local.Template).ID) assert.Equal(t, "tech-blue", res.(*local.Template).ID)
} }
func TestEditorRender(t *testing.T) {
load(t)
defer clean()
// test demo
p, err := process.Of("sui.editor.render", "demo", "tech-blue", "/index")
if err != nil {
t.Fatal(err)
}
res, err := p.Exec()
if err != nil {
t.Fatal(err)
}
assert.IsType(t, &core.ResponseEditor{}, res)
assert.NotEmpty(t, res.(*core.ResponseEditor).HTML)
}
func load(t *testing.T) { func load(t *testing.T) {
prepare(t) prepare(t)
err := Load(config.Conf) err := Load(config.Conf)

View file

@ -1,8 +1,25 @@
package core package core
import (
"strings"
jsoniter "github.com/json-iterator/go"
)
// Data get the data // Data get the data
func (page *Page) Data(request *Request) (map[string]interface{}, error) { func (page *Page) Data(request *Request) (map[string]interface{}, map[string]interface{}, error) {
return nil, nil
setting := map[string]interface{}{
"title": strings.ToUpper(page.Name),
}
if page.Codes.DATA.Code != "" {
err := jsoniter.UnmarshalFromString(page.Codes.DATA.Code, &setting)
if err != nil {
return nil, nil, err
}
}
return nil, setting, nil
} }
// RenderHTML render for the html // RenderHTML render for the html

View file

@ -29,7 +29,7 @@ type ITemplate interface {
// IPage is the interface for the page // IPage is the interface for the page
type IPage interface { type IPage interface {
Load() error Load() error
RenderEditor(request *Request) (*ResponseEditor, error) EditorRender(request *Request) (*ResponseEditor, error)
// Render() // Render()

View file

@ -9,8 +9,8 @@ import (
// Render render the page // Render render the page
func (page *Page) Render() {} func (page *Page) Render() {}
// RenderEditor render for the editor // EditorRender render HTML for the editor
func (page *Page) RenderEditor(request *Request) (*ResponseEditor, error) { func (page *Page) EditorRender(request *Request) (*ResponseEditor, error) {
html := page.Codes.HTML.Code html := page.Codes.HTML.Code
res := &ResponseEditor{ res := &ResponseEditor{
@ -19,6 +19,7 @@ func (page *Page) RenderEditor(request *Request) (*ResponseEditor, error) {
Scripts: []string{}, Scripts: []string{},
Styles: []string{}, Styles: []string{},
Warnings: []string{}, Warnings: []string{},
Setting: map[string]interface{}{},
} }
// Get The scripts and styles // Get The scripts and styles
@ -50,11 +51,12 @@ func (page *Page) RenderEditor(request *Request) (*ResponseEditor, error) {
res.Scripts = append(res.Scripts, filepath.Join("@pages", page.Route, page.Name+".ts")) res.Scripts = append(res.Scripts, filepath.Join("@pages", page.Route, page.Name+".ts"))
} }
data, err := page.Data(request) data, setting, err := page.Data(request)
if err != nil { if err != nil {
res.Warnings = append(res.Warnings, err.Error()) res.Warnings = append(res.Warnings, err.Error())
} }
res.Setting = setting
if data == nil { if data == nil {
res.HTML = html res.HTML = html
return res, nil return res, nil

View file

@ -74,6 +74,7 @@ type ResponseEditor struct {
CSS string `json:"css,omitempty"` CSS string `json:"css,omitempty"`
Scripts []string `json:"scripts,omitempty"` Scripts []string `json:"scripts,omitempty"`
Styles []string `json:"styles,omitempty"` Styles []string `json:"styles,omitempty"`
Setting map[string]interface{} `json:"setting,omitempty"`
Warnings []string `json:"warnings,omitempty"` Warnings []string `json:"warnings,omitempty"`
} }

View file

@ -131,7 +131,7 @@ func TestPageRenderEditor(t *testing.T) {
} }
r := &core.Request{Method: "GET"} r := &core.Request{Method: "GET"}
res, err := page.RenderEditor(r) res, err := page.EditorRender(r)
if err != nil { if err != nil {
t.Fatalf("RenderEditor error: %v", err) t.Fatalf("RenderEditor error: %v", err)
} }