ducky/devices
ducky/devices/memstore.go
Implement ListDevicesByOwner. Write a unit test for listing Devices by their Owner property, as per our Storer interface. Basically, if we insert Devices into the datastore, we need to be able to retrieve the Devices that someone owns. Simple enough. This meant that I needed to implement the Memstore version, past the barebones stub, so the tests would continue to pass.
1 package devices
3 import (
4 "sync"
6 "code.secondbit.org/uuid.hg"
7 "golang.org/x/net/context"
8 )
10 type Memstore struct {
11 devices map[string]Device
12 lock sync.RWMutex
13 }
15 func NewMemstore() *Memstore {
16 return &Memstore{
17 devices: map[string]Device{},
18 }
19 }
21 func (m *Memstore) GetDevices(ids []uuid.ID, c context.Context) (map[string]Device, error) {
22 m.lock.RLock()
23 defer m.lock.RUnlock()
25 results := map[string]Device{}
27 for _, id := range ids {
28 device, ok := m.devices[id.String()]
29 if !ok {
30 continue
31 }
32 results[id.String()] = device
33 }
34 return results, nil
35 }
37 func (m *Memstore) UpdateDevice(change DeviceChange, c context.Context) error {
38 return nil
39 }
41 func (m *Memstore) DeleteDevices(id []uuid.ID, c context.Context) error {
42 return nil
43 }
45 func (m *Memstore) CreateDevices(devices []Device, c context.Context) error {
46 m.lock.Lock()
47 defer m.lock.Unlock()
49 for _, device := range devices {
50 if _, ok := m.devices[device.ID.String()]; ok {
51 return ErrDeviceAlreadyExists(device.ID)
52 }
53 }
55 for _, device := range devices {
56 m.devices[device.ID.String()] = device
57 }
58 return nil
59 }
61 func (m *Memstore) ListDevicesByOwner(user uuid.ID, c context.Context) ([]Device, error) {
62 var devices []Device
63 for _, device := range m.devices {
64 if !device.Owner.Equal(user) {
65 continue
66 }
67 devices = append(devices, device)
68 }
69 return devices, nil
70 }
72 func (m *Memstore) Factory(c context.Context) (Storer, error) {
73 return NewMemstore(), nil
74 }
76 func (m *Memstore) Destroy(c context.Context) error {
77 m.devices = nil
78 return nil
79 }