From 7e94fcd909bb85417d9b7e7f5489bcbab28e41be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9E=E3=83=AA=E3=82=A6=E3=82=B9?= Date: Fri, 30 Dec 2022 03:22:54 -0500 Subject: [PATCH] Implemented Aggregator --- aggregator/aggregator.go | 43 +++++++++++++++++++++++++++++++++++ cmd/root.go | 10 +++++--- models/post/post.go | 2 ++ system/discourse/discourse.go | 4 +++- system/lemmy/lemmy.go | 4 +++- system/system.go | 2 +- ui/views/posts/posts.go | 8 ++++--- 7 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 aggregator/aggregator.go diff --git a/aggregator/aggregator.go b/aggregator/aggregator.go new file mode 100644 index 0000000..c250938 --- /dev/null +++ b/aggregator/aggregator.go @@ -0,0 +1,43 @@ +package aggregator + +import ( + "sort" + + "github.com/mrusme/gobbs/models/post" + "github.com/mrusme/gobbs/ui/ctx" +) + +type Aggregator struct { + ctx *ctx.Ctx +} + +func New(c *ctx.Ctx) (*Aggregator, error) { + a := new(Aggregator) + a.ctx = c + + return a, nil +} + +func (a *Aggregator) ListPosts() ([]post.Post, []error) { + var errs []error = make([]error, len(a.ctx.Systems)) + var posts []post.Post + + for idx, sys := range a.ctx.Systems { + sysPosts, err := (*sys).ListPosts(idx) + if err != nil { + errs[idx] = err + continue + } + posts = append(posts, sysPosts...) + } + + sort.SliceStable(posts, func(i, j int) bool { + return posts[i].CreatedAt.After(posts[j].CreatedAt) + }) + + return posts, errs +} + +func (a *Aggregator) LoadPost(p *post.Post) error { + return (*a.ctx.Systems[p.SysIDX]).LoadPost(p) +} diff --git a/cmd/root.go b/cmd/root.go index 66f2fe5..e0271e1 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -5,6 +5,7 @@ import ( "os" tea "github.com/charmbracelet/bubbletea" + "github.com/mrusme/gobbs/aggregator" "github.com/mrusme/gobbs/config" "github.com/mrusme/gobbs/system" "github.com/mrusme/gobbs/ui" @@ -79,12 +80,15 @@ var rootCmd = &cobra.Command{ c := ctx.New(&CFG, LOG) _ = loadSystems(&c) // TODO: Handle errs - posts, err := (*c.Systems[0]).ListPosts() + a, _ := aggregator.New(&c) + posts, errs := a.ListPosts() + // posts, err := (*c.Systems[0]).ListPosts() fmt.Println("-----------------------") fmt.Printf("%v\n", posts) - fmt.Printf("%v\n", err) + fmt.Printf("%v\n", errs) - err = (*c.Systems[0]).LoadPost(&posts[4]) + // err = s(*c.Systems[0]).LoadPost(&posts[4]) + err := a.LoadPost(&posts[4]) fmt.Printf("%v\n", posts[4].Replies[2]) fmt.Printf("%v\n", err) os.Exit(0) diff --git a/models/post/post.go b/models/post/post.go index 271ed4b..198a285 100644 --- a/models/post/post.go +++ b/models/post/post.go @@ -23,6 +23,8 @@ type Post struct { Author author.Author Replies []reply.Reply + + SysIDX int } func (post Post) FilterValue() string { diff --git a/system/discourse/discourse.go b/system/discourse/discourse.go index 44b8e4a..3f875ee 100644 --- a/system/discourse/discourse.go +++ b/system/discourse/discourse.go @@ -72,7 +72,7 @@ func (sys *System) Load() error { return nil } -func (sys *System) ListPosts() ([]post.Post, error) { +func (sys *System) ListPosts(sysIdx int) ([]post.Post, error) { items, err := sys.client.Topics.ListLatest(context.Background()) if err != nil { return []post.Post{}, err @@ -114,6 +114,8 @@ func (sys *System) ListPosts() ([]post.Post, error) { ID: strconv.Itoa(i.Posters[0].UserID), Name: userName, }, + + SysIDX: sysIdx, }) } diff --git a/system/lemmy/lemmy.go b/system/lemmy/lemmy.go index 8d9cbd3..91c95f7 100644 --- a/system/lemmy/lemmy.go +++ b/system/lemmy/lemmy.go @@ -80,7 +80,7 @@ func (sys *System) Load() error { return nil } -func (sys *System) ListPosts() ([]post.Post, error) { +func (sys *System) ListPosts(sysIdx int) ([]post.Post, error) { resp, err := sys.client.Posts(context.Background(), types.GetPosts{ Type: types.NewOptional(types.ListingLocal), Sort: types.NewOptional(types.New), @@ -125,6 +125,8 @@ func (sys *System) ListPosts() ([]post.Post, error) { ID: strconv.Itoa(i.Post.CreatorID), Name: i.Creator.Name, }, + + SysIDX: sysIdx, }) } diff --git a/system/system.go b/system/system.go index ee8c7be..3dd495a 100644 --- a/system/system.go +++ b/system/system.go @@ -19,7 +19,7 @@ type System interface { Connect(sysURL string) error Load() error - ListPosts() ([]post.Post, error) + ListPosts(sysIdx int) ([]post.Post, error) LoadPost(p *post.Post) error } diff --git a/ui/views/posts/posts.go b/ui/views/posts/posts.go index 7ce3ec9..5994e09 100644 --- a/ui/views/posts/posts.go +++ b/ui/views/posts/posts.go @@ -9,6 +9,7 @@ import ( "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" + "github.com/mrusme/gobbs/aggregator" "github.com/mrusme/gobbs/models/post" "github.com/mrusme/gobbs/ui/ctx" ) @@ -171,9 +172,10 @@ func (m *Model) refresh() tea.Cmd { return func() tea.Msg { var items []list.Item - posts, err := (*m.ctx.Systems[0]).ListPosts() - if err != nil { - fmt.Printf("%s", err) // TODO: Implement error message + a, _ := aggregator.New(m.ctx) + posts, errs := a.ListPosts() + if len(errs) > 0 { + fmt.Printf("%s", errs) // TODO: Implement error message } for _, post := range posts { items = append(items, post)