scopes

Paddy 2015-12-05 Child:b93938562a17

0:b2ab1ab8f157 Go to Latest

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.

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@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 }