gifs/api

Paddy 2014-10-17 Parent:96aac3ae74e6

6:eb450538f079 Go to Latest

gifs/api/memstore.go

Make UsageTracker an interface, ditch the channel interface. Stop using channels to track usage. Just call functions. Make UsageTracker an interface, so there can be multiple implementations, and create the in-memory implementation.

History
paddy@0 1 package api
paddy@0 2
paddy@0 3 import (
paddy@0 4 "time"
paddy@0 5
paddy@3 6 "code.secondbit.org/uuid.hg"
paddy@0 7 )
paddy@0 8
paddy@0 9 type Memstore struct {
paddy@0 10 collections map[string]Collection
paddy@0 11 domains map[string]Domain
paddy@0 12 items map[string]Item
paddy@0 13 }
paddy@0 14
paddy@0 15 func NewMemstore() Memstore {
paddy@0 16 return Memstore{
paddy@0 17 collections: map[string]Collection{},
paddy@0 18 domains: map[string]Domain{},
paddy@0 19 items: map[string]Item{},
paddy@0 20 }
paddy@0 21 }
paddy@0 22
paddy@0 23 func (m Memstore) CreateCollection(c Collection) error {
paddy@0 24 m.collections[c.ID.String()] = c
paddy@0 25 return nil
paddy@0 26 }
paddy@0 27
paddy@3 28 func (m Memstore) UpdateCollection(id uuid.ID, change CollectionChange) error {
paddy@3 29 c, ok := m.collections[id.String()]
paddy@3 30 if !ok {
paddy@3 31 return ErrCollectionNotFound
paddy@0 32 }
paddy@3 33 c.ApplyChange(change)
paddy@3 34 m.collections[id.String()] = c
paddy@0 35 return nil
paddy@0 36 }
paddy@0 37
paddy@0 38 func (m Memstore) GetCollectionByDomain(domain string) (Collection, error) {
paddy@0 39 d, ok := m.domains[domain]
paddy@0 40 if !ok {
paddy@3 41 return Collection{}, ErrCollectionNotFound
paddy@0 42 }
paddy@0 43 return m.GetCollectionByID(d.CollectionID)
paddy@0 44 }
paddy@0 45
paddy@0 46 func (m Memstore) GetCollectionByID(id uuid.ID) (Collection, error) {
paddy@0 47 if c, ok := m.collections[id.String()]; ok {
paddy@0 48 return c, nil
paddy@0 49 }
paddy@3 50 return Collection{}, ErrCollectionNotFound
paddy@0 51 }
paddy@0 52
paddy@0 53 func (m Memstore) GetCollectionsByUser(id uuid.ID) ([]Collection, error) {
paddy@0 54 collections := []Collection{}
paddy@0 55 for _, c := range m.collections {
paddy@0 56 if c.Owner.Equal(id) {
paddy@0 57 collections = append(collections, c)
paddy@0 58 }
paddy@0 59 }
paddy@0 60 return collections, nil
paddy@0 61 }
paddy@0 62
paddy@0 63 func (m Memstore) AddDomainToCollection(id uuid.ID, domain string) error {
paddy@0 64 if _, ok := m.domains[domain]; ok {
paddy@3 65 return ErrDomainAlreadyExists
paddy@0 66 }
paddy@0 67 m.domains[domain] = Domain{
paddy@0 68 Domain: domain,
paddy@0 69 CollectionID: id,
paddy@0 70 Created: time.Now(),
paddy@0 71 }
paddy@0 72 return nil
paddy@0 73 }
paddy@0 74
paddy@0 75 func (m Memstore) RemoveDomainFromCollection(id uuid.ID, domain string) error {
paddy@0 76 if _, ok := m.domains[domain]; !ok {
paddy@3 77 return ErrDomainNotFound
paddy@0 78 }
paddy@0 79 delete(m.domains, domain)
paddy@0 80 return nil
paddy@0 81 }
paddy@0 82
paddy@0 83 func (m Memstore) GetDomainsByCollection(id uuid.ID) ([]Domain, error) {
paddy@0 84 domains := []Domain{}
paddy@0 85 for _, d := range m.domains {
paddy@0 86 if d.CollectionID.Equal(id) {
paddy@0 87 domains = append(domains, d)
paddy@0 88 }
paddy@0 89 }
paddy@0 90 return domains, nil
paddy@0 91 }
paddy@0 92
paddy@0 93 func (m Memstore) DeleteCollection(c Collection) error {
paddy@0 94 if _, ok := m.collections[c.ID.String()]; !ok {
paddy@3 95 return ErrCollectionNotFound
paddy@0 96 }
paddy@0 97 delete(m.collections, c.ID.String())
paddy@0 98 return nil
paddy@0 99 }
paddy@0 100
paddy@0 101 func (m Memstore) GetItemsByCollectionDomain(domain string, num, offset int) ([]Item, error) {
paddy@0 102 collection, err := m.GetCollectionByDomain(domain)
paddy@0 103 if err != nil {
paddy@0 104 return []Item{}, err
paddy@0 105 }
paddy@0 106 return m.GetItemsByCollectionID(collection.ID, num, offset)
paddy@0 107 }
paddy@0 108
paddy@0 109 func (m Memstore) GetItemsByCollectionID(id uuid.ID, num, offset int) ([]Item, error) {
paddy@0 110 if _, ok := m.collections[id.String()]; !ok {
paddy@3 111 return []Item{}, ErrCollectionNotFound
paddy@0 112 }
paddy@0 113 items := []Item{}
paddy@0 114 for _, item := range m.items {
paddy@0 115 if item.CollectionID.Equal(id) {
paddy@0 116 items = append(items, item)
paddy@0 117 }
paddy@0 118 }
paddy@0 119 if len(items) < offset {
paddy@0 120 return []Item{}, nil
paddy@0 121 }
paddy@0 122 end := offset + num
paddy@0 123 if len(items) < end {
paddy@0 124 end = len(items)
paddy@0 125 }
paddy@0 126 return items[offset:end], nil
paddy@0 127 }
paddy@0 128
paddy@0 129 func (m Memstore) AddItemToCollection(id uuid.ID, item Item) error {
paddy@0 130 if _, ok := m.collections[id.String()]; !ok {
paddy@3 131 return ErrCollectionNotFound
paddy@0 132 }
paddy@0 133 if _, ok := m.items[id.String()+"/"+item.Name]; ok {
paddy@3 134 return ErrItemAlreadyExists
paddy@0 135 }
paddy@0 136 item.CollectionID = id
paddy@0 137 m.items[id.String()+"/"+item.Name] = item
paddy@0 138 return nil
paddy@0 139 }
paddy@0 140
paddy@0 141 func (m Memstore) GetItemByName(collectionID uuid.ID, name string) (Item, error) {
paddy@0 142 if _, ok := m.collections[collectionID.String()]; !ok {
paddy@3 143 return Item{}, ErrCollectionNotFound
paddy@0 144 }
paddy@0 145 if item, ok := m.items[collectionID.String()+"/"+name]; ok {
paddy@0 146 return item, nil
paddy@0 147 }
paddy@3 148 return Item{}, ErrItemNotFound
paddy@0 149 }
paddy@0 150
paddy@0 151 func (m Memstore) DeleteItem(item Item) error {
paddy@0 152 if _, ok := m.items[item.CollectionID.String()+"/"+item.Name]; !ok {
paddy@3 153 return ErrItemNotFound
paddy@0 154 }
paddy@0 155 delete(m.items, item.CollectionID.String()+"/"+item.Name)
paddy@0 156 return nil
paddy@0 157 }