/
renderer.go
58 lines (46 loc) · 1.25 KB
/
renderer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package defaults
import (
"context"
"encoding/json"
"github.com/volatiletech/authboss/v3"
)
var (
jsonDefaultFailures = []string{authboss.DataErr, authboss.DataValidation}
)
// There is a separate package that does HTML Rendering authboss-renderer
// JSONRenderer simply renders the data provided in JSON.
// Known failure keys in the HTMLData can be passed in to force a
// status: failure in the JSON when they appear.
type JSONRenderer struct {
Failures []string
}
// Load is a no-op since json doesn't require any templates
func (JSONRenderer) Load(names ...string) error {
return nil
}
// Render the data
func (j JSONRenderer) Render(ctx context.Context, page string, data authboss.HTMLData) (output []byte, contentType string, err error) {
if data == nil {
return []byte(`{"status":"success"}`), "application/json", nil
}
if _, hasStatus := data["status"]; !hasStatus {
failures := j.Failures
if len(failures) == 0 {
failures = jsonDefaultFailures
}
status := "success"
for _, failure := range failures {
val, has := data[failure]
if has && val != nil {
status = "failure"
break
}
}
data["status"] = status
}
b, err := json.Marshal(data)
if err != nil {
return nil, "", err
}
return b, "application/json", nil
}