@@ -2,7 +2,10 @@ package provider
22
33import (
44 "context"
5+ "errors"
56 "fmt"
7+ "regexp"
8+
69 "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
710 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
811 "github.com/redpwn/terraform-provider-rctf/internal/rctf"
@@ -20,9 +23,7 @@ func resourceChallenge() *schema.Resource {
2023 Schema : map [string ]* schema.Schema {
2124 "id" : {
2225 Type : schema .TypeString ,
23- Optional : true ,
2426 Computed : true ,
25- ForceNew : true ,
2627 },
2728 "name" : {
2829 Type : schema .TypeString ,
@@ -82,9 +83,10 @@ func resourceChallenge() *schema.Resource {
8283 }
8384}
8485
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 ) {
8689 r := m .(* rctf.Client )
87- var diags diag.Diagnostics
8890 c := rctf.Challenge {
8991 Name : d .Get ("name" ).(string ),
9092 Description : d .Get ("description" ).(string ),
@@ -108,80 +110,54 @@ func resourceChallengePut(ctx context.Context, d *schema.ResourceData, m interfa
108110 }
109111 c .Id = d .Id ()
110112 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 )
115116 }
116- d .SetId (c .Id )
117117 if err := r .PutChallenge (ctx , c ); err != nil {
118118 return diag .Errorf ("put challenge: %s" , err )
119119 }
120- diags = append (diags , resourceChallengeRead (ctx , d , m )... )
121120 return diags
122121}
123122
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 ) {
136124 r := m .(* rctf.Client )
137- var diags diag.Diagnostics
138125 id := d .Id ()
139126 c , err := r .Challenge (ctx , id )
140127 if err != nil {
128+ rctfErr := & rctf.Error {}
129+ if errors .As (err , rctfErr ) && rctfErr .Kind == "badChallenge" {
130+ d .SetId ("" )
131+ return
132+ }
141133 return diag .Errorf ("get challenge: %s" , err )
142134 }
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+ })
175146 }
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
177154}
178155
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 ) {
180157 r := m .(* rctf.Client )
181- var diags diag.Diagnostics
182158 id := d .Id ()
183159 if err := r .DeleteChallenge (ctx , id ); err != nil {
184160 return diag .Errorf ("delete challenge: %s" , err )
185161 }
186- return diags
162+ return
187163}
0 commit comments