in commands/token/rotate/rotate.go [123:241]
func rotateTokenRun(opts *RotateOptions) error {
httpClient, err := opts.HTTPClient()
if err != nil {
return err
}
expirationDate := gitlab.ISOTime(opts.ExpireAt)
var outputToken any
var outputTokenValue string
if opts.User != "" {
user, err := api.UserByName(httpClient, opts.User)
if err != nil {
return cmdutils.FlagError{Err: err}
}
options := &gitlab.ListPersonalAccessTokensOptions{
ListOptions: gitlab.ListOptions{PerPage: 100},
UserID: &user.ID,
}
tokens, err := api.ListPersonalAccessTokens(httpClient, options)
if err != nil {
return err
}
var token *gitlab.PersonalAccessToken
tokens = filter.Filter(tokens, func(t *gitlab.PersonalAccessToken) bool {
return t.Active && (t.Name == opts.Name || t.ID == opts.Name)
})
switch len(tokens) {
case 1:
token = tokens[0]
case 0:
return cmdutils.FlagError{Err: fmt.Errorf("no token found with the name '%v'", opts.Name)}
default:
return cmdutils.FlagError{Err: fmt.Errorf("multiple tokens found with the name '%v'. Use the ID instead.", opts.Name)}
}
rotateOptions := &gitlab.RotatePersonalAccessTokenOptions{
ExpiresAt: &expirationDate,
}
if token, err = api.RotatePersonalAccessToken(httpClient, token.ID, rotateOptions); err != nil {
return err
}
outputToken = token
outputTokenValue = token.Token
} else {
if opts.Group != "" {
options := &gitlab.ListGroupAccessTokensOptions{PerPage: 100}
tokens, err := api.ListGroupAccessTokens(httpClient, opts.Group, options)
if err != nil {
return err
}
var token *gitlab.GroupAccessToken
tokens = filter.Filter(tokens, func(t *gitlab.GroupAccessToken) bool {
return t.Active && (t.Name == opts.Name || t.ID == opts.Name)
})
switch len(tokens) {
case 1:
token = tokens[0]
case 0:
return cmdutils.FlagError{Err: fmt.Errorf("no token found with the name '%v'", opts.Name)}
default:
return cmdutils.FlagError{Err: fmt.Errorf("multiple tokens found with the name '%v', use the ID instead", opts.Name)}
}
rotateOptions := &gitlab.RotateGroupAccessTokenOptions{
ExpiresAt: &expirationDate,
}
if token, err = api.RotateGroupAccessToken(httpClient, opts.Group, token.ID, rotateOptions); err != nil {
return err
}
outputToken = token
outputTokenValue = token.Token
} else {
repo, err := opts.BaseRepo()
if err != nil {
return err
}
options := &gitlab.ListProjectAccessTokensOptions{ListOptions: gitlab.ListOptions{PerPage: 100}}
tokens, err := api.ListProjectAccessTokens(httpClient, repo.FullName(), options)
if err != nil {
return err
}
tokens = filter.Filter(tokens, func(t *gitlab.ProjectAccessToken) bool {
return t.Active && (t.Name == opts.Name || t.ID == opts.Name)
})
var token *gitlab.ProjectAccessToken
switch len(tokens) {
case 1:
token = tokens[0]
case 0:
return cmdutils.FlagError{Err: fmt.Errorf("no token found with the name '%v'", opts.Name)}
default:
return cmdutils.FlagError{Err: fmt.Errorf("multiple tokens found with the name '%v', use the ID instead", opts.Name)}
}
rotateOptions := &gitlab.RotateProjectAccessTokenOptions{
ExpiresAt: &expirationDate,
}
if token, err = api.RotateProjectAccessToken(httpClient, repo.FullName(), token.ID, rotateOptions); err != nil {
return err
}
outputToken = token
outputTokenValue = token.Token
}
}
if opts.OutputFormat == "json" {
encoder := json.NewEncoder(opts.IO.StdOut)
if err := encoder.Encode(outputToken); err != nil {
return err
}
} else {
if _, err := fmt.Fprintf(opts.IO.StdOut, "%s\n", outputTokenValue); err != nil {
return err
}
}
return nil
}