From 3e2aea81b4729d8f8097c04d660a66a3fadc8dc6 Mon Sep 17 00:00:00 2001 From: minhlq Date: Tue, 21 Feb 2023 18:28:32 +0700 Subject: [PATCH] changelog list --- pkg/adapter/fortress/fortress.go | 16 ++++++++ pkg/adapter/fortress/interface.go | 2 + pkg/discord/command/changelog/base.go | 41 +++++++++++++++++++++ pkg/discord/command/changelog/changelog.go | 37 +++++++++++++++++++ pkg/discord/command/changelog/interface.go | 12 ++++++ pkg/discord/command/command.go | 2 + pkg/discord/service/changelog/changelog.go | 33 +++++++++++++++++ pkg/discord/service/changelog/interface.go | 7 ++++ pkg/discord/service/interface.go | 2 + pkg/discord/service/service.go | 7 ++++ pkg/discord/view/changelog/changelog.go | 43 ++++++++++++++++++++++ pkg/discord/view/changelog/interface.go | 8 ++++ pkg/discord/view/interface.go | 2 + pkg/discord/view/view.go | 7 ++++ pkg/model/changelog.go | 15 ++++++++ 15 files changed, 234 insertions(+) create mode 100644 pkg/discord/command/changelog/base.go create mode 100644 pkg/discord/command/changelog/changelog.go create mode 100644 pkg/discord/command/changelog/interface.go create mode 100644 pkg/discord/service/changelog/changelog.go create mode 100644 pkg/discord/service/changelog/interface.go create mode 100644 pkg/discord/view/changelog/changelog.go create mode 100644 pkg/discord/view/changelog/interface.go create mode 100644 pkg/model/changelog.go diff --git a/pkg/adapter/fortress/fortress.go b/pkg/adapter/fortress/fortress.go index ee79435..0fe4f43 100644 --- a/pkg/adapter/fortress/fortress.go +++ b/pkg/adapter/fortress/fortress.go @@ -21,6 +21,22 @@ func New(url string) FortressAdapter { } } +// GetChangelogs implements FortressAdapter +func (f *Fortress) GetChangelogs() (changelogs *model.ChangelogDigest, err error) { + resp, err := http.Get(f.Url + "/api/v1/notion-changelog/projects/available") + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("invalid call, code %v", resp.StatusCode) + } + if err := json.NewDecoder(resp.Body).Decode(&changelogs); err != nil { + return nil, fmt.Errorf("invalid decoded, error %v", err.Error()) + } + return changelogs, nil +} + func (f *Fortress) GetCommunityEarn() (earns *model.AdapterEarn, err error) { resp, err := http.Get(f.Url + "/api/v1/earn") if err != nil { diff --git a/pkg/adapter/fortress/interface.go b/pkg/adapter/fortress/interface.go index 89361c8..4514c98 100644 --- a/pkg/adapter/fortress/interface.go +++ b/pkg/adapter/fortress/interface.go @@ -25,4 +25,6 @@ type FortressAdapter interface { GetActiveIssues() (issues *model.AdapterIssue, err error) LogTechRadarTopic(topicName string, discordId string) error + + GetChangelogs() (digests *model.ChangelogDigest, err error) } diff --git a/pkg/discord/command/changelog/base.go b/pkg/discord/command/changelog/base.go new file mode 100644 index 0000000..7d0e322 --- /dev/null +++ b/pkg/discord/command/changelog/base.go @@ -0,0 +1,41 @@ +package changelog + +import ( + "github.com/dwarvesf/fortress-discord/pkg/model" +) + +func (a *Changelog) Prefix() []string { + return []string{"changelog"} +} + +// Execute is where we handle logic for each command +func (a *Changelog) Execute(message *model.DiscordMessage) error { + // default command for only 1 args input from user, e.g `?earn` + if len(message.ContentArgs) == 1 { + return a.DefaultCommand(message) + } + + // handle command for 2 args input from user, e.g `?earn list` + switch message.ContentArgs[1] { + case "list": + return a.List(message) + } + + return nil +} + +func (a *Changelog) Name() string { + return "Changelog Command" +} + +func (a *Changelog) Help(message *model.DiscordMessage) error { + return nil +} + +func (a *Changelog) DefaultCommand(message *model.DiscordMessage) error { + return a.List(message) +} + +func (a *Changelog) PermissionCheck(message *model.DiscordMessage) (bool, []string) { + return true, []string{} +} diff --git a/pkg/discord/command/changelog/changelog.go b/pkg/discord/command/changelog/changelog.go new file mode 100644 index 0000000..185e53c --- /dev/null +++ b/pkg/discord/command/changelog/changelog.go @@ -0,0 +1,37 @@ +package changelog + +import ( + "github.com/dwarvesf/fortress-discord/pkg/discord/service" + "github.com/dwarvesf/fortress-discord/pkg/discord/view" + "github.com/dwarvesf/fortress-discord/pkg/logger" + "github.com/dwarvesf/fortress-discord/pkg/model" + "github.com/k0kubun/pp" +) + +type Changelog struct { + L logger.Logger + svc service.Servicer + view view.Viewer +} + +func New(l logger.Logger, svc service.Servicer, view view.Viewer) ChangelogCommander { + return &Changelog{ + L: l, + svc: svc, + view: view, + } +} + +func (t *Changelog) List(message *model.DiscordMessage) error { + // 1. get data from service + data, err := t.svc.Changelog().GetListChangelogs() + if err != nil { + t.L.Error(err, "can't get list of Changelog") + return err + } + + pp.Println(data) + + // 2. render + return t.view.Changelog().Changelog(message, data) +} diff --git a/pkg/discord/command/changelog/interface.go b/pkg/discord/command/changelog/interface.go new file mode 100644 index 0000000..cd5ebf3 --- /dev/null +++ b/pkg/discord/command/changelog/interface.go @@ -0,0 +1,12 @@ +package changelog + +import ( + "github.com/dwarvesf/fortress-discord/pkg/discord/base" + "github.com/dwarvesf/fortress-discord/pkg/model" +) + +type ChangelogCommander interface { + base.TextCommander + + List(message *model.DiscordMessage) error +} diff --git a/pkg/discord/command/command.go b/pkg/discord/command/command.go index 977aa69..3bdb82e 100644 --- a/pkg/discord/command/command.go +++ b/pkg/discord/command/command.go @@ -5,6 +5,7 @@ import ( "github.com/dwarvesf/fortress-discord/pkg/discord/base" "github.com/dwarvesf/fortress-discord/pkg/discord/command/adopt" "github.com/dwarvesf/fortress-discord/pkg/discord/command/assess" + "github.com/dwarvesf/fortress-discord/pkg/discord/command/changelog" "github.com/dwarvesf/fortress-discord/pkg/discord/command/digest" "github.com/dwarvesf/fortress-discord/pkg/discord/command/done" "github.com/dwarvesf/fortress-discord/pkg/discord/command/earn" @@ -60,6 +61,7 @@ func New(cfg *config.Config, l logger.Logger, svc service.Servicer, view view.Vi done.New(cfg, l, svc, view), radar.New(l, svc, view), issue.New(l, svc, view), + changelog.New(l, svc, view), }) return cmd diff --git a/pkg/discord/service/changelog/changelog.go b/pkg/discord/service/changelog/changelog.go new file mode 100644 index 0000000..73c6ea2 --- /dev/null +++ b/pkg/discord/service/changelog/changelog.go @@ -0,0 +1,33 @@ +package changelog + +import ( + "github.com/dwarvesf/fortress-discord/pkg/adapter" + "github.com/dwarvesf/fortress-discord/pkg/logger" + "github.com/dwarvesf/fortress-discord/pkg/model" +) + +type Changelog struct { + adapter adapter.IAdapter + l logger.Logger +} + +func New(adapter adapter.IAdapter, l logger.Logger) ChangelogServicer { + return &Changelog{ + adapter: adapter, + l: l, + } +} + +func (e *Changelog) GetListChangelogs() ([]*model.Changelog, error) { + // get response from fortress + adapterChangelog, err := e.adapter.Fortress().GetChangelogs() + if err != nil { + e.l.Error(err, "can't get open changelog from fortress") + return nil, err + } + + // normalized into in-app model + changelog := adapterChangelog.Data + + return changelog, nil +} diff --git a/pkg/discord/service/changelog/interface.go b/pkg/discord/service/changelog/interface.go new file mode 100644 index 0000000..2ce129a --- /dev/null +++ b/pkg/discord/service/changelog/interface.go @@ -0,0 +1,7 @@ +package changelog + +import "github.com/dwarvesf/fortress-discord/pkg/model" + +type ChangelogServicer interface { + GetListChangelogs() ([]*model.Changelog, error) +} diff --git a/pkg/discord/service/interface.go b/pkg/discord/service/interface.go index 728c208..7dbda70 100644 --- a/pkg/discord/service/interface.go +++ b/pkg/discord/service/interface.go @@ -1,6 +1,7 @@ package service import ( + "github.com/dwarvesf/fortress-discord/pkg/discord/service/changelog" "github.com/dwarvesf/fortress-discord/pkg/discord/service/digest" "github.com/dwarvesf/fortress-discord/pkg/discord/service/earn" "github.com/dwarvesf/fortress-discord/pkg/discord/service/event" @@ -23,6 +24,7 @@ type Servicer interface { Staff() staff.StaffServicer Project() project.ProjectServicer Digest() digest.DigestServicer + Changelog() changelog.ChangelogServicer Memo() memo.MemoServicer Treasury() treasury.TreasuryServicer Issue() issue.IssueServicer diff --git a/pkg/discord/service/service.go b/pkg/discord/service/service.go index abc7c6c..64b7c39 100644 --- a/pkg/discord/service/service.go +++ b/pkg/discord/service/service.go @@ -2,6 +2,7 @@ package service import ( "github.com/dwarvesf/fortress-discord/pkg/adapter" + "github.com/dwarvesf/fortress-discord/pkg/discord/service/changelog" "github.com/dwarvesf/fortress-discord/pkg/discord/service/digest" "github.com/dwarvesf/fortress-discord/pkg/discord/service/earn" "github.com/dwarvesf/fortress-discord/pkg/discord/service/event" @@ -32,6 +33,7 @@ type subService struct { Memo memo.MemoServicer Treasury treasury.TreasuryServicer Issue issue.IssueServicer + Changelog changelog.ChangelogServicer } func New(adapter adapter.IAdapter, l logger.Logger) Servicer { @@ -48,6 +50,7 @@ func New(adapter adapter.IAdapter, l logger.Logger) Servicer { Memo: memo.New(adapter, l), Treasury: treasury.New(adapter, l), Issue: issue.New(adapter, l), + Changelog: changelog.New(adapter, l), }, } } @@ -95,3 +98,7 @@ func (s *Service) Treasury() treasury.TreasuryServicer { func (s *Service) Issue() issue.IssueServicer { return s.subService.Issue } + +func (s *Service) Changelog() changelog.ChangelogServicer { + return s.subService.Changelog +} diff --git a/pkg/discord/view/changelog/changelog.go b/pkg/discord/view/changelog/changelog.go new file mode 100644 index 0000000..a0b1f97 --- /dev/null +++ b/pkg/discord/view/changelog/changelog.go @@ -0,0 +1,43 @@ +package changelog + +import ( + "strings" + + "github.com/bwmarrin/discordgo" + "github.com/dwarvesf/fortress-discord/pkg/discord/view/base" + "github.com/dwarvesf/fortress-discord/pkg/model" +) + +type Changelog struct { + ses *discordgo.Session +} + +func New(ses *discordgo.Session) ChangelogViewer { + return &Changelog{ + ses: ses, + } +} + +func (c *Changelog) Changelog(message *model.DiscordMessage, data []*model.Changelog) error { + content := []string{ + "**?earn**・earn $ICY for free", + "**?trial**・list of trial tech", + "**?assess**・list of assess tech", + "**?adopt**・list of adopt tech", + "**?hold**・list of on-hold tech", + "**?new**・list of new subscribers", + "**?event**・list of upcoming events", + "**?hiring**・list of open positions", + "**?staff**・list of staffing demands", + "**?milestones**・list of projects milestones", + "**?updates**・list of Dwarves updates", + "**?digest**・list of Internal Digests", + "**?memos**・list of Team memos", + } + msg := &discordgo.MessageEmbed{ + Title: "**Changelog**", + Description: strings.Join(content, "\n"), + } + + return base.SendEmbededMessage(c.ses, message, msg) +} diff --git a/pkg/discord/view/changelog/interface.go b/pkg/discord/view/changelog/interface.go new file mode 100644 index 0000000..743000a --- /dev/null +++ b/pkg/discord/view/changelog/interface.go @@ -0,0 +1,8 @@ +package changelog + +import "github.com/dwarvesf/fortress-discord/pkg/model" + +// ChangelogViewer is an interface for changelog view +type ChangelogViewer interface { + Changelog(message *model.DiscordMessage, data []*model.Changelog) error +} diff --git a/pkg/discord/view/interface.go b/pkg/discord/view/interface.go index aae3f84..2fe60a8 100644 --- a/pkg/discord/view/interface.go +++ b/pkg/discord/view/interface.go @@ -1,6 +1,7 @@ package view import ( + "github.com/dwarvesf/fortress-discord/pkg/discord/view/changelog" "github.com/dwarvesf/fortress-discord/pkg/discord/view/digest" "github.com/dwarvesf/fortress-discord/pkg/discord/view/done" "github.com/dwarvesf/fortress-discord/pkg/discord/view/earn" @@ -30,4 +31,5 @@ type Viewer interface { Memo() memo.MemoViewer Done() done.DoneViewer Issue() issue.IssueViewer + Changelog() changelog.ChangelogViewer } diff --git a/pkg/discord/view/view.go b/pkg/discord/view/view.go index 9aebb77..4a26f22 100644 --- a/pkg/discord/view/view.go +++ b/pkg/discord/view/view.go @@ -3,6 +3,7 @@ package view import ( "github.com/bwmarrin/discordgo" + "github.com/dwarvesf/fortress-discord/pkg/discord/view/changelog" "github.com/dwarvesf/fortress-discord/pkg/discord/view/digest" "github.com/dwarvesf/fortress-discord/pkg/discord/view/done" "github.com/dwarvesf/fortress-discord/pkg/discord/view/earn" @@ -36,6 +37,7 @@ type subView struct { Memo memo.MemoViewer Done done.DoneViewer Issue issue.IssueViewer + Changelog changelog.ChangelogViewer } func New(ses *discordgo.Session) Viewer { @@ -54,6 +56,7 @@ func New(ses *discordgo.Session) Viewer { Memo: memo.New(ses), Done: done.New(ses), Issue: issue.New(ses), + Changelog: changelog.New(ses), }, } } @@ -109,3 +112,7 @@ func (v *View) Done() done.DoneViewer { func (v *View) Issue() issue.IssueViewer { return v.subView.Issue } + +func (v *View) Changelog() changelog.ChangelogViewer { + return v.subView.Changelog +} diff --git a/pkg/model/changelog.go b/pkg/model/changelog.go new file mode 100644 index 0000000..d39d535 --- /dev/null +++ b/pkg/model/changelog.go @@ -0,0 +1,15 @@ +package model + +// ChangelogDigest is a struct response from adapter, before process to in-app model +type ChangelogDigest struct { + Data []*Changelog `json:"data"` + Message string `json:"message"` +} + +// Changelog is a model for changelog +type Changelog struct { + RowID string `json:"row_id"` + Name string `json:"name"` + Title string `json:"title"` + ChangelogURL string `json:"changelog_url"` +}