scopes

Paddy 2015-12-13 Parent:b93938562a17

2:a64a25ae2db1 Go to Latest

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.

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