gifs/api

Paddy 2014-10-17 Parent:96aac3ae74e6

5:b5d88d57d587 Go to Latest

gifs/api/memstore.go

Simplify upload. Simplify the upload code by not running the hashing async, which requires fewer copy operations and less channel synchronization. Also, take advantage of the fact that PipeWriters and PipeReaders will return an error to the PipeReaders/PipeWriters (respectively) when read/write is called (respectively) to avoid passing back errors through channels.

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 }