diff --git a/src/serra/add.go b/src/serra/add.go index 9726c8e..b6f1cb3 100644 --- a/src/serra/add.go +++ b/src/serra/add.go @@ -93,7 +93,7 @@ func addCards(cards []string, unique bool, count int64) error { setName := strings.Split(card, "/")[0] // Check if card is already in collection - co, err := coll.storageFind(bson.D{{"set", setName}, {"collectornumber", collectorNumber}}, bson.D{}) + co, err := coll.storageFind(bson.D{{"set", setName}, {"collectornumber", collectorNumber}}, bson.D{}, 0, 0) if err != nil { LogMessage(fmt.Sprintf("%v", err), "red") continue diff --git a/src/serra/card.go b/src/serra/card.go index 4768f8c..95b0d11 100644 --- a/src/serra/card.go +++ b/src/serra/card.go @@ -33,7 +33,7 @@ otherwise you'll get a list of cards as a search result.`, SilenceErrors: true, RunE: func(cmd *cobra.Command, cards []string) error { if len(cards) == 0 { - cardList := Cards(rarity, set, sortby, name, oracle, cardType, reserved, foil) + cardList := Cards(rarity, set, sortby, name, oracle, cardType, reserved, foil, 0, 0) showCardList(cardList, detail) } else { ShowCard(cards) @@ -53,7 +53,7 @@ func ShowCard(cardids []string) { continue } - cards, _ := coll.storageFind(bson.D{{"set", strings.Split(v, "/")[0]}, {"collectornumber", strings.Split(v, "/")[1]}}, bson.D{{"name", 1}}) + cards, _ := coll.storageFind(bson.D{{"set", strings.Split(v, "/")[0]}, {"collectornumber", strings.Split(v, "/")[1]}}, bson.D{{"name", 1}}, 0, 0) for _, card := range cards { showCardDetails(&card) @@ -61,7 +61,7 @@ func ShowCard(cardids []string) { } } -func Cards(rarity, set, sortby, name, oracle, cardType string, reserved, foil bool) []Card { +func Cards(rarity, set, sortby, name, oracle, cardType string, reserved, foil bool, skip, limit int64) []Card { client := storageConnect() coll := &Collection{client.Database("serra").Collection("cards")} defer storageDisconnect(client) @@ -123,7 +123,7 @@ func Cards(rarity, set, sortby, name, oracle, cardType string, reserved, foil bo filter = append(filter, bson.E{"serra_count", bson.D{{"$gte", count}}}) } - cards, _ := coll.storageFind(filter, sortStage) + cards, _ := coll.storageFind(filter, sortStage, skip, limit) // This is needed because collectornumbers are strings (ie. "23a") but still we // want it to be sorted numerically ... 1,2,3,10,11,100. diff --git a/src/serra/helpers.go b/src/serra/helpers.go index 2a3612f..f325f14 100644 --- a/src/serra/helpers.go +++ b/src/serra/helpers.go @@ -21,7 +21,7 @@ func modifyCardCount(coll *Collection, c *Card, amount int64, foil bool) error { // find already existing card sort := bson.D{{"_id", 1}} searchFilter := bson.D{{"_id", c.ID}} - storedCards, err := coll.storageFind(searchFilter, sort) + storedCards, err := coll.storageFind(searchFilter, sort, 0, 0) if err != nil { return err } @@ -54,7 +54,7 @@ func modifyCardCount(coll *Collection, c *Card, amount int64, foil bool) error { func findCardByCollectorNumber(coll *Collection, setCode string, collectorNumber string) (*Card, error) { sort := bson.D{{"_id", 1}} searchFilter := bson.D{{"set", setCode}, {"collectornumber", collectorNumber}} - storedCards, err := coll.storageFind(searchFilter, sort) + storedCards, err := coll.storageFind(searchFilter, sort, 0, 0) if err != nil { return &Card{}, err } diff --git a/src/serra/missing.go b/src/serra/missing.go index 62c1c22..4cc7c71 100644 --- a/src/serra/missing.go +++ b/src/serra/missing.go @@ -26,7 +26,7 @@ cards you dont own (yet) :)`, defer storageDisconnect(client) // fetch all cards in set - cards, err := coll.storageFind(bson.D{{"set", setName[0]}}, bson.D{{"collectornumber", 1}}) + cards, err := coll.storageFind(bson.D{{"set", setName[0]}}, bson.D{{"collectornumber", 1}}, 0, 0) if (err != nil) || len(cards) == 0 { LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setName[0]), "red") return err diff --git a/src/serra/set.go b/src/serra/set.go index c28afc3..1866e5b 100644 --- a/src/serra/set.go +++ b/src/serra/set.go @@ -95,7 +95,7 @@ func ShowSet(setname string) error { if getCurrency() == "EUR" { cardSortCurrency = bson.D{{"prices.eur", -1}} } - cards, err := coll.storageFind(bson.D{{"set", setname}}, cardSortCurrency) + cards, err := coll.storageFind(bson.D{{"set", setname}}, cardSortCurrency, 0, 0) if (err != nil) || len(cards) == 0 { LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setname), "red") return err diff --git a/src/serra/stats.go b/src/serra/stats.go index f8cb55b..0abd7a3 100644 --- a/src/serra/stats.go +++ b/src/serra/stats.go @@ -25,7 +25,7 @@ var statsCmd = &cobra.Command{ totalcoll := &Collection{client.Database("serra").Collection("total")} defer storageDisconnect(client) - // Generate list of Sets + // Colors sets, _ := coll.storageAggregate(mongo.Pipeline{ bson.D{ {"$match", bson.D{ diff --git a/src/serra/storage.go b/src/serra/storage.go index 23a0cb9..591d80b 100644 --- a/src/serra/storage.go +++ b/src/serra/storage.go @@ -101,8 +101,8 @@ func (coll Collection) storageAddTotal(p PriceEntry) error { return nil } -func (coll Collection) storageFind(filter, sort bson.D) ([]Card, error) { - opts := options.Find().SetSort(sort) +func (coll Collection) storageFind(filter, sort bson.D, skip, limit int64) ([]Card, error) { + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { LogMessage(fmt.Sprintf("Could not query data due to connection errors to database: %s", err.Error()), "red") diff --git a/src/serra/update.go b/src/serra/update.go index 5c36319..e185974 100644 --- a/src/serra/update.go +++ b/src/serra/update.go @@ -55,7 +55,7 @@ var updateCmd = &cobra.Command{ set.SerraPrices = []PriceEntry{} setscoll.storageAddSet(&set) - cards, _ := coll.storageFind(bson.D{{"set", set.Code}}, bson.D{{"_id", 1}}) + cards, _ := coll.storageFind(bson.D{{"set", set.Code}}, bson.D{{"_id", 1}}, 0, 0) // if no cards in collection for this set, skip it if len(cards) == 0 { diff --git a/src/serra/web.go b/src/serra/web.go index 4d57c3d..7138768 100644 --- a/src/serra/web.go +++ b/src/serra/web.go @@ -27,9 +27,11 @@ var webCmd = &cobra.Command{ } type Query struct { - Name string `form:"name"` - Set string `form:"set"` - Sort string `form:"sort"` + Name string `form:"name"` + Set string `form:"set"` + Sort string `form:"sort"` + Limit int64 `form:"limit"` + Page int64 `form:"page"` } func startWeb() error { @@ -47,13 +49,25 @@ func startWeb() error { func landingPage(c *gin.Context) { var query Query if c.ShouldBind(&query) == nil { - cards := Cards("", query.Set, query.Sort, query.Name, "", "", false, false) + if query.Limit == 0 { + query.Limit = 500 + } + cards := Cards("", query.Set, query.Sort, query.Name, "", "", false, false, query.Page, query.Limit) + numCards := len(Cards("", query.Set, query.Sort, query.Name, "", "", false, false, 0, 0)) sets := Sets("release") + c.HTML(http.StatusOK, "index.tmpl", gin.H{ - "title": "Serra", - "cards": cards, - "sets": sets, - "version": Version, + "title": "Serra", + "cards": cards, + "sets": sets, + "query": query, + "version": Version, + "prevPage": query.Page - 1, + "page": query.Page, + "nextPage": query.Page + 1, + "limit": query.Limit, + "numCards": numCards, + "numPages": int64(numCards) / query.Limit, }) } } diff --git a/templates/index.tmpl b/templates/index.tmpl index 7bfcb85..3bcfdc7 100644 --- a/templates/index.tmpl +++ b/templates/index.tmpl @@ -5,8 +5,9 @@