-
Notifications
You must be signed in to change notification settings - Fork 0
/
session.go
129 lines (112 loc) · 3.08 KB
/
session.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package handle
import (
"log"
"net/http"
"net/url"
"strings"
"github.com/gorilla/sessions"
"github.com/polyglottis/platform/frontend"
"github.com/polyglottis/platform/i18n"
"github.com/polyglottis/platform/user"
)
type Session struct {
session *sessions.Session
defaults *sessions.Session
r *http.Request
w http.ResponseWriter
}
func newSession(s *sessions.Session, defaults *sessions.Session, r *http.Request, w http.ResponseWriter) *Session {
return &Session{
session: s,
defaults: defaults,
r: r,
w: w,
}
}
func (s *Session) SetAccount(a *user.Account) {
s.session.Values["account"] = a
}
func (s *Session) GetAccount() *user.Account {
if u, ok := s.session.Values["account"]; ok && u != nil {
if account, ok := u.(*user.Account); ok {
return account
} else {
log.Println("Unable to decode user account: did user.Account change recently?")
}
}
return nil
}
func (s *Session) RemoveAccount() {
delete(s.session.Values, "account")
}
func (s *Session) Save() error {
return s.session.Save(s.r, s.w)
}
// SaveFlashErrors saves the error map into the session flash messages.
func (s *Session) SaveFlashErrors(errMap frontend.ErrorMap) {
s.session.AddFlash(errMap)
s.Save()
}
// SaveFlashError is a shorthand for saving a single error message for the whole form (key "FORM").
func (s *Session) SaveFlashError(msg i18n.Key) {
s.SaveFlashErrors(frontend.ErrorMap{
"FORM": msg,
})
s.Save()
}
// ReadFlashErrors reads the errors stored in the flash messages.
// Calling this method flushes the flash messages immediately.
func (s *Session) ReadFlashErrors() frontend.ErrorMap {
if flashes := s.session.Flashes(); len(flashes) != 0 {
defer s.Save()
if errMap, ok := flashes[0].(frontend.ErrorMap); ok {
return errMap
} else {
log.Println("Flash message is not an error map:", flashes[0])
}
if len(flashes) > 1 {
log.Println("Session with multiple flash messages:", flashes)
}
}
return nil
}
// SaveDefaults saves the values as default for the current form.
func (s *Session) SaveDefaults(values url.Values) {
s.defaults.Options = &sessions.Options{
Path: s.path(),
MaxAge: 3600,
}
s.defaults.Values["def"] = values
s.defaults.Save(s.r, s.w)
}
func (s *Session) path() string {
path := s.r.URL.String()
if pos := strings.Index(path, "?"); pos != -1 {
path = path[:pos]
}
return path
}
// SaveDefault is a shorthand for saving a single default key-value pair.
func (s *Session) SaveDefault(key, value string) {
defaults := url.Values{}
defaults.Set(key, value)
s.SaveDefaults(defaults)
}
// GetDefaults returns the default values for the current form.
func (s *Session) GetDefaults() url.Values {
if def, ok := s.defaults.Values["def"]; ok {
if defaults, ok := def.(url.Values); ok {
return defaults
}
}
return url.Values{}
}
// ClearDefaults clears the default values for the current form.
// It is typically called when a post request was successful.
func (s *Session) ClearDefaults() {
s.defaults.Options = &sessions.Options{
Path: s.path(),
MaxAge: -1, // delete immediately
}
s.defaults.Save(s.r, s.w)
}