scopes

Paddy 2015-12-05 Parent:b2ab1ab8f157 Child:a64a25ae2db1

1:b93938562a17 Go to Latest

scopes/memstore.go

Separete out scopeTypes package. To avoid the same problem we had in the auth package (where importing the type required you to vendor all the database drivers, etc.) let's just separate out the scopeTypes package to hold the types, then everything can import that.

History
paddy@0 1 package scopes
paddy@0 2
paddy@0 3 import (
paddy@0 4 "sort"
paddy@0 5 "sync"
paddy@0 6
paddy@1 7 "code.secondbit.org/scopes.hg/types"
paddy@1 8
paddy@0 9 "golang.org/x/net/context"
paddy@0 10 )
paddy@0 11
paddy@0 12 type Memstore struct {
paddy@1 13 scopes map[string]scopeTypes.Scope
paddy@0 14 lock sync.RWMutex
paddy@0 15 }
paddy@0 16
paddy@1 17 func (m *Memstore) CreateScopes(scopes []scopeTypes.Scope, ctx context.Context) error {
paddy@0 18 m.lock.Lock()
paddy@0 19 defer m.lock.Unlock()
paddy@0 20
paddy@0 21 for _, scope := range scopes {
paddy@0 22 if _, ok := m.scopes[scope.ID]; ok {
paddy@0 23 return ErrScopeAlreadyExists(scope.ID)
paddy@0 24 }
paddy@0 25 }
paddy@0 26 for _, scope := range scopes {
paddy@0 27 m.scopes[scope.ID] = scope
paddy@0 28 }
paddy@0 29 return nil
paddy@0 30 }
paddy@0 31
paddy@1 32 func (m *Memstore) GetScopes(ids []string, ctx context.Context) (map[string]scopeTypes.Scope, error) {
paddy@0 33 m.lock.RLock()
paddy@0 34 defer m.lock.RUnlock()
paddy@0 35
paddy@1 36 scopes := map[string]scopeTypes.Scope{}
paddy@0 37 for _, id := range ids {
paddy@0 38 scope, ok := m.scopes[id]
paddy@0 39 if !ok {
paddy@0 40 continue
paddy@0 41 }
paddy@0 42 scopes[id] = scope
paddy@0 43 }
paddy@0 44 return scopes, nil
paddy@0 45 }
paddy@0 46
paddy@1 47 func (m *Memstore) UpdateScope(change scopeTypes.ScopeChange, ctx context.Context) error {
paddy@0 48 m.lock.Lock()
paddy@0 49 defer m.lock.Unlock()
paddy@0 50
paddy@0 51 scope, ok := m.scopes[change.ScopeID]
paddy@0 52 if !ok {
paddy@0 53 return ErrScopeNotFound
paddy@0 54 }
paddy@1 55 scope = scopeTypes.ApplyChange(change, scope)
paddy@0 56 m.scopes[change.ScopeID] = scope
paddy@0 57 return nil
paddy@0 58 }
paddy@0 59
paddy@0 60 func (m *Memstore) RemoveScopes(ids []string, ctx context.Context) error {
paddy@0 61 m.lock.Lock()
paddy@0 62 defer m.lock.Unlock()
paddy@0 63
paddy@0 64 for _, id := range ids {
paddy@0 65 delete(m.scopes, id)
paddy@0 66 }
paddy@0 67 return nil
paddy@0 68 }
paddy@0 69
paddy@1 70 func (m *Memstore) ListScopes(ctx context.Context) ([]scopeTypes.Scope, error) {
paddy@0 71 m.lock.RLock()
paddy@0 72 defer m.lock.RUnlock()
paddy@0 73
paddy@1 74 scopes := []scopeTypes.Scope{}
paddy@0 75 for _, scope := range m.scopes {
paddy@0 76 scopes = append(scopes, scope)
paddy@0 77 }
paddy@1 78 sorted := scopeTypes.Scopes(scopes)
paddy@0 79 sort.Sort(sorted)
paddy@0 80 scopes = sorted
paddy@0 81 return scopes, nil
paddy@0 82 }