From 009b2b31d40dd1df9d0e012f1bd05004ea54c9b6 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Mon, 11 Jul 2022 20:40:53 +0200 Subject: [PATCH] web: add total pages indexed to home page --- cmd/sh-web/main.go | 20 +++++++++++++++----- go.mod | 1 + go.sum | 2 ++ graph/schema.graphqls | 7 +++++++ graph/schema.resolvers.go | 18 ++++++++++++++++++ query/queries.gql | 7 +++++++ templates/form.html | 4 ++++ 7 files changed, 54 insertions(+), 5 deletions(-) diff --git a/cmd/sh-web/main.go b/cmd/sh-web/main.go index 2f648db..d99e362 100644 --- a/cmd/sh-web/main.go +++ b/cmd/sh-web/main.go @@ -7,6 +7,7 @@ import ( "time" "git.sr.ht/~emersion/gqlclient" + "github.com/dustin/go-humanize" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" @@ -18,6 +19,7 @@ type IndexPage struct { Page string Title string Query string + Npage string } type SearchPage struct { @@ -25,11 +27,12 @@ type SearchPage struct { Title string Query string Results []query.Result + Npage string // Unused } type AboutPage struct { - Page string - Title string + Page string + Title string CrawlerUA string } @@ -57,9 +60,16 @@ func main() { client := gqlclient.New("http://localhost:8080/query", nil) router.Get("/", func(w http.ResponseWriter, r *http.Request) { - err := tmpl.ExecuteTemplate(w, "index.html", &IndexPage{ + results, err := query.GetStats(client, r.Context()) + if err != nil { + log.Println(err) + http.Error(w, "Error loading index", http.StatusInternalServerError) + return + } + err = tmpl.ExecuteTemplate(w, "index.html", &IndexPage{ Page: "index", Title: "searchhut", + Npage: humanize.Comma(int64(results.Npages)), }) if err != nil { log.Println(err) @@ -99,8 +109,8 @@ func main() { ua = "" } err := tmpl.ExecuteTemplate(w, "about.html", &AboutPage{ - Title: "About searchhut", - Page: "about", + Title: "About searchhut", + Page: "about", CrawlerUA: ua, }) if err != nil { diff --git a/go.mod b/go.mod index 993b64e..44d47d0 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( git.sr.ht/~emersion/gqlclient v0.0.0-20220202181617-4e6e9c763dd2 git.sr.ht/~sircmpwn/getopt v1.0.0 github.com/99designs/gqlgen v0.17.12 + github.com/dustin/go-humanize v1.0.0 github.com/go-chi/chi v1.5.4 github.com/go-shiori/go-readability v0.0.0-20220215145315-dd6828d2f09b github.com/lib/pq v1.10.6 diff --git a/go.sum b/go.sum index 4a5439b..5ee914b 100644 --- a/go.sum +++ b/go.sum @@ -41,6 +41,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g= github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= diff --git a/graph/schema.graphqls b/graph/schema.graphqls index 02e82c7..d50e485 100644 --- a/graph/schema.graphqls +++ b/graph/schema.graphqls @@ -30,7 +30,14 @@ type Result { context: String } +type Stats { + npages: Int! + ndomains: Int! +} + type Query { # TODO: Add cursors search(query: String!): [Result!]! + + stats: Stats! } diff --git a/graph/schema.resolvers.go b/graph/schema.resolvers.go index 0ffda80..914a86c 100644 --- a/graph/schema.resolvers.go +++ b/graph/schema.resolvers.go @@ -72,6 +72,24 @@ func (r *queryResolver) Search(ctx context.Context, query string) ([]*model.Resu return results, nil } +// Stats is the resolver for the stats field. +func (r *queryResolver) Stats(ctx context.Context) (*model.Stats, error) { + var stats model.Stats + if err := database.WithTx(ctx, &sql.TxOptions{ + ReadOnly: true, + Isolation: 0, + }, func(tx *sql.Tx) error { + row := tx.QueryRowContext(ctx, ` + SELECT + (SELECT count(*) FROM page), + (SELECT count(*) FROM domain);`) + return row.Scan(&stats.Npages, &stats.Ndomains) + }); err != nil { + return nil, err + } + return &stats, nil +} + // Page returns generated.PageResolver implementation. func (r *Resolver) Page() generated.PageResolver { return &pageResolver{r} } diff --git a/query/queries.gql b/query/queries.gql index 4cdf3a5..8d8f793 100644 --- a/query/queries.gql +++ b/query/queries.gql @@ -8,3 +8,10 @@ query Search($query: String!) { } } } + +query GetStats { + stats { + npages + ndomains + } +} diff --git a/templates/form.html b/templates/form.html index ec1615d..30f359b 100644 --- a/templates/form.html +++ b/templates/form.html @@ -13,7 +13,11 @@ type="text" id="q" name="q" + {{ if .Npage }} + placeholder="Search {{.Npage}} web pages..." + {{ else }} placeholder="Search terms..." + {{ end }} autofocus required value="{{.Query}}" />