Support conversations API
Support these APIs added in Mastodon 2.6.0. - GET /api/v1/conversations - DELETE /api/v1/conversations/:id - POST /api/v1/conversations/:id/readpull/127/head
parent
151613575d
commit
fd6533a508
|
@ -87,6 +87,9 @@ func main() {
|
||||||
* [x] GET /api/v1/accounts/search
|
* [x] GET /api/v1/accounts/search
|
||||||
* [x] POST /api/v1/apps
|
* [x] POST /api/v1/apps
|
||||||
* [x] GET /api/v1/blocks
|
* [x] GET /api/v1/blocks
|
||||||
|
* [x] GET /api/v1/conversations
|
||||||
|
* [x] DELETE /api/v1/conversations/:id
|
||||||
|
* [x] POST /api/v1/conversations/:id/read
|
||||||
* [x] GET /api/v1/favourites
|
* [x] GET /api/v1/favourites
|
||||||
* [x] GET /api/v1/follow_requests
|
* [x] GET /api/v1/follow_requests
|
||||||
* [x] POST /api/v1/follow_requests/:id/authorize
|
* [x] POST /api/v1/follow_requests/:id/authorize
|
||||||
|
|
30
status.go
30
status.go
|
@ -61,6 +61,14 @@ type Card struct {
|
||||||
Height int64 `json:"height"`
|
Height int64 `json:"height"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Conversation hold information for mastodon conversation.
|
||||||
|
type Conversation struct {
|
||||||
|
ID ID `json:"id"`
|
||||||
|
Accounts []*Account `json:"accounts"`
|
||||||
|
Unread bool `json:"unread"`
|
||||||
|
LastStatus *Status `json:"last_status"`
|
||||||
|
}
|
||||||
|
|
||||||
// GetFavourites return the favorite list of the current user.
|
// GetFavourites return the favorite list of the current user.
|
||||||
func (c *Client) GetFavourites(ctx context.Context, pg *Pagination) ([]*Status, error) {
|
func (c *Client) GetFavourites(ctx context.Context, pg *Pagination) ([]*Status, error) {
|
||||||
var statuses []*Status
|
var statuses []*Status
|
||||||
|
@ -307,3 +315,25 @@ func (c *Client) GetTimelineDirect(ctx context.Context, pg *Pagination) ([]*Stat
|
||||||
}
|
}
|
||||||
return statuses, nil
|
return statuses, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetConversations return direct conversations.
|
||||||
|
func (c *Client) GetConversations(ctx context.Context, pg *Pagination) ([]*Conversation, error) {
|
||||||
|
params := url.Values{}
|
||||||
|
|
||||||
|
var conversations []*Conversation
|
||||||
|
err := c.doAPI(ctx, http.MethodGet, "/api/v1/conversations", params, &conversations, pg)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return conversations, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteConversation delete the conversation specified by id.
|
||||||
|
func (c *Client) DeleteConversation(ctx context.Context, id ID) error {
|
||||||
|
return c.doAPI(ctx, http.MethodDelete, fmt.Sprintf("/api/v1/conversations/%s", id), nil, nil, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarkConversationAsRead mark the conversation as read.
|
||||||
|
func (c *Client) MarkConversationAsRead(ctx context.Context, id ID) error {
|
||||||
|
return c.doAPI(ctx, http.MethodPost, fmt.Sprintf("/api/v1/conversations/%s/read", id), nil, nil, nil)
|
||||||
|
}
|
||||||
|
|
|
@ -621,3 +621,89 @@ func TestUploadMedia(t *testing.T) {
|
||||||
t.Fatalf("want %q but %q", "123", attachment.ID)
|
t.Fatalf("want %q but %q", "123", attachment.ID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetConversations(t *testing.T) {
|
||||||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.URL.Path != "/api/v1/conversations" {
|
||||||
|
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
|
||||||
|
}
|
||||||
|
fmt.Fprintln(w, `[{"id": "4", "unread":false, "last_status" : {"content": "zzz"}}, {"id": "3", "unread":true, "last_status" : {"content": "bar"}}]`)
|
||||||
|
return
|
||||||
|
}))
|
||||||
|
defer ts.Close()
|
||||||
|
|
||||||
|
client := NewClient(&Config{
|
||||||
|
Server: ts.URL,
|
||||||
|
ClientID: "foo",
|
||||||
|
ClientSecret: "bar",
|
||||||
|
AccessToken: "zoo",
|
||||||
|
})
|
||||||
|
convs, err := client.GetConversations(context.Background(), nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("should not be fail: %v", err)
|
||||||
|
}
|
||||||
|
if len(convs) != 2 {
|
||||||
|
t.Fatalf("result should be 2: %d", len(convs))
|
||||||
|
}
|
||||||
|
if convs[0].ID != "4" {
|
||||||
|
t.Fatalf("want %q but %q", "4", convs[0].ID)
|
||||||
|
}
|
||||||
|
if convs[0].LastStatus.Content != "zzz" {
|
||||||
|
t.Fatalf("want %q but %q", "zzz", convs[0].LastStatus.Content)
|
||||||
|
}
|
||||||
|
if convs[1].Unread != true {
|
||||||
|
t.Fatalf("unread should be true: %t", convs[1].Unread)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeleteConversation(t *testing.T) {
|
||||||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.URL.Path != "/api/v1/conversations/12345678" {
|
||||||
|
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if r.Method != "DELETE" {
|
||||||
|
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusMethodNotAllowed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}))
|
||||||
|
defer ts.Close()
|
||||||
|
|
||||||
|
client := NewClient(&Config{
|
||||||
|
Server: ts.URL,
|
||||||
|
ClientID: "foo",
|
||||||
|
ClientSecret: "bar",
|
||||||
|
AccessToken: "hoge",
|
||||||
|
})
|
||||||
|
err = client.DeleteConversation(context.Background(), "12345678")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("should not be fail: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMarkConversationsAsRead(t *testing.T) {
|
||||||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.URL.Path != "/api/v1/conversations/111111/read" {
|
||||||
|
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if r.Method != "POST" {
|
||||||
|
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}))
|
||||||
|
defer ts.Close()
|
||||||
|
|
||||||
|
client := NewClient(&Config{
|
||||||
|
Server: ts.URL,
|
||||||
|
ClientID: "foo",
|
||||||
|
ClientSecret: "bar",
|
||||||
|
AccessToken: "zoo",
|
||||||
|
})
|
||||||
|
err := client.MarkConversationAsRead(context.Background(), "111111")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("should not be fail: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue