impl ui search

master
Bel LaPointe 2022-02-15 15:40:19 -07:00
parent b22891b0c4
commit 0e1ced34b2
1 changed files with 51 additions and 15 deletions

View File

@ -73,6 +73,7 @@ func (server *Server) tryCatchHttpHandler(handler func(http.ResponseWriter, *htt
} }
if err := handler(w, r); err != nil { if err := handler(w, r); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
log.Printf("failed handling %s: %v", r.URL.String(), err)
} }
} }
} }
@ -201,23 +202,40 @@ func (server *Server) putContentHandler(filePath string, w http.ResponseWriter,
func (server *Server) uiSearchHandler(w http.ResponseWriter, r *http.Request) error { func (server *Server) uiSearchHandler(w http.ResponseWriter, r *http.Request) error {
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files") r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files")
t, err := server.uiTemplate() t, err := server.uiSubTemplates()
if err != nil { if err != nil {
return err return err
} }
return t.Lookup("search").Execute(w, "TODO data") t, err = t.ParseFiles(path.Join(server.root, "ui", "search.ctmpl"))
if err != nil {
return err
}
idsTitles, err := server._apiV0SearchHandler(r.URL.Query().Get("q"))
if err != nil {
return err
}
data := make([]struct {
Title string
ID string
}, len(idsTitles))
for i := range idsTitles {
data[i].ID = idsTitles[i][0]
data[i].Title = idsTitles[i][1]
}
log.Printf("ui search: %v", data)
return t.Lookup("search").Execute(w, map[string]interface{}{"Results": data})
} }
func (server *Server) uiFilesHandler(w http.ResponseWriter, r *http.Request) error { func (server *Server) uiFilesHandler(w http.ResponseWriter, r *http.Request) error {
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files") r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files")
t, err := server.uiTemplate() t, err := server.uiSubTemplates()
if err != nil { if err != nil {
return err return err
} }
return t.Lookup("files").Execute(w, "TODO data") return t.Lookup("files").Execute(w, "TODO data")
} }
func (server *Server) uiTemplate() (*template.Template, error) { func (server *Server) uiSubTemplates() (*template.Template, error) {
templateFiles := []string{} templateFiles := []string{}
var loadTemplateFilesFromDir func(string) error var loadTemplateFilesFromDir func(string) error
loadTemplateFilesFromDir = func(root string) error { loadTemplateFilesFromDir = func(root string) error {
@ -231,14 +249,14 @@ func (server *Server) uiTemplate() (*template.Template, error) {
if err := loadTemplateFilesFromDir(entryPath); err != nil { if err := loadTemplateFilesFromDir(entryPath); err != nil {
return err return err
} }
} else if strings.HasPrefix(path.Base(entryPath), ".") { } else if !strings.HasPrefix(path.Base(entryPath), "_") {
} else if strings.HasSuffix(entryPath, ".ctmpl") { } else if strings.HasSuffix(entryPath, ".ctmpl") {
templateFiles = append(templateFiles, entryPath) templateFiles = append(templateFiles, entryPath)
} }
} }
return nil return nil
} }
if err := loadTemplateFilesFromDir(server.root); err != nil { if err := loadTemplateFilesFromDir(path.Join(server.root, "ui")); err != nil {
return nil, err return nil, err
} }
return template.ParseFiles(templateFiles...) return template.ParseFiles(templateFiles...)
@ -394,10 +412,21 @@ func (server *Server) apiV0FilesIDPutHandler(w http.ResponseWriter, r *http.Requ
func (server *Server) apiV0SearchHandler(w http.ResponseWriter, r *http.Request) error { func (server *Server) apiV0SearchHandler(w http.ResponseWriter, r *http.Request) error {
query := r.URL.Query().Get("q") query := r.URL.Query().Get("q")
idsTitles, err := server._apiV0SearchHandler(query)
if err != nil {
return err
}
result := make([]string, len(idsTitles))
for i := range idsTitles {
result[i] = idsTitles[i][0]
}
return json.NewEncoder(w).Encode(result)
}
func (server *Server) _apiV0SearchHandler(query string) ([][2]string, error) {
queries := strings.Split(query, " ") queries := strings.Split(query, " ")
if len(queries) == 0 { if len(queries) == 0 {
w.Write([]byte(`[]`)) return [][2]string{}, nil
return nil
} }
patterns := []*regexp.Regexp{} patterns := []*regexp.Regexp{}
unsafepattern := regexp.MustCompile(`[^a-zA-Z0-9]`) unsafepattern := regexp.MustCompile(`[^a-zA-Z0-9]`)
@ -408,24 +437,31 @@ func (server *Server) apiV0SearchHandler(w http.ResponseWriter, r *http.Request)
} }
} }
if len(patterns) == 0 { if len(patterns) == 0 {
w.Write([]byte(`[]`)) return [][2]string{}, nil
return nil
} }
tree, err := server.tree().GetRoot() tree, err := server.tree().GetRoot()
if err != nil { if err != nil {
return err return nil, err
} }
result := []string{} result := [][2]string{}
if err := tree.ForEach(func(id []string, leaf Leaf) error { if err := tree.ForEach(func(id []string, leaf Leaf) error {
for _, pattern := range patterns { for _, pattern := range patterns {
if !pattern.MatchString(leaf.Content) && !pattern.MatchString(leaf.Title) { if !pattern.MatchString(leaf.Content) && !pattern.MatchString(leaf.Title) {
return nil return nil
} }
} }
result = append(result, server.urlFileId(id)) title := leaf.Title
for i := len(id) - 1; i >= 1; i-- {
parent, err := server.tree().Get(id[:i])
if err != nil {
return err
}
title = path.Join(parent.Title, title)
}
result = append(result, [2]string{server.urlFileId(id), title})
return nil return nil
}); err != nil { }); err != nil {
return err return nil, err
} }
return json.NewEncoder(w).Encode(result) return result, nil
} }