You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.5 KiB
107 lines
2.5 KiB
package mongodb
|
|
|
|
import (
|
|
"context"
|
|
"git.aiterp.net/rpdata/api/models"
|
|
"github.com/globalsign/mgo"
|
|
"github.com/globalsign/mgo/bson"
|
|
)
|
|
|
|
func newChannelRepository(db *mgo.Database) (*channelRepository, error) {
|
|
collection := db.C("common.channels")
|
|
|
|
err := collection.EnsureIndexKey("logged")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = collection.EnsureIndexKey("event")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = collection.EnsureIndexKey("location")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &channelRepository{
|
|
channels: collection,
|
|
}, nil
|
|
}
|
|
|
|
type channelRepository struct {
|
|
channels *mgo.Collection
|
|
}
|
|
|
|
func (r *channelRepository) Find(ctx context.Context, name string) (*models.Channel, error) {
|
|
channel := new(models.Channel)
|
|
err := r.channels.FindId(name).One(channel)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return channel, nil
|
|
}
|
|
|
|
func (r *channelRepository) List(ctx context.Context, filter models.ChannelFilter) ([]*models.Channel, error) {
|
|
query := bson.M{}
|
|
if filter.Logged != nil {
|
|
query["logged"] = *filter.Logged
|
|
}
|
|
if filter.EventName != nil {
|
|
query["eventName"] = *filter.EventName
|
|
}
|
|
if filter.LocationName != nil {
|
|
query["locationName"] = *filter.LocationName
|
|
}
|
|
if len(filter.Names) > 0 {
|
|
query["_id"] = bson.M{"$in": filter.Names}
|
|
}
|
|
|
|
channels := make([]*models.Channel, 0, 32)
|
|
err := r.channels.Find(query).Limit(filter.Limit).Sort("_id").All(&channels)
|
|
if err != nil {
|
|
if err == mgo.ErrNotFound {
|
|
return channels, nil
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
return channels, nil
|
|
}
|
|
|
|
func (r *channelRepository) Insert(ctx context.Context, channel models.Channel) (*models.Channel, error) {
|
|
err := r.channels.Insert(channel)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &channel, nil
|
|
}
|
|
|
|
func (r *channelRepository) Update(ctx context.Context, channel models.Channel, update models.ChannelUpdate) (*models.Channel, error) {
|
|
updateBson := bson.M{}
|
|
if update.Logged != nil {
|
|
updateBson["logged"] = *update.Logged
|
|
channel.Logged = *update.Logged
|
|
}
|
|
if update.LocationName != nil {
|
|
updateBson["locationName"] = *update.LocationName
|
|
channel.LocationName = *update.LocationName
|
|
}
|
|
if update.EventName != nil {
|
|
updateBson["eventName"] = *update.EventName
|
|
channel.EventName = *update.EventName
|
|
}
|
|
|
|
err := r.channels.UpdateId(channel.Name, bson.M{"$set": updateBson})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &channel, nil
|
|
}
|
|
|
|
func (r *channelRepository) Remove(ctx context.Context, channel models.Channel) error {
|
|
return r.channels.RemoveId(channel.Name)
|
|
}
|