Skip to content

Commit

Permalink
Merge pull request #3 from seatsio/steve/workspaces
Browse files Browse the repository at this point in the history
Workspace API
  • Loading branch information
schaloner authored Jul 7, 2023
2 parents 75f4967 + d736aa7 commit 4d14012
Show file tree
Hide file tree
Showing 13 changed files with 482 additions and 7 deletions.
14 changes: 7 additions & 7 deletions shared/shared_pagination.go
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
package shared

type paginationParams struct {
type PaginationParams struct {
PageSize *int
QueryParams map[string]string
}

type PaginationParamsOption func(Params *paginationParams)
type PaginationParamsOption func(Params *PaginationParams)

type paginationNS struct{}

var Pagination paginationNS

func (paginationNS) newParams() *paginationParams {
return &paginationParams{QueryParams: map[string]string{}}
func (paginationNS) newParams() *PaginationParams {
return &PaginationParams{QueryParams: map[string]string{}}
}

func (paginationNS) PageSize(pageSize int) PaginationParamsOption {
return func(params *paginationParams) {
return func(params *PaginationParams) {
params.PageSize = &pageSize
}
}

func (paginationNS) QueryParam(key string, value string) PaginationParamsOption {
return func(params *paginationParams) {
return func(params *PaginationParams) {
params.QueryParams[key] = value
}
}

func (paginationNS) QueryParams(queryParams map[string]string) PaginationParamsOption {
return func(params *paginationParams) {
return func(params *PaginationParams) {
for key, value := range queryParams {
params.QueryParams[key] = value
}
Expand Down
1 change: 1 addition & 0 deletions test_util/test_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type User struct {
}

type Workspace struct {
Key string `json:"key"`
SecretKey string `json:"secretKey"`
}

Expand Down
103 changes: 103 additions & 0 deletions workspaces/workspaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,26 @@ type CreateWorkspaceParams struct {
IsTest bool `json:"isTest"`
}

type UpdateWorkspaceParams struct {
Name string `json:"name"`
}

type regenerateSecretKeyResponse struct {
SecretKey string `json:"secretKey"`
}

type WorkspaceStatus string

type workspaceNS struct{}

var WorkspaceSupport workspaceNS

const (
All WorkspaceStatus = ""
Active WorkspaceStatus = "/active"
Inactive WorkspaceStatus = "/inactive"
)

func (workspaces Workspaces) CreateTestWorkspace(name string) (*Workspace, error) {
return workspaces.createWorkspace(name, true)
}
Expand All @@ -30,3 +50,86 @@ func (workspaces Workspaces) createWorkspace(name string, isTest bool) (*Workspa
Post("/workspaces")
return shared.AssertOk(result, err, &workspace)
}

func (workspaces Workspaces) Activate(key string) error {
result, err := workspaces.Client.R().
SetPathParam("key", key).
Post("/workspaces/{key}/actions/activate")
return shared.AssertOkNoBody(result, err)
}

func (workspaces Workspaces) Deactivate(key string) error {
result, err := workspaces.Client.R().
SetPathParam("key", key).
Post("/workspaces/{key}/actions/deactivate")
return shared.AssertOkNoBody(result, err)
}

func (workspaces Workspaces) RegenerateSecretKey(key string) (*string, error) {
var response regenerateSecretKeyResponse
result, err := workspaces.Client.R().
SetPathParam("key", key).
SetSuccessResult(&response).
Post("/workspaces/{key}/actions/regenerate-secret-key")
ok, err := shared.AssertOk(result, err, &response)
if err == nil {
return &ok.SecretKey, nil
} else {
return nil, err
}
}

func (workspaces Workspaces) SetDefaultWorkspace(key string) error {
result, err := workspaces.Client.R().
SetPathParam("key", key).
Post("/workspaces/actions/set-default/{key}")
return shared.AssertOkNoBody(result, err)
}

func (workspaces Workspaces) Update(key string, Name string) error {
result, err := workspaces.Client.R().
SetBody(UpdateWorkspaceParams{Name}).
SetPathParam("key", key).
Post("/workspaces/{key}")
return shared.AssertOkNoBody(result, err)
}

func (workspaces Workspaces) Retrieve(key string) (*Workspace, error) {
var workspace Workspace
result, err := workspaces.Client.R().
SetPathParam("key", key).
SetSuccessResult(&workspace).
Get("/workspaces/{key}")
return shared.AssertOk(result, err, &workspace)
}

func (workspaces Workspaces) ListAll(status WorkspaceStatus, opts ...shared.PaginationParamsOption) ([]Workspace, error) {
return workspaces.lister(status).All(opts...)
}

func (workspaces Workspaces) ListFirstPage(status WorkspaceStatus, opts ...shared.PaginationParamsOption) (*shared.Page[Workspace], error) {
return workspaces.lister(status).ListFirstPage(opts...)
}

func (workspaces Workspaces) ListPageAfter(id int64, status WorkspaceStatus, opts ...shared.PaginationParamsOption) (*shared.Page[Workspace], error) {
return workspaces.lister(status).ListPageAfter(id, opts...)
}

func (workspaces Workspaces) ListPageBefore(id int64, status WorkspaceStatus, opts ...shared.PaginationParamsOption) (*shared.Page[Workspace], error) {
return workspaces.lister(status).ListPageBefore(id, opts...)
}

func (workspaces Workspaces) lister(status WorkspaceStatus) *shared.Lister[Workspace] {
pageFetcher := shared.PageFetcher[Workspace]{
Client: workspaces.Client,
Url: string("/workspaces" + status), // avoids URL encoding of forward slash
UrlParams: map[string]string{},
}
return &shared.Lister[Workspace]{PageFetcher: &pageFetcher}
}

func (workspaceNS) WithFilter(filterValue string) shared.PaginationParamsOption {
return func(Params *shared.PaginationParams) {
Params.QueryParams["filter"] = filterValue
}
}
31 changes: 31 additions & 0 deletions workspaces_test/activate_workspace_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package workspaces

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

func TestActivateWorkspace(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

workspace, err := client.Workspaces.CreateProductionWorkspace("my workspace")
require.NoError(t, err)

err = client.Workspaces.Deactivate(workspace.Key)
require.NoError(t, err)

retrievedWorkspace, err := client.Workspaces.Retrieve(workspace.Key)
require.NoError(t, err)
require.False(t, retrievedWorkspace.IsActive)

err = client.Workspaces.Activate(workspace.Key)
require.NoError(t, err)

activatedWorkspace, err := client.Workspaces.Retrieve(workspace.Key)
require.NoError(t, err)
require.True(t, activatedWorkspace.IsActive)
}
2 changes: 2 additions & 0 deletions workspaces_test/create_workspace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
)

func TestCreateProductionWorkspace(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

Expand All @@ -22,6 +23,7 @@ func TestCreateProductionWorkspace(t *testing.T) {
}

func TestCreateTestWorkspace(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

Expand Down
25 changes: 25 additions & 0 deletions workspaces_test/deactivate_workspace_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package workspaces

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

func TestDeactivateWorkspace(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

workspace, err := client.Workspaces.CreateProductionWorkspace("my workspace")
require.NoError(t, err)
require.True(t, workspace.IsActive)

err = client.Workspaces.Deactivate(workspace.Key)
require.NoError(t, err)

deactivatedWorkspace, err := client.Workspaces.Retrieve(workspace.Key)
require.NoError(t, err)
require.False(t, deactivatedWorkspace.IsActive)
}
76 changes: 76 additions & 0 deletions workspaces_test/list_active_workspaces_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package workspaces

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

func TestListActiveWorkspaces(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

workspace1, err := client.Workspaces.CreateProductionWorkspace("workspace 1")
require.NoError(t, err)
workspace2, err := client.Workspaces.CreateProductionWorkspace("workspace 2")
require.NoError(t, err)
workspace3, err := client.Workspaces.CreateProductionWorkspace("workspace 3")
require.NoError(t, err)

err = client.Workspaces.Deactivate(workspace2.Key)
require.NoError(t, err)

retrievedWorkspaces, err := client.Workspaces.ListAll(workspaces.Active)
require.NoError(t, err)

require.Equal(t, 3, len(retrievedWorkspaces))
require.Equal(t, workspace3.Key, retrievedWorkspaces[0].Key)
require.Equal(t, workspace1.Key, retrievedWorkspaces[1].Key)
require.Equal(t, company.Workspace.Key, retrievedWorkspaces[2].Key)
}

func TestListActiveWorkspacesWithFilter(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

workspace1, err := client.Workspaces.CreateProductionWorkspace("workspace 1")
require.NoError(t, err)
workspace2, err := client.Workspaces.CreateProductionWorkspace("workspace 2")
require.NoError(t, err)
_, err = client.Workspaces.CreateProductionWorkspace("workspace 3")
require.NoError(t, err)

err = client.Workspaces.Deactivate(workspace2.Key)
require.NoError(t, err)

retrievedWorkspaces, err := client.Workspaces.ListAll(workspaces.Active, workspaces.WorkspaceSupport.WithFilter("workspace 1"))
require.NoError(t, err)

require.Equal(t, 1, len(retrievedWorkspaces))
require.Equal(t, workspace1.Key, retrievedWorkspaces[0].Key)
}

func TestListActiveWorkspacesWithFilterNoResults(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

_, err := client.Workspaces.CreateProductionWorkspace("workspace 1")
require.NoError(t, err)
workspace2, err := client.Workspaces.CreateProductionWorkspace("workspace 2")
require.NoError(t, err)
_, err = client.Workspaces.CreateProductionWorkspace("workspace 3")
require.NoError(t, err)

err = client.Workspaces.Deactivate(workspace2.Key)
require.NoError(t, err)

retrievedWorkspaces, err := client.Workspaces.ListAll(workspaces.Active, workspaces.WorkspaceSupport.WithFilter("workspace 2"))
require.NoError(t, err)

require.Equal(t, 0, len(retrievedWorkspaces))
}
76 changes: 76 additions & 0 deletions workspaces_test/list_inactive_workspaces_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package workspaces

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

func TestListInactiveWorkspaces(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

_, err := client.Workspaces.CreateProductionWorkspace("workspace 1")
require.NoError(t, err)
workspace2, err := client.Workspaces.CreateProductionWorkspace("workspace 2")
require.NoError(t, err)
_, err = client.Workspaces.CreateProductionWorkspace("workspace 3")
require.NoError(t, err)

err = client.Workspaces.Deactivate(workspace2.Key)
require.NoError(t, err)

retrievedWorkspaces, err := client.Workspaces.ListAll(workspaces.Inactive)
require.NoError(t, err)

require.Equal(t, 1, len(retrievedWorkspaces))
require.Equal(t, workspace2.Key, retrievedWorkspaces[0].Key)
}

func TestListInactiveWorkspacesWithFilter(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

workspace1, err := client.Workspaces.CreateProductionWorkspace("workspace 1")
require.NoError(t, err)
workspace2, err := client.Workspaces.CreateProductionWorkspace("workspace 2")
require.NoError(t, err)
_, err = client.Workspaces.CreateProductionWorkspace("workspace 3")
require.NoError(t, err)

err = client.Workspaces.Deactivate(workspace1.Key)
require.NoError(t, err)
err = client.Workspaces.Deactivate(workspace2.Key)
require.NoError(t, err)

retrievedWorkspaces, err := client.Workspaces.ListAll(workspaces.Inactive, workspaces.WorkspaceSupport.WithFilter("workspace 2"))
require.NoError(t, err)

require.Equal(t, 1, len(retrievedWorkspaces))
require.Equal(t, workspace2.Key, retrievedWorkspaces[0].Key)
}

func TestListInactiveWorkspacesWithFilterNoResults(t *testing.T) {
t.Parallel()
company := test_util.CreateTestCompany(t)
client := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl)

_, err := client.Workspaces.CreateProductionWorkspace("workspace 1")
require.NoError(t, err)
workspace2, err := client.Workspaces.CreateProductionWorkspace("workspace 2")
require.NoError(t, err)
_, err = client.Workspaces.CreateProductionWorkspace("workspace 3")
require.NoError(t, err)

err = client.Workspaces.Deactivate(workspace2.Key)
require.NoError(t, err)

retrievedWorkspaces, err := client.Workspaces.ListAll(workspaces.Inactive, workspaces.WorkspaceSupport.WithFilter("workspace 1"))
require.NoError(t, err)

require.Equal(t, 0, len(retrievedWorkspaces))
}
Loading

0 comments on commit 4d14012

Please sign in to comment.