2021-12-09 02:04:15 +00:00
|
|
|
package hmndata
|
2021-12-08 03:37:52 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"git.handmade.network/hmn/hmn/src/db"
|
|
|
|
"git.handmade.network/hmn/hmn/src/models"
|
|
|
|
"git.handmade.network/hmn/hmn/src/oops"
|
2021-12-09 02:04:15 +00:00
|
|
|
"git.handmade.network/hmn/hmn/src/perf"
|
2021-12-08 03:37:52 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type TagQuery struct {
|
|
|
|
IDs []int
|
|
|
|
Text []string
|
|
|
|
|
|
|
|
Limit, Offset int
|
|
|
|
}
|
|
|
|
|
|
|
|
func FetchTags(ctx context.Context, dbConn db.ConnOrTx, q TagQuery) ([]*models.Tag, error) {
|
2021-12-09 02:04:15 +00:00
|
|
|
perf := perf.ExtractPerf(ctx)
|
2021-12-11 19:08:10 +00:00
|
|
|
perf.StartBlock("SQL", "Fetch tags")
|
2021-12-08 03:37:52 +00:00
|
|
|
defer perf.EndBlock()
|
|
|
|
|
|
|
|
var qb db.QueryBuilder
|
|
|
|
qb.Add(
|
|
|
|
`
|
|
|
|
SELECT $columns
|
2022-05-07 13:11:05 +00:00
|
|
|
FROM tag
|
2021-12-08 03:37:52 +00:00
|
|
|
WHERE
|
|
|
|
TRUE
|
|
|
|
`,
|
|
|
|
)
|
|
|
|
if len(q.IDs) > 0 {
|
|
|
|
qb.Add(`AND id = ANY ($?)`, q.IDs)
|
|
|
|
}
|
|
|
|
if len(q.Text) > 0 {
|
|
|
|
qb.Add(`AND text = ANY ($?)`, q.Text)
|
|
|
|
}
|
|
|
|
if q.Limit > 0 {
|
|
|
|
qb.Add(`LIMIT $? OFFSET $?`, q.Limit, q.Offset)
|
|
|
|
}
|
|
|
|
|
2022-04-16 17:49:29 +00:00
|
|
|
tags, err := db.Query[models.Tag](ctx, dbConn, qb.String(), qb.Args()...)
|
2021-12-08 03:37:52 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, oops.New(err, "failed to fetch tags")
|
|
|
|
}
|
2022-04-16 17:49:29 +00:00
|
|
|
return tags, nil
|
2021-12-08 03:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func FetchTag(ctx context.Context, dbConn db.ConnOrTx, q TagQuery) (*models.Tag, error) {
|
|
|
|
tags, err := FetchTags(ctx, dbConn, q)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(tags) == 0 {
|
|
|
|
return nil, db.NotFound
|
|
|
|
}
|
|
|
|
return tags[0], nil
|
|
|
|
}
|