Skip to content

Commit 5806dbd

Browse files
committed
Create user token ephemeral resource
1 parent 1dde5ac commit 5806dbd

File tree

6 files changed

+130
-1
lines changed

6 files changed

+130
-1
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "nginxproxymanager_user_token Ephemeral Resource - nginxproxymanager"
4+
subcategory: "Users"
5+
description: |-
6+
This ephemeral resource can be used to retrieve an ephemeral token for the current user.
7+
---
8+
9+
# nginxproxymanager_user_token (Ephemeral Resource)
10+
11+
This ephemeral resource can be used to retrieve an ephemeral token for the current user.
12+
13+
14+
## Example Usage
15+
16+
```terraform
17+
ephemeral "nginxproxymanager_user_token" "token" {}
18+
```
19+
20+
<!-- schema generated by tfplugindocs -->
21+
## Schema
22+
23+
### Read-Only
24+
25+
- `token` (String, Sensitive) The token for the current user.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ephemeral "nginxproxymanager_user_token" "token" {}

internal/provider/helpers.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"fmt"
99
"github.com/hashicorp/terraform-plugin-framework/datasource"
10+
"github.com/hashicorp/terraform-plugin-framework/ephemeral"
1011
"github.com/hashicorp/terraform-plugin-framework/resource"
1112
"github.com/sander0542/nginxproxymanager-go"
1213
)
@@ -48,3 +49,22 @@ func dataSourceConfigure(_ context.Context, req datasource.ConfigureRequest, res
4849

4950
return providerData.Auth, providerData.Client
5051
}
52+
53+
func ephemeralResourceConfigure(_ context.Context, req ephemeral.ConfigureRequest, resp *ephemeral.ConfigureResponse) (context.Context, *nginxproxymanager.APIClient) {
54+
// Prevent panic if the provider has not been configured.
55+
if req.ProviderData == nil {
56+
return nil, nil
57+
}
58+
59+
providerData, ok := req.ProviderData.(*NginxProxyManagerProviderData)
60+
if !ok {
61+
resp.Diagnostics.AddError(
62+
"Unexpected Ephemeral Resource Configure Type",
63+
fmt.Sprintf("Expected *NginxProxyManagerProviderData, got: %T. Please report this issue to the provider developers.", req.ProviderData),
64+
)
65+
66+
return nil, nil
67+
}
68+
69+
return providerData.Auth, providerData.Client
70+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright (c) Sander Jochems
2+
// SPDX-License-Identifier: MIT
3+
4+
package models
5+
6+
import "github.com/hashicorp/terraform-plugin-framework/types"
7+
8+
type UserToken struct {
9+
Token types.String `tfsdk:"token"`
10+
}

internal/provider/provider.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ func (p *NginxProxyManagerProvider) Configure(ctx context.Context, req provider.
172172

173173
resp.DataSourceData = &providerData
174174
resp.ResourceData = &providerData
175+
resp.EphemeralResourceData = &providerData
175176

176177
tflog.Info(ctx, "Successfully initialized the Nginx Proxy Manager API client")
177178
}
@@ -190,7 +191,9 @@ func (p *NginxProxyManagerProvider) Resources(ctx context.Context) []func() reso
190191
}
191192

192193
func (p *NginxProxyManagerProvider) EphemeralResources(ctx context.Context) []func() ephemeral.EphemeralResource {
193-
return []func() ephemeral.EphemeralResource{}
194+
return []func() ephemeral.EphemeralResource{
195+
NewUserTokenEphemeralResource,
196+
}
194197
}
195198

196199
func (p *NginxProxyManagerProvider) DataSources(ctx context.Context) []func() datasource.DataSource {
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (c) Sander Jochems
2+
// SPDX-License-Identifier: MIT
3+
4+
package provider
5+
6+
import (
7+
"context"
8+
"github.com/sander0542/nginxproxymanager-go"
9+
"github.com/sander0542/terraform-provider-nginxproxymanager/internal/provider/models"
10+
11+
"github.com/hashicorp/terraform-plugin-framework/ephemeral"
12+
"github.com/hashicorp/terraform-plugin-framework/ephemeral/schema"
13+
"github.com/hashicorp/terraform-plugin-framework/types"
14+
)
15+
16+
var _ ephemeral.EphemeralResource = &UserTokenEphemeralResource{}
17+
var _ ephemeral.EphemeralResourceWithConfigure = &UserTokenEphemeralResource{}
18+
19+
func NewUserTokenEphemeralResource() ephemeral.EphemeralResource {
20+
return &UserTokenEphemeralResource{}
21+
}
22+
23+
type UserTokenEphemeralResource struct {
24+
client *nginxproxymanager.APIClient
25+
auth context.Context
26+
}
27+
28+
func (r *UserTokenEphemeralResource) Metadata(_ context.Context, req ephemeral.MetadataRequest, resp *ephemeral.MetadataResponse) {
29+
resp.TypeName = req.ProviderTypeName + "_user_token"
30+
}
31+
32+
func (r *UserTokenEphemeralResource) Schema(ctx context.Context, _ ephemeral.SchemaRequest, resp *ephemeral.SchemaResponse) {
33+
resp.Schema = schema.Schema{
34+
MarkdownDescription: "Users --- This ephemeral resource can be used to retrieve an ephemeral token for the current user.",
35+
Attributes: map[string]schema.Attribute{
36+
"token": schema.StringAttribute{
37+
Computed: true,
38+
Sensitive: true,
39+
MarkdownDescription: "The token for the current user.",
40+
},
41+
},
42+
}
43+
}
44+
45+
func (r *UserTokenEphemeralResource) Configure(ctx context.Context, req ephemeral.ConfigureRequest, resp *ephemeral.ConfigureResponse) {
46+
if auth, client := ephemeralResourceConfigure(ctx, req, resp); client != nil {
47+
r.client = client
48+
r.auth = auth
49+
}
50+
}
51+
52+
func (r *UserTokenEphemeralResource) Open(ctx context.Context, req ephemeral.OpenRequest, resp *ephemeral.OpenResponse) {
53+
var data *models.UserToken
54+
55+
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
56+
57+
if resp.Diagnostics.HasError() {
58+
return
59+
}
60+
61+
token, ok := r.auth.Value(nginxproxymanager.ContextAccessToken).(string)
62+
63+
if !ok {
64+
resp.Diagnostics.AddError("Client Error", "Unable to read token")
65+
}
66+
67+
data.Token = types.StringValue(token)
68+
69+
resp.Diagnostics.Append(resp.Result.Set(ctx, &data)...)
70+
}

0 commit comments

Comments
 (0)