-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathusers.go
130 lines (118 loc) · 3.13 KB
/
users.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
package main
import (
. "fmt"
"github.com/a8m/documentdb-go"
)
// User document
type User struct {
documentdb.Document
Name string `json:"name,omitempty"`
Email string `json:"email,omitempty"`
}
// DB interface
type DB interface {
Get(id string) *User
GetAll() []*User
Add(u *User) *User
Update(u *User) *User
Remove(id string) error
}
// UsersDB implement DB interface
type UsersDB struct {
Database string
Collection string
db *documentdb.Database
coll *documentdb.Collection
client *documentdb.DocumentDB
}
// Return new UserDB
// Test if database and collection exist. if not, create them.
func NewDB(db, coll string, config *Config) (users UsersDB) {
users.Database = db
users.Collection = coll
users.client = documentdb.New(config.Url, documentdb.Config{config.MasterKey})
// Find or create `test` db and `users` collection
if err := users.findOrDatabase(db); err != nil {
panic(err)
}
if err := users.findOrCreateCollection(coll); err != nil {
panic(err)
}
return
}
// Get user by given id
func (u *UsersDB) Get(id string) (user User, err error) {
var users []User
query := Sprintf("SELECT * FROM ROOT r WHERE r.id='%s'", id)
if err = u.client.QueryDocuments(u.coll.Self, query, &users); err != nil || len(users) == 0 {
return user, err
}
user = users[0]
return user, nil
}
// Get all users
func (u *UsersDB) GetAll() (users []User, err error) {
err = u.client.ReadDocuments(u.coll.Self, &users)
return
}
// Create user
func (u *UsersDB) Add(user *User) (err error) {
return u.client.CreateDocument(u.coll.Self, user)
}
// Update user by id
func (u *UsersDB) Update(id string, user *User) (err error) {
var users []User
if err = u.client.QueryDocuments(u.coll.Self,
Sprintf("SELECT * FROM ROOT r WHERE r.id='%s'", id), &users); err != nil || len(users) == 0 {
return
}
nUser := users[0]
user.Id = nUser.Id
if err = u.client.ReplaceDocument(nUser.Self, &user); err != nil {
return
}
return
}
// Remove user by id
func (u *UsersDB) Remove(id string) (err error) {
var users []User
if err = u.client.QueryDocuments(u.coll.Self,
Sprintf("SELECT * FROM ROOT r WHERE r.id='%s'", id), &users); err != nil || len(users) == 0 {
return
}
nUser := users[0]
if err = u.client.DeleteDocument(nUser.Self); err != nil {
return
}
return
}
// Find or create collection by id
func (u *UsersDB) findOrCreateCollection(name string) (err error) {
if colls, err := u.client.QueryCollections(u.db.Self, Sprintf("SELECT * FROM ROOT r WHERE r.id='%s'", name)); err != nil {
return err
} else if len(colls) == 0 {
if coll, err := u.client.CreateCollection(u.db.Self, Sprintf(`{ "id": "%s" }`, name)); err != nil {
return err
} else {
u.coll = coll
}
} else {
u.coll = &colls[0]
}
return
}
// Find or create database by id
func (u *UsersDB) findOrDatabase(name string) (err error) {
if dbs, err := u.client.QueryDatabases(Sprintf("SELECT * FROM ROOT r WHERE r.id='%s'", name)); err != nil {
return err
} else if len(dbs) == 0 {
if db, err := u.client.CreateDatabase(Sprintf(`{ "id": "%s" }`, name)); err != nil {
return err
} else {
u.db = db
}
} else {
u.db = &dbs[0]
}
return
}