From 8f41f3481901f817ed74a9966dd8cf02cd7edf60 Mon Sep 17 00:00:00 2001 From: Daisuke Maki Date: Wed, 12 Apr 2017 19:55:51 +0900 Subject: [PATCH] implement channels.invite --- channels.go | 63 ++++++++++++++++++++++++++++------------------------- client.go | 24 ++++++++++++++++++++ 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/channels.go b/channels.go index 06cc652..9d83e55 100644 --- a/channels.go +++ b/channels.go @@ -34,13 +34,8 @@ func (c *ChannelsArchiveCall) Do(ctx context.Context) error { const endpoint = "channels.archive" var res SlackResponse - - if err := c.service.client.postForm(ctx, endpoint, c.Values(), &res); err != nil { - return errors.Wrapf(err, `failed to post to %s`, endpoint) - } - - if !res.OK { - return errors.New(res.Error.String()) + if err := genericPost(ctx, c.service.client, endpoint, c.Values(), &res); err != nil { + return err } return nil @@ -78,17 +73,10 @@ func (c *ChannelsCreateCall) Validate(b bool) *ChannelsCreateCall { func (c *ChannelsCreateCall) Do(ctx context.Context) error { const endpoint = "channels.archive" - var res SlackResponse - - if err := c.service.client.postForm(ctx, endpoint, c.Values(), &res); err != nil { - return errors.Wrapf(err, `failed to post to %s`, endpoint) - } - - if !res.OK { - return errors.New(res.Error.String()) + if err := genericPost(ctx, c.service.client, endpoint, c.Values(), &res); err != nil { + return err } - return nil } @@ -177,12 +165,8 @@ func (c *ChannelsHistoryCall) Do(ctx context.Context) (*ChannelsHistoryResponse, *ChannelsHistoryResponse } - if err := c.service.client.postForm(ctx, endpoint, c.Values(), &res); err != nil { - return nil, errors.Wrapf(err, `failed to post to %s`, endpoint) - } - - if !res.OK { - return nil, errors.New(res.Error.String()) + if err := genericPost(ctx, c.service.client, endpoint, c.Values(), &res); err != nil { + return nil, err } return res.ChannelsHistoryResponse, nil @@ -216,7 +200,7 @@ func (c *ChannelsInfoCall) Do(ctx context.Context) (*objects.Channel, error) { *objects.Channel `json:"channel"` } - if err := c.service.client.postForm(ctx, endpoint, c.Values(), &res); err != nil { + if err := genericPost(ctx, c.service.client, endpoint, c.Values(), &res); err != nil { return nil, errors.Wrapf(err, `failed to post to %s`, endpoint) } @@ -227,6 +211,30 @@ func (c *ChannelsInfoCall) Do(ctx context.Context) (*objects.Channel, error) { return res.Channel, nil } +// ChannelsInviteCall is created via Channels.Invite() method +type ChannelsInviteCall struct { + service *ChannelsService + channel string + user string +} + +func (s *ChannelsService) Invite(channelID, userID string) *ChannelsInviteCall { + return &ChannelsInviteCall{ + service: s, + channel: channelID, + user: userID, + } +} + +func (c *ChannelsInviteCall) Values() url.Values { + v := url.Values{ + "token": {c.service.token}, + "channel": {c.channel}, + "user": {c.user}, + } + return v +} + // ChannelsListCall is created via Channels.List() method type ChannelsListCall struct { service *ChannelsService @@ -262,13 +270,8 @@ func (c *ChannelsListCall) Do(ctx context.Context) (objects.ChannelList, error) objects.ChannelList `json:"channels"` } - if err := c.service.client.postForm(ctx, endpoint, c.Values(), &res); err != nil { - return nil, errors.Wrapf(err, `failed to post to %s`, endpoint) - } - - if !res.OK { - return nil, errors.New(res.Error.String()) + if err := genericPost(ctx, c.service.client, endpoint, c.Values(), &res); err != nil { + return nil, err } - return res.ChannelList, nil } diff --git a/client.go b/client.go index 604894a..a00ae0b 100644 --- a/client.go +++ b/client.go @@ -233,3 +233,27 @@ func (c *httpClient) get(octx context.Context, path string, f url.Values, data i defer res.Body.Close() return c.parseResponse(path, res.Body, data) } + +func (r SlackResponse) err() error { + return errors.New(r.Error.String()) +} + +func (r SlackResponse) ok() bool { + return r.OK +} + +type genericResponse interface { + ok() bool + err() error +} + +func genericPost(ctx context.Context, client *httpClient, endpoint string, v url.Values, res genericResponse) error { + if err := client.postForm(ctx, endpoint, v, res); err != nil { + return errors.Wrapf(err, `failed to post to %s`, endpoint) + } + + if !res.ok() { + return res.err() + } + return nil +}