Add resource gitea_team_members

This commit is contained in:
Tobias Balle-Petersen 2023-10-30 13:15:59 +01:00
parent 8ee3cbc679
commit 58995ff1b8
2 changed files with 166 additions and 0 deletions

View File

@ -82,6 +82,7 @@ func Provider() *schema.Provider {
"gitea_public_key": resourceGiteaPublicKey(),
"gitea_team": resourceGiteaTeam(),
"gitea_team_membership": resourceGiteaTeamMembership(),
"gitea_team_members": resourceGiteaTeamMembers(),
"gitea_git_hook": resourceGiteaGitHook(),
"gitea_token": resourceGiteaToken(),
"gitea_repository_key": resourceGiteaRepositoryKey(),

View File

@ -0,0 +1,165 @@
package gitea
import (
"fmt"
"code.gitea.io/sdk/gitea"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
membersTeamID string = "team_id"
membersTeamName string = "team_name"
membersNames string = "members"
)
func getTeamMembers(t *gitea.Team, meta interface{}) (u []*gitea.User, err error) {
client := meta.(*gitea.Client)
var users []*gitea.User
// FIXME: Support pagination
opts := gitea.ListTeamMembersOptions{
ListOptions: gitea.ListOptions{Page: -1, PageSize: 100},
}
// Get all members of team.
users, _, err = client.ListTeamMembers(t.ID, opts)
if err != nil {
return nil, err
}
return users, nil
}
func resourceTeamMembersCreate(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*gitea.Client)
// var resp *gitea.Response
var team *gitea.Team
var members []*gitea.User
// Get the team data
team, _, err = client.GetTeam(int64(d.Get(membersTeamID).(int)))
if err != nil {
return err
}
memberNames := d.Get(membersNames)
// What if team already has member?
// What if user is already in the team?
// What if user does not exist?
// Add members to the team
for _, name := range memberNames.([]interface{}) {
_ , err = client.AddTeamMember(team.ID, name.(string))
if err != nil {
return err
}
}
// Read memberships back from Gitea
members , err = getTeamMembers(team, meta)
err = setTeamMembersData(team, members, d)
return
}
func resourceTeamMembersRead(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*gitea.Client)
//var resp *gitea.Response
var team *gitea.Team
var members []*gitea.User
// Get the team data
team, _, err = client.GetTeam(int64(d.Get(membershipTeamID).(int)))
if err != nil {
return err
}
// Read memberships back from Gitea
members , err = getTeamMembers(team, meta)
err = setTeamMembersData(team, members, d)
return
}
func resourceTeamMembersDelete(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*gitea.Client)
var team *gitea.Team
var members []*gitea.User
// Make sure the team exists in Gitea
team, _, err = client.GetTeam(int64(d.Get(membershipTeamID).(int)))
if err != nil {
return err
}
members , err = getTeamMembers(team, meta)
// Delete all memberships
for _, m := range members {
_, err = client.RemoveTeamMember(team.ID, m.UserName)
if err != nil {
return err
}
}
return
}
func setTeamMembersData(t *gitea.Team, users []*gitea.User, d *schema.ResourceData) (err error) {
var userNames []string
for _, u := range users {
userNames = append(userNames, u.UserName)
}
d.SetId(fmt.Sprintf("%d", t.ID))
d.Set(membersTeamID, t.ID)
d.Set(membersTeamName, t.Name)
d.Set(membersNames, userNames)
return
}
func resourceGiteaTeamMembers() *schema.Resource {
return &schema.Resource{
Read: resourceTeamMembersRead,
Create: resourceTeamMembersCreate,
Delete: resourceTeamMembersDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Schema: map[string]*schema.Schema{
"team_id": {
Type: schema.TypeInt,
Required: true,
ForceNew: true,
Description: "The ID of the team.",
},
"team_name": {
Type: schema.TypeString,
Required: false,
Computed: true,
Description: "The name of the team.",
},
"members": {
Type: schema.TypeList,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Required: true,
ForceNew: true,
Description: "The user names of the members of the team.",
},
},
Description: "`gitea_team_members` manages all members of a single team.",
}
}