ducky/devices
ducky/devices/memstore.go
Return ErrDeviceNotFound when updating devices. If we can't find the Device we're supposed to update, return an ErrDeviceNotFound error. Write a unit test that tests for this behaviour.
| paddy@4 | 1 package devices |
| paddy@4 | 2 |
| paddy@4 | 3 import ( |
| paddy@4 | 4 "sync" |
| paddy@4 | 5 |
| paddy@4 | 6 "code.secondbit.org/uuid.hg" |
| paddy@4 | 7 "golang.org/x/net/context" |
| paddy@4 | 8 ) |
| paddy@4 | 9 |
| paddy@4 | 10 type Memstore struct { |
| paddy@4 | 11 devices map[string]Device |
| paddy@4 | 12 lock sync.RWMutex |
| paddy@4 | 13 } |
| paddy@4 | 14 |
| paddy@4 | 15 func NewMemstore() *Memstore { |
| paddy@4 | 16 return &Memstore{ |
| paddy@4 | 17 devices: map[string]Device{}, |
| paddy@4 | 18 } |
| paddy@4 | 19 } |
| paddy@4 | 20 |
| paddy@4 | 21 func (m *Memstore) GetDevices(ids []uuid.ID, c context.Context) (map[string]Device, error) { |
| paddy@4 | 22 m.lock.RLock() |
| paddy@4 | 23 defer m.lock.RUnlock() |
| paddy@4 | 24 |
| paddy@4 | 25 results := map[string]Device{} |
| paddy@4 | 26 |
| paddy@4 | 27 for _, id := range ids { |
| paddy@4 | 28 device, ok := m.devices[id.String()] |
| paddy@4 | 29 if !ok { |
| paddy@4 | 30 continue |
| paddy@4 | 31 } |
| paddy@4 | 32 results[id.String()] = device |
| paddy@4 | 33 } |
| paddy@4 | 34 return results, nil |
| paddy@4 | 35 } |
| paddy@4 | 36 |
| paddy@4 | 37 func (m *Memstore) UpdateDevice(change DeviceChange, c context.Context) error { |
| paddy@10 | 38 m.lock.Lock() |
| paddy@10 | 39 defer m.lock.Unlock() |
| paddy@10 | 40 |
| paddy@10 | 41 device, ok := m.devices[change.DeviceID.String()] |
| paddy@10 | 42 if !ok { |
| paddy@11 | 43 return ErrDeviceNotFound |
| paddy@10 | 44 } |
| paddy@10 | 45 |
| paddy@10 | 46 device = ApplyChange(device, change) |
| paddy@10 | 47 m.devices[change.DeviceID.String()] = device |
| paddy@10 | 48 |
| paddy@4 | 49 return nil |
| paddy@4 | 50 } |
| paddy@4 | 51 |
| paddy@4 | 52 func (m *Memstore) DeleteDevices(id []uuid.ID, c context.Context) error { |
| paddy@4 | 53 return nil |
| paddy@4 | 54 } |
| paddy@4 | 55 |
| paddy@4 | 56 func (m *Memstore) CreateDevices(devices []Device, c context.Context) error { |
| paddy@4 | 57 m.lock.Lock() |
| paddy@4 | 58 defer m.lock.Unlock() |
| paddy@4 | 59 |
| paddy@4 | 60 for _, device := range devices { |
| paddy@5 | 61 if _, ok := m.devices[device.ID.String()]; ok { |
| paddy@5 | 62 return ErrDeviceAlreadyExists(device.ID) |
| paddy@5 | 63 } |
| paddy@5 | 64 } |
| paddy@5 | 65 |
| paddy@5 | 66 for _, device := range devices { |
| paddy@4 | 67 m.devices[device.ID.String()] = device |
| paddy@4 | 68 } |
| paddy@4 | 69 return nil |
| paddy@4 | 70 } |
| paddy@4 | 71 |
| paddy@4 | 72 func (m *Memstore) ListDevicesByOwner(user uuid.ID, c context.Context) ([]Device, error) { |
| paddy@8 | 73 var devices []Device |
| paddy@8 | 74 for _, device := range m.devices { |
| paddy@8 | 75 if !device.Owner.Equal(user) { |
| paddy@8 | 76 continue |
| paddy@8 | 77 } |
| paddy@8 | 78 devices = append(devices, device) |
| paddy@8 | 79 } |
| paddy@8 | 80 return devices, nil |
| paddy@4 | 81 } |