diff --git a/internal/webserver/handler_lists.go b/internal/webserver/handler_lists.go index 475a911..acb5167 100644 --- a/internal/webserver/handler_lists.go +++ b/internal/webserver/handler_lists.go @@ -3,10 +3,12 @@ package webserver import ( "context" "errors" + "io" "fmt" "net/http" "strconv" "strings" + "encoding/json" "gitlab.com/offline-twitter/twitter_offline_engine/pkg/persistence" . "gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper" @@ -140,6 +142,21 @@ func (app *Application) Lists(w http.ResponseWriter, r *http.Request) { return } + // New list + if r.Method == "POST" { + var formdata struct { + Name string `json:"name"` + } + data, err := io.ReadAll(r.Body) + panic_if(err) + err = json.Unmarshal(data, &formdata) + panic_if(err) + new_list := List{Name: formdata.Name} + app.Profile.SaveList(&new_list) + http.Redirect(w, r, fmt.Sprintf("/lists/%d/users", new_list.ID), 302) + return + } + // List index lists := app.Profile.GetAllLists() trove := NewTweetTrove() diff --git a/internal/webserver/server_test.go b/internal/webserver/server_test.go index dd7da1b..66751d2 100644 --- a/internal/webserver/server_test.go +++ b/internal/webserver/server_test.go @@ -666,6 +666,30 @@ func TestListAddAndDeleteUser(t *testing.T) { assert.Len(cascadia.QueryAll(root, selector(".users-list-container .author-info")), 2) } +func TestCreateNewList(t *testing.T) { + require := require.New(t) + assert := assert.New(t) + + // Initial list-of-lists + resp := do_request(httptest.NewRequest("GET", "/lists", nil)) + require.Equal(resp.StatusCode, 200) + root, err := html.Parse(resp.Body) + require.NoError(err) + num_lists := len(cascadia.QueryAll(root, selector(".users-list-preview"))) + + // Create a new list + resp_add := do_request(httptest.NewRequest("POST", "/lists", strings.NewReader(`{"name": "My New List"}`))) + require.Equal(resp_add.StatusCode, 302) + require.Equal(fmt.Sprintf("/lists/%d/users", num_lists + 1), resp_add.Header.Get("Location")) + + // Should be N+1 lists now + resp = do_request(httptest.NewRequest("GET", "/lists", nil)) + require.Equal(resp.StatusCode, 200) + root, err = html.Parse(resp.Body) + require.NoError(err) + assert.Len(cascadia.QueryAll(root, selector(".users-list-preview")), num_lists + 1) +} + // Messages // -------- diff --git a/internal/webserver/tpl/list_of_lists.tpl b/internal/webserver/tpl/list_of_lists.tpl index 2efa782..0247458 100644 --- a/internal/webserver/tpl/list_of_lists.tpl +++ b/internal/webserver/tpl/list_of_lists.tpl @@ -2,6 +2,18 @@ {{define "main"}}

Lists

+ + + +

Create new list

+
+ + + +
+ +
+
{{range .}} {{$max_display_users := 10}}