@@ -2,7 +2,10 @@ package provider
2
2
3
3
import (
4
4
"context"
5
+ "errors"
5
6
"fmt"
7
+ "regexp"
8
+
6
9
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7
10
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8
11
"github.com/redpwn/terraform-provider-rctf/internal/rctf"
@@ -20,9 +23,7 @@ func resourceChallenge() *schema.Resource {
20
23
Schema : map [string ]* schema.Schema {
21
24
"id" : {
22
25
Type : schema .TypeString ,
23
- Optional : true ,
24
26
Computed : true ,
25
- ForceNew : true ,
26
27
},
27
28
"name" : {
28
29
Type : schema .TypeString ,
@@ -82,9 +83,10 @@ func resourceChallenge() *schema.Resource {
82
83
}
83
84
}
84
85
85
- func resourceChallengePut (ctx context.Context , d * schema.ResourceData , m interface {}) diag.Diagnostics {
86
+ var idReg = regexp .MustCompile (`[^\w-]+` )
87
+
88
+ func resourceChallengePut (ctx context.Context , d * schema.ResourceData , m interface {}) (diags diag.Diagnostics ) {
86
89
r := m .(* rctf.Client )
87
- var diags diag.Diagnostics
88
90
c := rctf.Challenge {
89
91
Name : d .Get ("name" ).(string ),
90
92
Description : d .Get ("description" ).(string ),
@@ -108,80 +110,54 @@ func resourceChallengePut(ctx context.Context, d *schema.ResourceData, m interfa
108
110
}
109
111
c .Id = d .Id ()
110
112
if c .Id == "" {
111
- c .Id = d .Get ("id" ).(string )
112
- }
113
- if c .Id == "" {
114
- c .Id = fmt .Sprintf ("%s-%s" , c .Category , c .Name )
113
+ c .Id = idReg .ReplaceAllString (fmt .Sprintf ("%s-%s" , c .Category , c .Name ), "-" )
114
+ d .SetId (c .Id )
115
+ d .Set ("id" , c .Id )
115
116
}
116
- d .SetId (c .Id )
117
117
if err := r .PutChallenge (ctx , c ); err != nil {
118
118
return diag .Errorf ("put challenge: %s" , err )
119
119
}
120
- diags = append (diags , resourceChallengeRead (ctx , d , m )... )
121
120
return diags
122
121
}
123
122
124
- func flattenFiles (files []rctf.ChallengeFile ) []map [string ]interface {} {
125
- var f []map [string ]interface {}
126
- for _ , file := range files {
127
- f = append (f , map [string ]interface {}{
128
- "name" : file .Name ,
129
- "url" : file .Url ,
130
- })
131
- }
132
- return f
133
- }
134
-
135
- func resourceChallengeRead (ctx context.Context , d * schema.ResourceData , m interface {}) diag.Diagnostics {
123
+ func resourceChallengeRead (ctx context.Context , d * schema.ResourceData , m interface {}) (diags diag.Diagnostics ) {
136
124
r := m .(* rctf.Client )
137
- var diags diag.Diagnostics
138
125
id := d .Id ()
139
126
c , err := r .Challenge (ctx , id )
140
127
if err != nil {
128
+ rctfErr := & rctf.Error {}
129
+ if errors .As (err , rctfErr ) && rctfErr .Kind == "badChallenge" {
130
+ d .SetId ("" )
131
+ return
132
+ }
141
133
return diag .Errorf ("get challenge: %s" , err )
142
134
}
143
- if err := d .Set ("id" , c .Id ); err != nil {
144
- return diag .FromErr (err )
145
- }
146
- if err := d .Set ("name" , c .Name ); err != nil {
147
- return diag .FromErr (err )
148
- }
149
- if err := d .Set ("description" , c .Description ); err != nil {
150
- return diag .FromErr (err )
151
- }
152
- if err := d .Set ("category" , c .Category ); err != nil {
153
- return diag .FromErr (err )
154
- }
155
- if err := d .Set ("author" , c .Author ); err != nil {
156
- return diag .FromErr (err )
157
- }
158
- if err := d .Set ("file" , flattenFiles (c .Files )); err != nil {
159
- return diag .FromErr (err )
160
- }
161
- if err := d .Set ("min_points" , c .Points .Min ); err != nil {
162
- return diag .FromErr (err )
163
- }
164
- if err := d .Set ("max_points" , c .Points .Max ); err != nil {
165
- return diag .FromErr (err )
166
- }
167
- if err := d .Set ("flag" , c .Flag ); err != nil {
168
- return diag .FromErr (err )
169
- }
170
- if err := d .Set ("tiebreak_eligible" , c .TiebreakEligible ); err != nil {
171
- return diag .FromErr (err )
172
- }
173
- if err := d .Set ("sort_weight" , c .SortWeight ); err != nil {
174
- return diag .FromErr (err )
135
+ d .Set ("id" , c .Id )
136
+ d .Set ("name" , c .Name )
137
+ d .Set ("description" , c .Description )
138
+ d .Set ("category" , c .Category )
139
+ d .Set ("author" , c .Author )
140
+ var f []map [string ]interface {}
141
+ for _ , file := range c .Files {
142
+ f = append (f , map [string ]interface {}{
143
+ "name" : file .Name ,
144
+ "url" : file .Url ,
145
+ })
175
146
}
176
- return diags
147
+ d .Set ("file" , f )
148
+ d .Set ("min_points" , c .Points .Min )
149
+ d .Set ("max_points" , c .Points .Max )
150
+ d .Set ("flag" , c .Flag )
151
+ d .Set ("tiebreak_eligible" , c .TiebreakEligible )
152
+ d .Set ("sort_weight" , c .SortWeight )
153
+ return
177
154
}
178
155
179
- func resourceChallengeDelete (ctx context.Context , d * schema.ResourceData , m interface {}) diag.Diagnostics {
156
+ func resourceChallengeDelete (ctx context.Context , d * schema.ResourceData , m interface {}) ( diags diag.Diagnostics ) {
180
157
r := m .(* rctf.Client )
181
- var diags diag.Diagnostics
182
158
id := d .Id ()
183
159
if err := r .DeleteChallenge (ctx , id ); err != nil {
184
160
return diag .Errorf ("delete challenge: %s" , err )
185
161
}
186
- return diags
162
+ return
187
163
}
0 commit comments