forked from manyminds/api2go
/
storage_chocolate.go
87 lines (70 loc) · 1.82 KB
/
storage_chocolate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package storage
import (
"fmt"
"sort"
"github.com/manyminds/api2go/examples/model"
)
// sorting
type byID []model.Chocolate
func (c byID) Len() int {
return len(c)
}
func (c byID) Swap(i, j int) {
c[i], c[j] = c[j], c[i]
}
func (c byID) Less(i, j int) bool {
return c[i].GetID() < c[j].GetID()
}
// NewChocolateStorage initializes the storage
func NewChocolateStorage() *ChocolateStorage {
return &ChocolateStorage{make(map[string]*model.Chocolate), 1}
}
// ChocolateStorage stores all of the tasty chocolate, needs to be injected into
// User and Chocolate Resource. In the real world, you would use a database for that.
type ChocolateStorage struct {
chocolates map[string]*model.Chocolate
idCount int
}
// GetAll of the chocolate
func (s ChocolateStorage) GetAll() []model.Chocolate {
result := []model.Chocolate{}
for key := range s.chocolates {
result = append(result, *s.chocolates[key])
}
sort.Sort(byID(result))
return result
}
// GetOne tasty chocolate
func (s ChocolateStorage) GetOne(id string) (model.Chocolate, error) {
choc, ok := s.chocolates[id]
if ok {
return *choc, nil
}
return model.Chocolate{}, fmt.Errorf("Chocolate for id %s not found", id)
}
// Insert a fresh one
func (s *ChocolateStorage) Insert(c model.Chocolate) string {
id := fmt.Sprintf("%d", s.idCount)
c.ID = id
s.chocolates[id] = &c
s.idCount++
return id
}
// Delete one :(
func (s *ChocolateStorage) Delete(id string) error {
_, exists := s.chocolates[id]
if !exists {
return fmt.Errorf("Chocolate with id %s does not exist", id)
}
delete(s.chocolates, id)
return nil
}
// Update updates an existing chocolate
func (s *ChocolateStorage) Update(c model.Chocolate) error {
_, exists := s.chocolates[c.ID]
if !exists {
return fmt.Errorf("Chocolate with id %s does not exist", c.ID)
}
s.chocolates[c.ID] = &c
return nil
}