diff --git a/spike/review/reinvent/ezmded/server/server.go b/spike/review/reinvent/ezmded/server/server.go index a89efc5..b06e3b3 100644 --- a/spike/review/reinvent/ezmded/server/server.go +++ b/spike/review/reinvent/ezmded/server/server.go @@ -73,6 +73,7 @@ func (server *Server) tryCatchHttpHandler(handler func(http.ResponseWriter, *htt } if err := handler(w, r); err != nil { 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 { r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files") - t, err := server.uiTemplate() + t, err := server.uiSubTemplates() if err != nil { 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 { r.URL.Path = strings.TrimPrefix(r.URL.Path, "/ui/files") - t, err := server.uiTemplate() + t, err := server.uiSubTemplates() if err != nil { return err } return t.Lookup("files").Execute(w, "TODO data") } -func (server *Server) uiTemplate() (*template.Template, error) { +func (server *Server) uiSubTemplates() (*template.Template, error) { templateFiles := []string{} var loadTemplateFilesFromDir func(string) error loadTemplateFilesFromDir = func(root string) error { @@ -231,14 +249,14 @@ func (server *Server) uiTemplate() (*template.Template, error) { if err := loadTemplateFilesFromDir(entryPath); err != nil { return err } - } else if strings.HasPrefix(path.Base(entryPath), ".") { + } else if !strings.HasPrefix(path.Base(entryPath), "_") { } else if strings.HasSuffix(entryPath, ".ctmpl") { templateFiles = append(templateFiles, entryPath) } } return nil } - if err := loadTemplateFilesFromDir(server.root); err != nil { + if err := loadTemplateFilesFromDir(path.Join(server.root, "ui")); err != nil { return nil, err } 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 { 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, " ") if len(queries) == 0 { - w.Write([]byte(`[]`)) - return nil + return [][2]string{}, nil } patterns := []*regexp.Regexp{} 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 { - w.Write([]byte(`[]`)) - return nil + return [][2]string{}, nil } tree, err := server.tree().GetRoot() if err != nil { - return err + return nil, err } - result := []string{} + result := [][2]string{} if err := tree.ForEach(func(id []string, leaf Leaf) error { for _, pattern := range patterns { if !pattern.MatchString(leaf.Content) && !pattern.MatchString(leaf.Title) { 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 }); err != nil { - return err + return nil, err } - return json.NewEncoder(w).Encode(result) + return result, nil }