1
0
mirror of https://github.com/mrusme/neonmodem.git synced 2024-06-16 06:25:23 +00:00

Refactored response, implemented topics

This commit is contained in:
マリウス 2022-12-29 23:47:16 -05:00
parent d203f0a112
commit d6436021f1
No known key found for this signature in database
GPG Key ID: 272ED814BF63261F
4 changed files with 136 additions and 26 deletions

View File

@ -82,6 +82,7 @@ var rootCmd = &cobra.Command{
posts, err := (*c.Systems[0]).ListPosts()
fmt.Println("-----------------------")
fmt.Printf("%v\n", posts)
fmt.Printf("%v\n", err)
os.Exit(0)
tui := tea.NewProgram(ui.NewModel(&c), tea.WithAltScreen())

View File

@ -13,32 +13,18 @@ import (
)
type Response struct {
Type string `json:"type"`
Timestamp int64 `json:"timestamp"`
Message string `json:"message"`
Validation map[string]interface{} `json:"validation,omitempty"`
Post PostModel `json:"post,omitempty"`
Posts []PostModel `json:"latest_posts,omitempty"`
}
type RequestError struct {
Response Response
Err error
Err error
}
func (re *RequestError) Error() string {
return re.Err.Error()
}
func (re *RequestError) Type() string {
return re.Response.Type
}
func (re *RequestError) Message() string {
return re.Response.Message
}
type Logger interface {
Debug(args ...interface{})
Debugf(format string, args ...interface{})
@ -82,7 +68,9 @@ type Client struct {
endpoint *url.URL
credentials map[string]string
logger Logger
Posts PostsService
Posts PostsService
Topics TopicsService
}
func NewDefaultClientConfig(
@ -111,6 +99,7 @@ func NewClient(cc *ClientConfig) *Client {
c.credentials = cc.Credentials
c.Posts = &PostServiceHandler{client: c}
c.Topics = &TopicServiceHandler{client: c}
return c
}
@ -156,7 +145,7 @@ func (c *Client) NewRequest(
func (c *Client) Do(
ctx context.Context,
req *http.Request,
content *Response,
content interface{},
) error {
var rreq *retryablehttp.Request
var res *http.Response
@ -186,8 +175,7 @@ func (c *Client) Do(
if res.StatusCode < http.StatusOK ||
res.StatusCode > http.StatusNoContent {
return &RequestError{
Err: errors.New("Non-2xx status code"),
Response: *content,
Err: errors.New("Non-2xx status code"),
}
}

View File

@ -62,18 +62,18 @@ func (sys *System) ListPosts() ([]post.Post, error) {
Logger: sys.logger,
})
posts, err := c.Posts.List(context.Background())
items, err := c.Topics.ListLatest(context.Background())
if err != nil {
return []post.Post{}, err
}
var mPosts []post.Post
for _, p := range posts {
mPosts = append(mPosts, post.Post{
ID: string(p.ID),
Subject: p.TopicTitle,
var models []post.Post
for _, i := range (*items).TopicList.Topics {
models = append(models, post.Post{
ID: string(i.ID),
Subject: i.Title,
})
}
return mPosts, nil
return models, nil
}

121
system/discourse/topics.go Normal file
View File

@ -0,0 +1,121 @@
package discourse
import (
"context"
"net/http"
)
const TopicsBaseURL = "/topics"
type LatestTopicsResponse struct {
Users []struct {
ID int `json:"id"`
Username string `json:"username"`
Name string `json:"name"`
AvatarTemplate string `json:"avatar_template"`
}
TopicList struct {
CanCreateTopic bool `json:"can_create_topic"`
Draft string `json:"draft"`
DraftKey string `json:"draft_key"`
DraftSequence int `json:"draft_sequence"`
PerPage int `json:"per_page"`
Topics []TopicModel `json:"topics"`
} `json:"topic_list"`
}
type TopicModel struct {
ID int `json:"id"`
Title string `json:"title"`
FancyTitle string `json:"fancy_title"`
Slug string `json:"slug"`
PostsCount int `json:"posts_count"`
ReplyCount int `json:"reply_count"`
HighestPostNumber int `json:"highest_post_number"`
ImageURL string `json:"image_url"`
CreatedAt string `json:"created_at"`
LastPostedAt string `json:"last_posted_at"`
Bumped bool `json:"bumped"`
BumpedAt string `json:"bumped_at"`
Archetype string `json:"archetype"`
Unseen bool `json:"unseen"`
LastReadPostNumber int `json:"last_read_post_number"`
UnreadPosts int `json:"unread_posts"`
Pinned bool `json:"pinned"`
Unpinned string `json:"unpinned"`
Visible bool `json:"visible"`
Closed bool `json:"closed"`
Archived bool `json:"archived"`
NotificationLevel int `json:"notification_level"`
Bookmarked bool `json:"bookmarked"`
Liked bool `json:"liked"`
Views int `json:"views"`
LikeCount int `json:"like_count"`
HasSummary bool `json:"has_summary"`
LastPosterUsername string `json:"last_poster_username"`
CategoryID int `json:"category_id"`
OpLikeCount int `json:"op_like_count"`
PinnedGlobally bool `json:"pinned_globally"`
FeaturedLink string `json:"featured_link"`
Posters []struct {
Extras string `json:"extras"`
Description string `json:"description"`
UserID int `json:"user_id"`
PrimaryGroupID string `json:"primary_group_id"`
} `json:"posters"`
}
type TopicsService interface {
Show(
ctx context.Context,
id string,
) (*TopicModel, error)
ListLatest(
ctx context.Context,
) (*LatestTopicsResponse, error)
}
type TopicServiceHandler struct {
client *Client
}
// Show
func (a *TopicServiceHandler) Show(
ctx context.Context,
id string,
) (*TopicModel, error) {
uri := TopicsBaseURL + "/t/" + id + ".json"
req, err := a.client.NewRequest(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, err
}
response := new(TopicModel)
if err = a.client.Do(ctx, req, response); err != nil {
return nil, err
}
return response, nil
}
// List
func (a *TopicServiceHandler) ListLatest(
ctx context.Context,
) (*LatestTopicsResponse, error) {
uri := "/latest.json"
req, err := a.client.NewRequest(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, err
}
response := new(LatestTopicsResponse)
if err = a.client.Do(ctx, req, response); err != nil {
return nil, err
}
return response, nil
}