Skip to content

Commit 7474f22

Browse files
committed
Add the typeahead endpoint
1 parent 66178a6 commit 7474f22

File tree

3 files changed

+52
-18
lines changed

3 files changed

+52
-18
lines changed

api.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,17 @@ func HandleTerm(term string) func(*sql.DB) (int, []byte) {
235235
}
236236
}
237237

238+
func HandleTypeahead(db *sql.DB, req *http.Request) (int, []byte) {
239+
cards, err := FetchTypeahead(db, req.URL.Query().Get("q"))
240+
241+
if err != nil {
242+
log.Println(err)
243+
return JSON(http.StatusNotFound, Errors(" Can't find any cards that match that search"))
244+
}
245+
246+
return JSON(http.StatusOK, cards)
247+
}
248+
238249
type Pong struct {
239250
Rally string `json:"rally"`
240251
}
@@ -266,6 +277,7 @@ func NewApi() *martini.Martini {
266277

267278
r.Get("/ping", Ping)
268279
r.Get("/mtg/cards", HandleCards)
280+
r.Get("/mtg/cards/typeahead", HandleTypeahead)
269281
r.Get("/mtg/cards/:id", HandleCard)
270282
r.Get("/mtg/sets", HandleSets)
271283
r.Get("/mtg/sets/:id", HandleSet)

api_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func TestApi(t *testing.T) {
5151
"/mtg/cards?rarity=basic",
5252
"/mtg/cards?oracle=you+win+the+game",
5353
"/mtg/cards/1cdf2b87355ed978c0c5fe64bfc6a38c",
54+
"/mtg/cards/typeahead?q=nessian",
5455
"/mtg/sets",
5556
"/mtg/sets/UNH",
5657
"/mtg/colors",

database.go

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
_ "github.com/lib/pq"
88
"log"
99
"os"
10+
"strings"
1011
)
1112

1213
func GetDatabaseURL() (string, error) {
@@ -83,26 +84,11 @@ func FetchTerms(db *sql.DB, term string) ([]string, error) {
8384
return result, rows.Err()
8485
}
8586

86-
func FetchCards(db *sql.DB, cond Condition) ([]Card, error) {
87+
func scanCards(rows *sql.Rows) ([]Card, error) {
8788
cards := []Card{}
8889

89-
query := Select("record").From("cards").Where(cond).Limit(100).OrderBy("name", true)
90-
91-
ql, items, err := query.ToSql()
92-
93-
if err != nil {
94-
return cards, err
95-
}
96-
97-
log.Println(ql, items)
98-
99-
rows, err := db.Query(ql, items...)
100-
101-
if err != nil {
102-
return cards, err
103-
}
104-
10590
defer rows.Close()
91+
10692
for rows.Next() {
10793
var blob []byte
10894
var card Card
@@ -111,7 +97,7 @@ func FetchCards(db *sql.DB, cond Condition) ([]Card, error) {
11197
return cards, err
11298
}
11399

114-
err = json.Unmarshal(blob, &card)
100+
err := json.Unmarshal(blob, &card)
115101

116102
if err != nil {
117103
return cards, err
@@ -122,9 +108,44 @@ func FetchCards(db *sql.DB, cond Condition) ([]Card, error) {
122108
if err := rows.Err(); err != nil {
123109
return cards, err
124110
}
111+
125112
return cards, nil
126113
}
127114

115+
func FetchTypeahead(db *sql.DB, search string) ([]Card, error) {
116+
if strings.ContainsAny(search, "%_") {
117+
return []Card{}, fmt.Errorf("Search string can't contain '%%' or '_'")
118+
}
119+
120+
rows, err := db.Query("SELECT record FROM cards WHERE name ILIKE $1 ORDER BY name LIMIT 10", search+"%")
121+
122+
if err != nil {
123+
return []Card{}, err
124+
}
125+
126+
return scanCards(rows)
127+
}
128+
129+
func FetchCards(db *sql.DB, cond Condition) ([]Card, error) {
130+
query := Select("record").From("cards").Where(cond).Limit(100).OrderBy("name", true)
131+
132+
ql, items, err := query.ToSql()
133+
134+
if err != nil {
135+
return []Card{}, err
136+
}
137+
138+
log.Println(ql, items)
139+
140+
rows, err := db.Query(ql, items...)
141+
142+
if err != nil {
143+
return []Card{}, err
144+
}
145+
146+
return scanCards(rows)
147+
}
148+
128149
func FetchCard(db *sql.DB, id string) (Card, error) {
129150
var blob []byte
130151
var card Card

0 commit comments

Comments
 (0)