-
Notifications
You must be signed in to change notification settings - Fork 5
/
storage_mem.go
90 lines (69 loc) · 1.82 KB
/
storage_mem.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
88
89
90
package main
import model "github.com/golang-bristol/beer-model"
// StorageMemory data storage type save only in memory
type StorageMemory struct {
cellar []model.Beer
reviews []model.Review
}
// SaveBeer insert or update beers
func (s *StorageMemory) SaveBeer(beers ...model.Beer) error {
for _, beer := range beers {
var err error
beersFound, err := s.FindBeer(beer)
if err != nil {
return err
}
if len(beersFound) == 1 {
*beersFound[0] = beer
return nil
}
beer.ID = len(s.cellar) + 1
s.cellar = append(s.cellar, beer)
}
return nil
}
// SaveReview insert or update reviews
func (s *StorageMemory) SaveReview(reviews ...model.Review) error {
for _, review := range reviews {
var err error
reviewsFound, err := s.FindReview(review)
if err != nil {
return err
}
if len(reviewsFound) == 1 {
*reviewsFound[0] = review
return nil
}
review.ID = len(s.reviews) + 1
s.reviews = append(s.reviews, review)
}
return nil
}
// FindBeer locate full data set based on given criteria
func (s *StorageMemory) FindBeer(criteria model.Beer) ([]*model.Beer, error) {
var beers []*model.Beer
for idx := range s.cellar {
if s.cellar[idx].ID == criteria.ID {
beers = append(beers, &s.cellar[idx])
}
}
return beers, nil
}
// FindReview locate full data set based on given criteria
func (s *StorageMemory) FindReview(criteria model.Review) ([]*model.Review, error) {
var reviews []*model.Review
for idx := range s.reviews {
if s.reviews[idx].ID == criteria.ID || s.reviews[idx].BeerID == criteria.BeerID {
reviews = append(reviews, &s.reviews[idx])
}
}
return reviews, nil
}
// FindBeers return all beers
func (s *StorageMemory) FindBeers() []model.Beer {
return s.cellar
}
// FindReviews return all reviews
func (s *StorageMemory) FindReviews() []model.Review {
return s.reviews
}