mtgbot/models/sets.go
2019-01-03 15:58:32 +08:00

115 lines
2.1 KiB
Go

package models
import (
"fmt"
"strings"
"time"
"github.com/jmoiron/sqlx"
)
// Sets - product set
type Sets struct {
Code string `db:"code" cc:"code"`
Name string `db:"name" cc:"name"`
ReleaseDate time.Time `db:"release_date" cc:"release_date"`
}
// ListSetsOpts -
type ListSetsOpts struct {
OrderBy OrderStr
Code []string
Limit, Offset int
}
// order opts
const (
SetSearchOrderByName OrderStr = `s."name" asc`
SetSearchOrderByNameDesc = `s."name" desc`
)
// CountSets -
func CountSets(arg ListSetsOpts) (c int, err error) {
c = 0
query := `select count(*) as count from "public"."sets" s`
where := struct {
Code []string `db:"code"`
}{}
whereStr := []string{}
if len(arg.Code) > 0 {
where.Code = arg.Code
whereStr = append(whereStr, `s."code" in (:code)`)
}
wStr := ""
if len(whereStr) > 0 {
wStr = fmt.Sprintf(`where %s`, strings.Join(whereStr, " and "))
}
query = fmt.Sprintf("%s %s", query, wStr)
query, args, err := sqlx.Named(query, where)
if err != nil {
return 0, err
}
query, args, err = sqlx.In(query, args)
if err != nil {
return 0, err
}
query = x.Rebind(query)
err = x.Get(&c, query, args...)
return
}
// ListSets -
func ListSets(arg ListSetsOpts) (sets []*Sets, err error) {
if arg.Limit < 1 {
arg.Limit = 1
}
if arg.Offset < 0 {
arg.Offset = 0
}
query := `select s.code, s.name, s.release_date from "public"."sets" s`
where := struct {
Code []string `db:"code"`
}{}
whereStr := []string{}
if len(arg.Code) > 0 {
where.Code = arg.Code
whereStr = append(whereStr, `s."code" in (:code)`)
}
wStr := ""
if len(whereStr) > 0 {
wStr = fmt.Sprintf("where %s", strings.Join(whereStr, " and "))
}
query = fmt.Sprintf("%s %s %s %s",
query,
wStr,
arg.OrderBy,
fmt.Sprintf("limit %d offset %d", arg.Limit, arg.Offset))
query, args, err := sqlx.Named(query, where)
if err != nil {
return nil, err
}
query, args, err = sqlx.In(query, args)
if err != nil {
return nil, err
}
query = x.Rebind(query)
err = x.Select(&sets, query, args...)
if err != nil {
return nil, err
}
return
}