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