Skip to content

Commit

Permalink
Refactor search filters and add artist filter
Browse files Browse the repository at this point in the history
  • Loading branch information
blackfyre committed Oct 30, 2023
1 parent d67f9c9 commit 9210ace
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 82 deletions.
102 changes: 28 additions & 74 deletions handlers/search/filters.go
Original file line number Diff line number Diff line change
@@ -1,112 +1,66 @@
package search

import (
"fmt"

"blackfyre.ninja/wga/models"
"github.com/labstack/echo/v5"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
)

type filters struct {
Q string
School string
ArtForm string
ArtType string
Title string
SchoolString string
ArtFormString string
ArtTypeString string
ArtistString string
}

func (f *filters) AnyFilterActive() bool {
return f.Q != "" || f.School != "" || f.ArtForm != "" || f.ArtType != ""
return f.Title != "" || f.SchoolString != "" || f.ArtFormString != "" || f.ArtTypeString != "" || f.ArtistString != ""
}

func (f *filters) FingerPrint() string {
return f.Q + ":" + f.School + ":" + f.ArtForm + ":" + f.ArtType
return f.Title + ":" + f.SchoolString + ":" + f.ArtFormString + ":" + f.ArtTypeString + ":" + f.ArtistString
}

func (f *filters) BuildFilter() (string, dbx.Params) {
filterString := "published = true"
params := dbx.Params{}

if f.Q != "" {
filterString = filterString + " && name ~ {:q}"
params["q"] = f.Q
if f.Title != "" {
filterString = filterString + " && title ~ {:title}"
params["title"] = f.Title
}

if f.School != "" {
filterString = filterString + " && school = {:art_school}"
params["art_school"] = f.School
if f.SchoolString != "" {
filterString = filterString + " && school.slug = {:art_school}"
params["art_school"] = f.SchoolString
}

if f.ArtForm != "" {
filterString = filterString + " && form = {:art_form}"
params["art_form"] = f.ArtForm
if f.ArtFormString != "" {
filterString = filterString + " && form.slug = {:art_form}"
params["art_form"] = f.ArtFormString
}

if f.ArtType != "" {
filterString = filterString + " && type = {:art_type}"
params["art_type"] = f.ArtType
if f.ArtTypeString != "" {
filterString = filterString + " && type.slug = {:art_type}"
params["art_type"] = f.ArtTypeString
}

fmt.Println(filterString, params)
if f.ArtistString != "" {
filterString = filterString + " && author.name ~ {:artist}"
params["artist"] = f.ArtistString
}

return filterString, params
}

func buildFilters(app *pocketbase.PocketBase, c echo.Context) *filters {
f := &filters{
Q: c.QueryParamDefault("q", ""),
School: c.QueryParamDefault("art_school", ""),
ArtForm: c.QueryParamDefault("art_form", ""),
ArtType: c.QueryParamDefault("art_type", ""),
}

if f.School == "na" {
f.School = ""
} else {
if app.Cache().Has("search:schools:" + f.School) {
f.School = app.Cache().Get("search:schools:" + f.School).(string)
} else {
r, err := models.GetSchoolBySlug(app.Dao(), f.School)

if err != nil {
f.School = ""
} else {
f.School = r.GetId()
}
}
}

if f.ArtForm == "na" {
f.ArtForm = ""
} else {
if app.Cache().Has("search:forms:" + f.ArtForm) {
f.ArtForm = app.Cache().Get("search:forms:" + f.ArtForm).(string)
} else {
r, err := models.GetArtFormBySlug(app.Dao(), f.ArtForm)

if err != nil {
f.ArtForm = ""
} else {
f.ArtForm = r.GetId()
}
}
}

if f.ArtType == "na" {
f.ArtType = ""
} else {
if app.Cache().Has("search:types:" + f.ArtType) {
f.ArtType = app.Cache().Get("search:types:" + f.ArtType).(string)
} else {
r, err := models.GetArtTypeBySlug(app.Dao(), f.ArtType)

if err != nil {
f.ArtType = ""
} else {
f.ArtType = r.GetId()
}
}
Title: c.QueryParamDefault("title", ""),
SchoolString: c.QueryParamDefault("art_school", ""),
ArtFormString: c.QueryParamDefault("art_form", ""),
ArtTypeString: c.QueryParamDefault("art_type", ""),
ArtistString: c.QueryParamDefault("artist", ""),
}

return f
Expand Down
33 changes: 30 additions & 3 deletions handlers/search/getters.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import (
// getArtTypesOptions returns a map of art type slugs and their corresponding names.
// It retrieves the art types from the database using the provided PocketBase app instance.
func getArtTypesOptions(app *pocketbase.PocketBase) (map[string]string, error) {
options := map[string]string{}
options := map[string]string{
"": "Any",
}
c, err := models.GetArtTypes(app.Dao())

if err != nil {
Expand All @@ -25,7 +27,9 @@ func getArtTypesOptions(app *pocketbase.PocketBase) (map[string]string, error) {
// getArtFormOptions returns a map of art form slugs to their corresponding names.
// It retrieves the art forms from the database using the provided PocketBase app instance.
func getArtFormOptions(app *pocketbase.PocketBase) (map[string]string, error) {
options := map[string]string{}
options := map[string]string{
"": "Any",
}
c, err := models.GetArtForms(app.Dao())

if err != nil {
Expand All @@ -41,7 +45,9 @@ func getArtFormOptions(app *pocketbase.PocketBase) (map[string]string, error) {

// getArtSchoolOptions returns a map of art school options where the key is the slug and the value is the name.
func getArtSchoolOptions(app *pocketbase.PocketBase) (map[string]string, error) {
options := map[string]string{}
options := map[string]string{
"": "Any",
}
c, err := models.GetSchools(app.Dao())

if err != nil {
Expand All @@ -54,3 +60,24 @@ func getArtSchoolOptions(app *pocketbase.PocketBase) (map[string]string, error)

return options, nil
}

func getArtistNameList(app *pocketbase.PocketBase) ([]string, error) {
names := []string{}
c, err := app.Dao().FindRecordsByFilter(
"artists",
"published = true",
"+name",
0,
0,
)

if err != nil {
return names, err
}

for _, v := range c {
names = append(names, v.GetString("name"))
}

return names, nil
}
15 changes: 10 additions & 5 deletions handlers/search/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@ func search(app *pocketbase.PocketBase, e *core.ServeEvent, c echo.Context) erro
limit := 30
page := 1

//set push url
c.Response().Header().Set("HX-Push-Url", currentUrl)

//build filters
filters := buildFilters(app, c)

Expand Down Expand Up @@ -134,22 +131,30 @@ func search(app *pocketbase.PocketBase, e *core.ServeEvent, c echo.Context) erro
td["ArtFormOptions"], _ = getArtFormOptions(app)
td["ArtTypeOptions"], _ = getArtTypesOptions(app)
td["ArtSchoolOptions"], _ = getArtSchoolOptions(app)
td["ArtistNameList"], _ = getArtistNameList(app)
td["ActiveFilterValues"] = filters

pagination := utils.NewPagination(recordsCount, limit, page, "/artists?q=")

td["Pagination"] = pagination.Render()

blockToRender := "search:content"

if filters.AnyFilterActive() {
blockToRender = "search:search-results"
}

html, err := assets.Render(assets.Renderable{
IsHtmx: htmx,
Block: "search:content",
Block: blockToRender,
Data: td,
})

if err != nil {
return apis.NewNotFoundError("", err)
}

c.Response().Header().Set("HX-Push-Url", "/search")
c.Response().Header().Set("HX-Push-Url", currentUrl)

return c.HTML(http.StatusOK, html)
}
Expand Down

0 comments on commit 9210ace

Please sign in to comment.