scopes
2015-12-13
Parent:b93938562a17
scopes/memstore.go
Port over Postgres storage and tests. Do the minimum possible port of the code from auth to get Postgres working and make the tests run and pass again. This leaves a bug where the ErrScopeAlreadyExists type, when populatd from Postgres, contains the entire error string returned from the database, instead of parsing the ID itself out. Which is a thing we should do and add a test for.
| 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@2 | 17 func NewMemstore() *Memstore { |
| paddy@2 | 18 return &Memstore{ |
| paddy@2 | 19 scopes: map[string]scopeTypes.Scope{}, |
| paddy@2 | 20 } |
| paddy@2 | 21 } |
| paddy@2 | 22 |
| paddy@1 | 23 func (m *Memstore) CreateScopes(scopes []scopeTypes.Scope, ctx context.Context) error { |
| paddy@0 | 24 m.lock.Lock() |
| paddy@0 | 25 defer m.lock.Unlock() |
| paddy@0 | 26 |
| paddy@0 | 27 for _, scope := range scopes { |
| paddy@0 | 28 if _, ok := m.scopes[scope.ID]; ok { |
| paddy@0 | 29 return ErrScopeAlreadyExists(scope.ID) |
| paddy@0 | 30 } |
| paddy@0 | 31 } |
| paddy@0 | 32 for _, scope := range scopes { |
| paddy@0 | 33 m.scopes[scope.ID] = scope |
| paddy@0 | 34 } |
| paddy@0 | 35 return nil |
| paddy@0 | 36 } |
| paddy@0 | 37 |
| paddy@1 | 38 func (m *Memstore) GetScopes(ids []string, ctx context.Context) (map[string]scopeTypes.Scope, error) { |
| paddy@0 | 39 m.lock.RLock() |
| paddy@0 | 40 defer m.lock.RUnlock() |
| paddy@0 | 41 |
| paddy@1 | 42 scopes := map[string]scopeTypes.Scope{} |
| paddy@0 | 43 for _, id := range ids { |
| paddy@0 | 44 scope, ok := m.scopes[id] |
| paddy@0 | 45 if !ok { |
| paddy@0 | 46 continue |
| paddy@0 | 47 } |
| paddy@0 | 48 scopes[id] = scope |
| paddy@0 | 49 } |
| paddy@0 | 50 return scopes, nil |
| paddy@0 | 51 } |
| paddy@0 | 52 |
| paddy@1 | 53 func (m *Memstore) UpdateScope(change scopeTypes.ScopeChange, ctx context.Context) error { |
| paddy@0 | 54 m.lock.Lock() |
| paddy@0 | 55 defer m.lock.Unlock() |
| paddy@0 | 56 |
| paddy@0 | 57 scope, ok := m.scopes[change.ScopeID] |
| paddy@0 | 58 if !ok { |
| paddy@0 | 59 return ErrScopeNotFound |
| paddy@0 | 60 } |
| paddy@1 | 61 scope = scopeTypes.ApplyChange(change, scope) |
| paddy@0 | 62 m.scopes[change.ScopeID] = scope |
| paddy@0 | 63 return nil |
| paddy@0 | 64 } |
| paddy@0 | 65 |
| paddy@0 | 66 func (m *Memstore) RemoveScopes(ids []string, ctx context.Context) error { |
| paddy@0 | 67 m.lock.Lock() |
| paddy@0 | 68 defer m.lock.Unlock() |
| paddy@0 | 69 |
| paddy@0 | 70 for _, id := range ids { |
| paddy@0 | 71 delete(m.scopes, id) |
| paddy@0 | 72 } |
| paddy@0 | 73 return nil |
| paddy@0 | 74 } |
| paddy@0 | 75 |
| paddy@1 | 76 func (m *Memstore) ListScopes(ctx context.Context) ([]scopeTypes.Scope, error) { |
| paddy@0 | 77 m.lock.RLock() |
| paddy@0 | 78 defer m.lock.RUnlock() |
| paddy@0 | 79 |
| paddy@1 | 80 scopes := []scopeTypes.Scope{} |
| paddy@0 | 81 for _, scope := range m.scopes { |
| paddy@0 | 82 scopes = append(scopes, scope) |
| paddy@0 | 83 } |
| paddy@1 | 84 sorted := scopeTypes.Scopes(scopes) |
| paddy@0 | 85 sort.Sort(sorted) |
| paddy@0 | 86 scopes = sorted |
| paddy@0 | 87 return scopes, nil |
| paddy@0 | 88 } |