/
gallery.go
136 lines (115 loc) · 2.66 KB
/
gallery.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package model
import "github.com/jinzhu/gorm"
const (
ErrUserIDRequired modelError = "model: user ID is required"
ErrTitleRequired modelError = "model: title is required"
)
// Gallery contains images to view
type Gallery struct {
gorm.Model
UserID uint `gorm:"not_null;index"`
Title string `gorm:"not_null"`
}
// GalleryService provides an interface to the Gallery model
type GalleryService interface {
GalleryDB
}
// GalleryDB is the DB connection for galleries
type GalleryDB interface {
ByID(id uint) (*Gallery, error)
Create(gallery *Gallery) error
Update(gallery *Gallery) error
Delete(id uint) error
}
type galleryService struct {
GalleryDB
}
type galleryValidator struct {
GalleryDB
}
type galleryGorm struct {
db *gorm.DB
}
// NewGalleryService instantiates a new GalleryService
func NewGalleryService(db *gorm.DB) GalleryService {
return &galleryService{
GalleryDB: &galleryValidator{
GalleryDB: &galleryGorm{
db: db,
},
},
}
}
func (gv *galleryValidator) Create(gallery *Gallery) error {
err := runGalleryValFns(gallery,
gv.userIDRequired,
gv.titleRequired)
if err != nil {
return err
}
return gv.GalleryDB.Create(gallery)
}
func (gg *galleryGorm) Create(gallery *Gallery) error {
return gg.db.Create(gallery).Error
}
func (gg *galleryGorm) ByID(id uint) (*Gallery, error) {
var gallery Gallery
db := gg.db.Where("id = ?", id)
err := first(db, &gallery)
if err != nil {
return nil, err
}
return &gallery, nil
}
func (gv *galleryValidator) Update(gallery *Gallery) error {
err := runGalleryValFns(gallery,
gv.userIDRequired,
gv.titleRequired,
)
if err != nil {
return err
}
return gv.GalleryDB.Update(gallery)
}
func (gg *galleryGorm) Update(gallery *Gallery) error {
return gg.db.Save(gallery).Error
}
func (gv *galleryValidator) Delete(id uint) error {
var gallery Gallery
gallery.ID = id
if err := runGalleryValFns(&gallery, gv.nonZeroID); err != nil {
return err
}
return gv.GalleryDB.Delete(gallery.ID)
}
func (gg *galleryGorm) Delete(id uint) error {
gallery := Gallery{Model: gorm.Model{ID: id}}
return gg.db.Delete(&gallery).Error
}
type galleryValFn func(*Gallery) error
func runGalleryValFns(gallery *Gallery, fns ...galleryValFn) error {
for _, fn := range fns {
if err := fn(gallery); err != nil {
return err
}
}
return nil
}
func (gv *galleryValidator) userIDRequired(g *Gallery) error {
if g.UserID <= 0 {
return ErrUserIDRequired
}
return nil
}
func (gv *galleryValidator) titleRequired(g *Gallery) error {
if g.Title == "" {
return ErrTitleRequired
}
return nil
}
func (gv *galleryValidator) nonZeroID(gallery *Gallery) error {
if gallery.ID <= 0 {
return ErrIDInvalid
}
return nil
}