gifs/api

Paddy 2014-10-17 Parent:96aac3ae74e6

7:21787ed8a185 Go to Latest

gifs/api/memstore.go

Create a Dockerfile and binary. Write a Dockerfile that compiles everything and runs it. Start the binary; load a Context from etcd, and start everything running. The binary is pretty useless until we get HTTP handlers, though, obviously.

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 }