Skip to content

Commit

Permalink
Start fleshing out project members resource
Browse files Browse the repository at this point in the history
  • Loading branch information
dglsparsons committed Dec 13, 2024
1 parent e2bd728 commit 44b1a08
Show file tree
Hide file tree
Showing 4 changed files with 548 additions and 22 deletions.
138 changes: 138 additions & 0 deletions client/project_member.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package client

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-log/tflog"
)

type ProjectMember struct {
UserID string `json:"uid,omitempty"`
Username string `json:"username,omitempty"`
Email string `json:"email,omitempty"`
Role string `json:"role"`
}

type AddProjectMembersRequest struct {
ProjectID string `json:"-"`
TeamID string `json:"-"`
Members []ProjectMember `json:"members"`
}

func (c *Client) AddProjectMembers(ctx context.Context, request AddProjectMembersRequest) error {
url := fmt.Sprintf("%s/v1/projects/%s/members/batch", c.baseURL, request.ProjectID)
if c.teamID(request.TeamID) != "" {
url = fmt.Sprintf("%s?teamId=%s", url, c.teamID(request.TeamID))
}
tflog.Info(ctx, "adding project members", map[string]interface{}{
"url": url,
})
err := c.doRequest(clientRequest{
ctx: ctx,
method: "POST",
url: url,
body: string(mustMarshal(request)),
}, nil)
if err != nil {
tflog.Error(ctx, "error adding project members", map[string]interface{}{
"url": url,
"members": request.Members,
})
}
return err
}

type RemoveProjectMembersRequest struct {
ProjectID string `json:"-"`
TeamID string `json:"-"`
Members []string `json:"members"`
}

func (c *Client) RemoveProjectMembers(ctx context.Context, request RemoveProjectMembersRequest) error {
url := fmt.Sprintf("%s/v1/projects/%s/members/batch", c.baseURL, request.ProjectID)
if c.teamID(request.TeamID) != "" {
url = fmt.Sprintf("%s?teamId=%s", url, c.teamID(request.TeamID))
}
tflog.Info(ctx, "adding project members", map[string]interface{}{
"url": url,
})
err := c.doRequest(clientRequest{
ctx: ctx,
method: "DELETE",
url: url,
body: string(mustMarshal(request)),
}, nil)
if err != nil {
tflog.Error(ctx, "error removing project members", map[string]interface{}{
"url": url,
"members": request.Members,
})
}
return err
}

type UpdateProjectMemberRequest struct {
UserID string `json:"uid,omitempty"`
Role string `json:"role"`
}

type UpdateProjectMembersRequest struct {
ProjectID string `json:"-"`
TeamID string `json:"-"`
Members []UpdateProjectMemberRequest `json:"members"`
}

func (c *Client) UpdateProjectMembers(ctx context.Context, request UpdateProjectMembersRequest) error {
url := fmt.Sprintf("%s/v1/projects/%s/members", c.baseURL, request.ProjectID)
if c.teamID(request.TeamID) != "" {
url = fmt.Sprintf("%s?teamId=%s", url, c.teamID(request.TeamID))
}
tflog.Info(ctx, "adding project members", map[string]interface{}{
"url": url,
})
err := c.doRequest(clientRequest{
ctx: ctx,
method: "PATCH",
url: url,
body: string(mustMarshal(request)),
}, nil)
if err != nil {
tflog.Error(ctx, "error updating project members", map[string]interface{}{
"url": url,
"members": request.Members,
})
}
return err
}

type GetProjectMembersRequest struct {
ProjectID string `json:"-"`
TeamID string `json:"-"`
}

func (c *Client) ListProjectMembers(ctx context.Context, request GetProjectMembersRequest) ([]ProjectMember, error) {
url := fmt.Sprintf("%s/v1/projects/%s/members", c.baseURL, request.ProjectID)
if c.teamID(request.TeamID) != "" {
url = fmt.Sprintf("%s?teamId=%s&limit=100", url, c.teamID(request.TeamID))
}
tflog.Info(ctx, "adding project members", map[string]interface{}{
"url": url,
})

var resp struct {
Members []ProjectMember `json:"members"`
}
err := c.doRequest(clientRequest{
ctx: ctx,
method: "GET",
url: url,
body: string(mustMarshal(request)),
}, &resp)
if err != nil {
tflog.Error(ctx, "error getting project members", map[string]interface{}{
"url": url,
})
}
return resp.Members, err
}
1 change: 1 addition & 0 deletions vercel/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ func (p *vercelProvider) Resources(_ context.Context) []func() resource.Resource
newProjectDomainResource,
newProjectEnvironmentVariableResource,
newProjectEnvironmentVariablesResource,
newProjectMemberResource,

Check failure on line 69 in vercel/provider.go

View workflow job for this annotation

GitHub Actions / Build

undefined: newProjectMemberResource

Check failure on line 69 in vercel/provider.go

View workflow job for this annotation

GitHub Actions / Docs Test

undefined: newProjectMemberResource
newProjectResource,
newSharedEnvironmentVariableResource,
newTeamConfigResource,
Expand Down
31 changes: 9 additions & 22 deletions vercel/resource_project.go
Original file line number Diff line number Diff line change
Expand Up @@ -1208,28 +1208,15 @@ func convertResponseToProject(ctx context.Context, response client.ProjectRespon
}
}

env = append(env, types.ObjectValueMust(
map[string]attr.Type{
"key": types.StringType,
"value": types.StringType,
"target": types.SetType{
ElemType: types.StringType,
},
"git_branch": types.StringType,
"id": types.StringType,
"sensitive": types.BoolType,
"comment": types.StringType,
},
map[string]attr.Value{
"key": types.StringValue(e.Key),
"value": value,
"target": types.SetValueMust(types.StringType, target),
"git_branch": types.StringPointerValue(e.GitBranch),
"id": types.StringValue(e.ID),
"sensitive": types.BoolValue(e.Type == "sensitive"),
"comment": types.StringValue(e.Comment),
},
))
env = append(env, types.ObjectValueMust(envVariableElemType.AttrTypes, map[string]attr.Value{
"key": types.StringValue(e.Key),
"value": value,
"target": types.SetValueMust(types.StringType, target),
"git_branch": types.StringPointerValue(e.GitBranch),
"id": types.StringValue(e.ID),
"sensitive": types.BoolValue(e.Type == "sensitive"),
"comment": types.StringValue(e.Comment),
}))
}

protectionBypassSecret := types.StringNull()
Expand Down
Loading

0 comments on commit 44b1a08

Please sign in to comment.