scopes
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.
| 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 } |