/
models.go
66 lines (58 loc) · 1.66 KB
/
models.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
59
60
61
62
63
64
65
66
package server
import (
"errors"
"fmt"
"strings"
"time"
humanize "github.com/dustin/go-humanize"
"github.com/microcosm-cc/bluemonday"
)
type messageHTML struct {
Meta string `json:"meta"`
Message string `json:"message"`
Submessage string `json:"submessage"`
}
type messageJSON struct {
To string `json:"to" binding:"required"`
From string `json:"from" binding:"required"`
Message string `json:"message" binding:"required"`
Display int `json:"display"`
Timestamp time.Time `json:"timestamp"`
}
func validateMessage(m messageJSON) (messageJSON, error) {
var err error
if m.Display == 0 {
m.Display = 10
}
m.Timestamp = time.Now()
m.To = strings.ToLower(strings.TrimSpace(m.To))
m.From = strings.ToLower(strings.TrimSpace(m.From))
m.Message = strings.TrimSpace(m.Message)
p := bluemonday.NewPolicy()
p.AllowStandardURLs()
p.AllowAttrs("href").OnElements("a")
p.AllowElements("p")
p.AllowElements("em")
p.AllowElements("i")
p.AllowElements("small")
m.Message = p.Sanitize(m.Message)
if len(m.To) == 0 || len(m.From) == 0 || len(m.Message) == 0 {
err = errors.New("to, from, and message cannot be empty")
}
return m, err
}
func getNextMessage(name string) (m messageHTML, err error) {
db := open(name)
defer db.close()
messages, err := db.popMessage()
if err != nil {
m.Message = "No messages."
} else {
m.Message = messages[0].Message
m.Submessage = fmt.Sprintf("Sent from <a class='link dim mid-gray' href='/?to=%s&from=%s'>%s</a> %s.", strings.ToLower(messages[0].From), name, messages[0].From, humanize.Time(messages[0].Timestamp))
if len(messages) > 1 {
m.Meta = "more messages"
}
}
return
}