diff --git a/tui/entry.go b/tui/entry.go index b5adbb6..6af4fca 100644 --- a/tui/entry.go +++ b/tui/entry.go @@ -5,24 +5,24 @@ import ( ) type Feed struct { - id string - name string - url string - faviconUrl string - tags []string + Id string `json:"id"` + Name string `json:"name"` + Url string `json:"url"` + FaviconUrl string `json:"faviconUrl"` + Tags []string `json:"tags"` } type Entry struct { - id string - title string - content string - link string - date time.Time + Id string `json:"id"` + ArticleTitle string `json:"title"` + Content string `json:"content"` + Link string `json:"link"` + Date time.Time `json:"time"` - author *string // author not always specified - isRead bool - isBookmarked bool - isIgnored bool - isReadLater bool - feed Feed + Author *string `json:"author"` // author not always specified + IsRead bool `json:"isRead"` + IsBookmarked bool `json:"IsBookmarked"` + IsIgnored bool `json:"isIgnored"` + IsReadLater bool `json:"isReadLater"` + Feed Feed `json:"feed"` } diff --git a/tui/http.go b/tui/http.go index 0833da6..cc79571 100644 --- a/tui/http.go +++ b/tui/http.go @@ -15,12 +15,12 @@ type statusMsg int type errMsg struct{ error } type missingJwtMsg struct{} +type noJwtMsg struct{} +type invalidJwtMsg struct{} +type httpErrorMsg error func (e errMsg) Error() string { return e.error.Error() } -type getEntriesSuccessMsg []Entry -type httpErrorMsg error - const serverUrl = "http://localhost:1597" type loginSuccessMsg struct{ string } @@ -43,6 +43,35 @@ func getData(req *http.Request) ([]byte, error) { } +func checkJwt(jwt *string) tea.Cmd { + + return func() tea.Msg { + if jwt == nil || *jwt == "" { + return noJwtMsg{} + } + url := fmt.Sprintf("%s/me", serverUrl) + req, _ := http.NewRequest(http.MethodPost, url, nil) + req.Header.Add("Content-type", "application/json") + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", *jwt)) + data, err := getData(req) + if err != nil { + return invalidJwtMsg{} + } + var resp struct { + Id string `json:"id"` + Name string `json:"name"` + } + err = json.Unmarshal(data, &resp) + if err != nil { + return invalidJwtMsg{} + } + + return nil + + } + +} + func login(username string, password string) tea.Cmd { return func() tea.Msg { url := fmt.Sprintf("%s/login", serverUrl) @@ -107,42 +136,49 @@ func register(username string, password string, email string) tea.Cmd { } } +type getEntriesSuccessMsg []Entry + func getEntries(jwt *string) tea.Cmd { return func() tea.Msg { url := fmt.Sprintf("%s/entries", serverUrl) - - req, err := http.NewRequest(http.MethodGet, url, nil) + req, _ := http.NewRequest(http.MethodGet, url, nil) if jwt == nil { return missingJwtMsg{} } req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", *jwt)) - + req.Header.Add("Content-type", "application/json") + data, err := getData(req) if err != nil { return httpErrorMsg(err) } - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return httpErrorMsg(err) - } - defer resp.Body.Close() // nolint: errcheck - - data, err := io.ReadAll(resp.Body) - if err != nil { - return httpErrorMsg(err) - } - var entries []Entry - err = json.Unmarshal(data, &entries) if err != nil { return httpErrorMsg(err) } - return getEntriesSuccessMsg(entries) } - } type getFeedsSuccessMsg []Feed -type getFeedsErrMsg error + +func getFeeds(jwt *string) tea.Cmd { + return func() tea.Msg { + url := fmt.Sprintf("%s/feeds", serverUrl) + req, _ := http.NewRequest(http.MethodGet, url, nil) + if jwt == nil { + return missingJwtMsg{} + } + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", *jwt)) + data, err := getData(req) + if err != nil { + return httpErrorMsg(err) + } + var feeds []Feed + err = json.Unmarshal(data, &feeds) + if err != nil { + return httpErrorMsg(err) + } + return getFeedsSuccessMsg(feeds) + } +} diff --git a/tui/main.go b/tui/main.go index dc11dfe..4b15db0 100644 --- a/tui/main.go +++ b/tui/main.go @@ -15,11 +15,11 @@ import ( ) func (e Entry) FilterValue() string { - return e.title + return e.ArticleTitle } func (e Entry) Title() string { - return e.title + return e.ArticleTitle } func (e Entry) Description() string { @@ -57,16 +57,16 @@ func (m *Model) initList(width int, height int) { m.list = list.New([]list.Item{}, list.NewDefaultDelegate(), width, height) m.list.Title = "Posts" m.list.SetFilteringEnabled(false) - var f = Feed{id: "1", tags: []string{"Devops", "Kubernetes"}, name: "zwindler", url: "zwindler.blog", faviconUrl: "zwindler.blog.favicon"} + var f = Feed{Id: "1", Tags: []string{"Devops", "Kubernetes"}, Name: "zwindler", Url: "zwindler.blog", FaviconUrl: "zwindler.blog.favicon"} m.list.SetItems([]list.Item{ - Entry{id: "1", title: "yay", content: "ouin ouin ouin", link: "awd", date: time.Now(), isRead: false, isIgnored: false, isReadLater: false, isBookmarked: false, feed: f}, - Entry{id: "2", title: "grrrrr", content: "ouin ouin ouin", link: "awd", date: time.Now(), isRead: false, isIgnored: false, isReadLater: false, isBookmarked: false, feed: f}, - Entry{id: "3", title: "my life is pain", content: "ouin ouin ouin", link: "awd", date: time.Now(), isRead: false, isIgnored: false, isReadLater: false, isBookmarked: false, feed: f}, + Entry{Id: "1", ArticleTitle: "yay", Content: "ouin ouin ouin", Link: "awd", Date: time.Now(), IsRead: false, IsIgnored: false, IsReadLater: false, IsBookmarked: false, Feed: f}, + Entry{Id: "2", ArticleTitle: "grrrrr", Content: "ouin ouin ouin", Link: "awd", Date: time.Now(), IsRead: false, IsIgnored: false, IsReadLater: false, IsBookmarked: false, Feed: f}, + Entry{Id: "3", ArticleTitle: "my life is pain", Content: "ouin ouin ouin", Link: "awd", Date: time.Now(), IsRead: false, IsIgnored: false, IsReadLater: false, IsBookmarked: false, Feed: f}, }) } func (m Model) Init() tea.Cmd { - return tea.Batch(checkServer, m.auth.loginForm.Init(), m.auth.registerForm.Init()) + return tea.Batch(checkServer, m.auth.loginForm.Init(), m.auth.registerForm.Init(), checkJwt(m.auth.jwt)) } @@ -172,6 +172,11 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.WindowSizeMsg: m.initList(msg.Width, msg.Height) + + case invalidJwtMsg: + m.auth.jwt = new(string) + m.page = LOGIN + return m, nil case loginSuccessMsg: *m.auth.jwt = msg.string m.page = FEEDS @@ -254,7 +259,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } func main() { - tea.LogToFile("yay.log", "") + tea.LogToFile("vex.log", "") m := New() p := tea.NewProgram(m) if _, err := p.Run(); err != nil {