Skip to content

feat(cli) Add All missing features of the Organizations API#263

Open
DerBurri wants to merge 17 commits into
mainfrom
add-organization-api
Open

feat(cli) Add All missing features of the Organizations API#263
DerBurri wants to merge 17 commits into
mainfrom
add-organization-api

Conversation

@DerBurri

@DerBurri DerBurri commented May 13, 2026

Copy link
Copy Markdown
Contributor

This branch implements org-aware team functionality across the CLI and API client, adds unit tests for team flows, and makes client creation injectable to improve testability. It also includes several refactors and dependency updates required to support the new behavior.

  1. Key points

Organization-aware team behavior:
Use GlobalOptions.OrgId and environment GetOrgId() for org-scoped commands.
Add organization filtering to ListTeams and helper conversions for org teams (API + CLI).
Team management commands and tests:
Implement and test AddTeamMember and RemoveTeamMember command logic and validation.
Implement and test team deletion (RemoveTeam) with injectible ClientFactory to mock API calls.
Add/extend unit tests for create/add/remove team flows.
Error handling & observability:
Improve API error logging to include traceId.
Centralize API error formatting via api/errors.FormatAPIError.
Testability & infra:
Make client construction injectable for CLI commands to allow mocks in tests.
Build-and-run integration test workflow updated (artifact + label matrix) — see integration-test.yml.
Chores & deps:
Multiple dependency updates and lint/test chore fixes.
Representative commits

CLI commands: team_create.go, team_add_member.go, team_remove_member.go, team_remove.go
Tests: team_create_test.go, team_add_member_test.go, team_remove_member_test.go, team_remove_test.go
API error handling: errors.go, tests in errors_test.go
CI workflow: integration-test.yml
Client interface and mocks: client.go, mocks.go
Testing / verification

Ran unit tests for the CLI package locally: go test ./cli/cmd — passing.
Integration tests are built and run via the updated GitHub Actions workflow; note that some int tests previously observed backend HTTP 500s during workspace deletion (server-side). If CI shows failures, collect trace IDs and forward to backend logs for investigation.
Migration / usage notes

@DerBurri DerBurri force-pushed the add-organization-api branch 2 times, most recently from 2452e6c to 1487f91 Compare May 13, 2026 12:18
DerBurri and others added 14 commits June 3, 2026 10:20
* add list organizations command

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>

* chore(docs): Auto-update docs and licenses

Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>

* feat(test): removed old code

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>

* feat(test): add coverage report

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>

* add missing err checks for stdout closing

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>

---------

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Co-authored-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
chore(mock): Update MockClient.ListTeams signature
test(cli): Update ListTeams mock expectation in list_workspaces_test
feat(api): Add ConvertOrgTeamToTeam helper for organization teams
refactor(cli): Simplify ListTeamsCmd.RunE to use new ListTeams signature
feat(cli): Update Client interface for ListTeams to include orgId
feat(cli): Add --org flag and GlobalOptions.OrgId for organization context
feat(pkg): Add GetOrgId to Environment for CS_ORG_ID
feat(cli): Implement 'cs list org' command to list organizations

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
added team add and delete opton with org context

Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
Signed-off-by: Maximilian <burr.maximilian97@gmail.com>
@DerBurri DerBurri force-pushed the add-organization-api branch from 044e3a4 to a513836 Compare June 3, 2026 08:20
@DerBurri DerBurri self-assigned this Jun 3, 2026
@DerBurri DerBurri force-pushed the add-organization-api branch from 3ceec3c to a58b8eb Compare June 3, 2026 08:58
Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com>
@DerBurri DerBurri marked this pull request as ready for review June 3, 2026 09:20
@DerBurri DerBurri requested a review from a team as a code owner June 3, 2026 09:20

@OliverTrautvetter OliverTrautvetter left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice feature, some comments for it 👍

Comment thread pkg/cs/env.go
return orgId
}
return ""
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? It is like
if true return true
Maybe log something before return "" that CS_ORG_ID is not set

Comment thread cli/cmd/root.go
Comment on lines +74 to 76
if orgId == "" {
return "", nil
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is it no longer an error?

Comment on lines +28 to +32
cmd: &cobra.Command{
Use: "add",
Short: "Add team member",
Long: `Add team member to a team`,
},

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add some Example: formatExamples

Comment thread cli/cmd/team_create.go
Comment on lines +26 to +31
t := CreateTeamCmd{
cmd: &cobra.Command{
Use: "create",
Short: "Create team",
Long: `Create a team in Codesphere or an Organization`,
},

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add some Example: formatExamples

Comment thread cli/cmd/team_remove.go
Comment on lines +25 to +30
t := RemoveTeamCmd{
cmd: &cobra.Command{
Use: "remove",
Short: "Remove team",
Long: `Remove a team from Codesphere or an Organization`,
},

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add some Example: formatExamples

Comment thread cli/cmd/team_create.go
ClientFactory: NewClient,
}
t.cmd.RunE = t.RunE
t.cmd.Flags().StringVarP(&t.Opts.Name, "name", "n", "", "Team name")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name flag should be MarkFlagRequired too

Comment thread cli/cmd/team_remove.go
ClientFactory: NewClient,
}
t.cmd.RunE = t.RunE
t.cmd.Flags().StringVarP(&t.Opts.name, "name", "n", "", "Team name")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name is not used?

Comment thread cli/cmd/team_remove.go

teamId, err := c.Opts.GetTeamId()
if err != nil {
return errors.New("team ID not set, use -T or CS_TEAM_ID to set it")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-t not -T, right?

},
ClientFactory: NewClient,
}
res.cmd.Flags().IntVarP(&res.Opts.UserId, "user", "u", 0, "Team member user ID")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MarkFlagRequired

}

func (c *RemoveTeamMemberCmd) RemoveTeamMember(client Client, teamId int, userId int) error {
if userId == 0 {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can userId be -1? Maybe we should check if <= 0 -> error

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants