这是indexloc提供的服务,不要输入任何密码
Skip to content

Add vercel_project_members resource #240

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 16, 2024
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
140 changes: 140 additions & 0 deletions client/project_member.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
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, "removing 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))
}
payload := string(mustMarshal(request))
tflog.Info(ctx, "updating project members", map[string]interface{}{
"url": url,
"payload": payload,
})
err := c.doRequest(clientRequest{
ctx: ctx,
method: "PATCH",
url: url,
body: payload,
}, 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, "listing 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
}
48 changes: 48 additions & 0 deletions docs/data-sources/project_members.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "vercel_project_members Data Source - terraform-provider-vercel"
subcategory: ""
description: |-
Retrieves members and their roles for a Vercel Project.
---

# vercel_project_members (Data Source)

Retrieves members and their roles for a Vercel Project.

## Example Usage

```terraform
data "vercel_project" "example" {
name = "example-with-members"
}

data "vercel_project_members" "example" {
project_id = data.vercel_project.example.id
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `project_id` (String) The ID of the Vercel Project.

### Optional

- `team_id` (String) The team ID to which the project belongs. Required when accessing a team project if a default team has not been set in the provider.

### Read-Only

- `members` (Attributes Set) The set of members in this project. (see [below for nested schema](#nestedatt--members))

<a id="nestedatt--members"></a>
### Nested Schema for `members`

Read-Only:

- `email` (String) The email of the user.
- `role` (String) The role of the user in the project. One of 'MEMBER', 'PROJECT_DEVELOPER', or 'PROJECT_VIEWER'.
- `user_id` (String) The ID of the user.
- `username` (String) The username of the user.
63 changes: 63 additions & 0 deletions docs/resources/project_members.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "vercel_project_members Resource - terraform-provider-vercel"
subcategory: ""
description: |-
Manages members and their roles for a Vercel Project.
~> Note that this resource does not manage the complete set of members for a project, only the members that
are explicitly configured here. This is deliberately done to allow granular additions.
This, however, means config drift will not be detected for members that are added or removed outside of terraform.
---

# vercel_project_members (Resource)

Manages members and their roles for a Vercel Project.

~> Note that this resource does not manage the complete set of members for a project, only the members that
are explicitly configured here. This is deliberately done to allow granular additions.
This, however, means config drift will not be detected for members that are added or removed outside of terraform.

## Example Usage

```terraform
resource "vercel_project" "example" {
name = "example-with-members"
}

resource "vercel_project_members" "example" {
project_id = vercel_project.example.id

members = [{
email = "user@example.com"
role = "PROJECT_VIEWER"
}, {
username = "some-example-user"
role = "PROJECT_DEVELOPER"
}]
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `members` (Attributes Set) The set of members to manage for this project. (see [below for nested schema](#nestedatt--members))
- `project_id` (String) The ID of the existing Vercel Project.

### Optional

- `team_id` (String) The team ID to add the project to. Required when configuring a team resource if a default team has not been set in the provider.

<a id="nestedatt--members"></a>
### Nested Schema for `members`

Required:

- `role` (String) The role that the user should have in the project. One of 'MEMBER', 'PROJECT_DEVELOPER', or 'PROJECT_VIEWER'.

Optional:

- `email` (String) The email of the user to add to the project. Exactly one of `user_id`, `email`, or `username` must be specified.
- `user_id` (String) The ID of the user to add to the project. Exactly one of `user_id`, `email`, or `username` must be specified.
- `username` (String) The username of the user to add to the project. Exactly one of `user_id`, `email`, or `username` must be specified.
7 changes: 7 additions & 0 deletions examples/data-sources/vercel_project_members/data-source.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
data "vercel_project" "example" {
name = "example-with-members"
}

data "vercel_project_members" "example" {
project_id = data.vercel_project.example.id
}
15 changes: 15 additions & 0 deletions examples/resources/vercel_project_members/resource.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
resource "vercel_project" "example" {
name = "example-with-members"
}

resource "vercel_project_members" "example" {
project_id = vercel_project.example.id

members = [{
email = "user@example.com"
role = "PROJECT_VIEWER"
}, {
username = "some-example-user"
role = "PROJECT_DEVELOPER"
}]
}
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ require (
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/oklog/run v1.1.0 // indirect
github.com/vercel/terraform-provider-vercel v1.14.1
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,6 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/vercel/terraform-provider-vercel v1.14.1 h1:ghAjFkMMzka4XuoBYdu1OXM/K7FQEj8wUd+xMPPOGrg=
github.com/vercel/terraform-provider-vercel v1.14.1/go.mod h1:AdFCiUD0XP8XOi6tnhaCh7I0vyq2TAPmI+GcIp3+7SI=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
Expand Down
Loading
Loading