From daaf6fbb207a6065b5d5d0a4d0744cacbf74edc5 Mon Sep 17 00:00:00 2001 From: Andreas Grub Date: Mon, 26 Oct 2026 19:33:27 +0100 Subject: [PATCH] feat(client): list workspace and project bindings, and read the expiry date of a project binding Co-Authored-By: Claude Opus 5.5 --- client/project_binding.go | 14 ++++++++++---- client/project_group_binding.go | 6 ++++++ client/project_user_binding.go | 6 ++++++ client/workspace_binding.go | 7 +++++++ client/workspace_group_binding.go | 6 ++++++ client/workspace_user_binding.go | 6 ++++++ 6 files changed, 41 insertions(+), 4 deletions(-) diff --git a/client/project_binding.go b/client/project_binding.go index 59edd60d..57f91d39 100644 --- a/client/project_binding.go +++ b/client/project_binding.go @@ -1,10 +1,11 @@ package client type MeshProjectBinding struct { - Metadata MeshProjectBindingMetadata `json:"metadata" tfsdk:"metadata"` - RoleRef MeshProjectRoleRef `json:"roleRef" tfsdk:"role_ref"` - TargetRef MeshProjectTargetRef `json:"targetRef" tfsdk:"target_ref"` - Subject MeshSubject `json:"subject" tfsdk:"subject"` + Metadata MeshProjectBindingMetadata `json:"metadata" tfsdk:"metadata"` + RoleRef MeshProjectRoleRef `json:"roleRef" tfsdk:"role_ref"` + TargetRef MeshProjectTargetRef `json:"targetRef" tfsdk:"target_ref"` + Subject MeshSubject `json:"subject" tfsdk:"subject"` + ExpiryDate *string `json:"expiryDate,omitzero" tfsdk:"expiry_date"` } type MeshProjectBindingMetadata struct { @@ -27,3 +28,8 @@ type MeshProjectTargetRef struct { type MeshSubject struct { Name string `json:"name" tfsdk:"name"` } + +type MeshProjectBindingListFilter struct { + WorkspaceIdentifier *string `json:"workspaceIdentifier"` + ProjectIdentifier *string `json:"projectIdentifier"` +} diff --git a/client/project_group_binding.go b/client/project_group_binding.go index 85872ef2..f0f2d274 100644 --- a/client/project_group_binding.go +++ b/client/project_group_binding.go @@ -4,6 +4,7 @@ import ( "context" "github.com/meshcloud/meshstack-cli/client/internal" + "github.com/meshcloud/meshstack-cli/internal/http" ) type MeshProjectGroupBinding struct { @@ -12,6 +13,7 @@ type MeshProjectGroupBinding struct { type MeshProjectGroupBindingClient interface { Read(ctx context.Context, name string) (*MeshProjectGroupBinding, error) + List(ctx context.Context, filter MeshProjectBindingListFilter) ([]MeshProjectGroupBinding, error) Create(ctx context.Context, binding *MeshProjectGroupBinding) (*MeshProjectGroupBinding, error) Delete(ctx context.Context, name string) error } @@ -28,6 +30,10 @@ func (c meshProjectGroupBindingClient) Read(ctx context.Context, name string) (* return c.meshObject.Get(ctx, name) } +func (c meshProjectGroupBindingClient) List(ctx context.Context, filter MeshProjectBindingListFilter) ([]MeshProjectGroupBinding, error) { + return c.meshObject.List(ctx, http.WithUrlQuery(filter)) +} + func (c meshProjectGroupBindingClient) Create(ctx context.Context, binding *MeshProjectGroupBinding) (*MeshProjectGroupBinding, error) { return c.meshObject.Post(ctx, binding) } diff --git a/client/project_user_binding.go b/client/project_user_binding.go index 2b5b418b..90aaf14d 100644 --- a/client/project_user_binding.go +++ b/client/project_user_binding.go @@ -4,6 +4,7 @@ import ( "context" "github.com/meshcloud/meshstack-cli/client/internal" + "github.com/meshcloud/meshstack-cli/internal/http" ) type MeshProjectUserBinding struct { @@ -12,6 +13,7 @@ type MeshProjectUserBinding struct { type MeshProjectUserBindingClient interface { Read(ctx context.Context, name string) (*MeshProjectUserBinding, error) + List(ctx context.Context, filter MeshProjectBindingListFilter) ([]MeshProjectUserBinding, error) Create(ctx context.Context, binding *MeshProjectUserBinding) (*MeshProjectUserBinding, error) Delete(ctx context.Context, name string) error } @@ -28,6 +30,10 @@ func (c meshProjectUserBindingClient) Read(ctx context.Context, name string) (*M return c.meshObject.Get(ctx, name) } +func (c meshProjectUserBindingClient) List(ctx context.Context, filter MeshProjectBindingListFilter) ([]MeshProjectUserBinding, error) { + return c.meshObject.List(ctx, http.WithUrlQuery(filter)) +} + func (c meshProjectUserBindingClient) Create(ctx context.Context, binding *MeshProjectUserBinding) (*MeshProjectUserBinding, error) { return c.meshObject.Post(ctx, binding) } diff --git a/client/workspace_binding.go b/client/workspace_binding.go index e21418d8..8d2892be 100644 --- a/client/workspace_binding.go +++ b/client/workspace_binding.go @@ -23,3 +23,10 @@ type MeshWorkspaceTargetRef struct { type MeshWorkspaceSubject struct { Name string `json:"name" tfsdk:"name"` } + +type MeshWorkspaceBindingListFilter struct { + WorkspaceIdentifier *string `json:"workspaceIdentifier"` + WorkspaceRole *string `json:"workspaceRole"` + // Username matches a user binding of that user, or a group binding of a group the user is in. + Username *string `json:"username"` +} diff --git a/client/workspace_group_binding.go b/client/workspace_group_binding.go index cc56cd34..4c4da9c3 100644 --- a/client/workspace_group_binding.go +++ b/client/workspace_group_binding.go @@ -4,6 +4,7 @@ import ( "context" "github.com/meshcloud/meshstack-cli/client/internal" + "github.com/meshcloud/meshstack-cli/internal/http" ) type MeshWorkspaceGroupBinding struct { @@ -12,6 +13,7 @@ type MeshWorkspaceGroupBinding struct { type MeshWorkspaceGroupBindingClient interface { Read(ctx context.Context, name string) (*MeshWorkspaceGroupBinding, error) + List(ctx context.Context, filter MeshWorkspaceBindingListFilter) ([]MeshWorkspaceGroupBinding, error) Create(ctx context.Context, binding *MeshWorkspaceGroupBinding) (*MeshWorkspaceGroupBinding, error) Delete(ctx context.Context, name string) error } @@ -28,6 +30,10 @@ func (c meshWorkspaceGroupBindingClient) Read(ctx context.Context, name string) return c.meshObject.Get(ctx, name) } +func (c meshWorkspaceGroupBindingClient) List(ctx context.Context, filter MeshWorkspaceBindingListFilter) ([]MeshWorkspaceGroupBinding, error) { + return c.meshObject.List(ctx, http.WithUrlQuery(filter)) +} + func (c meshWorkspaceGroupBindingClient) Create(ctx context.Context, binding *MeshWorkspaceGroupBinding) (*MeshWorkspaceGroupBinding, error) { return c.meshObject.Post(ctx, binding) } diff --git a/client/workspace_user_binding.go b/client/workspace_user_binding.go index 1b9cdd24..0c0a3179 100644 --- a/client/workspace_user_binding.go +++ b/client/workspace_user_binding.go @@ -4,6 +4,7 @@ import ( "context" "github.com/meshcloud/meshstack-cli/client/internal" + "github.com/meshcloud/meshstack-cli/internal/http" ) type MeshWorkspaceUserBinding struct { @@ -12,6 +13,7 @@ type MeshWorkspaceUserBinding struct { type MeshWorkspaceUserBindingClient interface { Read(ctx context.Context, name string) (*MeshWorkspaceUserBinding, error) + List(ctx context.Context, filter MeshWorkspaceBindingListFilter) ([]MeshWorkspaceUserBinding, error) Create(ctx context.Context, binding *MeshWorkspaceUserBinding) (*MeshWorkspaceUserBinding, error) Delete(ctx context.Context, name string) error } @@ -28,6 +30,10 @@ func (c meshWorkspaceUserBindingClient) Read(ctx context.Context, name string) ( return c.meshObject.Get(ctx, name) } +func (c meshWorkspaceUserBindingClient) List(ctx context.Context, filter MeshWorkspaceBindingListFilter) ([]MeshWorkspaceUserBinding, error) { + return c.meshObject.List(ctx, http.WithUrlQuery(filter)) +} + func (c meshWorkspaceUserBindingClient) Create(ctx context.Context, binding *MeshWorkspaceUserBinding) (*MeshWorkspaceUserBinding, error) { return c.meshObject.Post(ctx, binding) }