-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathffuncs.go
141 lines (119 loc) · 2.8 KB
/
ffuncs.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
137
138
139
140
141
/*
filter provides set of FilterFunc functions.
*/
package core
import "github.com/jinzhu/gorm"
// FilterFunc is callback which is called in some methods (Get, List)
type FilterFunc func(*gorm.DB) *gorm.DB
/*
ApplyFilterFuncs applies all FilterFuncs and returns db
*/
func ApplyFilterFuncs(db *gorm.DB, funcs ...FilterFunc) *gorm.DB {
for _, f := range funcs {
db = f(db)
}
return db
}
/*
FilterUsername filters user by username
*/
func FFUsername(username string) FilterFunc {
return func(db *gorm.DB) *gorm.DB {
return db.Where("username = ?", username)
}
}
/*
FFID adds clause to search by id
*/
func FFID(id interface{}) FilterFunc {
return func(db *gorm.DB) *gorm.DB {
return db.Where("id = ?", id)
}
}
/*
FFOrderBy orders by
*/
func FFOrderBy(order string) FilterFunc {
return func(db *gorm.DB) *gorm.DB {
return db.Order(order, false)
}
}
/*
FFPackagesFor filters packages by given user, user is either author or maintainer
*/
func FFPackagesFor(user User) FilterFunc {
return func(db *gorm.DB) *gorm.DB {
maintainers := []User{}
other := db.New()
ids := make([]uint, 0, len(maintainers))
var pid uint
rows, err := other.Table("package_maintainers").Where("user_id = ?", user.ID).Select("package_id").Rows()
if err != nil {
db.Error = err
return db
}
for rows.Next() {
rows.Scan(&pid)
ids = append(ids, pid)
}
// if we have found packages that are maintained by user
if len(ids) > 0 {
db = db.Where("author_id = ? OR id IN (?)", user.ID, ids)
} else {
db = db.Where("author_id = ?", user.ID)
}
return db
}
}
/*
FFPreload add preloads to que
*/
func FFPreload(preloads ...string) FilterFunc {
return func(db *gorm.DB) *gorm.DB {
for _, preload := range preloads {
db = db.Preload(preload)
}
return db
}
}
/*
FFDownloadStatsPackage filters stats by package
*/
func FFDownloadStatsPackage(pack *Package) FilterFunc {
return func(db *gorm.DB) *gorm.DB {
versions := []PackageVersion{}
// first select all versions for IN clause
other := db.New()
other.Model(pack).Related(&versions)
// prepare list of ids
ids := make([]uint, 0, len(versions))
for _, version := range versions {
ids = append(ids, version.ID)
}
// if ids, add where clause, otherwise select none
if len(ids) > 0 {
db = db.Where("package_version_id IN (?)", ids)
} else {
db = db.Where("package_version_id IN (0)", ids)
}
return db
}
}
/*
FFDownloadStatsPackage filters stats by package
*/
func FFDownloadStatsPackageVersion(pv *PackageVersion) FilterFunc {
return func(db *gorm.DB) *gorm.DB {
db = db.Where("package_version_id = ?", pv.ID)
return db
}
}
/*
FFWhere is shorthand for gorm Where
*/
func FFWhere(query interface{}, args ...interface{}) FilterFunc {
return func(db *gorm.DB) *gorm.DB {
queryset := db.Where(query, args...)
return queryset
}
}