gifs/api

Paddy 2014-08-27 Child:d3ba1115bfd0

0:08ec88016e2f Go to Latest

gifs/api/datastore.go

Spike out functionality and tests. Create our interfaces around storing data and retrieving it. Create an in-memory implementation of our interfaces, for testing and rapid dev purposes. Begin sketching out what our unit tests look like. Create our Google Cloud Storage datastore implementation. Sketch out an idea for a usage collection process to keep track of which users are actually using stuff.

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@0 9 "secondbit.org/uuid"
paddy@0 10 )
paddy@0 11
paddy@0 12 var (
paddy@0 13 CollectionNotFoundError = errors.New("collection not found")
paddy@0 14 DomainNotFoundError = errors.New("domain not found")
paddy@0 15 DomainAlreadyExistsError = errors.New("domain already attached to a collection")
paddy@0 16 ItemNotFoundError = errors.New("item not found")
paddy@0 17 ItemAlreadyExistsError = errors.New("item already exists")
paddy@0 18 UserNotFoundError = errors.New("user not found")
paddy@0 19 UserAlreadyExistsError = errors.New("user already exists")
paddy@0 20 LoginNotFoundError = errors.New("login not found")
paddy@0 21 LoginAlreadyExistsError = errors.New("login already exists")
paddy@0 22 )
paddy@0 23
paddy@0 24 type Datastore interface {
paddy@0 25 CreateCollection(c Collection) error
paddy@0 26 UpdateCollection(c Collection) error
paddy@0 27 GetCollectionByDomain(domain string) (Collection, error)
paddy@0 28 GetCollectionByID(id uuid.ID) (Collection, error)
paddy@0 29 GetCollectionsByUser(id uuid.ID) ([]Collection, error)
paddy@0 30 AddDomainToCollection(id uuid.ID, domain string) error
paddy@0 31 RemoveDomainFromCollection(id uuid.ID, domain string) error
paddy@0 32 GetDomainsByCollection(id uuid.ID) ([]Domain, error)
paddy@0 33 DeleteCollection(c Collection) error
paddy@0 34
paddy@0 35 GetItemsByCollectionDomain(domain string, num, offset int) ([]Item, error)
paddy@0 36 GetItemsByCollectionID(id uuid.ID, num, offset int) ([]Item, error)
paddy@0 37 AddItemToCollection(id uuid.ID, item Item) error
paddy@0 38 GetItemByName(collectionID uuid.ID, name string) (Item, error)
paddy@0 39 DeleteItem(item Item) error
paddy@0 40
paddy@0 41 GetUserByID(id uuid.ID) (User, error)
paddy@0 42 GetUserByLogin(loginType, value, passphrase string) (User, error)
paddy@0 43 AddLoginToUser(login Login, user uuid.ID) error
paddy@0 44 RemoveLoginFromUser(loginType, value string, user uuid.ID) error
paddy@0 45 GetLoginsByUser(user uuid.ID) ([]Login, error)
paddy@0 46 CreateUser(u User) error
paddy@0 47 UpdateUser(u User) error
paddy@0 48 DeleteUser(u User) error
paddy@0 49 }
paddy@0 50
paddy@0 51 func slugify(in string) string {
paddy@0 52 buf := make([]rune, 0, len(in))
paddy@0 53 needsDash := false
paddy@0 54 for _, r := range norm.NFKD.String(in) {
paddy@0 55 if unicode.IsSpace(r) || unicode.IsPunct(r) {
paddy@0 56 if needsDash {
paddy@0 57 buf = append(buf, '-')
paddy@0 58 needsDash = false
paddy@0 59 }
paddy@0 60 } else {
paddy@0 61 buf = append(buf, r)
paddy@0 62 needsDash = true
paddy@0 63 }
paddy@0 64 }
paddy@0 65 return string(buf)
paddy@0 66 }
paddy@0 67
paddy@0 68 type Collection struct {
paddy@0 69 ID uuid.ID
paddy@0 70 Name string
paddy@0 71 Owner uuid.ID
paddy@0 72 Created time.Time
paddy@0 73 }
paddy@0 74
paddy@0 75 type Domain struct {
paddy@0 76 Domain string
paddy@0 77 CollectionID uuid.ID
paddy@0 78 Created time.Time
paddy@0 79 }
paddy@0 80
paddy@0 81 type Item struct {
paddy@0 82 Blob string
paddy@0 83 Bucket string
paddy@0 84 CollectionID uuid.ID
paddy@0 85 Name string
paddy@0 86 }
paddy@0 87
paddy@0 88 type User struct {
paddy@0 89 ID uuid.ID
paddy@0 90 Name string
paddy@0 91 Passphrase string
paddy@0 92 Email string
paddy@0 93 Created time.Time
paddy@0 94 LastSeen time.Time
paddy@0 95 }
paddy@0 96
paddy@0 97 type Login struct {
paddy@0 98 Type string
paddy@0 99 Value string
paddy@0 100 UserID uuid.ID
paddy@0 101 Created time.Time
paddy@0 102 LastUsed time.Time
paddy@0 103 }