Skip to content

Commit

Permalink
Added listing pages (text and image)
Browse files Browse the repository at this point in the history
  • Loading branch information
fileformat committed Apr 3, 2024
1 parent b033ec1 commit c6d40e8
Show file tree
Hide file tree
Showing 12 changed files with 203 additions and 57 deletions.
8 changes: 4 additions & 4 deletions bimiHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ func bimiHandler(w http.ResponseWriter, r *http.Request) {
bimi, bimiErr := lookupBimi(domain)

runTemplate(w, r, "_bimi/index.tmpl", map[string]any{
"title": fmt.Sprintf("BIMI for %s", domain),
"domain": domain,
"err": bimiErr,
"bimi": bimi,
"Bimi": bimi,
"Domain": domain,
"Err": bimiErr,
"Title": fmt.Sprintf("BIMI Logo for %s", domain),
})
}
31 changes: 25 additions & 6 deletions database.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package main

import (
"context"
"fmt"
"net/url"
"os"

Expand Down Expand Up @@ -39,7 +38,7 @@ func upsertDomain(domain, imgurl string) error {
defer conn.Close(context.Background())

queries := generated.New(conn)
row, queryErr := queries.UpsertDomain(context.Background(), generated.UpsertDomainParams{
_, queryErr := queries.UpsertDomain(context.Background(), generated.UpsertDomainParams{
Domain: domain,
Imgurl: pgtype.Text{String: imgurl, Valid: true},
})
Expand All @@ -48,11 +47,29 @@ func upsertDomain(domain, imgurl string) error {
return queryErr
}

fmt.Printf("upsert=%v\n", row)
return nil
}

func listSampleDomains(limit int32) ([]generated.Domain, error) {
func countDomains() (int64, error) {

conn, connErr := connect()
if connErr != nil {
// already logged
return 0, connErr
}
defer conn.Close(context.Background())

queries := generated.New(conn)
row, queryErr := queries.CountDomains(context.Background())
if queryErr != nil {
logger.Error("Unable count rows", "err", queryErr)
return 0, queryErr
}

return row, nil
}

func listDomains(limit int32, offset int32) ([]generated.ListDomainsRow, error) {

conn, connErr := connect()
if connErr != nil {
Expand All @@ -62,12 +79,14 @@ func listSampleDomains(limit int32) ([]generated.Domain, error) {
defer conn.Close(context.Background())

queries := generated.New(conn)
rows, queryErr := queries.ListSampleDomains(context.Background(), limit)
rows, queryErr := queries.ListDomains(context.Background(), generated.ListDomainsParams{
Thelimit: limit,
Theoffset: offset,
})
if queryErr != nil {
logger.Error("Unable to insert into database", "err", queryErr)
return nil, queryErr
}

fmt.Printf("upsert=%v\n", rows)
return rows, nil
}
7 changes: 5 additions & 2 deletions db/queries.sql
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,8 @@ INSERT INTO domain
updated = NOW()
RETURNING *;

-- name: ListSampleDomains :many
SELECT * FROM domain LIMIT sqlc.arg(maxlimit);
-- name: ListDomains :many
SELECT domain, imgurl FROM domain ORDER BY domain LIMIT sqlc.arg(theLimit) OFFSET sqlc.arg(theOffset);

-- name: CountDomains :one
SELECT COUNT(*) AS "Count" FROM domain;
9 changes: 5 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,16 @@ func main() {
var listenAddress = os.Getenv("ADDRESS")

http.HandleFunc("/status.json", statusHandler)
http.HandleFunc("GET /{$}", rootHandlerGet)
http.HandleFunc("POST /{$}", rootHandlerPost)
http.HandleFunc("/{$}", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/bimi/", http.StatusSeeOther) })
http.HandleFunc("GET /bimi/{$}", rootHandlerGet)
http.HandleFunc("POST /bimi/{$}", rootHandlerPost)
http.HandleFunc("/robots.txt", staticHandler.ServeHTTP)
http.HandleFunc("/favicon.ico", staticHandler.ServeHTTP)
http.HandleFunc("/favicon.svg", staticHandler.ServeHTTP)
http.HandleFunc("/images/", staticHandler.ServeHTTP)
http.HandleFunc("POST /bimi/bulk.html", bulkHandlerPost)
http.HandleFunc("GET /bimi/bulk.html", bulkHandlerGet)
http.HandleFunc("/bimi/{domain}/{$}", bimiHandler)
http.HandleFunc("/bimi/list.html", listHandler)
http.HandleFunc("/bimi/view.html", viewHandler)

err := http.ListenAndServe(listenAddress+":"+strconv.Itoa(listenPort), nil)
if err != nil {
Expand Down
13 changes: 9 additions & 4 deletions partials/above.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{if (ne .h1 "")}}{{ .title }}{{else}}{{ .title }} - BIMI Explorer{{end}}</title>
<title>{{if .H1}}{{ .Title }}{{else}}{{ .Title }} - BIMI Explorer{{end}}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="unsafe-url" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
Expand Down Expand Up @@ -46,8 +46,8 @@
<nav class="navbar navbar-expand d-flex justify-content-between d-print-none border-bottom bg-body-tertiary pb-1 mb-2">
<div class="container">
<div class="navbar-nav">
<a class="navbar-brand h1 mb-0" href="/" title="{{.site.title}}"><span class="d-sm-none">BIMI</span><span class="d-none d-sm-inline"><img
alt="{{.site.title}} Logo" class="navbar-logo me-2" src="/images/logo.svg" style="height:1em;vertical-align:middle;"/>BIMI Explorer</span></a>
<a class="navbar-brand h1 mb-0" href="/" title="BIMI Explorer"><span class="d-sm-none">BIMI</span><span class="d-none d-sm-inline"><img
alt="BIMI Explorer Logo" class="navbar-logo me-2" src="/images/logo.svg" style="height:1em;vertical-align:middle;"/>BIMI Explorer</span></a>
</div>
<div class="navbar-nav">
<a class="nav-link" href="/">Home</a>
Expand All @@ -63,7 +63,12 @@
<div class="row">
<div class="col">
<h1>
{{if (ne .h1 "")}}{{.h1}}{{else}}{{ .title }}{{end}}
{{if .H1}}{{.H1}}{{else}}{{ .Title }}{{end}}
</h1>
<hr />
{{- if (ne .Err nil) }}
<div class="alert alert-danger">
{{.Err}}
</div>
{{- end}}
{{end}}
75 changes: 67 additions & 8 deletions rootHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,45 @@ package main
import (
"fmt"
"net/http"
"strconv"
)

func rootHandlerGet(w http.ResponseWriter, r *http.Request) {
func listHandler(w http.ResponseWriter, r *http.Request) {

pageSize, psErr := strconv.Atoi(r.URL.Query().Get("pageSize"))
if psErr != nil || pageSize < 1 {
pageSize = 2500
}

count, _ := countDomains()
maxPages := int(count / int64(pageSize))
if count%int64(pageSize) > 0 {
maxPages++
}

currentPage, cpErr := strconv.Atoi(r.URL.Query().Get("page"))
if cpErr != nil || currentPage < 1 || currentPage > maxPages {
currentPage = 1
}
domains, dbErr := listDomains(int32(pageSize), int32((currentPage-1)*pageSize))

runTemplate(w, r, "bimi/list.tmpl", map[string]any{
"Count": count,
"CurrentPage": currentPage,
"Domains": domains,
"Err": dbErr,
"MaxPage": maxPages,
"PageSize": pageSize,
"Title": "List Domains",
})

domains, dbErr := listSampleDomains(50)
}

func rootHandlerGet(w http.ResponseWriter, r *http.Request) {

runTemplate(w, r, "index.tmpl", map[string]any{
"domains": domains,
"err": dbErr,
"h1": "Welcome",
"title": "BIMI Explorer",
runTemplate(w, r, "bimi/index.tmpl", map[string]any{
"H1": "Welcome",
"Title": "BIMI Explorer",
})

}
Expand All @@ -23,9 +51,40 @@ func rootHandlerPost(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
domain := r.Form.Get("domain")
if domain == "" {
http.Redirect(w, r, "/?err=You+must+enter+a+domain", http.StatusSeeOther)
http.Redirect(w, r, "/bimi/?err=You+must+enter+a+domain", http.StatusSeeOther)
return
}

http.Redirect(w, r, fmt.Sprintf("/bimi/%s/", domain), http.StatusSeeOther)
}

func viewHandler(w http.ResponseWriter, r *http.Request) {

pageSize, psErr := strconv.Atoi(r.URL.Query().Get("pageSize"))
if psErr != nil || pageSize < 1 {
pageSize = 144
}

count, _ := countDomains()
maxPages := int(count / int64(pageSize))
if count%int64(pageSize) > 0 {
maxPages++
}

currentPage, cpErr := strconv.Atoi(r.URL.Query().Get("page"))
if cpErr != nil || currentPage < 1 || currentPage > maxPages {
currentPage = 1
}

domains, dbErr := listDomains(int32(pageSize), int32((currentPage-1)*pageSize))

runTemplate(w, r, "bimi/view.tmpl", map[string]any{
"CurrentPage": currentPage,
"Domains": domains,
"Err": dbErr,
"MaxPage": maxPages,
"PageSize": pageSize,
"Title": "View BIMI Logos",
})

}
20 changes: 15 additions & 5 deletions templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package main
import (
"bytes"
"embed"
"fmt"
"io/fs"
"net/http"
"strings"
Expand All @@ -25,6 +24,19 @@ var templateCache = initTemplates()

func initTemplates() map[string]TemplateFunc {

funcMap := template.FuncMap{
"inc": func(i int) int {
return i + 1
},
"loop": func(from, to int) []int {
result := []int{}
for i := from; i < to; i++ {
result = append(result, i)
}
return result
},
}

theCache := make(map[string]TemplateFunc)

var partials bytes.Buffer
Expand All @@ -49,13 +61,12 @@ func initTemplates() map[string]TemplateFunc {
}

viewErr := fs.WalkDir(viewsFS, ".", func(path string, d fs.DirEntry, err error) error {
fmt.Printf("%v\n", d)
if err != nil {
logger.Error("walkdir error", "err", err)
return err
}
if !d.IsDir() {
logger.Info("registering view", "filename", path)
logger.Debug("registering view", "filename", path)
content, readErr := fs.ReadFile(viewsFS, path)
if readErr != nil {
logger.Error("unable to read view file", "err", readErr, "filename", path)
Expand All @@ -66,13 +77,12 @@ func initTemplates() map[string]TemplateFunc {
var templateBuffer bytes.Buffer
templateBuffer.Write(content)
templateBuffer.Write(partials.Bytes())
t := template.New(name)
t := template.New(name).Funcs(funcMap)
template, parseErr := t.Parse(templateBuffer.String())
if parseErr != nil {
logger.Error("unable to parse template", "err", parseErr, "filename", path, "content", string(content))
return parseErr
}
fmt.Printf("template: %s has %v\n", t.Name(), t.DefinedTemplates())
theCache[name] = func(data any) (string, error) {
var buf bytes.Buffer
err := template.Execute(&buf, data)
Expand Down
10 changes: 3 additions & 7 deletions views/_bimi/index.tmpl
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
{{template "above" .}}

{{ if (ne .err nil) }}
<div class="alert alert-danger">
{{.err}}
</div>
{{else}}
{{ if .Bimi }}
<div class="container d-flex justify-content-center row">
<div class="col-sm-12 col-md-9 col-lg-6">
<img src="{{.bimi}}" alt="{{.domain}} logo" />
<img src="{{.Bimi}}" alt="{{.Domain}} logo" />
</div>
</div>
{{end}}
{{ end }}

{{template "below" .}}
13 changes: 0 additions & 13 deletions views/bimi/bulk.tmpl

This file was deleted.

11 changes: 7 additions & 4 deletions views/bimi/index.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@
</form>
</div>

{{range .domains}}
<a href="/bimi/{{.Domain}}/"><img src="{{.Imgurl.String}}" alt="{{.Domain}}" style="height:48pt;" /></a>
{{end}}
<p class="mt-3"><a href="/bimi/bulk.html">Bulk add</a></p>
<div class="row">
<div class="col">
<a href="view.html">View Images</a>
<a href="list.html">List (text)</a>
</div>
</div>


{{template "below" .}}
40 changes: 40 additions & 0 deletions views/bimi/list.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{{template "above" .}}

<div class="row">
<div class="col">
There are {{.Count}} domains with BIMI logos.
</div>
</div>

<div class="btn-toolbar d-flex justify-content-center mb-3" role="toolbar" aria-label="Paging">
<div class="btn-group" role="group" aria-label="Pages">
{{range $page := loop 1 (inc .MaxPage) }}
<a href="?page={{$page}}" class="btn btn-outline-secondary{{if (eq $.CurrentPage $page)}} active{{end}}">{{$page}}</a>
{{end}}
</div>
</div>

<table class="table table-striped">
<thead>
<tr>
<th>Domain</th>
<th>Image URL</th>
</tr>
</thead>
<tbody>
{{range .Domains}}
<tr>
<td><a href="https://{{.Domain}}/">{{.Domain}}</a></td>
<td><a href="/bimi/{{.Domain}}/">{{.Imgurl.String}}</td>
</tr>
{{end}}
</tbody>
</table>

<div class="row">
<div class="col">
({{len .Domains}} rows)
</div>
</div>

{{template "below" .}}
Loading

0 comments on commit c6d40e8

Please sign in to comment.