Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .envrc
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
dotenv_if_exists .env
dotenv_if_exists .api_key

CY_SAAS_API_KEY="$(op read "op://Cycloid/API_prod_cycloid/identifiant")"
export CY_SAAS_API_KEY

if has nix; then
watch_file flake.nix
use flake . -Lv --log-format raw
Expand Down
6 changes: 4 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,17 @@ SWAGGER_GENERATE = swagger generate client \
--target=./client \
--name=api

BACKEND_TAG ?= staging

-include .env
-include .api_key

.PHONY: help
help: ## Show this help
@grep -F -h "##" $(MAKEFILE_LIST) | grep -F -v fgrep | sed -e 's/:.*##/:##/' | column -t -s '##'

.PHONY: print-version
print-version:
echo $$BACKEND_TAG

.PHONY: install
install: .env .git/hooks/pre-commit ## install all pre-requisites

Expand Down
8 changes: 8 additions & 0 deletions changelog/unreleased/CLI-ADDED-20260218-203527.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
component: CLI
kind: ADDED
body: Update teams commands and added member management commands
time: 2026-02-18T20:35:27.850357845Z
custom:
DETAILS: Lookup `cy team --help` and `cy team members --help` commands
PR: "411"
TYPE: CLI
8 changes: 8 additions & 0 deletions changelog/unreleased/CLI-CHANGED-20260203-095730.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
component: CLI
kind: CHANGED
body: "Update client to version v6.7.48"
time: 2026-02-03T09:57:30.887038069+00:00
custom:
DETAILS: ""
PR: "407"
TYPE: CLI
2 changes: 1 addition & 1 deletion client/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v6.7.38
v6.7.48
3 changes: 2 additions & 1 deletion cmd/cycloid/members/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ func NewCommands() *cobra.Command {
NewListCommand(),
NewGetCommand(),
NewInviteCommand(),
NewListInvitesCommand())
NewListInvitesCommand(),
)

return cmd
}
13 changes: 13 additions & 0 deletions cmd/cycloid/middleware/middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,19 @@ type Middleware interface {
ListInvites(org string) ([]*models.MemberOrg, error)
UpdateMember(org string, id uint32, role string) (*models.MemberOrg, error)

// organization_teams
ListTeams(org string, teamNameFilter *string, createdAtFilter *uint64, memberIDFilter *uint32, orderBy *TeamOrderByParam) ([]*models.Team, error)
GetTeam(org, team string) (*models.Team, error)
CreateTeam(org string, name, team, owner *string, roles []string) (*models.Team, error)
UpdateTeam(org string, name, team, owner *string, roles []string) (*models.Team, error)
DeleteTeam(org, team string) error

// organization_team_members
ListTeamMembers(org string, team string) ([]*models.MemberTeam, error)
GetTeamMember(org string, team string, memberID uint32) (*models.MemberTeam, error)
AssignMemberToTeam(org, team string, username, email *string) (*models.MemberTeam, error)
UnAssignMemberFromTeam(org, team string, memberID uint32) error

// organizations
CreateOrganization(name string) (*models.Organization, error)
UpdateOrganization(org, name string) (*models.Organization, error)
Expand Down
89 changes: 89 additions & 0 deletions cmd/cycloid/middleware/organization_team_members.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package middleware

import (
"fmt"

"github.com/cycloidio/cycloid-cli/client/client/organization_team_members"
"github.com/cycloidio/cycloid-cli/client/models"
strfmt "github.com/go-openapi/strfmt"
)

func (m *middleware) ListTeamMembers(org string, team string) ([]*models.MemberTeam, error) {
params := organization_team_members.NewGetTeamMembersParams()
params.SetOrganizationCanonical(org)
params.SetTeamCanonical(team)

resp, err := m.api.OrganizationTeamMembers.GetTeamMembers(params, m.api.Credentials(&org))
if err != nil {
return nil, NewAPIError(err)
}

payload := resp.GetPayload()

return payload.Data, nil
}

func (m *middleware) GetTeamMember(org string, team string, memberID uint32) (*models.MemberTeam, error) {
params := organization_team_members.NewGetTeamMemberParams()
params.SetOrganizationCanonical(org)
params.SetTeamCanonical(team)
params.SetMemberID(memberID)

resp, err := m.api.OrganizationTeamMembers.GetTeamMember(params, m.api.Credentials(&org))
if err != nil {
return nil, NewAPIError(err)
}

payload := resp.GetPayload()

return payload.Data, nil
}

// AssignMemberToTeam will assign a organization member to a team using either username or email
// one of them is required
func (m *middleware) AssignMemberToTeam(org, team string, username, email *string) (*models.MemberTeam, error) {
params := organization_team_members.NewAssignMemberToTeamParams()
params.SetOrganizationCanonical(org)
params.SetTeamCanonical(team)
body := &models.NewTeamMemberAssignation{}

if username == nil && email == nil {
return nil, fmt.Errorf("missing email or username for AssignMemberToTeam")
}

if username != nil {
body.Username = *username
}

if email != nil {
body.Email = strfmt.Email(*email)
}
err := body.Validate(strfmt.Default)
if err != nil {
return nil, err
}

params.SetBody(body)
resp, err := m.api.OrganizationTeamMembers.AssignMemberToTeam(params, m.api.Credentials(&org), organization_team_members.WithAcceptApplicationVndCycloidIoV1JSON)
if err != nil {
return nil, NewAPIError(err)
}

payload := resp.GetPayload()

return payload.Data, nil
}

func (m *middleware) UnAssignMemberFromTeam(org, team string, memberID uint32) error {
params := organization_team_members.NewUnassignMemberFromTeamParams()
params.SetOrganizationCanonical(org)
params.SetTeamCanonical(team)
params.SetMemberID(memberID)

_, err := m.api.OrganizationTeamMembers.UnassignMemberFromTeam(params, m.api.Credentials(&org), organization_team_members.WithAcceptApplicationJSON)
if err != nil {
return NewAPIError(err)
}

return nil
}
137 changes: 137 additions & 0 deletions cmd/cycloid/middleware/organization_teams.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
package middleware

import (
"fmt"

"github.com/cycloidio/cycloid-cli/client/client/organization_teams"
"github.com/cycloidio/cycloid-cli/client/models"
"github.com/go-openapi/strfmt"
"github.com/sanity-io/litter"
)

type TeamOrderByParam string

var (
Ascending TeamOrderByParam = "asc"
Descending TeamOrderByParam = "desc"
)

func (m *middleware) ListTeams(org string, teamNameFilter *string, createdAtFilter *uint64, memberIDFilter *uint32, orderBy *TeamOrderByParam) ([]*models.Team, error) {
params := organization_teams.NewGetTeamsParams()
params.SetOrganizationCanonical(org)
params.SetTeamName(teamNameFilter)
params.SetTeamCreatedAt(createdAtFilter)
params.SetMemberID(memberIDFilter)
params.SetOrderBy((*string)(orderBy))

resp, err := m.api.OrganizationTeams.GetTeams(params, m.api.Credentials(&org))
if err != nil {
return nil, NewAPIError(err)
}

payload := resp.GetPayload()

return payload.Data, nil
}

func (m *middleware) GetTeam(org, team string) (*models.Team, error) {
params := organization_teams.NewGetTeamParams()
params.SetOrganizationCanonical(org)
params.SetTeamCanonical(team)

resp, err := m.api.OrganizationTeams.GetTeam(params, m.api.Credentials(&org))
if err != nil {
return nil, NewAPIError(err)
}

payload := resp.GetPayload()

return payload.Data, nil
}

func (m *middleware) CreateTeam(org string, name, team, owner *string, roles []string) (*models.Team, error) {
params := organization_teams.NewCreateTeamParams()
params.SetOrganizationCanonical(org)

teamName, canonical, err := NameOrCanonical(name, team)
if err != nil {
return nil, err
}

body := &models.NewTeam{
Name: &teamName,
Canonical: canonical,
RolesCanonical: roles,
}

if owner != nil {
body.Owner = *owner
}

err = body.Validate(strfmt.Default)
if err != nil {
return nil, fmt.Errorf("failed to validate body for CreateTeam: %w", err)
}

params.SetBody(body)

resp, err := m.api.OrganizationTeams.CreateTeam(params, m.api.Credentials(&org))
if err != nil {
return nil, NewAPIError(err)
}

payload := resp.GetPayload()

return payload.Data, nil
}

func (m *middleware) UpdateTeam(org string, name, team, owner *string, roles []string) (*models.Team, error) {
params := organization_teams.NewUpdateTeamParams()
params.SetOrganizationCanonical(org)

teamName, canonical, err := NameOrCanonical(name, team)
if err != nil {
return nil, err
}
params.SetTeamCanonical(canonical)

body := &models.UpdateTeam{
Name: &teamName,
Canonical: &canonical,
RolesCanonical: roles,
}

if owner != nil {
body.Owner = *owner
}

err = body.Validate(strfmt.Default)
if err != nil {
return nil, fmt.Errorf("failed to validate body for UpdateTeam: %w", err)
}

params.SetBody(body)

litter.Dump(params)
resp, err := m.api.OrganizationTeams.UpdateTeam(params, m.api.Credentials(&org))
if err != nil {
return nil, NewAPIError(err)
}

payload := resp.GetPayload()

return payload.Data, nil
}

func (m *middleware) DeleteTeam(org, team string) error {
params := organization_teams.NewDeleteTeamParams()
params.SetOrganizationCanonical(org)
params.SetTeamCanonical(team)

_, err := m.api.OrganizationTeams.DeleteTeam(params, m.api.Credentials(&org))
if err != nil {
return NewAPIError(err)
}

return nil
}
2 changes: 1 addition & 1 deletion cmd/cycloid/roles/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func NewDeleteCommand() *cobra.Command {
Use: "delete",
Aliases: []string{"rm"},
Args: cobra.MinimumNArgs(1),
ValidArgsFunction: cyargs.CompleteRoleCanonicals,
ValidArgsFunction: cyargs.CompleteRoleCanonical,
Example: example,
Short: short,
Long: long,
Expand Down
2 changes: 1 addition & 1 deletion cmd/cycloid/roles/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func NewGetCommand() *cobra.Command {
Short: short,
Long: long,
RunE: getRole,
ValidArgsFunction: cyargs.CompleteRoleCanonicals,
ValidArgsFunction: cyargs.CompleteRoleCanonical,
}

cyargs.AddRoleCanonicalFlag(cmd)
Expand Down
20 changes: 20 additions & 0 deletions cmd/cycloid/teams/cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package teams

import "github.com/spf13/cobra"

func NewTeamsCommands() *cobra.Command {
cmd := &cobra.Command{
Use: "teams",
Aliases: []string{"team"},
Short: "Commands to manage teams",
}
cmd.AddCommand(
NewTeamMembersCommand(),
NewCreateTeamCommand(),
NewUpdateTeamCommand(),
NewGetTeamCommand(),
NewDeleteTeamCommand(),
NewListTeamCommand(),
)
return cmd
}
Loading