scopes
2015-12-05
Child:b93938562a17
scopes/memstore.go
First pass at a scopes package. We need a minimal scopes package that we'll be able to share around. I don't want it embedded in auth, because then all the requirements of auth have to be pulled into whatever package wants to import type Scope, which seems silly. So this is the bare minimum of the beginning of a new service that separates Scopes out from auth.
| paddy@0 | 1 package scopes |
| paddy@0 | 2 |
| paddy@0 | 3 import ( |
| paddy@0 | 4 "sort" |
| paddy@0 | 5 "sync" |
| paddy@0 | 6 |
| paddy@0 | 7 "golang.org/x/net/context" |
| paddy@0 | 8 ) |
| paddy@0 | 9 |
| paddy@0 | 10 type Memstore struct { |
| paddy@0 | 11 scopes map[string]Scope |
| paddy@0 | 12 lock sync.RWMutex |
| paddy@0 | 13 } |
| paddy@0 | 14 |
| paddy@0 | 15 func (m *Memstore) CreateScopes(scopes []Scope, ctx context.Context) error { |
| paddy@0 | 16 m.lock.Lock() |
| paddy@0 | 17 defer m.lock.Unlock() |
| paddy@0 | 18 |
| paddy@0 | 19 for _, scope := range scopes { |
| paddy@0 | 20 if _, ok := m.scopes[scope.ID]; ok { |
| paddy@0 | 21 return ErrScopeAlreadyExists(scope.ID) |
| paddy@0 | 22 } |
| paddy@0 | 23 } |
| paddy@0 | 24 for _, scope := range scopes { |
| paddy@0 | 25 m.scopes[scope.ID] = scope |
| paddy@0 | 26 } |
| paddy@0 | 27 return nil |
| paddy@0 | 28 } |
| paddy@0 | 29 |
| paddy@0 | 30 func (m *Memstore) GetScopes(ids []string, ctx context.Context) (map[string]Scope, error) { |
| paddy@0 | 31 m.lock.RLock() |
| paddy@0 | 32 defer m.lock.RUnlock() |
| paddy@0 | 33 |
| paddy@0 | 34 scopes := map[string]Scope{} |
| paddy@0 | 35 for _, id := range ids { |
| paddy@0 | 36 scope, ok := m.scopes[id] |
| paddy@0 | 37 if !ok { |
| paddy@0 | 38 continue |
| paddy@0 | 39 } |
| paddy@0 | 40 scopes[id] = scope |
| paddy@0 | 41 } |
| paddy@0 | 42 return scopes, nil |
| paddy@0 | 43 } |
| paddy@0 | 44 |
| paddy@0 | 45 func (m *Memstore) UpdateScope(change ScopeChange, ctx context.Context) error { |
| paddy@0 | 46 m.lock.Lock() |
| paddy@0 | 47 defer m.lock.Unlock() |
| paddy@0 | 48 |
| paddy@0 | 49 scope, ok := m.scopes[change.ScopeID] |
| paddy@0 | 50 if !ok { |
| paddy@0 | 51 return ErrScopeNotFound |
| paddy@0 | 52 } |
| paddy@0 | 53 scope = ApplyChange(change, scope) |
| paddy@0 | 54 m.scopes[change.ScopeID] = scope |
| paddy@0 | 55 return nil |
| paddy@0 | 56 } |
| paddy@0 | 57 |
| paddy@0 | 58 func (m *Memstore) RemoveScopes(ids []string, ctx context.Context) error { |
| paddy@0 | 59 m.lock.Lock() |
| paddy@0 | 60 defer m.lock.Unlock() |
| paddy@0 | 61 |
| paddy@0 | 62 for _, id := range ids { |
| paddy@0 | 63 delete(m.scopes, id) |
| paddy@0 | 64 } |
| paddy@0 | 65 return nil |
| paddy@0 | 66 } |
| paddy@0 | 67 |
| paddy@0 | 68 func (m *Memstore) ListScopes(ctx context.Context) ([]Scope, error) { |
| paddy@0 | 69 m.lock.RLock() |
| paddy@0 | 70 defer m.lock.RUnlock() |
| paddy@0 | 71 |
| paddy@0 | 72 scopes := []Scope{} |
| paddy@0 | 73 for _, scope := range m.scopes { |
| paddy@0 | 74 scopes = append(scopes, scope) |
| paddy@0 | 75 } |
| paddy@0 | 76 sorted := Scopes(scopes) |
| paddy@0 | 77 sort.Sort(sorted) |
| paddy@0 | 78 scopes = sorted |
| paddy@0 | 79 return scopes, nil |
| paddy@0 | 80 } |