dorfylegends/backend/server/search.go
2022-04-30 08:25:50 +00:00

67 lines
2.2 KiB
Go

package server
import (
"encoding/json"
"fmt"
"net/http"
"sort"
"strings"
"github.com/robertjanetzko/LegendsBrowser2/backend/model"
"github.com/robertjanetzko/LegendsBrowser2/backend/util"
)
type searchHandler struct {
server *DfServer
}
type SearchResult struct {
Label string `json:"label"`
Value string `json:"value"`
}
func (h searchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if h.server.context.world == nil {
h.server.renderLoading(w, r)
return
}
term := r.URL.Query().Get("term")
var results []SearchResult
results = seachMap(term, h.server.context.world.HistoricalFigures, results, "/hf")
results = seachMap(term, h.server.context.world.Entities, results, "/entity")
results = seachMap(term, h.server.context.world.Sites, results, "/site")
for _, site := range h.server.context.world.Sites {
results = seachMap(term, site.Structures, results, fmt.Sprintf("/site/%d/structure", site.Id_))
}
results = seachMap(term, h.server.context.world.Regions, results, "/region")
results = seachMap(term, h.server.context.world.Artifacts, results, "/artifavt")
results = seachMap(term, h.server.context.world.WorldConstructions, results, "/worldconstruction")
results = seachMap(term, h.server.context.world.DanceForms, results, "/danceForm")
results = seachMap(term, h.server.context.world.MusicalForms, results, "/musicalForm")
results = seachMap(term, h.server.context.world.PoeticForms, results, "/poeticForm")
results = seachMap(term, h.server.context.world.WrittenContents, results, "/writtencontent")
results = seachMap(term, h.server.context.world.Landmasses, results, "/landmass")
results = seachMap(term, h.server.context.world.MountainPeaks, results, "/mountain")
sort.Slice(results, func(i, j int) bool { return results[i].Label < results[j].Label })
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(results)
}
func seachMap[T model.Named](s string, input map[int]T, output []SearchResult, baseUrl string) []SearchResult {
for id, v := range input {
if strings.Contains(v.Name(), s) {
output = append(output, SearchResult{
Label: util.Title(v.Name()),
Value: fmt.Sprintf("%s/%d", baseUrl, id),
})
}
}
return output
}