Skip to content

Commit 5173393

Browse files
authored
feat: using goqrius in blog posts endpoint (#68)
1 parent 4e97b07 commit 5173393

File tree

7 files changed

+79
-28
lines changed

7 files changed

+79
-28
lines changed

go.mod

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ require (
88
github.com/gin-contrib/sessions v1.0.4
99
github.com/gin-gonic/gin v1.11.0
1010
github.com/golang-migrate/migrate/v4 v4.19.0
11+
github.com/golaxo/goqrius v0.0.2
12+
github.com/golaxo/gormgoqrius v0.0.2
1113
github.com/google/uuid v1.6.0
1214
github.com/manuelarte/pagorminator v0.1.0
1315
github.com/manuelarte/ptrutils v1.0.1
@@ -73,13 +75,13 @@ require (
7375
go.uber.org/mock v0.5.0 // indirect
7476
go.yaml.in/yaml/v4 v4.0.0-rc.2 // indirect
7577
golang.org/x/arch v0.20.0 // indirect
76-
golang.org/x/crypto v0.40.0 // indirect
77-
golang.org/x/mod v0.25.0 // indirect
78-
golang.org/x/net v0.42.0 // indirect
79-
golang.org/x/sync v0.16.0 // indirect
80-
golang.org/x/sys v0.35.0 // indirect
81-
golang.org/x/text v0.27.0 // indirect
82-
golang.org/x/tools v0.34.0 // indirect
78+
golang.org/x/crypto v0.42.0 // indirect
79+
golang.org/x/mod v0.28.0 // indirect
80+
golang.org/x/net v0.44.0 // indirect
81+
golang.org/x/sync v0.17.0 // indirect
82+
golang.org/x/sys v0.36.0 // indirect
83+
golang.org/x/text v0.30.0 // indirect
84+
golang.org/x/tools v0.37.0 // indirect
8385
google.golang.org/protobuf v1.36.9 // indirect
8486
gopkg.in/yaml.v2 v2.4.0 // indirect
8587
gopkg.in/yaml.v3 v3.0.1 // indirect

go.sum

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
7070
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
7171
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
7272
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
73+
github.com/golaxo/goqrius v0.0.2 h1:ZmPjtfh04IH69dj+hzsnxDsn+HWPmxhp1t6qcXY4l8U=
74+
github.com/golaxo/goqrius v0.0.2/go.mod h1:UsfNoEqAUp9jPx81JsytcSds2qVJbqyWtt1qBdWivAk=
75+
github.com/golaxo/gormgoqrius v0.0.2 h1:vb7KWNWaLVCLrD87Y0ztQHomSy+kMO6juHnLFrH1wLE=
76+
github.com/golaxo/gormgoqrius v0.0.2/go.mod h1:UIguftghA46WTyYg9SbvKCIhCBLxavdIiM5hmIxjv/Q=
7377
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
7478
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
7579
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -216,25 +220,25 @@ golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
216220
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
217221
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
218222
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
219-
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
220-
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
223+
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
224+
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
221225
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
222-
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
223-
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
226+
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
227+
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
224228
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
225229
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
226230
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
227231
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
228232
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
229233
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
230234
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
231-
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
232-
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
235+
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
236+
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
233237
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
234238
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
235239
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
236-
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
237-
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
240+
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
241+
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
238242
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
239243
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
240244
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -251,21 +255,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
251255
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
252256
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
253257
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
254-
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
255-
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
258+
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
259+
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
256260
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
257261
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
258262
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
259263
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
260264
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
261265
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
262-
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
263-
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
266+
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
267+
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
264268
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
265269
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
266270
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
267-
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
268-
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
271+
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
272+
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
269273
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
270274
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
271275
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/api/rest/gen.go

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/api/rest/posts_handler.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"strconv"
66

77
"github.com/gin-gonic/gin"
8+
"github.com/golaxo/goqrius"
89
"github.com/manuelarte/pagorminator"
910
"github.com/manuelarte/ptrutils"
1011

@@ -37,6 +38,17 @@ func (h *PostsHandler) GetPostByID(c *gin.Context, postID uint) {
3738
}
3839

3940
func (h *PostsHandler) GetPosts(c *gin.Context, params GetPostsParams) {
41+
q, err := goqrius.Parse(ptrutils.DerefOr(params.Q, ""))
42+
if err != nil {
43+
c.JSON(http.StatusBadRequest, ErrorResponse{
44+
Code: http.StatusBadRequest,
45+
Details: err.Error(),
46+
Message: "Error parsing the q parameter",
47+
})
48+
49+
return
50+
}
51+
4052
pageRequest, err := pagorminator.PageRequest(
4153
ptrutils.DerefOr(params.Page, 0),
4254
ptrutils.DerefOr(params.Size, defaultPageRequestSize),
@@ -51,7 +63,7 @@ func (h *PostsHandler) GetPosts(c *gin.Context, params GetPostsParams) {
5163

5264
return
5365
}
54-
postPage, err := h.service.GetAll(c, pageRequest)
66+
postPage, err := h.service.GetAll(c, q, pageRequest)
5567
if err != nil {
5668
c.JSON(http.StatusBadRequest, ErrorResponse{
5769
Code: http.StatusBadRequest,

internal/posts/repository.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package posts
33
import (
44
"context"
55

6+
"github.com/golaxo/goqrius"
7+
"github.com/golaxo/gormgoqrius"
68
"github.com/manuelarte/pagorminator"
79
"gorm.io/gorm"
810

@@ -11,7 +13,7 @@ import (
1113

1214
//nolint:iface // separate repository from service
1315
type Repository interface {
14-
GetAll(ctx context.Context, pageRequest *pagorminator.Pagination) ([]*models.Post, error)
16+
GetAll(ctx context.Context, q goqrius.Expression, pageRequest *pagorminator.Pagination) ([]*models.Post, error)
1517
GetByID(ctx context.Context, id uint) (models.Post, error)
1618
}
1719

@@ -25,9 +27,19 @@ func NewRepository(db *gorm.DB) Repository {
2527
return &gormRepository{DB: db}
2628
}
2729

28-
func (b gormRepository) GetAll(ctx context.Context, pageRequest *pagorminator.Pagination) ([]*models.Post, error) {
30+
func (b gormRepository) GetAll(
31+
ctx context.Context,
32+
q goqrius.Expression,
33+
pageRequest *pagorminator.Pagination,
34+
) ([]*models.Post, error) {
2935
var posts []*models.Post
30-
tx := b.DB.WithContext(ctx).Clauses(pageRequest).Find(&posts)
36+
37+
whereClause := gormgoqrius.WhereClause(q)
38+
tx := b.DB.WithContext(ctx).Clauses(pageRequest)
39+
if whereClause != nil {
40+
tx = tx.Clauses(whereClause)
41+
}
42+
tx = tx.Find(&posts)
3143
if tx.Error != nil {
3244
return nil, tx.Error
3345
}

internal/posts/service.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ package posts
33
import (
44
"context"
55

6+
"github.com/golaxo/goqrius"
67
"github.com/manuelarte/pagorminator"
78

89
"github.com/manuelarte/gowasp/internal/models"
910
)
1011

1112
//nolint:iface // separate repository from service
1213
type Service interface {
13-
GetAll(ctx context.Context, pagination *pagorminator.Pagination) ([]*models.Post, error)
14+
// GetAll post based on the filtering expression q and the pagination information.
15+
GetAll(ctx context.Context, q goqrius.Expression, pagination *pagorminator.Pagination) ([]*models.Post, error)
1416
GetByID(ctx context.Context, id uint) (models.Post, error)
1517
}
1618

@@ -24,10 +26,12 @@ func NewService(repository Repository) Service {
2426
return &serviceImpl{repository: repository}
2527
}
2628

27-
func (b serviceImpl) GetAll(ctx context.Context,
29+
func (b serviceImpl) GetAll(
30+
ctx context.Context,
31+
q goqrius.Expression,
2832
pagination *pagorminator.Pagination,
2933
) ([]*models.Post, error) {
30-
posts, err := b.repository.GetAll(ctx, pagination)
34+
posts, err := b.repository.GetAll(ctx, q, pagination)
3135
if err != nil {
3236
return nil, err
3337
}

openapi.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,14 @@ paths:
140140
default: "postedAt,asc"
141141
description: Sorting criteria
142142
example: "postedAt,asc"
143+
- in: query
144+
name: q
145+
required: false
146+
schema:
147+
type: string
148+
default: ""
149+
format: rfc8040
150+
example: "title eq 'Cats are evil'"
143151
responses:
144152
"200":
145153
description: Post page retrieved

0 commit comments

Comments
 (0)