From ae1bf73b90510461da271ea94b7e92a04cb06494 Mon Sep 17 00:00:00 2001 From: Dan Anglin Date: Sun, 19 May 2024 20:20:08 +0100 Subject: [PATCH] checkpoint: notifications implementation --- cmd/enbas/main.go | 14 +++++++----- cmd/enbas/show.go | 39 +++++++++++++++++++++++--------- internal/client/notifications.go | 29 ++++++++++++++++++++++++ internal/model/notification.go | 2 +- 4 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 internal/client/notifications.go diff --git a/cmd/enbas/main.go b/cmd/enbas/main.go index b9fa5f7..1e8292e 100644 --- a/cmd/enbas/main.go +++ b/cmd/enbas/main.go @@ -15,21 +15,23 @@ const ( listTitleFlag = "list-title" listRepliesPolicyFlag = "list-replies-policy" myAccountFlag = "my-account" + notificationIDFlag = "notification-id" removeFromFlag = "remove-from" resourceTypeFlag = "type" statusIDFlag = "status-id" tagFlag = "tag" timelineCategoryFlag = "timeline-category" - timelineLimitFlag = "timeline-limit" + limitFlag = "limit" toAccountFlag = "to-account" ) const ( - accountResource = "account" - instanceResource = "instance" - listResource = "list" - statusResource = "status" - timelineResource = "timeline" + accountResource = "account" + instanceResource = "instance" + listResource = "list" + notificationResource = "notification" + statusResource = "status" + timelineResource = "timeline" ) type Executor interface { diff --git a/cmd/enbas/show.go b/cmd/enbas/show.go index 8d21d92..d038ef8 100644 --- a/cmd/enbas/show.go +++ b/cmd/enbas/show.go @@ -19,7 +19,8 @@ type showCommand struct { timelineCategory string listID string tag string - timelineLimit int + limit int + notificationID string } func newShowCommand(name, summary string) *showCommand { @@ -34,7 +35,8 @@ func newShowCommand(name, summary string) *showCommand { command.StringVar(&command.timelineCategory, timelineCategoryFlag, "home", "specify the type of timeline to display (valid values are home, public, list and tag)") command.StringVar(&command.listID, listIDFlag, "", "specify the ID of the list to display") command.StringVar(&command.tag, tagFlag, "", "specify the name of the tag to use") - command.IntVar(&command.timelineLimit, timelineLimitFlag, 5, "specify the number of statuses to display") + command.IntVar(&command.limit, limitFlag, 20, "specify the limit") + command.StringVar(&command.notificationID, notificationIDFlag, "", "specify the ID of the notification to display") command.Usage = commandUsageFunc(name, summary, command.FlagSet) @@ -47,11 +49,12 @@ func (c *showCommand) Execute() error { } funcMap := map[string]func(*client.Client) error{ - instanceResource: c.showInstance, - accountResource: c.showAccount, - statusResource: c.showStatus, - timelineResource: c.showTimeline, - listResource: c.showList, + instanceResource: c.showInstance, + accountResource: c.showAccount, + statusResource: c.showStatus, + timelineResource: c.showTimeline, + listResource: c.showList, + notificationResource: c.showNotification, } doFunc, ok := funcMap[c.resourceType] @@ -129,21 +132,21 @@ func (c *showCommand) showTimeline(gts *client.Client) error { switch c.timelineCategory { case "home": - timeline, err = gts.GetHomeTimeline(c.timelineLimit) + timeline, err = gts.GetHomeTimeline(c.limit) case "public": - timeline, err = gts.GetPublicTimeline(c.timelineLimit) + timeline, err = gts.GetPublicTimeline(c.limit) case "list": if c.listID == "" { return flagNotSetError{flagText: listIDFlag} } - timeline, err = gts.GetListTimeline(c.listID, c.timelineLimit) + timeline, err = gts.GetListTimeline(c.listID, c.limit) case "tag": if c.tag == "" { return flagNotSetError{flagText: tagFlag} } - timeline, err = gts.GetTagTimeline(c.tag, c.timelineLimit) + timeline, err = gts.GetTagTimeline(c.tag, c.limit) default: return invalidTimelineCategoryError{category: c.timelineCategory} } @@ -183,6 +186,7 @@ func (c *showCommand) showList(gts *client.Client) error { for i := range accounts { accountMap[accounts[i].ID] = accounts[i].Username } + list.Accounts = accountMap } @@ -208,3 +212,16 @@ func (c *showCommand) showLists(gts *client.Client) error { return nil } + +func (c *showCommand) showNotification(gts *client.Client) error { + notifications, err := gts.GetNotifications(c.limit) + if err != nil { + return fmt.Errorf("unable to retrieve the notifications; %w", err) + } + + for i := range notifications { + fmt.Printf("\nNotification ID: %s\n%s", notifications[i].ID, notifications[i].Type) + } + + return nil +} diff --git a/internal/client/notifications.go b/internal/client/notifications.go new file mode 100644 index 0000000..c88df9b --- /dev/null +++ b/internal/client/notifications.go @@ -0,0 +1,29 @@ +package client + +import ( + "fmt" + "net/http" + + "codeflow.dananglin.me.uk/apollo/enbas/internal/model" +) + +func (g *Client) GetNotifications(limit int) ([]model.Notification, error) { + path := fmt.Sprintf("/api/v1/notifications?limit=%d", limit) + url := g.Authentication.Instance + path + + var notifications []model.Notification + + if err := g.sendRequest(http.MethodGet, url, nil, ¬ifications); err != nil { + return nil, fmt.Errorf("received an error after sending the request to get the notifications; %w", err) + } + + return notifications, nil +} + +func (g *Client) GetNotification() error { + return nil +} + +func (g *Client) DeleteAllNotifications() error { + return nil +} diff --git a/internal/model/notification.go b/internal/model/notification.go index 751d1c3..e5cf6d6 100644 --- a/internal/model/notification.go +++ b/internal/model/notification.go @@ -53,7 +53,7 @@ func (n NotificationType) String() string { case NotificationTypeFavourite: return "Someone liked one of your statuses" case NotificationTypePoll: - return "A poll you have voted in (or created) has ended" + return "A poll you have participated in has ended" case NotificationTypeStatus: return "Someone you enabled notifications for has posted a status" }