diff --git a/.changelog/3742.txt b/.changelog/3742.txt new file mode 100644 index 00000000000..0395042d07d --- /dev/null +++ b/.changelog/3742.txt @@ -0,0 +1,3 @@ +```release-note:bug +certificate_authorities: fixes for methods to interact with Certificate Authorities Hostname Associations API +``` \ No newline at end of file diff --git a/certificate_authorities.go b/certificate_authorities.go index b9cffb2ab61..80ba39c877f 100644 --- a/certificate_authorities.go +++ b/certificate_authorities.go @@ -17,9 +17,18 @@ type UpdateCertificateAuthoritiesHostnameAssociationsParams struct { MTLSCertificateID string `json:"mtls_certificate_id,omitempty"` } +type HostnameAssociationsUpdateRequest struct { + Hostnames []HostnameAssociation `json:"hostnames,omitempty"` + MTLSCertificateID string `json:"mtls_certificate_id,omitempty"` +} + type HostnameAssociationsResponse struct { Response - Result []HostnameAssociation `json:"result"` + Result HostnameAssociations `json:"result"` +} + +type HostnameAssociations struct { + Hostnames []HostnameAssociation `json:"hostnames"` } type HostnameAssociation = string @@ -28,12 +37,11 @@ type HostnameAssociation = string // // API Reference: https://developers.cloudflare.com/api/resources/certificate_authorities/subresources/hostname_associations/methods/get/ func (api *API) ListCertificateAuthoritiesHostnameAssociations(ctx context.Context, rc *ResourceContainer, params ListCertificateAuthoritiesHostnameAssociationsParams) ([]HostnameAssociation, error) { + if rc.Level != ZoneRouteLevel { + return []HostnameAssociation{}, ErrRequiredZoneLevelResourceContainer + } - uri := fmt.Sprintf( - "/%s/%s/certificate_authorities/hostname_associations", - rc.Level, - rc.Identifier, - ) + uri := buildURI(fmt.Sprintf("/zones/%s/certificate_authorities/hostname_associations", rc.Identifier), params) res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil) if err != nil { @@ -46,18 +54,18 @@ func (api *API) ListCertificateAuthoritiesHostnameAssociations(ctx context.Conte return []HostnameAssociation{}, fmt.Errorf("%s: %w", errUnmarshalError, err) } - return hostnameAssociationsResponse.Result, nil + return hostnameAssociationsResponse.Result.Hostnames, nil } // Replace Hostname Associations // // API Reference: https://developers.cloudflare.com/api/resources/certificate_authorities/subresources/hostname_associations/methods/update/ func (api *API) UpdateCertificateAuthoritiesHostnameAssociations(ctx context.Context, rc *ResourceContainer, params UpdateCertificateAuthoritiesHostnameAssociationsParams) ([]HostnameAssociation, error) { - uri := fmt.Sprintf( - "/%s/%s/certificate_authorities/hostname_associations", - rc.Level, - rc.Identifier, - ) + if rc.Level != ZoneRouteLevel { + return []HostnameAssociation{}, ErrRequiredZoneLevelResourceContainer + } + + uri := fmt.Sprintf("/zones/%s/certificate_authorities/hostname_associations", rc.Identifier) res, err := api.makeRequestContext(ctx, http.MethodPut, uri, params) if err != nil { @@ -70,5 +78,5 @@ func (api *API) UpdateCertificateAuthoritiesHostnameAssociations(ctx context.Con return []HostnameAssociation{}, fmt.Errorf("%s: %w", errUnmarshalError, err) } - return hostnameAssociationsResponse.Result, nil + return hostnameAssociationsResponse.Result.Hostnames, nil } diff --git a/certificate_authorities_test.go b/certificate_authorities_test.go index 940524a5b7b..cba5c57f7a2 100644 --- a/certificate_authorities_test.go +++ b/certificate_authorities_test.go @@ -6,6 +6,7 @@ import ( "net/http" "testing" + "github.com/goccy/go-json" "github.com/stretchr/testify/assert" ) @@ -15,15 +16,18 @@ func TestListCertificateAuthoritiesHostnameAssociations(t *testing.T) { handler := func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + assert.Equal(t, "72ef4d06-4752-4493-a60a-7421470fd585", r.URL.Query().Get("mtls_certificate_id")) w.Header().Set("content-type", "application/json") fmt.Fprintf(w, `{ "success": true, "errors": [], "messages": [], - "result": [ - "admin.example.com", - "foobar.example.com" - ] + "result": { + "hostnames": [ + "admin.example.com", + "foobar.example.com" + ] + } }`) } @@ -51,19 +55,32 @@ func TestUpdateCertificateAuthoritiesHostnameAssociations(t *testing.T) { handler := func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method) + + wantReqHostnames := []HostnameAssociation{ + "admin.example.com", + "foobar.example.com", + } + var req HostnameAssociationsUpdateRequest + assert.NoError(t, json.NewDecoder(r.Body).Decode(&req)) + assert.Equal(t, "72ef4d06-4752-4493-a60a-7421470fd585", req.MTLSCertificateID) + assert.Equal(t, wantReqHostnames, req.Hostnames) + w.Header().Set("content-type", "application/json") fmt.Fprintf(w, `{ "success": true, "errors": [], "messages": [], - "result": [ - "admin.example.com", - "foobar.example.com" - ] + "result": { + "hostnames": [ + "admin.example.com", + "foobar.example.com" + ] + } }`) } hostnameAssociations := UpdateCertificateAuthoritiesHostnameAssociationsParams{ + MTLSCertificateID: "72ef4d06-4752-4493-a60a-7421470fd585", Hostnames: []HostnameAssociation{ "admin.example.com", "foobar.example.com",