Skip to content

Commit

Permalink
Merge pull request #1 from seatsio/steve/channel_support
Browse files Browse the repository at this point in the history
Channel support, patterned on the Java client's channel support
  • Loading branch information
schaloner authored Jul 4, 2023
2 parents b4f0faa + 9db5e14 commit 93792c7
Show file tree
Hide file tree
Showing 13 changed files with 690 additions and 2 deletions.
3 changes: 1 addition & 2 deletions charts_test/add_tag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ func TestAddTag(t *testing.T) {
retrievedChart, err := client.Charts.Retrieve(chartKey)
require.NoError(t, err)
require.Equal(t, 2, len(retrievedChart.Tags))
require.Equal(t, "tag1", retrievedChart.Tags[0])
require.Equal(t, "tag2", retrievedChart.Tags[1])
require.Contains(t, []string{"tag1", "tag2"}, retrievedChart.Tags[0])
}

func TestSpecialCharacters(t *testing.T) {
Expand Down
9 changes: 9 additions & 0 deletions events/channel.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package events

type Channel struct {
Key string `json:"key"`
Name string `json:"name"`
Color string `json:"color"`
Index int32 `json:"index"`
Objects []string `json:"objects"`
}
121 changes: 121 additions & 0 deletions events/channels.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package events

import (
"github.com/imroc/req/v3"
"github.com/seatsio/seatsio-go/shared"
)

type Channels struct {
Client *req.Client
}

type CreateChannelParams struct {
Key string `json:"key"`
Name string `json:"name"`
Color string `json:"color"`
Index int32 `json:"index"`
Objects []string `json:"objects"`
}

type CreateChannelParamsOption func(Params *CreateChannelParams)

type UpdateChannelParams struct {
Name string `json:"name"`
Color string `json:"color"`
Objects []string `json:"objects"`
}

type changeChannelObjectsRequest struct {
Objects []string `json:"objects"`
}

type replaceChannelsRequest struct {
Channels []Channel `json:"channels"`
}

type setObjectsRequest struct {
ChannelConfig map[string][]string `json:"channelConfig"`
}

func (channels *Channels) Create(eventKey string, params *CreateChannelParams) error {
result, err := channels.Client.R().
SetBody(params).
SetPathParam("key", eventKey).
Post("/events/{key}/channels")
return shared.AssertOkNoBody(result, err)
}

func (channels *Channels) CreateMultiple(eventKey string, params *[]CreateChannelParams) error {
result, err := channels.Client.R().
SetBody(params).
SetPathParam("key", eventKey).
Post("/events/{key}/channels")
return shared.AssertOkNoBody(result, err)
}

func (channels *Channels) Update(eventKey string, channelKey string, params UpdateChannelParams) error {
result, err := channels.Client.R().
SetBody(params).
SetPathParam("eventKey", eventKey).
SetPathParam("channelKey", channelKey).
Post("/events/{eventKey}/channels/{channelKey}")
return shared.AssertOkNoBody(result, err)
}

func (channels *Channels) Delete(eventKey string, channelKey string) error {
result, err := channels.Client.R().
SetPathParam("eventKey", eventKey).
SetPathParam("channelKey", channelKey).
Delete("/events/{eventKey}/channels/{channelKey}")
return shared.AssertOkNoBody(result, err)
}

func (channels *Channels) AddObjects(eventKey string, channelKey string, objects []string) error {
result, err := channels.Client.R().
SetBody(changeChannelObjectsRequest{objects}).
SetPathParam("eventKey", eventKey).
SetPathParam("channelKey", channelKey).
Post("/events/{eventKey}/channels/{channelKey}/objects")
return shared.AssertOkNoBody(result, err)
}

func (channels *Channels) RemoveObjects(eventKey string, channelKey string, objects []string) error {
result, err := channels.Client.R().
SetBody(changeChannelObjectsRequest{objects}).
SetPathParam("eventKey", eventKey).
SetPathParam("channelKey", channelKey).
Delete("/events/{eventKey}/channels/{channelKey}/objects")
return shared.AssertOkNoBody(result, err)
}

func (channels *Channels) Replace(eventKey string, newChannels []Channel) error {
result, err := channels.Client.R().
SetBody(replaceChannelsRequest{newChannels}).
SetPathParam("eventKey", eventKey).
Post("/events/{eventKey}/channels/replace")
return shared.AssertOkNoBody(result, err)
}

func (channels *Channels) WithIndex(index int32) CreateChannelParamsOption {
return func(params *CreateChannelParams) {
params.Index = index
}
}

func (channels *Channels) WithObjects(objects []string) CreateChannelParamsOption {
return func(params *CreateChannelParams) {
params.Objects = objects
}
}

func (channels *Channels) NewCreateChannelParams(key string, name string, color string, opts ...CreateChannelParamsOption) *CreateChannelParams {
params := &CreateChannelParams{key, name, color, 0, []string{}}
for _, opt := range opts {
opt(params)
}
return params
}

func (channels *Channels) NewUpdateChannelParams(channel Channel) UpdateChannelParams {
return UpdateChannelParams{Name: channel.Name, Color: channel.Color, Objects: channel.Objects}
}
1 change: 1 addition & 0 deletions events/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ type Event struct {
UpdatedOn *time.Time `json:"updatedOn"`
Categories []Category `json:"categories"`
ObjectCategories map[string]CategoryKey `json:"objectCategories"`
Channels []Channel `json:"channels"`
}
17 changes: 17 additions & 0 deletions events_test/add_objects_to_channel_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package events

import (
"github.com/seatsio/seatsio-go/events"
"github.com/stretchr/testify/require"
"testing"
)

func TestObjectsAreAddedToChannel(t *testing.T) {
t.Parallel()

event, client := CreateChannel(t, &events.CreateChannelParams{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}})
_ = client.Channels.AddObjects(event.Key, "foo", []string{"A-3", "A-4"})

retrievedEvent, _ := client.Events.Retrieve(event.Key)
require.Equal(t, []events.Channel{{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2", "A-3", "A-4"}}}, retrievedEvent.Channels)
}
19 changes: 19 additions & 0 deletions events_test/channel_test_util.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package events

import (
"github.com/seatsio/seatsio-go"
"github.com/seatsio/seatsio-go/events"
"github.com/seatsio/seatsio-go/test_util"
"github.com/stretchr/testify/require"
"testing"
)

func CreateChannel(t *testing.T, params *events.CreateChannelParams) (*events.Event, *seatsio.SeatsioClient) {
company := test_util.CreateTestCompany(t)
chartKey := test_util.CreateTestChart(t, company.Admin.SecretKey)
c := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)
event, _ := c.Events.Create(&events.CreateEventParams{ChartKey: chartKey, EventKey: "anEvent"})
err := c.Channels.Create(event.Key, params)
require.NoError(t, err)
return event, c
}
82 changes: 82 additions & 0 deletions events_test/create_channel_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package events

import (
"github.com/seatsio/seatsio-go"
"github.com/seatsio/seatsio-go/events"
"github.com/seatsio/seatsio-go/test_util"
"github.com/stretchr/testify/require"
"testing"
)

func TestCreateChannel(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
chartKey := test_util.CreateTestChart(t, company.Admin.SecretKey)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)
event, _ := client.Events.Create(&events.CreateEventParams{ChartKey: chartKey, EventKey: "anEvent"})
require.Equal(t, 0, len(event.Channels))

err := client.Channels.Create(event.Key, &events.CreateChannelParams{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}})
require.NoError(t, err)

retrievedEvent, err := client.Events.Retrieve(event.Key)
require.Equal(t, []events.Channel{{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}}}, retrievedEvent.Channels)
}

func TestCreateChannels(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
chartKey := test_util.CreateTestChart(t, company.Admin.SecretKey)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)
event, _ := client.Events.Create(&events.CreateEventParams{ChartKey: chartKey, EventKey: "anEvent"})
require.Equal(t, 0, len(event.Channels))

err := client.Channels.CreateMultiple(event.Key, &[]events.CreateChannelParams{
*&events.CreateChannelParams{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}},
*&events.CreateChannelParams{Key: "hurdy", Name: "gurdy", Color: "#DFDFDF", Index: 2, Objects: []string{"A-3", "A-4"}},
})
require.NoError(t, err)

retrievedEvent, err := client.Events.Retrieve(event.Key)
require.Equal(t, []events.Channel{
{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}},
{Key: "hurdy", Name: "gurdy", Color: "#DFDFDF", Index: 2, Objects: []string{"A-3", "A-4"}},
}, retrievedEvent.Channels)
}

func TestIndexIsOptional(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
chartKey := test_util.CreateTestChart(t, company.Admin.SecretKey)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)
event, _ := client.Events.Create(&events.CreateEventParams{ChartKey: chartKey, EventKey: "anEvent"})
require.Equal(t, 0, len(event.Channels))

err := client.Channels.Create(event.Key, client.Channels.NewCreateChannelParams("foo", "bar", "#ED303D", client.Channels.WithObjects([]string{"A-1"})))
require.NoError(t, err)

retrievedEvent, err := client.Events.Retrieve(event.Key)
require.Equal(t, 1, len(retrievedEvent.Channels))
require.Equal(t, "foo", retrievedEvent.Channels[0].Key)
require.Equal(t, int32(0), retrievedEvent.Channels[0].Index)
require.Equal(t, "A-1", retrievedEvent.Channels[0].Objects[0])
}

func TestObjectsIsOptional(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
chartKey := test_util.CreateTestChart(t, company.Admin.SecretKey)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)
event, _ := client.Events.Create(&events.CreateEventParams{ChartKey: chartKey, EventKey: "anEvent"})
require.Equal(t, 0, len(event.Channels))

channels := client.Channels
err := channels.Create(event.Key, channels.NewCreateChannelParams("foo", "bar", "#ED303D", channels.WithIndex(1)))
require.NoError(t, err)

retrievedEvent, err := client.Events.Retrieve(event.Key)
require.Equal(t, 1, len(retrievedEvent.Channels))
require.Equal(t, "foo", retrievedEvent.Channels[0].Key)
require.Equal(t, int32(1), retrievedEvent.Channels[0].Index)
require.Empty(t, retrievedEvent.Channels[0].Objects)
}
21 changes: 21 additions & 0 deletions events_test/delete_channel_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package events

import (
"github.com/seatsio/seatsio-go/events"
"github.com/stretchr/testify/require"
"testing"
)

func TestDeleteChannel(t *testing.T) {
t.Parallel()

event, client := CreateChannel(t, &events.CreateChannelParams{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}})
retrievedEvent, _ := client.Events.Retrieve(event.Key)
require.Equal(t, []events.Channel{{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}}}, retrievedEvent.Channels)

deleteErr := client.Channels.Delete(event.Key, "foo")
require.NoError(t, deleteErr)

postDeleteEvent, _ := client.Events.Retrieve(event.Key)
require.Empty(t, postDeleteEvent.Channels)
}
17 changes: 17 additions & 0 deletions events_test/remove_objects_from_channel_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package events

import (
"github.com/seatsio/seatsio-go/events"
"github.com/stretchr/testify/require"
"testing"
)

func TestObjectsAreRemovedFromChannel(t *testing.T) {
t.Parallel()

event, client := CreateChannel(t, &events.CreateChannelParams{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}})
_ = client.Channels.RemoveObjects(event.Key, "foo", []string{"A-1"})

retrievedEvent, _ := client.Events.Retrieve(event.Key)
require.Equal(t, []events.Channel{{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-2"}}}, retrievedEvent.Channels)
}
42 changes: 42 additions & 0 deletions events_test/replace_channels_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package events

import (
"github.com/seatsio/seatsio-go"
"github.com/seatsio/seatsio-go/events"
"github.com/seatsio/seatsio-go/test_util"
"github.com/stretchr/testify/require"
"testing"
)

func TestReplaceChannel(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
chartKey := test_util.CreateTestChart(t, company.Admin.SecretKey)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)
event, _ := client.Events.Create(&events.CreateEventParams{ChartKey: chartKey, EventKey: "anEvent"})
require.Equal(t, 0, len(event.Channels))

err := client.Channels.CreateMultiple(event.Key, &[]events.CreateChannelParams{
*&events.CreateChannelParams{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}},
*&events.CreateChannelParams{Key: "hurdy", Name: "gurdy", Color: "#DFDFDF", Index: 2, Objects: []string{"A-3", "A-4"}},
})
require.NoError(t, err)

retrievedEvent, err := client.Events.Retrieve(event.Key)
require.Equal(t, []events.Channel{
{Key: "foo", Name: "bar", Color: "#ED303D", Index: 1, Objects: []string{"A-1", "A-2"}},
{Key: "hurdy", Name: "gurdy", Color: "#DFDFDF", Index: 2, Objects: []string{"A-3", "A-4"}},
}, retrievedEvent.Channels)

replaceError := client.Channels.Replace(event.Key, []events.Channel{
{Key: "aaa", Name: "bbb", Color: "#101010", Index: 1, Objects: []string{"A-5", "A-6"}},
{Key: "ccc", Name: "ddd", Color: "#F2F2F2", Index: 2, Objects: []string{"A-7", "A-8"}},
})
require.NoError(t, replaceError)

postReplacementEvent, _ := client.Events.Retrieve(event.Key)
require.Equal(t, []events.Channel{
{Key: "aaa", Name: "bbb", Color: "#101010", Index: 1, Objects: []string{"A-5", "A-6"}},
{Key: "ccc", Name: "ddd", Color: "#F2F2F2", Index: 2, Objects: []string{"A-7", "A-8"}},
}, postReplacementEvent.Channels)
}
Loading

0 comments on commit 93792c7

Please sign in to comment.