gifs/api

Paddy 2014-10-17 Parent:d3ba1115bfd0

5:b5d88d57d587 Go to Latest

gifs/api/datastore.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 "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 }