gifs/api
2014-10-17
Parent:96aac3ae74e6
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.
| 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 } |