checkpoint: got the list of notification IDs

This commit is contained in:
Dan Anglin 2024-06-03 10:48:46 +01:00
parent 0f7668a046
commit 2919bb9fa2
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
5 changed files with 162 additions and 11 deletions

View file

@ -0,0 +1,33 @@
// SPDX-FileCopyrightText: 2024 Dan Anglin <d.n.i.anglin@gmail.com>
//
// SPDX-License-Identifier: GPL-3.0-or-later
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, &notifications); err != nil {
return nil, fmt.Errorf("received an error after sending the request to get your notifications: %w", err)
}
return notifications, nil
}
func (g *Client) GetNotification() error {
return nil
}
func (g *Client) DeleteAllNotifications() error {
return nil
}

View file

@ -35,14 +35,15 @@ const (
flagType = "type" flagType = "type"
flagVisibility = "visibility" flagVisibility = "visibility"
resourceAccount = "account" resourceAccount = "account"
resourceBlocked = "blocked" resourceBlocked = "blocked"
resourceFollowers = "followers" resourceFollowers = "followers"
resourceFollowing = "following" resourceFollowing = "following"
resourceInstance = "instance" resourceInstance = "instance"
resourceList = "list" resourceList = "list"
resourceNote = "note" resourceNote = "note"
resourceStatus = "status" resourceStatus = "status"
resourceTimeline = "timeline" resourceTimeline = "timeline"
resourceBookmarks = "bookmarks" resourceBookmarks = "bookmarks"
resourceNotification = "notification"
) )

View file

@ -67,6 +67,7 @@ func (s *ShowExecutor) Execute() error {
resourceFollowing: s.showFollowing, resourceFollowing: s.showFollowing,
resourceBlocked: s.showBlocked, resourceBlocked: s.showBlocked,
resourceBookmarks: s.showBookmarks, resourceBookmarks: s.showBookmarks,
resourceNotification: s.showNotifications,
} }
doFunc, ok := funcMap[s.resourceType] doFunc, ok := funcMap[s.resourceType]
@ -329,3 +330,16 @@ func (s *ShowExecutor) showBookmarks(gtsClient *client.Client) error {
return nil return nil
} }
func (s *ShowExecutor) showNotifications(gts *client.Client) error {
notifications, err := gts.GetNotifications(s.limit)
if err != nil {
return fmt.Errorf("unable to retrieve your notifications: %w", err)
}
for i := range notifications {
fmt.Printf("\nNotification ID: %s\n%s", notifications[i].ID, notifications[i].Type)
}
return nil
}

View file

@ -0,0 +1,103 @@
// SPDX-FileCopyrightText: 2024 Dan Anglin <d.n.i.anglin@gmail.com>
//
// SPDX-License-Identifier: GPL-3.0-or-later
package model
import (
"encoding/json"
"fmt"
"time"
)
type NotificationType int
const (
NotificationTypeFollow NotificationType = iota
NotificationTypeFollowRequest
NotificationTypeMention
NotificationTypeReblog
NotificationTypeFavourite
NotificationTypePoll
NotificationTypeStatus
NotificationTypeUnknown
)
const (
notificationFollow = "follow"
notificationFollowRequest = "follow_request"
notificationMention = "mention"
notificationReblog = "reblog"
notificationFavourite = "favourite"
notificationPoll = "poll"
notificationStatus = "status"
)
func (n NotificationType) String() string {
mapped := map[NotificationType]string{
NotificationTypeFollow: "Someone followed you",
NotificationTypeFollowRequest: "Someone requested to follow you",
NotificationTypeMention: "Someone mentioned you in their status",
NotificationTypeReblog: "Someone reposted one of your statuses",
NotificationTypeFavourite: "Someone liked one of your statuses",
NotificationTypePoll: "A poll you have participated in has ended",
NotificationTypeStatus: "Someone you enabled notifications for has posted a status",
}
output, ok := mapped[n]
if !ok {
return "You have received an unknown notification"
}
return output
}
func ParseNotificationType(value string) (NotificationType, error) {
mapped := map[string]NotificationType{
notificationFollow: NotificationTypeFollow,
notificationFollowRequest: NotificationTypeFollowRequest,
notificationMention: NotificationTypeMention,
notificationReblog: NotificationTypeReblog,
notificationFavourite: NotificationTypeFavourite,
notificationPoll: NotificationTypePoll,
notificationStatus: NotificationTypeStatus,
}
output, ok := mapped[value]
if !ok {
return NotificationTypeUnknown, UnknownNotificationError{}
}
return output, nil
}
func (n *NotificationType) UnmarshalJSON(data []byte) error {
var (
value string
err error
)
if err = json.Unmarshal(data, &value); err != nil {
return fmt.Errorf("unable to unmarshal the data: %w", err)
}
// Ignore the error if the notification type from another Fediverse service
// is not known by enbas. It will be seen as an unknown notification to the user.
*n, _ = ParseNotificationType(value)
return nil
}
type UnknownNotificationError struct{}
func (e UnknownNotificationError) Error() string {
return "unknown notification type"
}
type Notification struct {
Account *Account `json:"account"`
CreatedAt time.Time `json:"created_at"`
ID string `json:"id"`
Status *Status `json:"status"`
Type NotificationType `json:"type"`
}

View file

@ -83,7 +83,7 @@ type Poll struct {
type PollOption struct { type PollOption struct {
Title string `json:"title"` Title string `json:"title"`
VotesCount string `json:"votes_count"` VotesCount int `json:"votes_count"`
} }
type StatusReblogged struct { type StatusReblogged struct {