-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsession_crud.go
145 lines (118 loc) · 3.22 KB
/
session_crud.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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package firestoreadapter
import (
"errors"
"fmt"
"cloud.google.com/go/firestore"
"github.com/mhogar/amber/common"
"github.com/mhogar/amber/models"
"google.golang.org/api/iterator"
"github.com/google/uuid"
)
func (crud *FirestoreCRUD) SaveSession(session *models.Session) error {
//validate the session model
verr := session.Validate()
if verr != models.ValidateSessionValid {
return errors.New(fmt.Sprint("error validating session model:", verr))
}
//create session
err := crud.DocWriter.Create(crud.getSessionDocRef(session.Token), session)
if err != nil {
return common.ChainError("error creating session", err)
}
return nil
}
func (crud *FirestoreCRUD) GetSessionByToken(token uuid.UUID) (*models.Session, error) {
doc, err := crud.getSession(token)
if err != nil {
return nil, err
}
if doc == nil {
return nil, nil
}
return crud.readSessionData(doc)
}
func (crud *FirestoreCRUD) DeleteSession(token uuid.UUID) (bool, error) {
//check session already exists
doc, err := crud.getSession(token)
if err != nil {
return false, err
}
if doc == nil {
return false, nil
}
//delete session
err = crud.DocWriter.Delete(doc.Ref)
if err != nil {
return false, common.ChainError("error deleting session", err)
}
return true, nil
}
func (crud *FirestoreCRUD) DeleteAllUserSessions(username string) error {
ctx, cancel := crud.ContextFactory.CreateStandardTimeoutContext()
itr := crud.Client.Collection("sessions").
Where("username", "==", username).
Documents(ctx)
defer cancel()
//delete the sessions
err := crud.deleteSessions(itr)
if err != nil {
return err
}
return nil
}
func (crud *FirestoreCRUD) DeleteAllOtherUserSessions(username string, token uuid.UUID) error {
ctx, cancel := crud.ContextFactory.CreateStandardTimeoutContext()
itr := crud.Client.Collection("sessions").
Where("username", "==", username).
Where("token", "!=", token).
Documents(ctx)
defer cancel()
//delete the sessions
err := crud.deleteSessions(itr)
if err != nil {
return err
}
return nil
}
func (crud *FirestoreCRUD) deleteSessions(itr *firestore.DocumentIterator) error {
defer itr.Stop()
for {
doc, err := itr.Next()
if err == iterator.Done {
return nil
}
if err != nil {
return common.ChainError("error getting next doc", err)
}
//delete session
err = crud.DocWriter.Delete(doc.Ref)
if err != nil {
return common.ChainError("error deleting session", err)
}
}
}
func (crud *FirestoreCRUD) getSessionDocRef(token uuid.UUID) *firestore.DocumentRef {
return crud.Client.Collection("sessions").Doc(token.String())
}
func (crud *FirestoreCRUD) getSession(token uuid.UUID) (*firestore.DocumentSnapshot, error) {
ctx, cancel := crud.ContextFactory.CreateStandardTimeoutContext()
doc, err := crud.getSessionDocRef(token).Get(ctx)
cancel()
//check session was found
if !doc.Exists() {
return nil, nil
}
//handle other errors
if err != nil {
return nil, common.ChainError("error getting session", err)
}
return doc, nil
}
func (*FirestoreCRUD) readSessionData(doc *firestore.DocumentSnapshot) (*models.Session, error) {
session := &models.Session{}
err := doc.DataTo(&session)
if err != nil {
return nil, common.ChainError("error reading session data", err)
}
return session, nil
}