Skip to content

Commit c6a42a1

Browse files
committed
Create user resource
1 parent 7b38fd1 commit c6a42a1

File tree

7 files changed

+536
-0
lines changed

7 files changed

+536
-0
lines changed

docs/resources/user.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "nginxproxymanager_user Resource - nginxproxymanager"
4+
subcategory: "Users"
5+
description: |-
6+
This resource can be used to manage a user.
7+
---
8+
9+
# nginxproxymanager_user (Resource)
10+
11+
This resource can be used to manage a user.
12+
13+
14+
## Example Usage
15+
16+
```terraform
17+
resource "nginxproxymanager_user" "user" {
18+
name = "John Doe"
19+
nickname = "john.doe"
20+
email = "john.doe@example.com"
21+
22+
is_admin = false
23+
24+
permissions = {
25+
visibility = "all"
26+
27+
proxy_hosts = "manage"
28+
dead_hosts = "manage"
29+
redirection_hosts = "manage"
30+
streams = "manage"
31+
32+
access_lists = "view"
33+
certificates = "view"
34+
}
35+
}
36+
```
37+
38+
<!-- schema generated by tfplugindocs -->
39+
## Schema
40+
41+
### Required
42+
43+
- `email` (String) The email of the user.
44+
- `name` (String) The name of the user.
45+
- `nickname` (String) The nickname of the user.
46+
47+
### Optional
48+
49+
- `is_admin` (Boolean) Whether the user is an administrator.
50+
- `is_disabled` (Boolean) Whether the user is disabled.
51+
- `permissions` (Attributes) The permissions of the user. (see [below for nested schema](#nestedatt--permissions))
52+
53+
### Read-Only
54+
55+
- `avatar` (String) The avatar of the user.
56+
- `created_on` (String) The date and time the user was created.
57+
- `id` (Number) The Id of the user.
58+
- `modified_on` (String) The date and time the user was last modified.
59+
60+
<a id="nestedatt--permissions"></a>
61+
### Nested Schema for `permissions`
62+
63+
Optional:
64+
65+
- `access_lists` (String) The permission value for the access lists. Must be one of `manage`, `view` or `hidden`.
66+
- `certificates` (String) The permission value for the certificates. Must be one of `manage`, `view` or `hidden`.
67+
- `dead_hosts` (String) The permission value for the dead hosts. Must be one of `manage`, `view` or `hidden`.
68+
- `proxy_hosts` (String) The permission value for the proxy hosts. Must be one of `manage`, `view` or `hidden`.
69+
- `redirection_hosts` (String) The permission value for the redirection hosts. Must be one of `manage`, `view` or `hidden`.
70+
- `streams` (String) The permission value for the streams. Must be one of `manage`, `view` or `hidden`.
71+
- `visibility` (String) The level of visibility for the user. Must be one of `user` or `all`.
72+
73+
## Import
74+
75+
Import is supported using the following syntax:
76+
77+
```shell
78+
# Users can be imported by specifying the numeric identifier of the user.
79+
terraform import nginxproxymanager_user.user 1
80+
```
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Users can be imported by specifying the numeric identifier of the user.
2+
terraform import nginxproxymanager_user.user 1
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
resource "nginxproxymanager_user" "user" {
2+
name = "John Doe"
3+
nickname = "john.doe"
4+
email = "john.doe@example.com"
5+
6+
is_admin = false
7+
8+
permissions = {
9+
visibility = "all"
10+
11+
proxy_hosts = "manage"
12+
dead_hosts = "manage"
13+
redirection_hosts = "manage"
14+
streams = "manage"
15+
16+
access_lists = "view"
17+
certificates = "view"
18+
}
19+
}

internal/provider/models/user_permissions.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/hashicorp/terraform-plugin-framework/attr"
99
"github.com/hashicorp/terraform-plugin-framework/diag"
1010
"github.com/hashicorp/terraform-plugin-framework/types"
11+
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
1112
"github.com/sander0542/nginxproxymanager-go"
1213
)
1314

@@ -43,6 +44,20 @@ func (m *UserPermissions) Write(ctx context.Context, permissions *nginxproxymana
4344
m.Visibility = types.StringValue(permissions.GetVisibility())
4445
}
4546

47+
func (m *UserPermissions) ToRequest(ctx context.Context, diags *diag.Diagnostics) *nginxproxymanager.GetAccessLists200ResponseInnerOwnerPermissions {
48+
request := nginxproxymanager.NewGetAccessLists200ResponseInnerOwnerPermissions(
49+
m.Visibility.ValueString(),
50+
m.AccessLists.ValueString(),
51+
m.DeadHosts.ValueString(),
52+
m.ProxyHosts.ValueString(),
53+
m.RedirectionHosts.ValueString(),
54+
m.Streams.ValueString(),
55+
m.Certificates.ValueString(),
56+
)
57+
58+
return request
59+
}
60+
4661
func ObjectUserPermissionsFrom(ctx context.Context, permissions nginxproxymanager.GetAccessLists200ResponseInnerOwnerPermissions) (types.Object, diag.Diagnostics) {
4762
diags := diag.Diagnostics{}
4863

@@ -54,3 +69,10 @@ func ObjectUserPermissionsFrom(ctx context.Context, permissions nginxproxymanage
5469

5570
return object, diags
5671
}
72+
73+
func UserPermissionsAs(ctx context.Context, object types.Object) (UserPermissions, diag.Diagnostics) {
74+
permissions := UserPermissions{}
75+
diags := object.As(ctx, &permissions, basetypes.ObjectAsOptions{})
76+
77+
return permissions, diags
78+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Copyright (c) Sander Jochems
2+
// SPDX-License-Identifier: MIT
3+
4+
package models
5+
6+
import (
7+
"context"
8+
"github.com/hashicorp/terraform-plugin-framework/diag"
9+
"github.com/hashicorp/terraform-plugin-framework/types"
10+
"github.com/sander0542/nginxproxymanager-go"
11+
"slices"
12+
)
13+
14+
type UserResource struct {
15+
Id types.Int64 `tfsdk:"id"`
16+
CreatedOn types.String `tfsdk:"created_on"`
17+
ModifiedOn types.String `tfsdk:"modified_on"`
18+
19+
Name types.String `tfsdk:"name"`
20+
Nickname types.String `tfsdk:"nickname"`
21+
Email types.String `tfsdk:"email"`
22+
Avatar types.String `tfsdk:"avatar"`
23+
IsDisabled types.Bool `tfsdk:"is_disabled"`
24+
IsAdmin types.Bool `tfsdk:"is_admin"`
25+
Permissions types.Object `tfsdk:"permissions"`
26+
}
27+
28+
func (m *UserResource) Write(ctx context.Context, user *nginxproxymanager.GetAccessLists200ResponseInnerOwner, diags *diag.Diagnostics) {
29+
var tmpDiags diag.Diagnostics
30+
31+
m.Id = types.Int64Value(user.GetId())
32+
m.CreatedOn = types.StringValue(user.GetCreatedOn())
33+
m.ModifiedOn = types.StringValue(user.GetModifiedOn())
34+
35+
m.Name = types.StringValue(user.GetName())
36+
m.Nickname = types.StringValue(user.GetNickname())
37+
m.Email = types.StringValue(user.GetEmail())
38+
m.Avatar = types.StringValue(user.GetAvatar())
39+
m.IsDisabled = types.BoolValue(user.GetIsDisabled())
40+
m.IsAdmin = types.BoolValue(slices.Contains(user.GetRoles(), "admin"))
41+
42+
if user.HasPermissions() {
43+
m.Permissions, tmpDiags = ObjectUserPermissionsFrom(ctx, user.GetPermissions())
44+
diags.Append(tmpDiags...)
45+
} else {
46+
m.Permissions = types.ObjectNull(UserPermissions{}.GetType().AttributeTypes())
47+
}
48+
}
49+
50+
func (m *UserResource) ToCreateRequest(ctx context.Context, diags *diag.Diagnostics) *nginxproxymanager.CreateUserRequest {
51+
request := nginxproxymanager.NewCreateUserRequest(
52+
m.Name.ValueString(),
53+
m.Nickname.ValueString(),
54+
m.Email.ValueString(),
55+
)
56+
57+
request.SetIsDisabled(m.IsDisabled.ValueBool())
58+
if m.IsAdmin.ValueBool() {
59+
request.SetRoles([]string{"admin"})
60+
} else {
61+
request.SetRoles([]string{})
62+
}
63+
64+
return request
65+
}
66+
67+
func (m *UserResource) ToUpdateRequest(ctx context.Context, diags *diag.Diagnostics) *nginxproxymanager.UpdateUserRequest {
68+
request := nginxproxymanager.NewUpdateUserRequest()
69+
request.SetName(m.Name.ValueString())
70+
request.SetNickname(m.Nickname.ValueString())
71+
request.SetEmail(m.Email.ValueString())
72+
request.SetIsDisabled(m.IsDisabled.ValueBool())
73+
if m.IsAdmin.ValueBool() {
74+
request.SetRoles([]string{"admin"})
75+
} else {
76+
request.SetRoles([]string{})
77+
}
78+
79+
return request
80+
}

internal/provider/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ func (p *NginxProxyManagerProvider) Resources(ctx context.Context) []func() reso
187187
NewRedirectionHostResource,
188188
NewSettingsResource,
189189
NewStreamResource,
190+
NewUserResource,
190191
}
191192
}
192193

0 commit comments

Comments
 (0)