-
Notifications
You must be signed in to change notification settings - Fork 1
/
mongoclient.go
135 lines (120 loc) · 3.08 KB
/
mongoclient.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
package govideo
import (
"github.com/sickyoon/govideo/govideo/models"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
const (
colMedia = "media"
colUser = "users"
)
// MongoClient holds master session and other db-related info
type MongoClient struct {
session *mgo.Session // master session
uri string // mongodb uri
dbName string // database name
}
// NewMongoClient establishes connection to MongoDB database
// and returns new MongoClient object
func NewMongoClient(uri, dbName string) (*MongoClient, error) {
session, err := mgo.Dial(uri)
if err != nil {
return nil, err
}
session.SetMode(mgo.Monotonic, true)
return &MongoClient{session, uri, dbName}, nil
}
// GetSession returns mgo.Session copied from
// MongoClient's master session
// Be sure to close the session after done
func (mc *MongoClient) GetSession() *mgo.Session {
return mc.session.Copy()
}
// CRUD
// CreateUser -
func (mc *MongoClient) CreateUser(user *models.User) error {
s := mc.GetSession()
// TODO: indexes
/*
userIndex := mgo.Index{
Key: []string{"email"},
Unique: true,
DropDups: true,
Background: true,
Sparse: true,
}
err := s.DB(mc.dbName).C(colUser).EnsureIndex(userIndex)
if err != nil {
return err
}
*/
err := s.DB(mc.dbName).C(colUser).Insert(user)
s.Close()
return err
}
// GetUserFromDB -
func (mc *MongoClient) GetUserFromDB(email string, hash []byte) (*models.User, error) {
s := mc.GetSession()
user := models.User{}
err := s.DB(mc.dbName).C(colUser).Find(bson.M{"_id": email, "hash": hash}).One(&user)
if err != nil {
return nil, err
}
s.Close()
return &user, nil
}
// InsertMedia -
func (mc *MongoClient) InsertMedia(media *models.Media) error {
s := mc.GetSession()
err := s.DB(mc.dbName).C(colMedia).Insert(media)
s.Close()
return err
}
// GetAllMedia -
func (mc *MongoClient) GetAllMedia(email string) (*models.MediaList, error) {
s := mc.GetSession()
mediaList := models.GetMediaList()
err := s.DB(mc.dbName).C(colMedia).Find(bson.M{"access": bson.M{"$elemMatch": bson.M{"$exists": email}}}).Select(bson.M{"access": 0}).All(&mediaList.Data)
if err != nil {
return nil, err
}
// access list removed before serving
s.Close()
return mediaList, nil
}
// FindMedia -
// recycle media after use
func (mc *MongoClient) FindMedia(path string) (*models.Media, error) {
s := mc.GetSession()
media := models.GetMedia()
err := s.DB(mc.dbName).C(colMedia).Find(path).One(media)
s.Close()
return media, err
}
// UpdateSubtitle -
func (mc *MongoClient) UpdateSubtitle(name, path string) error {
s := mc.GetSession()
err := s.DB(mc.dbName).C(colMedia).Update(
bson.M{"name": name},
bson.M{"$set": bson.M{"subtitle": path}},
)
s.Close()
return err
}
// UpdateMedia -
func (mc *MongoClient) UpdateMedia(media *models.Media) error {
s := mc.GetSession()
err := s.DB(mc.dbName).C(colMedia).Update(
bson.M{"_id": media.Path},
media,
)
s.Close()
return err
}
// RemoveMedia -
func (mc *MongoClient) RemoveMedia(mediaID string) error {
s := mc.GetSession()
err := s.DB(mc.dbName).C("media").Remove(mediaID)
s.Close()
return err
}