From c37b934c011c66df3abc664968e501cb1bc55ff9 Mon Sep 17 00:00:00 2001 From: Vartan Benohanian Date: Thu, 10 Sep 2020 23:41:17 -0400 Subject: [PATCH] Select/assign flairs Signed-off-by: Vartan Benohanian --- reddit/flair.go | 78 +++++++++++++++++++++++++++++++++ reddit/flair_test.go | 102 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/reddit/flair.go b/reddit/flair.go index 9691fa9..9504c78 100644 --- a/reddit/flair.go +++ b/reddit/flair.go @@ -111,6 +111,15 @@ type FlairTemplate struct { CSSClass string `json:"cssClass"` } +// FlairSelectRequest represents a request to select a flair. +type FlairSelectRequest struct { + // The id of the template. + ID string `url:"flair_template_id,omitempty"` + // No longer than 64 characters. + // Only use this if the flair is editable (it is by default if you're a mod of the subreddit). + Text string `url:"text,omitempty"` +} + // GetUserFlairs returns the user flairs from the subreddit. func (s *FlairService) GetUserFlairs(ctx context.Context, subreddit string) ([]*Flair, *Response, error) { path := fmt.Sprintf("r/%s/api/user_flair_v2", subreddit) @@ -418,3 +427,72 @@ func (s *FlairService) choices(ctx context.Context, path string, form url.Values return root.Choices, root.Current, resp, nil } + +// Select a flair to display next to your username in the subreddit. +func (s *FlairService) Select(ctx context.Context, subreddit string, request *FlairSelectRequest) (*Response, error) { + return s.Assign(ctx, subreddit, s.client.Username, request) +} + +// Assign a flair to another user in the subreddit. +// This only works if you're a moderator of the subreddit, or if the user is you. +func (s *FlairService) Assign(ctx context.Context, subreddit, user string, request *FlairSelectRequest) (*Response, error) { + if request == nil { + return nil, errors.New("request: cannot be nil") + } + + path := fmt.Sprintf("r/%s/api/selectflair", subreddit) + + form, err := query.Values(request) + if err != nil { + return nil, err + } + form.Set("api_type", "json") + form.Set("name", user) + + req, err := s.client.NewRequest(http.MethodPost, path, form) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} + +// SelectForPost assigns a flair to the post. +// If the post isn't yours, you have to be a moderator of the post's subreddit for this to work. +func (s *FlairService) SelectForPost(ctx context.Context, postID string, request *FlairSelectRequest) (*Response, error) { + if request == nil { + return nil, errors.New("request: cannot be nil") + } + + path := "api/selectflair" + + form, err := query.Values(request) + if err != nil { + return nil, err + } + form.Set("api_type", "json") + form.Set("link", postID) + + req, err := s.client.NewRequest(http.MethodPost, path, form) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} + +// RemoveFromPost removes the flair from the post. +func (s *FlairService) RemoveFromPost(ctx context.Context, postID string) (*Response, error) { + path := "api/selectflair" + + form := url.Values{} + form.Set("api_type", "json") + form.Set("link", postID) + + req, err := s.client.NewRequest(http.MethodPost, path, form) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} diff --git a/reddit/flair_test.go b/reddit/flair_test.go index 0cd3224..b50758c 100644 --- a/reddit/flair_test.go +++ b/reddit/flair_test.go @@ -554,3 +554,105 @@ func TestFlairService_ChoicesForNewPost(t *testing.T) { require.NoError(t, err) require.Equal(t, expectedFlairChoices, choices) } + +func TestFlairService_Select(t *testing.T) { + client, mux, teardown := setup() + defer teardown() + + mux.HandleFunc("/r/testsubreddit/api/selectflair", func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, http.MethodPost, r.Method) + + form := url.Values{} + form.Set("api_type", "json") + form.Set("name", "user1") + form.Set("flair_template_id", "id123") + form.Set("text", "text123") + + err := r.ParseForm() + require.NoError(t, err) + require.Equal(t, form, r.PostForm) + }) + + _, err := client.Flair.Select(ctx, "testsubreddit", nil) + require.EqualError(t, err, "request: cannot be nil") + + _, err = client.Flair.Select(ctx, "testsubreddit", &FlairSelectRequest{ + ID: "id123", + Text: "text123", + }) + require.NoError(t, err) +} + +func TestFlairService_Assign(t *testing.T) { + client, mux, teardown := setup() + defer teardown() + + mux.HandleFunc("/r/testsubreddit/api/selectflair", func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, http.MethodPost, r.Method) + + form := url.Values{} + form.Set("api_type", "json") + form.Set("name", "testuser") + form.Set("flair_template_id", "id123") + + err := r.ParseForm() + require.NoError(t, err) + require.Equal(t, form, r.PostForm) + }) + + _, err := client.Flair.Assign(ctx, "testsubreddit", "testuser", nil) + require.EqualError(t, err, "request: cannot be nil") + + _, err = client.Flair.Assign(ctx, "testsubreddit", "testuser", &FlairSelectRequest{ + ID: "id123", + }) + require.NoError(t, err) +} + +func TestFlairService_SelectForPost(t *testing.T) { + client, mux, teardown := setup() + defer teardown() + + mux.HandleFunc("/api/selectflair", func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, http.MethodPost, r.Method) + + form := url.Values{} + form.Set("api_type", "json") + form.Set("link", "t3_123") + form.Set("flair_template_id", "id123") + form.Set("text", "text123") + + err := r.ParseForm() + require.NoError(t, err) + require.Equal(t, form, r.PostForm) + }) + + _, err := client.Flair.SelectForPost(ctx, "t3_123", nil) + require.EqualError(t, err, "request: cannot be nil") + + _, err = client.Flair.SelectForPost(ctx, "t3_123", &FlairSelectRequest{ + ID: "id123", + Text: "text123", + }) + require.NoError(t, err) +} + +func TestFlairService_RemoveFromPost(t *testing.T) { + client, mux, teardown := setup() + defer teardown() + + mux.HandleFunc("/api/selectflair", func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, http.MethodPost, r.Method) + + form := url.Values{} + form.Set("api_type", "json") + form.Set("link", "t3_123") + + err := r.ParseForm() + require.NoError(t, err) + require.Equal(t, form, r.PostForm) + }) + + _, err := client.Flair.RemoveFromPost(ctx, "t3_123") + require.NoError(t, err) +}