Skip to content

Commit

Permalink
corrected statements as linter suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
joicemjoseph committed Oct 1, 2020
1 parent 27d575c commit 1ee9020
Show file tree
Hide file tree
Showing 9 changed files with 138 additions and 139 deletions.
51 changes: 41 additions & 10 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"errors"
"fmt"
"html/template"
"math"
"net/http"
"net/url"
"strconv"
Expand All @@ -18,8 +17,8 @@ import (
)

const (
entriesPerPage = 20
glossaryPerPage = 100
entriesPerPage = 20
// glossaryPerPage = 100
)

// Results represents a set of results.
Expand Down Expand Up @@ -68,19 +67,25 @@ type httpResp struct {

// handleSearch performs a search and responds with JSON results.
func handleSearch(w http.ResponseWriter, r *http.Request) {
app := r.Context().Value("app").(*App)
app, _ := r.Context().Value("app").(*App)

_, out, err := doSearch(r, app)

if err != nil {
var s int

// If out is nil, it's a non 500 "soft" error.
if out != nil {
s = http.StatusBadRequest
} else {
s = http.StatusInternalServerError
}

sendErrorResponse(err.Error(), s, nil, w)

return
}

sendResponse(okResp{out}, http.StatusOK, w)
}

Expand All @@ -96,18 +101,22 @@ func doSearch(r *http.Request, app *App) (search.Query, *Results, error) {
pg = getPagination(qp, entriesPerPage, entriesPerPage)
out = &Results{}
)

if q == "" {
q = qp.Get("q")
}

q, err := url.QueryUnescape(q)
if err != nil {
return search.Query{}, nil, fmt.Errorf("error parsing query: %v", err)
}

q = strings.TrimSpace(q)

if _, ok := app.lang[fromLang]; !ok {
return search.Query{}, nil, errors.New("unknown `from` language")
}

if _, ok := app.lang[toLang]; !ok {
return search.Query{}, nil, errors.New("unknown `to` language")
}
Expand All @@ -124,7 +133,8 @@ func doSearch(r *http.Request, app *App) (search.Query, *Results, error) {
Offset: pg.Offset,
Limit: pg.Limit,
}
if err := validateSearchQuery(query, app.lang); err != nil {

if err = validateSearchQuery(query, app.lang); err != nil {
return query, out, err
}

Expand All @@ -140,9 +150,12 @@ func doSearch(r *http.Request, app *App) (search.Query, *Results, error) {
if err == sql.ErrNoRows {
return query, out, nil
}

app.logger.Printf("error querying db: %v", err)

return query, nil, errors.New("error querying db")
}

if len(res) == 0 {
return query, out, nil
}
Expand All @@ -166,6 +179,7 @@ func doSearch(r *http.Request, app *App) (search.Query, *Results, error) {

out.Total = total
out.Entries = res

return query, out, nil
}

Expand All @@ -184,15 +198,19 @@ func getGlossaryWords(lang, initial string, pg paginator.Set, app *App) (*Glossa
if err == sql.ErrNoRows {
return out, nil
}

app.logger.Printf("error querying db: %v", err)

return nil, errors.New("error querying db")
}

if len(res) == 0 {
return out, nil
}

out.Total = total
out.Words = res

return out, nil
}

Expand Down Expand Up @@ -225,19 +243,22 @@ func (p *pagination) GenerateNumbers() {
if p.Total <= p.PerPage {
return
}

var (
// Page divisor.
div = p.Total / p.PerPage
divStart = 1
hints = 0
)

if p.Total%p.PerPage == 0 {
div = div - 1
}

div++

if div > 10 {
hints = int(math.Floor(float64(div)))
hints = div
div = 10
}

Expand All @@ -260,7 +281,7 @@ func (p *pagination) GenerateNumbers() {
}

if hints-10 > p.Page {
p.PageEnd = int(math.Floor(float64(hints)))
p.PageEnd = hints
}
}

Expand All @@ -270,36 +291,44 @@ func validateSearchQuery(q search.Query, l Languages) error {
if q.Query == "" {
return errors.New("empty search query")
}

if _, ok := l[q.FromLang]; !ok {
return fmt.Errorf("unknown language %s", q.FromLang)
}

if _, ok := l[q.ToLang]; !ok {
return fmt.Errorf("unknown language %s", q.ToLang)
}

for _, t := range q.Types {
if _, ok := l[q.FromLang].Types[t]; !ok {
return fmt.Errorf("unknown type %s", t)
}
}

return nil
}

// sendResponse sends a JSON envelope to the HTTP response.
func sendResponse(data interface{}, status int, w http.ResponseWriter) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(status)

out, err := json.Marshal(httpResp{Status: "success", Data: data})
if err != nil {
sendErrorResponse("Internal Server Error", http.StatusInternalServerError, nil, w)
return
}
w.Write(out)

_, _ = w.Write(out)
}

// sendTpl executes a template and writes the results to the HTTP response.
func sendTpl(status int, tplName string, tpl *template.Template, data interface{}, w http.ResponseWriter) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
tpl.ExecuteTemplate(w, tplName, data)
w.WriteHeader(status)

_ = tpl.ExecuteTemplate(w, tplName, data)
}

// sendErrorResponse sends a JSON error envelope to the HTTP response.
Expand All @@ -310,6 +339,8 @@ func sendErrorResponse(message string, status int, data interface{}, w http.Resp
resp := httpResp{Status: "error",
Message: message,
Data: data}

out, _ := json.Marshal(resp)
w.Write(out)

_, _ = w.Write(out)
}
10 changes: 4 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,18 @@ module github.com/knadh/dictmaker
go 1.12

require (
github.com/go-chi/chi v4.0.2+incompatible
github.com/go-sql-driver/mysql v1.4.1 // indirect
github.com/go-chi/chi v4.1.2+incompatible
github.com/go-sql-driver/mysql v1.5.0 // indirect
github.com/jmoiron/sqlx v1.2.0
github.com/knadh/goyesql v0.0.0-20190822122127-22fd9176b589
github.com/knadh/knphone v0.0.0-20190624172359-d31f66505cbf
github.com/knadh/koanf v0.4.4
github.com/knadh/koanf v0.13.0
github.com/knadh/paginator v0.0.0-20190812121607-b4fbeb7c977b
github.com/knadh/stuffbin v1.0.0
github.com/kr/pretty v0.1.0 // indirect
github.com/lib/pq v1.2.0
github.com/mattn/go-sqlite3 v1.10.0 // indirect
github.com/spf13/pflag v1.0.3
github.com/spf13/pflag v1.0.5
gitlab.com/joice/mlphone-go v0.0.0-20201001084309-2bb02984eed8
google.golang.org/appengine v1.4.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/volatiletech/null.v6 v6.0.0-20170828023728-0bef4e07ae1b
)
45 changes: 22 additions & 23 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,23 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-chi/chi v4.0.2+incompatible h1:maB6vn6FqCxrpz4FqWdh4+lwpyZIQS7YEAUcHlgXVRs=
github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/knadh/goyesql v0.0.0-20190822122127-22fd9176b589 h1:+dkkaKpb9tbPEQIzunVA+1m4acbQzU0B2HW+lN9gsVA=
github.com/knadh/goyesql v0.0.0-20190822122127-22fd9176b589/go.mod h1:U9J4DmpkGzrHHKIs8XUtsyVnsZZKGtj3iwes78xrm6M=
github.com/knadh/knphone v0.0.0-20190624172359-d31f66505cbf h1:qaF4Sls+Z1vbo7j4Tz+QtwuZ0A+so4mCSoDIFGo/G+w=
github.com/knadh/knphone v0.0.0-20190624172359-d31f66505cbf/go.mod h1:tfUGBbPGiWlkwkFRF3WR3u0ybGgc0Pm/x3bObH0St0A=
github.com/knadh/koanf v0.4.4 h1:Pg+eR7wuJtCGHLeip31K20eJojjZ3lXE8ILQQGj2PTM=
github.com/knadh/koanf v0.4.4/go.mod h1:Qd5yvXN39ZzjoRJdXMKN2QqHzQKhSx/K8fU5gyn4LPs=
github.com/knadh/koanf v0.13.0 h1:OEjNdmrP/5oAhJkNwTtarioqOC4xe6WxRK8Q5ffW8WU=
github.com/knadh/koanf v0.13.0/go.mod h1:7XDF7OJIqSQLUZnaXkjb1HB3CgMEYHyrzmgT8A6xAaE=
github.com/knadh/paginator v0.0.0-20190812121607-b4fbeb7c977b h1:1nu8rKo3secxUYyD725+fnEMGz38+cgaBS1c+jBI4Hk=
github.com/knadh/paginator v0.0.0-20190812121607-b4fbeb7c977b/go.mod h1:80FK5OPRRQQKEK75ahG+92/MdX/lu4dE8loTzJRVcCQ=
github.com/knadh/stuffbin v1.0.0 h1:NQon6PTpLXies4bRFhS3VpLCf6y+jn6YVXU3i2wPQ+M=
Expand All @@ -36,31 +35,31 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg=
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
github.com/mitchellh/mapstructure v1.2.2 h1:dxe5oCinTXiTIcfgmZecdCzPmAJKd46KsCWc35r0TV4=
github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI=
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/rhnvrm/simples3 v0.5.0/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
gitlab.com/joice/mlphone-go v0.0.0-20201001084309-2bb02984eed8 h1:+5m7ptsr40FZTM+5KeDanmT47Mf/tkIwGGlaej39KC4=
gitlab.com/joice/mlphone-go v0.0.0-20201001084309-2bb02984eed8/go.mod h1:5Dd7/l9PpLOInmiSIbpTn2DT6zOz+cSA6csICfPtVxU=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/volatiletech/null.v6 v6.0.0-20170828023728-0bef4e07ae1b h1:P+3+n9hUbqSDkSdtusWHVPQRrpRpLiLFzlZ02xXskM0=
gopkg.in/volatiletech/null.v6 v6.0.0-20170828023728-0bef4e07ae1b/go.mod h1:0LRKfykySnChgQpG3Qpk+bkZFWazQ+MMfc5oldQCwnY=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
18 changes: 15 additions & 3 deletions init.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ func initFileSystem() (stuffbin.FileSystem, error) {
// the in-memory stuffbin.FileSystem.
logger.Printf("unable to initialize embedded filesystem: %v", err)
logger.Printf("using local filesystem for static assets")

files := []string{
"config.toml.sample",
"queries.sql",
Expand All @@ -55,6 +56,7 @@ func initFileSystem() (stuffbin.FileSystem, error) {
if err != nil {
return nil, fmt.Errorf("failed to initialize local file for assets: %v", err)
}

return fs, nil
}

Expand Down Expand Up @@ -90,6 +92,7 @@ func loadSiteTheme(path string, loadPages bool) (*template.Template, error) {
return t, err
}
}

return t, nil
}

Expand Down Expand Up @@ -140,6 +143,7 @@ func registerHandlers(r *chi.Mux, app *App) {
sendResponse("welcome to dictmaker", http.StatusOK, w)
})
}

r.Get("/api/dictionary/{fromLang}/{toLang}/{q}", wrap(app, handleSearch))
}

Expand All @@ -148,24 +152,29 @@ func loadLanguages(app *App) error {
// Language configuration.
for _, l := range ko.MapKeys("lang") {
var lang Lang
ko.Unmarshal("lang."+l, &lang)

_ = ko.Unmarshal("lang."+l, &lang)

// Load external plugin.
logger.Printf("language: %s", l)

if lang.TokenizerType == "plugin" {
tk, err := loadTokenizerPlugin(lang.TokenizerName)
if err != nil {
return err
}

lang.Tokenizer = tk

// Tokenizations for search queries are looked up by the tokenizer
// ID() returned by the plugin and not the filename in the config.
lang.TokenizerName = tk.ID()
logger.Printf("loaded tokenizer %s", lang.TokenizerName)
}

app.lang[l] = lang
}

return nil
}

Expand All @@ -186,13 +195,16 @@ func generateNewFiles() error {
if err != nil {
return fmt.Errorf("error reading sample config (is binary stuffed?): %v", err)
}
ioutil.WriteFile("config.toml", b, 0644)

_ = ioutil.WriteFile("config.toml", b, 0644)

// Generate schema file.
b, err = fs.Read("schema.sql")
if err != nil {
return fmt.Errorf("error reading schema.sql (is binary stuffed?): %v", err)
}
ioutil.WriteFile("schema.sql", b, 0644)

_ = ioutil.WriteFile("schema.sql", b, 0644)

return nil
}

0 comments on commit 1ee9020

Please sign in to comment.