gifs/api

Paddy 2014-10-17 Parent:d3ba1115bfd0

7:21787ed8a185 Go to Latest

gifs/api/datastore.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 "errors"
paddy@0 5 "time"
paddy@0 6 "unicode"
paddy@0 7
paddy@0 8 "code.google.com/p/go.text/unicode/norm"
paddy@1 9 "code.secondbit.org/uuid.hg"
paddy@0 10 )
paddy@0 11
paddy@0 12 var (
paddy@1 13 ErrCollectionNotFound = errors.New("collection not found")
paddy@1 14 ErrDomainNotFound = errors.New("domain not found")
paddy@1 15 ErrDomainAlreadyExists = errors.New("domain already attached to a collection")
paddy@1 16 ErrItemNotFound = errors.New("item not found")
paddy@1 17 ErrItemAlreadyExists = errors.New("item already exists")
paddy@0 18 )
paddy@0 19
paddy@0 20 type Datastore interface {
paddy@0 21 CreateCollection(c Collection) error
paddy@1 22 UpdateCollection(id uuid.ID, change CollectionChange) error
paddy@0 23 GetCollectionByDomain(domain string) (Collection, error)
paddy@0 24 GetCollectionByID(id uuid.ID) (Collection, error)
paddy@0 25 GetCollectionsByUser(id uuid.ID) ([]Collection, error)
paddy@0 26 AddDomainToCollection(id uuid.ID, domain string) error
paddy@0 27 RemoveDomainFromCollection(id uuid.ID, domain string) error
paddy@0 28 GetDomainsByCollection(id uuid.ID) ([]Domain, error)
paddy@0 29 DeleteCollection(c Collection) error
paddy@0 30
paddy@0 31 GetItemsByCollectionDomain(domain string, num, offset int) ([]Item, error)
paddy@0 32 GetItemsByCollectionID(id uuid.ID, num, offset int) ([]Item, error)
paddy@0 33 AddItemToCollection(id uuid.ID, item Item) error
paddy@0 34 GetItemByName(collectionID uuid.ID, name string) (Item, error)
paddy@0 35 DeleteItem(item Item) error
paddy@0 36 }
paddy@0 37
paddy@0 38 func slugify(in string) string {
paddy@0 39 buf := make([]rune, 0, len(in))
paddy@0 40 needsDash := false
paddy@0 41 for _, r := range norm.NFKD.String(in) {
paddy@0 42 if unicode.IsSpace(r) || unicode.IsPunct(r) {
paddy@0 43 if needsDash {
paddy@0 44 buf = append(buf, '-')
paddy@0 45 needsDash = false
paddy@0 46 }
paddy@0 47 } else {
paddy@0 48 buf = append(buf, r)
paddy@0 49 needsDash = true
paddy@0 50 }
paddy@0 51 }
paddy@0 52 return string(buf)
paddy@0 53 }
paddy@0 54
paddy@0 55 type Collection struct {
paddy@0 56 ID uuid.ID
paddy@0 57 Name string
paddy@0 58 Owner uuid.ID
paddy@0 59 Created time.Time
paddy@0 60 }
paddy@0 61
paddy@1 62 func (c *Collection) ApplyChange(change CollectionChange) {
paddy@1 63 if change.Name != nil {
paddy@1 64 c.Name = *change.Name
paddy@1 65 }
paddy@1 66 }
paddy@1 67
paddy@1 68 type CollectionChange struct {
paddy@1 69 Name *string
paddy@1 70 }
paddy@1 71
paddy@0 72 type Domain struct {
paddy@0 73 Domain string
paddy@0 74 CollectionID uuid.ID
paddy@0 75 Created time.Time
paddy@0 76 }
paddy@0 77
paddy@0 78 type Item struct {
paddy@0 79 Blob string
paddy@0 80 Bucket string
paddy@0 81 CollectionID uuid.ID
paddy@0 82 Name string
paddy@0 83 }