alexkappa/terraform-provider-auth0

View on GitHub
auth0/resource_auth0_email_template.go

Summary

Maintainability
A
1 hr
Test Coverage
B
80%
package auth0

import (
    "log"
    "net/http"

    "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
    "github.com/hashicorp/terraform-plugin-sdk/helper/validation"

    "gopkg.in/auth0.v5"
    "gopkg.in/auth0.v5/management"
)

func newEmailTemplate() *schema.Resource {
    return &schema.Resource{

        Create: createEmailTemplate,
        Read:   readEmailTemplate,
        Update: updateEmailTemplate,
        Delete: deleteEmailTemplate,
        Importer: &schema.ResourceImporter{
            State: schema.ImportStatePassthrough,
        },

        Schema: map[string]*schema.Schema{
            "template": {
                Type:     schema.TypeString,
                Required: true,
                ValidateFunc: validation.StringInSlice([]string{
                    "verify_email",
                    "verify_email_by_code",
                    "reset_email",
                    "welcome_email",
                    "blocked_account",
                    "stolen_credentials",
                    "enrollment_email",
                    "change_password",
                    "password_reset",
                    "mfa_oob_code",
                    "user_invitation",
                }, true),
            },
            "body": {
                Type:     schema.TypeString,
                Required: true,
            },
            "from": {
                Type:     schema.TypeString,
                Required: true,
            },
            "result_url": {
                Type:     schema.TypeString,
                Optional: true,
            },
            "subject": {
                Type:     schema.TypeString,
                Required: true,
            },
            "syntax": {
                Type:     schema.TypeString,
                Required: true,
            },
            "url_lifetime_in_seconds": {
                Type:     schema.TypeInt,
                Optional: true,
            },
            "enabled": {
                Type:     schema.TypeBool,
                Required: true,
            },
        },
    }
}

func createEmailTemplate(d *schema.ResourceData, m interface{}) error {
    e := buildEmailTemplate(d)
    api := m.(*management.Management)

    // The email template resource doesn't allow deleting templates, so in order
    // to avoid conflicts, we first attempt to read the template. If it exists
    // we'll try to update it, if not we'll try to create it.
    if _, err := api.EmailTemplate.Read(auth0.StringValue(e.Template)); err == nil {

        // We succeeded in reading the template, this means it was created
        // previously.
        if err := api.EmailTemplate.Update(auth0.StringValue(e.Template), e); err != nil {
            return err
        }
        d.SetId(auth0.StringValue(e.Template))
        return nil
    }

    // If we reached this point the template doesn't exist. Therefore it is safe
    // to create it.
    if err := api.EmailTemplate.Create(e); err != nil {
        return err
    }
    d.SetId(auth0.StringValue(e.Template))

    return nil
}

func readEmailTemplate(d *schema.ResourceData, m interface{}) error {
    api := m.(*management.Management)
    e, err := api.EmailTemplate.Read(d.Id())
    if err != nil {
        if mErr, ok := err.(management.Error); ok {
            if mErr.Status() == http.StatusNotFound {
                d.SetId("")
                return nil
            }
        }
        return err
    }
    d.SetId(auth0.StringValue(e.Template))
    d.Set("template", e.Template)
    d.Set("body", e.Body)
    d.Set("from", e.From)
    d.Set("result_url", e.ResultURL)
    d.Set("subject", e.Subject)
    d.Set("syntax", e.Syntax)
    d.Set("url_lifetime_in_seconds", e.URLLifetimeInSecoonds)
    d.Set("enabled", e.Enabled)
    return nil
}

func updateEmailTemplate(d *schema.ResourceData, m interface{}) error {
    e := buildEmailTemplate(d)
    api := m.(*management.Management)
    err := api.EmailTemplate.Update(d.Id(), e)
    if err != nil {
        return err
    }
    return readEmailTemplate(d, m)
}

func deleteEmailTemplate(d *schema.ResourceData, m interface{}) error {
    api := m.(*management.Management)
    t := &management.EmailTemplate{
        Template: auth0.String(d.Id()),
        Enabled:  auth0.Bool(false),
    }
    err := api.EmailTemplate.Update(d.Id(), t)
    if err != nil {
        if mErr, ok := err.(management.Error); ok {
            if mErr.Status() == http.StatusNotFound {
                d.SetId("")
                return nil
            }
        }
    }
    return err
}

func buildEmailTemplate(d *schema.ResourceData) *management.EmailTemplate {
    t := &management.EmailTemplate{
        Template:              String(d, "template"),
        Body:                  String(d, "body"),
        From:                  String(d, "from"),
        ResultURL:             String(d, "result_url"),
        Subject:               String(d, "subject"),
        Syntax:                String(d, "syntax"),
        URLLifetimeInSecoonds: Int(d, "url_lifetime_in_seconds"),
        Enabled:               Bool(d, "enabled"),
    }
    log.Printf("[DEBUG] Template: %s", t)
    return t
}