Method chaining for user posts/comments
Signed-off-by: Vartan Benohanian <vartanbeno@gmail.com>
This commit is contained in:
@@ -17,36 +17,18 @@ type UserService interface {
|
|||||||
Overview(ctx context.Context, opts *ListOptions) (*CommentsLinks, *Response, error)
|
Overview(ctx context.Context, opts *ListOptions) (*CommentsLinks, *Response, error)
|
||||||
OverviewOf(ctx context.Context, username string, opts *ListOptions) (*CommentsLinks, *Response, error)
|
OverviewOf(ctx context.Context, username string, opts *ListOptions) (*CommentsLinks, *Response, error)
|
||||||
|
|
||||||
// returns the client's links
|
GetPosts() *UserPostFinder
|
||||||
GetHotLinks(ctx context.Context, opts *ListOptions) (*Links, *Response, error)
|
GetPostsOf(username string) *UserPostFinder
|
||||||
GetNewLinks(ctx context.Context, opts *ListOptions) (*Links, *Response, error)
|
|
||||||
GetTopLinks(ctx context.Context, opts *ListOptions) (*Links, *Response, error)
|
|
||||||
GetControversialLinks(ctx context.Context, opts *ListOptions) (*Links, *Response, error)
|
|
||||||
|
|
||||||
// returns the links of the user with the username
|
GetComments() *UserCommentFinder
|
||||||
GetHotLinksOf(ctx context.Context, username string, opts *ListOptions) (*Links, *Response, error)
|
GetCommentsOf(username string) *UserCommentFinder
|
||||||
GetNewLinksOf(ctx context.Context, username string, opts *ListOptions) (*Links, *Response, error)
|
|
||||||
GetTopLinksOf(ctx context.Context, username string, opts *ListOptions) (*Links, *Response, error)
|
|
||||||
GetControversialLinksOf(ctx context.Context, username string, opts *ListOptions) (*Links, *Response, error)
|
|
||||||
|
|
||||||
GetUpvoted(ctx context.Context, opts *ListOptions) (*Links, *Response, error)
|
GetUpvoted() *UserPostFinder
|
||||||
GetDownvoted(ctx context.Context, opts *ListOptions) (*Links, *Response, error)
|
GetDownvoted() *UserPostFinder
|
||||||
GetHidden(ctx context.Context, opts *ListOptions) (*Links, *Response, error)
|
GetHidden() *UserPostFinder
|
||||||
GetSaved(ctx context.Context, opts *ListOptions) (*CommentsLinks, *Response, error)
|
GetSaved(ctx context.Context, opts *ListOptions) (*CommentsLinks, *Response, error)
|
||||||
GetGilded(ctx context.Context, opts *ListOptions) (*CommentsLinks, *Response, error)
|
GetGilded(ctx context.Context, opts *ListOptions) (*CommentsLinks, *Response, error)
|
||||||
|
|
||||||
// returns the client's comments
|
|
||||||
GetHotComments(ctx context.Context, opts *ListOptions) (*Comments, *Response, error)
|
|
||||||
GetNewComments(ctx context.Context, opts *ListOptions) (*Comments, *Response, error)
|
|
||||||
GetTopComments(ctx context.Context, opts *ListOptions) (*Comments, *Response, error)
|
|
||||||
GetControversialComments(ctx context.Context, opts *ListOptions) (*Comments, *Response, error)
|
|
||||||
|
|
||||||
// returns the comments of the user with the username
|
|
||||||
GetHotCommentsOf(ctx context.Context, username string, opts *ListOptions) (*Comments, *Response, error)
|
|
||||||
GetNewCommentsOf(ctx context.Context, username string, opts *ListOptions) (*Comments, *Response, error)
|
|
||||||
GetTopCommentsOf(ctx context.Context, username string, opts *ListOptions) (*Comments, *Response, error)
|
|
||||||
GetControversialCommentsOf(ctx context.Context, username string, opts *ListOptions) (*Comments, *Response, error)
|
|
||||||
|
|
||||||
Friend(ctx context.Context, username string, note string) (interface{}, *Response, error)
|
Friend(ctx context.Context, username string, note string) (interface{}, *Response, error)
|
||||||
Unblock(ctx context.Context, username string) (*Response, error)
|
Unblock(ctx context.Context, username string) (*Response, error)
|
||||||
Unfriend(ctx context.Context, username string) (*Response, error)
|
Unfriend(ctx context.Context, username string) (*Response, error)
|
||||||
@@ -169,66 +151,42 @@ func (s *UserServiceOp) OverviewOf(ctx context.Context, username string, opts *L
|
|||||||
return s.getCommentsAndLinks(ctx, path, opts)
|
return s.getCommentsAndLinks(ctx, path, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetHotLinks returns a list of the client's hottest submissions
|
// GetPosts returns a list of the client's posts.
|
||||||
func (s *UserServiceOp) GetHotLinks(ctx context.Context, opts *ListOptions) (*Links, *Response, error) {
|
func (s *UserServiceOp) GetPosts() *UserPostFinder {
|
||||||
return s.GetHotLinksOf(ctx, s.client.Username, opts)
|
return s.GetPostsOf(s.client.Username)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNewLinks returns a list of the client's newest submissions
|
// GetPostsOf returns a list of the user's posts.
|
||||||
func (s *UserServiceOp) GetNewLinks(ctx context.Context, opts *ListOptions) (*Links, *Response, error) {
|
func (s *UserServiceOp) GetPostsOf(username string) *UserPostFinder {
|
||||||
return s.GetNewLinksOf(ctx, s.client.Username, opts)
|
return newUserPostFinder(s.client, username, "submitted")
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTopLinks returns a list of the client's top submissions
|
// GetComments returns a list of the client's comments.
|
||||||
func (s *UserServiceOp) GetTopLinks(ctx context.Context, opts *ListOptions) (*Links, *Response, error) {
|
func (s *UserServiceOp) GetComments() *UserCommentFinder {
|
||||||
return s.GetTopLinksOf(ctx, s.client.Username, opts)
|
return s.GetCommentsOf(s.client.Username)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetControversialLinks returns a list of the client's most controversial submissions
|
// GetCommentsOf returns a list of a user's comments.
|
||||||
func (s *UserServiceOp) GetControversialLinks(ctx context.Context, opts *ListOptions) (*Links, *Response, error) {
|
func (s *UserServiceOp) GetCommentsOf(username string) *UserCommentFinder {
|
||||||
return s.GetControversialLinksOf(ctx, s.client.Username, opts)
|
f := new(UserCommentFinder)
|
||||||
}
|
f.client = s.client
|
||||||
|
f.username = username
|
||||||
// GetHotLinksOf returns a list of the user's hottest submissions
|
return f
|
||||||
func (s *UserServiceOp) GetHotLinksOf(ctx context.Context, username string, opts *ListOptions) (*Links, *Response, error) {
|
|
||||||
path := fmt.Sprintf("user/%s/submitted?sort=%s", username, SortHot)
|
|
||||||
return s.getLinks(ctx, path, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetNewLinksOf returns a list of the user's newest submissions
|
|
||||||
func (s *UserServiceOp) GetNewLinksOf(ctx context.Context, username string, opts *ListOptions) (*Links, *Response, error) {
|
|
||||||
path := fmt.Sprintf("user/%s/submitted?sort=%s", username, SortNew)
|
|
||||||
return s.getLinks(ctx, path, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetTopLinksOf returns a list of the user's top submissions
|
|
||||||
func (s *UserServiceOp) GetTopLinksOf(ctx context.Context, username string, opts *ListOptions) (*Links, *Response, error) {
|
|
||||||
path := fmt.Sprintf("user/%s/submitted?sort=%s", username, SortTop)
|
|
||||||
return s.getLinks(ctx, path, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetControversialLinksOf returns a list of the user's most controversial submissions
|
|
||||||
func (s *UserServiceOp) GetControversialLinksOf(ctx context.Context, username string, opts *ListOptions) (*Links, *Response, error) {
|
|
||||||
path := fmt.Sprintf("user/%s/submitted?sort=%s", username, SortControversial)
|
|
||||||
return s.getLinks(ctx, path, opts)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUpvoted returns a list of the client's upvoted submissions
|
// GetUpvoted returns a list of the client's upvoted submissions
|
||||||
func (s *UserServiceOp) GetUpvoted(ctx context.Context, opts *ListOptions) (*Links, *Response, error) {
|
func (s *UserServiceOp) GetUpvoted() *UserPostFinder {
|
||||||
path := fmt.Sprintf("user/%s/upvoted", s.client.Username)
|
return newUserPostFinder(s.client, s.client.Username, "upvoted")
|
||||||
return s.getLinks(ctx, path, opts)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDownvoted returns a list of the client's downvoted submissions
|
// GetDownvoted returns a list of the client's downvoted submissions
|
||||||
func (s *UserServiceOp) GetDownvoted(ctx context.Context, opts *ListOptions) (*Links, *Response, error) {
|
func (s *UserServiceOp) GetDownvoted() *UserPostFinder {
|
||||||
path := fmt.Sprintf("user/%s/downvoted", s.client.Username)
|
return newUserPostFinder(s.client, s.client.Username, "downvoted")
|
||||||
return s.getLinks(ctx, path, opts)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetHidden returns a list of the client's hidden submissions
|
// GetHidden returns a list of the client's hidden submissions
|
||||||
func (s *UserServiceOp) GetHidden(ctx context.Context, opts *ListOptions) (*Links, *Response, error) {
|
func (s *UserServiceOp) GetHidden() *UserPostFinder {
|
||||||
path := fmt.Sprintf("user/%s/hidden", s.client.Username)
|
return newUserPostFinder(s.client, s.client.Username, "hidden")
|
||||||
return s.getLinks(ctx, path, opts)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSaved returns a list of the client's saved comments and links
|
// GetSaved returns a list of the client's saved comments and links
|
||||||
@@ -243,50 +201,6 @@ func (s *UserServiceOp) GetGilded(ctx context.Context, opts *ListOptions) (*Comm
|
|||||||
return s.getCommentsAndLinks(ctx, path, opts)
|
return s.getCommentsAndLinks(ctx, path, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetHotComments returns a list of the client's hottest comments
|
|
||||||
func (s *UserServiceOp) GetHotComments(ctx context.Context, opts *ListOptions) (*Comments, *Response, error) {
|
|
||||||
return s.GetHotCommentsOf(ctx, s.client.Username, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetNewComments returns a list of the client's newest comments
|
|
||||||
func (s *UserServiceOp) GetNewComments(ctx context.Context, opts *ListOptions) (*Comments, *Response, error) {
|
|
||||||
return s.GetNewCommentsOf(ctx, s.client.Username, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetTopComments returns a list of the client's top comments
|
|
||||||
func (s *UserServiceOp) GetTopComments(ctx context.Context, opts *ListOptions) (*Comments, *Response, error) {
|
|
||||||
return s.GetTopCommentsOf(ctx, s.client.Username, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetControversialComments returns a list of the client's most controversial comments
|
|
||||||
func (s *UserServiceOp) GetControversialComments(ctx context.Context, opts *ListOptions) (*Comments, *Response, error) {
|
|
||||||
return s.GetControversialCommentsOf(ctx, s.client.Username, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetHotCommentsOf returns a list of the user's hottest comments
|
|
||||||
func (s *UserServiceOp) GetHotCommentsOf(ctx context.Context, username string, opts *ListOptions) (*Comments, *Response, error) {
|
|
||||||
path := fmt.Sprintf("user/%s/comments?sort=%s", username, SortHot)
|
|
||||||
return s.getComments(ctx, path, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetNewCommentsOf returns a list of the user's newest comments
|
|
||||||
func (s *UserServiceOp) GetNewCommentsOf(ctx context.Context, username string, opts *ListOptions) (*Comments, *Response, error) {
|
|
||||||
path := fmt.Sprintf("user/%s/comments?sort=%s", username, SortNew)
|
|
||||||
return s.getComments(ctx, path, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetTopCommentsOf returns a list of the user's top comments
|
|
||||||
func (s *UserServiceOp) GetTopCommentsOf(ctx context.Context, username string, opts *ListOptions) (*Comments, *Response, error) {
|
|
||||||
path := fmt.Sprintf("user/%s/comments?sort=%s", username, SortTop)
|
|
||||||
return s.getComments(ctx, path, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetControversialCommentsOf returns a list of the user's most controversial comments
|
|
||||||
func (s *UserServiceOp) GetControversialCommentsOf(ctx context.Context, username string, opts *ListOptions) (*Comments, *Response, error) {
|
|
||||||
path := fmt.Sprintf("user/%s/comments?sort=%s", username, SortControversial)
|
|
||||||
return s.getComments(ctx, path, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Friend creates or updates a "friend" relationship
|
// Friend creates or updates a "friend" relationship
|
||||||
// Request body contains JSON data with:
|
// Request body contains JSON data with:
|
||||||
// name: existing Reddit username
|
// name: existing Reddit username
|
||||||
@@ -387,3 +301,136 @@ func (s *UserServiceOp) getListing(ctx context.Context, path string, opts *ListO
|
|||||||
|
|
||||||
return root, resp, err
|
return root, resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UserPostFinder finds the posts of a user.
|
||||||
|
type UserPostFinder struct {
|
||||||
|
client *Client
|
||||||
|
username string
|
||||||
|
// where can be submitted, upvoted, downvoted, hidden
|
||||||
|
// https://www.reddit.com/dev/api/#GET_user_{username}_{where}
|
||||||
|
where string
|
||||||
|
opts struct {
|
||||||
|
After string `url:"after,omitempty"`
|
||||||
|
Before string `url:"before,omitempty"`
|
||||||
|
Limit int `url:"limit,omitempty"`
|
||||||
|
Sort string `url:"sort,omitempty"`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newUserPostFinder(cli *Client, username string, where string) *UserPostFinder {
|
||||||
|
f := new(UserPostFinder)
|
||||||
|
f.client = cli
|
||||||
|
f.username = username
|
||||||
|
f.where = where
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// After sets the after option.
|
||||||
|
func (f *UserPostFinder) After(after string) *UserPostFinder {
|
||||||
|
f.opts.After = after
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Before sets the before option.
|
||||||
|
func (f *UserPostFinder) Before(before string) *UserPostFinder {
|
||||||
|
f.opts.Before = before
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Limit sets the limit option.
|
||||||
|
func (f *UserPostFinder) Limit(limit int) *UserPostFinder {
|
||||||
|
f.opts.Limit = limit
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort sets the sort option.
|
||||||
|
func (f *UserPostFinder) Sort(sort Sort) *UserPostFinder {
|
||||||
|
f.opts.Sort = sort.String()
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do conducts the search.
|
||||||
|
func (f *UserPostFinder) Do(ctx context.Context) (*Links, *Response, error) {
|
||||||
|
path := fmt.Sprintf("user/%s/%s", f.username, f.where)
|
||||||
|
path, err := addOptions(path, f.opts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := f.client.NewRequest(http.MethodGet, path, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
root := new(rootListing)
|
||||||
|
resp, err := f.client.Do(ctx, req, root)
|
||||||
|
if err != nil {
|
||||||
|
return nil, resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return root.getLinks(), resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserCommentFinder finds the comments of a user.
|
||||||
|
type UserCommentFinder struct {
|
||||||
|
client *Client
|
||||||
|
username string
|
||||||
|
opts struct {
|
||||||
|
After string `url:"after,omitempty"`
|
||||||
|
Before string `url:"before,omitempty"`
|
||||||
|
Limit int `url:"limit,omitempty"`
|
||||||
|
Sort string `url:"sort,omitempty"`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OfUser specified the user we want to get the comments of.
|
||||||
|
func (f *UserCommentFinder) OfUser(username string) *UserCommentFinder {
|
||||||
|
f.username = username
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// After sets the after option.
|
||||||
|
func (f *UserCommentFinder) After(after string) *UserCommentFinder {
|
||||||
|
f.opts.After = after
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Before sets the before option.
|
||||||
|
func (f *UserCommentFinder) Before(before string) *UserCommentFinder {
|
||||||
|
f.opts.Before = before
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Limit sets the limit option.
|
||||||
|
func (f *UserCommentFinder) Limit(limit int) *UserCommentFinder {
|
||||||
|
f.opts.Limit = limit
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort sets the sort option.
|
||||||
|
func (f *UserCommentFinder) Sort(sort Sort) *UserCommentFinder {
|
||||||
|
f.opts.Sort = sort.String()
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do conducts the search.
|
||||||
|
func (f *UserCommentFinder) Do(ctx context.Context) (*Comments, *Response, error) {
|
||||||
|
path := fmt.Sprintf("user/%s/comments", f.username)
|
||||||
|
path, err := addOptions(path, f.opts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := f.client.NewRequest(http.MethodGet, path, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
root := new(rootListing)
|
||||||
|
resp, err := f.client.Do(ctx, req, root)
|
||||||
|
if err != nil {
|
||||||
|
return nil, resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return root.getComments(), resp, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user