From 92d8556df029907f4c2dc63f1da2fae7a16341fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorben=20G=C3=BCnther?= Date: Fri, 9 Jul 2021 12:42:06 +0200 Subject: [PATCH] Implement create for domain resource --- mailman/domain.go | 7 ++++ mailman/mailman_client.go | 49 +++++++++++++++++----- provider/provider.go | 4 +- provider/resource_mailman_domain.go | 63 +++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 10 deletions(-) diff --git a/mailman/domain.go b/mailman/domain.go index 311826c..468006b 100644 --- a/mailman/domain.go +++ b/mailman/domain.go @@ -17,3 +17,10 @@ func (client *Client) GetDomain(mailHost string) (*Domain, error) { return domain, nil } + +func (client *Client) NewDomain(domain *Domain) error { + + err := client.post("/domains", domain) + + return err +} diff --git a/mailman/mailman_client.go b/mailman/mailman_client.go index 3014ab1..1db07d0 100644 --- a/mailman/mailman_client.go +++ b/mailman/mailman_client.go @@ -1,6 +1,7 @@ package mailman import ( + "bytes" "encoding/json" "fmt" "io/ioutil" @@ -46,26 +47,56 @@ func (client *Client) get(path string, resource interface{}) error { return nil } - req.SetBasicAuth(client.credentials.Username, client.credentials.Password) - resp, err := client.httpClient.Do(req) + responseBody, err := client.sendRequest(req) if err != nil { return err } - defer resp.Body.Close() - if resp.StatusCode > 400 { - return fmt.Errorf("API error code: %d", resp.StatusCode) + err = json.Unmarshal(responseBody, &resource) + if err != nil { + return err } - responseBody, err := ioutil.ReadAll(resp.Body) + return nil +} + +func (client *Client) post(path string, requestBody interface{}) error { + resourceURL := client.baseURL + path + + payload, err := json.Marshal(requestBody) if err != nil { return err } - err = json.Unmarshal(responseBody, &resource) + req, err := http.NewRequest(http.MethodPost, resourceURL, bytes.NewBuffer(payload)) if err != nil { - return err + return nil } - return nil + req.Header.Add("Content-Type", "application/json") + + _, err = client.sendRequest(req) + + return err +} + +func (client *Client) sendRequest(req *http.Request) ([]byte, error) { + req.SetBasicAuth(client.credentials.Username, client.credentials.Password) + + resp, err := client.httpClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode > 400 { + return nil, fmt.Errorf("API error code: %d", resp.StatusCode) + } + + responseBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return responseBody, nil } diff --git a/provider/provider.go b/provider/provider.go index a3585a9..4a3e3eb 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -29,7 +29,9 @@ func MailmanProvider() *schema.Provider { DefaultFunc: schema.EnvDefaultFunc("MAILMAN_URL", nil), }, }, - ResourcesMap: map[string]*schema.Resource{}, + ResourcesMap: map[string]*schema.Resource{ + "mailman_domain": resourceMailmanDomain(), + }, DataSourcesMap: map[string]*schema.Resource{ "mailman_domain": dataSourceMailmanDomain(), }, diff --git a/provider/resource_mailman_domain.go b/provider/resource_mailman_domain.go index 2a16f0f..b184481 100644 --- a/provider/resource_mailman_domain.go +++ b/provider/resource_mailman_domain.go @@ -5,6 +5,69 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) +func resourceMailmanDomain() *schema.Resource { + return &schema.Resource{ + Create: resourceMailmanDomainCreate, + Read: resourceMailmanDomainRead, + Update: resourceMailmanDomainUpdate, + Delete: resourceMailmanDomainDelete, + Schema: map[string]*schema.Schema{ + "mail_host": { + Type: schema.TypeString, + Required: true, + }, + "alias_domain": { + Type: schema.TypeString, + Optional: true, + }, + "description": { + Type: schema.TypeString, + Optional: true, + }, + }, + } +} + +func resourceMailmanDomainCreate(data *schema.ResourceData, meta interface{}) error { + client := meta.(*mailman.Client) + + domain := &mailman.Domain{ + MailHost: data.Get("mail_host").(string), + AliasDomain: data.Get("alias_domain").(string), + Description: data.Get("description").(string), + } + + err := client.NewDomain(domain) + if err != nil { + return err + } + + setDomainData(data, domain) + + return resourceMailmanDomainRead(data, meta) +} + +func resourceMailmanDomainRead(data *schema.ResourceData, meta interface{}) error { + client := meta.(*mailman.Client) + + domain, err := client.GetDomain(data.Id()) + if err != nil { + return err + } + + setDomainData(data, domain) + + return nil +} + +func resourceMailmanDomainUpdate(data *schema.ResourceData, meta interface{}) error { + return nil +} + +func resourceMailmanDomainDelete(data *schema.ResourceData, meta interface{}) error { + return nil +} + func setDomainData(data *schema.ResourceData, domain *mailman.Domain) { data.SetId(domain.MailHost) -- 2.44.0