147 lines
3.5 KiB
Go
147 lines
3.5 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
)
|
|
|
|
// Cards -
|
|
type Cards struct {
|
|
ID string `db:"id" cc:"id"`
|
|
Name string `db:"name" cc:"name"`
|
|
CMC float32 `db:"cmc" cc:"cmc"`
|
|
ManaCost string `db:"mana_cost" cc:"mana_cost"`
|
|
Set string `db:"set" cc:"set"`
|
|
Text string `db:"text" cc:"text"`
|
|
Layout string `db:"layout" cc:"layout"`
|
|
ImageURL string `db:"image_url" cc:"image_url"`
|
|
Loyalty string `db:"loyalty" cc:"loyalty"`
|
|
Type string `db:"type" cc:"type"`
|
|
Number string `db:"number" cc:"number"`
|
|
Power string `db:"power" cc:"power"`
|
|
Toughness string `db:"toughness" cc:"toughness"`
|
|
Names []string `db:"names" cc:"names"`
|
|
Colors []string `db:"colors" cc:"colors"`
|
|
ColorIdentity []string `db:"color_identity" cc:"color_identity"`
|
|
Types []string `db:"types" cc:"types"`
|
|
Subtypes []string `db:"subtypes" cc:"subtypes"`
|
|
Supertypes []string `db:"supertypes" cc:"supertypes"`
|
|
}
|
|
|
|
// order opts
|
|
const (
|
|
CardSearchOrderByName OrderStr = `c."name" asc`
|
|
CardSearchOrderByNameDesc = `c."name" desc`
|
|
CardSearchOrderByCMC = `c."cmc" asc`
|
|
CardSearchOrderByCMCDesc = `c."cmc" desc"`
|
|
)
|
|
|
|
// CardSearchCMC -
|
|
type CardSearchCMC struct {
|
|
Op OpStr
|
|
Val float32
|
|
}
|
|
|
|
// ListCardsOpts -
|
|
type ListCardsOpts struct {
|
|
OrderBy OrderStr
|
|
Name string
|
|
CMC *CardSearchCMC
|
|
Set string
|
|
Types []string
|
|
Limit int
|
|
Offset int
|
|
}
|
|
|
|
// CountCards -
|
|
func CountCards(arg ListCardsOpts) (c int, err error) {
|
|
c = 0
|
|
query := `select count(*) as count from "public"."cards" c`
|
|
where := struct {
|
|
Name string `db:"name"`
|
|
CMC float32 `db:"name"`
|
|
Set string `db:"set"`
|
|
}{}
|
|
|
|
whereStr := []string{}
|
|
if len(arg.Name) > 0 {
|
|
where.Name = arg.Name
|
|
whereStr = append(whereStr, `c."name" = :name`)
|
|
}
|
|
if len(arg.Set) > 0 {
|
|
where.Set = arg.Set
|
|
whereStr = append(whereStr, `c."set" = :set`)
|
|
}
|
|
if arg.CMC != nil {
|
|
where.CMC = arg.CMC.Val
|
|
whereStr = append(whereStr, fmt.Sprintf(`c."cmc" %s :cmc`, arg.CMC.Op))
|
|
}
|
|
|
|
wStr := ""
|
|
if len(whereStr) > 0 {
|
|
wStr = fmt.Sprintf("where %s", strings.Join(whereStr, " and "))
|
|
}
|
|
|
|
query = fmt.Sprintf("%s %s",
|
|
query,
|
|
wStr)
|
|
q, a, err := sqlx.Named(query, where)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
err = x.Get(&c, q, a...)
|
|
return
|
|
}
|
|
|
|
// ListCards -
|
|
func ListCards(arg ListCardsOpts) (cards []*Cards, err error) {
|
|
if arg.Limit < 1 {
|
|
arg.Limit = 1
|
|
}
|
|
if arg.Offset < 0 {
|
|
arg.Offset = 0
|
|
}
|
|
query := `select c.id, c.name, c.cmc, c.mana_cost, c.text, c.layout, c.image_url, c.loyalty,
|
|
c.type, c.number, c.power, c.toughness, c.set from "public"."cards" c`
|
|
where := struct {
|
|
Name string `db:"name"`
|
|
CMC float32 `db:"cmc"`
|
|
Set string `db:"set"`
|
|
}{}
|
|
whereStr := []string{}
|
|
if len(arg.Name) > 0 {
|
|
where.Name = arg.Name
|
|
whereStr = append(whereStr, `c."name" = :name`)
|
|
}
|
|
if len(arg.Set) > 0 {
|
|
where.Set = arg.Set
|
|
whereStr = append(whereStr, `c."set" = :set`)
|
|
}
|
|
if arg.CMC != nil {
|
|
where.CMC = arg.CMC.Val
|
|
whereStr = append(whereStr, fmt.Sprintf(`c."cmc" %s :cmc`, arg.CMC.Op))
|
|
}
|
|
|
|
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))
|
|
q, a, err := sqlx.Named(query, where)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = x.Select(&cards, q, a...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return
|
|
}
|