diff --git a/cmd/owl/web/handler.go b/cmd/owl/web/handler.go index 5b0355a..1e7d13a 100644 --- a/cmd/owl/web/handler.go +++ b/cmd/owl/web/handler.go @@ -64,6 +64,40 @@ func userIndexHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Requ } } +func postListHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) { + return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + listId := ps.ByName("list") + user, err := getUserFromRepo(repo, ps) + if err != nil { + println("Error getting user: ", err.Error()) + notFoundHandler(repo)(w, r) + return + } + + list, err := user.GetPostList(listId) + + if err != nil { + println("Error getting post list: ", err.Error()) + notFoundUserHandler(repo, user)(w, r) + return + } + + html, err := owl.RenderPostList(user, list) + if err != nil { + println("Error rendering index page: ", err.Error()) + w.WriteHeader(http.StatusInternalServerError) + html, _ := owl.RenderUserError(user, owl.ErrorMessage{ + Error: "Internal server error", + Message: "Internal server error", + }) + w.Write([]byte(html)) + return + } + println("Rendering index page for user", user.Name()) + w.Write([]byte(html)) + } +} + func userWebmentionHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) { return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { user, err := getUserFromRepo(repo, ps) diff --git a/cmd/owl/web/server.go b/cmd/owl/web/server.go index b14f3a7..b36342e 100644 --- a/cmd/owl/web/server.go +++ b/cmd/owl/web/server.go @@ -14,6 +14,7 @@ func Router(repo *owl.Repository) http.Handler { router.ServeFiles("/static/*filepath", http.Dir(repo.StaticDir())) router.GET("/", repoIndexHandler(repo)) router.GET("/user/:user/", userIndexHandler(repo)) + router.GET("/user/:user/lists/:list/", postListHandler(repo)) // Editor router.GET("/user/:user/editor/auth/", userLoginGetHandler(repo)) router.POST("/user/:user/editor/auth/", userLoginPostHandler(repo)) @@ -44,6 +45,7 @@ func SingleUserRouter(repo *owl.Repository) http.Handler { router := httprouter.New() router.ServeFiles("/static/*filepath", http.Dir(repo.StaticDir())) router.GET("/", userIndexHandler(repo)) + router.GET("/lists/:list/", postListHandler(repo)) // Editor router.GET("/editor/auth/", userLoginGetHandler(repo)) router.POST("/editor/auth/", userLoginPostHandler(repo)) diff --git a/cmd/owl/web/single_user_test.go b/cmd/owl/web/single_user_test.go index 2ffbc9e..a632d54 100644 --- a/cmd/owl/web/single_user_test.go +++ b/cmd/owl/web/single_user_test.go @@ -99,3 +99,34 @@ func TestHasNoDraftsInList(t *testing.T) { // Check if title is in the response body assertions.AssertNotContains(t, rr.Body.String(), "Articles September 2019") } + +func TestSingleUserUserPostListHandler(t *testing.T) { + repo, user := getSingleUserTestRepo() + user.CreateNewPostFull(owl.PostMeta{ + Title: "post-1", + Type: "article", + }, "hi") + user.CreateNewPostFull(owl.PostMeta{ + Title: "post-2", + Type: "note", + }, "hi") + list := owl.PostList{ + Title: "list-1", + Id: "list-1", + Include: []string{"article"}, + } + user.AddPostList(list) + + // Create Request and Response + req, err := http.NewRequest("GET", user.ListUrl(list), nil) + assertions.AssertNoError(t, err, "Error creating request") + rr := httptest.NewRecorder() + router := main.SingleUserRouter(&repo) + router.ServeHTTP(rr, req) + + assertions.AssertStatus(t, rr, http.StatusOK) + + // Check the response body contains names of users + assertions.AssertContains(t, rr.Body.String(), "post-1") + assertions.AssertNotContains(t, rr.Body.String(), "post-2") +} diff --git a/renderer.go b/renderer.go index edbbc92..97f5c9e 100644 --- a/renderer.go +++ b/renderer.go @@ -133,6 +133,19 @@ func RenderIndexPage(user User) (string, error) { }) } +func RenderPostList(user User, list *PostList) (string, error) { + posts, _ := user.GetPostsOfList(*list) + postHtml, err := renderEmbedTemplate("embed/post-list.html", posts) + if err != nil { + return "", err + } + + return renderIntoBaseTemplate(user, PageContent{ + Title: "Index", + Content: template.HTML(postHtml), + }) +} + func RenderUserAuthPage(reqData AuthRequestData) (string, error) { reqData.Scopes = strings.Split(reqData.Scope, " ") authHtml, err := renderEmbedTemplate("embed/auth.html", reqData) diff --git a/renderer_test.go b/renderer_test.go index f199f02..af516b0 100644 --- a/renderer_test.go +++ b/renderer_test.go @@ -77,6 +77,53 @@ func TestRendererUsesBaseTemplate(t *testing.T) { assertions.AssertContains(t, result, "