Browse Source

Added channel repository and mongodb impl.

thegreatrefactor
Gisle Aune 5 years ago
parent
commit
f46b6f0774
  1. 1
      database/database.go
  2. 80
      database/mongodb/channels.go
  3. 5
      database/mongodb/db.go
  4. 18
      models/channel.go
  5. 15
      repositories/channel.go
  6. 2
      repositories/character.go

1
database/database.go

@ -14,6 +14,7 @@ var ErrDriverUnrecognized = errors.New("driver not recognized, check installed v
type Database interface {
Changes() repositories.ChangeRepository
Channels() repositories.ChannelRepository
Characters() repositories.CharacterRepository
Tags() repositories.TagRepository
Logs() repositories.LogRepository

80
database/mongodb/channels.go

@ -0,0 +1,80 @@
package mongodb
import (
"context"
"git.aiterp.net/rpdata/api/models"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson"
)
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
}
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
}
if update.LocationName != nil {
updateBson["locationName"] = *update.LocationName
}
if update.EventName != nil {
updateBson["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)
}

5
database/mongodb/db.go

@ -15,6 +15,7 @@ type MongoDB struct {
session *mgo.Session
changes repositories.ChangeRepository
channels *channelRepository
characters repositories.CharacterRepository
tags repositories.TagRepository
logs *logRepository
@ -41,6 +42,10 @@ func (m *MongoDB) Posts() repositories.PostRepository {
return m.posts
}
func (m *MongoDB) Channels() repositories.ChannelRepository {
return m.channels
}
func (m *MongoDB) Close(ctx context.Context) error {
m.session.Close()
return nil

18
models/channel.go

@ -13,4 +13,20 @@ type Channel struct {
// ChangeObject in GQL.
func (*Channel) IsChangeObject() {
panic("this method is a dummy, and so is its caller")
}
}
// ChannelFilter is a filter for channel listing.
type ChannelFilter struct {
Logged *bool `json:"logged"`
EventName *string `json:"eventName"`
LocationName *string `json:"locationName"`
Limit int `json:"limit"`
}
// ChannelUpdate is a filter for channel listing.
type ChannelUpdate struct {
Logged *bool `json:"logged"`
Hub *bool `json:"hub"`
EventName *string `json:"eventName"`
LocationName *string `json:"locationName"`
}

15
repositories/channel.go

@ -0,0 +1,15 @@
package repositories
import (
"context"
"git.aiterp.net/rpdata/api/models"
)
// ChannelRepository is an interface for a database using channels.
type ChannelRepository interface {
Find(ctx context.Context, name string) (*models.Channel, error)
List(ctx context.Context, filter models.ChannelFilter) ([]*models.Channel, error)
Insert(ctx context.Context, channel models.Channel) (*models.Channel, error)
Update(ctx context.Context, channel models.Channel, update models.ChannelUpdate) (*models.Channel, error)
Remove(ctx context.Context, channel models.Channel) error
}

2
repositories/character.go

@ -6,7 +6,7 @@ import (
"git.aiterp.net/rpdata/api/models"
)
// CharacterRepository is an interface for a database using logs.
// CharacterRepository is an interface for a database using characters.
type CharacterRepository interface {
Find(ctx context.Context, id string) (*models.Character, error)
FindNick(ctx context.Context, nick string) (*models.Character, error)

Loading…
Cancel
Save