Skip to content

Commit 094bc6a

Browse files
committed
feat(domain): add helpers for expand contact
1 parent 40fc5fa commit 094bc6a

File tree

3 files changed

+443
-21
lines changed

3 files changed

+443
-21
lines changed

internal/services/domain/domain.go

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -150,22 +150,6 @@ func contactSchema() map[string]*schema.Schema {
150150
Type: schema.TypeBool,
151151
Optional: true,
152152
},
153-
"questions": {
154-
Type: schema.TypeList,
155-
Optional: true,
156-
Elem: &schema.Resource{
157-
Schema: map[string]*schema.Schema{
158-
"question": {
159-
Type: schema.TypeString,
160-
Required: true,
161-
},
162-
"answer": {
163-
Type: schema.TypeString,
164-
Required: true,
165-
},
166-
},
167-
},
168-
},
169153
"extension_fr": {
170154
Type: schema.TypeMap,
171155
Optional: true,
@@ -220,21 +204,21 @@ func resourceDomainCreate(ctx context.Context, d *schema.ResourceData, m interfa
220204

221205
buyDomainsRequest.OwnerContactID = &ownerContactID
222206
} else if ownerContact, ok := d.GetOk("owner_contact"); ok {
223-
buyDomainsRequest.OwnerContact = expandContact(ownerContact.(map[string]interface{}))
207+
buyDomainsRequest.OwnerContact = ExpandNewContact(ownerContact.(map[string]interface{}))
224208
}
225209

226210
adminContactID := d.Get("administrative_contact_id").(string)
227211
if adminContactID != "" {
228212
buyDomainsRequest.AdministrativeContactID = &adminContactID
229213
} else if adminContact, ok := d.GetOk("administrative_contact"); ok {
230-
buyDomainsRequest.AdministrativeContact = expandContact(adminContact.(map[string]interface{}))
214+
buyDomainsRequest.AdministrativeContact = ExpandNewContact(adminContact.(map[string]interface{}))
231215
}
232216

233217
techContactID := d.Get("technical_contact_id").(string)
234218
if adminContactID != "" {
235219
buyDomainsRequest.TechnicalContactID = &techContactID
236220
} else if techContact, ok := d.GetOk("technical_contact"); ok {
237-
buyDomainsRequest.TechnicalContact = expandContact(techContact.(map[string]interface{}))
221+
buyDomainsRequest.TechnicalContact = ExpandNewContact(techContact.(map[string]interface{}))
238222
}
239223

240224
resp, err := registrarAPI.BuyDomains(buyDomainsRequest, scw.WithContext(ctx))
@@ -248,8 +232,7 @@ func resourceDomainCreate(ctx context.Context, d *schema.ResourceData, m interfa
248232
}
249233

250234
func resourceDomainsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
251-
registrarAPI := NewRegistrarDomainAPI(m)
252-
235+
return nil
253236
}
254237

255238
func contactToMap(contact *domain.Contact) map[string]interface{} {

internal/services/domain/helpers.go

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@ import (
44
"errors"
55
"fmt"
66
"strings"
7+
"time"
78

89
domain "github.com/scaleway/scaleway-sdk-go/api/domain/v2beta1"
10+
"github.com/scaleway/scaleway-sdk-go/api/std"
11+
"github.com/scaleway/scaleway-sdk-go/scw"
912
"github.com/scaleway/terraform-provider-scaleway/v2/internal/meta"
1013
)
1114

@@ -46,3 +49,220 @@ func FindDefaultReverse(address string) string {
4649
}
4750
return strings.Join(parts, "-") + ".instances.scw.cloud"
4851
}
52+
53+
func ExpandContact(contactMap map[string]interface{}) *domain.Contact {
54+
if contactMap == nil {
55+
return nil
56+
}
57+
58+
contact := &domain.Contact{
59+
PhoneNumber: contactMap["phone_number"].(string),
60+
LegalForm: domain.ContactLegalForm(contactMap["legal_form"].(string)),
61+
Firstname: contactMap["firstname"].(string),
62+
Lastname: contactMap["lastname"].(string),
63+
Email: contactMap["email"].(string),
64+
AddressLine1: contactMap["address_line_1"].(string),
65+
Zip: contactMap["zip"].(string),
66+
City: contactMap["city"].(string),
67+
Country: contactMap["country"].(string),
68+
}
69+
70+
// Optional fields
71+
if v, ok := contactMap["company_name"].(string); ok && v != "" {
72+
contact.CompanyName = v
73+
}
74+
if v, ok := contactMap["email_alt"].(string); ok && v != "" {
75+
contact.EmailAlt = v
76+
}
77+
if v, ok := contactMap["fax_number"].(string); ok && v != "" {
78+
contact.FaxNumber = v
79+
}
80+
if v, ok := contactMap["address_line_2"].(string); ok && v != "" {
81+
contact.AddressLine2 = v
82+
}
83+
if v, ok := contactMap["vat_identification_code"].(string); ok && v != "" {
84+
contact.VatIDentificationCode = v
85+
}
86+
if v, ok := contactMap["company_identification_code"].(string); ok && v != "" {
87+
contact.CompanyIDentificationCode = v
88+
}
89+
if v, ok := contactMap["lang"].(string); ok && v != "" {
90+
contact.Lang = std.LanguageCode(v)
91+
}
92+
if v, ok := contactMap["resale"].(bool); ok {
93+
contact.Resale = v
94+
}
95+
if v, ok := contactMap["state"].(string); ok && v != "" {
96+
contact.State = v
97+
}
98+
if v, ok := contactMap["whois_opt_in"].(bool); ok {
99+
contact.WhoisOptIn = v
100+
}
101+
102+
if extFr, ok := contactMap["extension_fr"].(map[string]interface{}); ok && len(extFr) > 0 {
103+
contact.ExtensionFr = expandContactExtension(extFr, "fr").(*domain.ContactExtensionFR)
104+
}
105+
if extEu, ok := contactMap["extension_eu"].(map[string]interface{}); ok && len(extEu) > 0 {
106+
contact.ExtensionEu = expandContactExtension(extEu, "eu").(*domain.ContactExtensionEU)
107+
}
108+
if extNl, ok := contactMap["extension_nl"].(map[string]interface{}); ok && len(extNl) > 0 {
109+
contact.ExtensionNl = expandContactExtension(extNl, "nl").(*domain.ContactExtensionNL)
110+
}
111+
112+
return contact
113+
}
114+
115+
func expandContactExtension(extensionMap map[string]interface{}, extensionType string) interface{} {
116+
if extensionMap == nil || len(extensionMap) == 0 {
117+
return nil
118+
}
119+
120+
switch extensionType {
121+
case "fr":
122+
return &domain.ContactExtensionFR{
123+
Mode: parseEnum[domain.ContactExtensionFRMode](extensionMap, "mode", domain.ContactExtensionFRModeModeUnknown),
124+
IndividualInfo: parseStruct[domain.ContactExtensionFRIndividualInfo](extensionMap, "individual_info"),
125+
DunsInfo: parseStruct[domain.ContactExtensionFRDunsInfo](extensionMap, "duns_info"),
126+
AssociationInfo: parseStruct[domain.ContactExtensionFRAssociationInfo](extensionMap, "association_info"),
127+
TrademarkInfo: parseStruct[domain.ContactExtensionFRTrademarkInfo](extensionMap, "trademark_info"),
128+
CodeAuthAfnicInfo: parseStruct[domain.ContactExtensionFRCodeAuthAfnicInfo](extensionMap, "code_auth_afnic_info"),
129+
}
130+
case "nl":
131+
legalFormRegistrationNumber := ""
132+
if value, ok := extensionMap["legal_form_registration_number"]; ok {
133+
if str, isString := value.(string); isString {
134+
legalFormRegistrationNumber = str
135+
}
136+
}
137+
138+
return &domain.ContactExtensionNL{
139+
LegalForm: parseEnum[domain.ContactExtensionNLLegalForm](extensionMap, "legal_form", domain.ContactExtensionNLLegalFormLegalFormUnknown),
140+
LegalFormRegistrationNumber: legalFormRegistrationNumber,
141+
}
142+
case "eu":
143+
europeanCitizenship := ""
144+
if value, ok := extensionMap["european_citizenship"]; ok {
145+
if str, isString := value.(string); isString {
146+
europeanCitizenship = str
147+
}
148+
}
149+
return &domain.ContactExtensionEU{
150+
EuropeanCitizenship: europeanCitizenship,
151+
}
152+
default:
153+
return nil
154+
}
155+
}
156+
157+
func ExpandNewContact(contactMap map[string]interface{}) *domain.NewContact {
158+
if contactMap == nil {
159+
return nil
160+
}
161+
162+
contact := &domain.NewContact{
163+
PhoneNumber: contactMap["phone_number"].(string),
164+
LegalForm: domain.ContactLegalForm(contactMap["legal_form"].(string)),
165+
Firstname: contactMap["firstname"].(string),
166+
Lastname: contactMap["lastname"].(string),
167+
Email: contactMap["email"].(string),
168+
AddressLine1: contactMap["address_line_1"].(string),
169+
Zip: contactMap["zip"].(string),
170+
City: contactMap["city"].(string),
171+
Country: contactMap["country"].(string),
172+
}
173+
174+
if v, ok := contactMap["resale"].(bool); ok {
175+
contact.Resale = v
176+
} else {
177+
contact.Resale = false
178+
}
179+
180+
if v, ok := contactMap["whois_opt_in"].(bool); ok {
181+
contact.WhoisOptIn = v
182+
} else {
183+
contact.WhoisOptIn = false
184+
}
185+
186+
if v, ok := contactMap["company_name"].(string); ok {
187+
contact.CompanyName = scw.StringPtr(v)
188+
}
189+
if v, ok := contactMap["email_alt"].(string); ok {
190+
contact.EmailAlt = scw.StringPtr(v)
191+
}
192+
if v, ok := contactMap["fax_number"].(string); ok {
193+
contact.FaxNumber = scw.StringPtr(v)
194+
}
195+
if v, ok := contactMap["address_line_2"].(string); ok {
196+
contact.AddressLine2 = scw.StringPtr(v)
197+
}
198+
if v, ok := contactMap["vat_identification_code"].(string); ok {
199+
contact.VatIDentificationCode = scw.StringPtr(v)
200+
}
201+
if v, ok := contactMap["company_identification_code"].(string); ok {
202+
contact.CompanyIDentificationCode = scw.StringPtr(v)
203+
}
204+
if v, ok := contactMap["state"].(string); ok {
205+
contact.State = scw.StringPtr(v)
206+
}
207+
208+
if extFr, ok := contactMap["extension_fr"].(map[string]interface{}); ok {
209+
contact.ExtensionFr = expandContactExtension(extFr, "fr").(*domain.ContactExtensionFR)
210+
}
211+
if extEu, ok := contactMap["extension_eu"].(map[string]interface{}); ok {
212+
contact.ExtensionEu = expandContactExtension(extEu, "eu").(*domain.ContactExtensionEU)
213+
}
214+
if extNl, ok := contactMap["extension_nl"].(map[string]interface{}); ok {
215+
contact.ExtensionNl = expandContactExtension(extNl, "nl").(*domain.ContactExtensionNL)
216+
}
217+
218+
return contact
219+
}
220+
221+
func parseEnum[T ~string](data map[string]interface{}, key string, defaultValue T) T {
222+
if value, ok := data[key].(string); ok {
223+
return T(value)
224+
}
225+
return defaultValue
226+
}
227+
228+
func parseStruct[T any](data map[string]interface{}, key string) *T {
229+
if nested, ok := data[key].(map[string]interface{}); ok {
230+
var result T
231+
mapToStruct(nested, &result)
232+
return &result
233+
}
234+
return nil
235+
}
236+
237+
func mapToStruct(data map[string]interface{}, target interface{}) {
238+
switch t := target.(type) {
239+
case *domain.ContactExtensionFRIndividualInfo:
240+
if v, ok := data["whois_opt_in"].(bool); ok {
241+
t.WhoisOptIn = v
242+
}
243+
case *domain.ContactExtensionFRDunsInfo:
244+
if v, ok := data["duns_id"].(string); ok {
245+
t.DunsID = v
246+
}
247+
if v, ok := data["local_id"].(string); ok {
248+
t.LocalID = v
249+
}
250+
case *domain.ContactExtensionFRAssociationInfo:
251+
if v, ok := data["publication_jo"].(string); ok {
252+
if parsedTime, err := time.Parse(time.RFC3339, v); err == nil {
253+
t.PublicationJo = &parsedTime
254+
}
255+
}
256+
if v, ok := data["publication_jo_page"].(float64); ok {
257+
t.PublicationJoPage = uint32(v)
258+
}
259+
case *domain.ContactExtensionFRTrademarkInfo:
260+
if v, ok := data["trademark_inpi"].(string); ok {
261+
t.TrademarkInpi = v
262+
}
263+
case *domain.ContactExtensionFRCodeAuthAfnicInfo:
264+
if v, ok := data["code_auth_afnic"].(string); ok {
265+
t.CodeAuthAfnic = v
266+
}
267+
}
268+
}

0 commit comments

Comments
 (0)