74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
|
package template
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"errors"
|
||
|
"html/template"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
|
||
|
"git.simponic.xyz/simponic/backup-notify/api/types"
|
||
|
)
|
||
|
|
||
|
func renderTemplate(context *types.RequestContext, templateName string, showBaseHtml bool) (bytes.Buffer, error) {
|
||
|
templatePath := context.Args.TemplatePath
|
||
|
basePath := templatePath + "/base_empty.html"
|
||
|
if showBaseHtml {
|
||
|
basePath = templatePath + "/base.html"
|
||
|
}
|
||
|
|
||
|
templateLocation := templatePath + "/" + templateName
|
||
|
tmpl, err := template.New("").ParseFiles(templateLocation, basePath)
|
||
|
if err != nil {
|
||
|
return bytes.Buffer{}, err
|
||
|
}
|
||
|
|
||
|
dataPtr := context.TemplateData
|
||
|
if dataPtr == nil {
|
||
|
dataPtr = &map[string]interface{}{}
|
||
|
}
|
||
|
|
||
|
data := *dataPtr
|
||
|
|
||
|
var buffer bytes.Buffer
|
||
|
err = tmpl.ExecuteTemplate(&buffer, "base", data)
|
||
|
|
||
|
if err != nil {
|
||
|
return bytes.Buffer{}, err
|
||
|
}
|
||
|
return buffer, nil
|
||
|
}
|
||
|
|
||
|
func TemplateContinuation(path string, showBase bool) types.Continuation {
|
||
|
return func(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
|
||
|
return func(success types.Continuation, failure types.Continuation) types.ContinuationChain {
|
||
|
html, err := renderTemplate(context, path, true)
|
||
|
if errors.Is(err, os.ErrNotExist) {
|
||
|
resp.WriteHeader(404)
|
||
|
html, err = renderTemplate(context, "404.html", true)
|
||
|
if err != nil {
|
||
|
log.Println("error rendering 404 template", err)
|
||
|
resp.WriteHeader(500)
|
||
|
return failure(context, req, resp)
|
||
|
}
|
||
|
|
||
|
resp.Header().Set("Content-Type", "text/html")
|
||
|
resp.Write(html.Bytes())
|
||
|
return failure(context, req, resp)
|
||
|
}
|
||
|
|
||
|
if err != nil {
|
||
|
log.Println("error rendering template", err)
|
||
|
resp.WriteHeader(500)
|
||
|
resp.Write([]byte("error rendering template"))
|
||
|
return failure(context, req, resp)
|
||
|
}
|
||
|
|
||
|
resp.Header().Set("Content-Type", "text/html")
|
||
|
resp.Write(html.Bytes())
|
||
|
return success(context, req, resp)
|
||
|
}
|
||
|
}
|
||
|
}
|