github.com/webonyx/up@v0.7.4-0.20180808230834-91b94e551323/platform/aws/domains/domains.go (about)

     1  // Package domains provides domain management for AWS platforms.
     2  package domains
     3  
     4  import (
     5  	"github.com/aws/aws-sdk-go/aws"
     6  	"github.com/aws/aws-sdk-go/aws/session"
     7  	r "github.com/aws/aws-sdk-go/service/route53domains"
     8  
     9  	"github.com/apex/up"
    10  )
    11  
    12  // Domains implementation.
    13  type Domains struct {
    14  	client *r.Route53Domains
    15  }
    16  
    17  // New returns a new domain manager.
    18  func New() *Domains {
    19  	return &Domains{
    20  		client: r.New(session.New(aws.NewConfig().WithRegion("us-east-1"))),
    21  	}
    22  }
    23  
    24  // List implementation.
    25  func (d *Domains) List() (v []*up.Domain, err error) {
    26  	res, err := d.client.ListDomains(&r.ListDomainsInput{
    27  		MaxItems: aws.Int64(100),
    28  	})
    29  
    30  	if err != nil {
    31  		return
    32  	}
    33  
    34  	for _, d := range res.Domains {
    35  		v = append(v, &up.Domain{
    36  			Name:      *d.DomainName,
    37  			Expiry:    *d.Expiry,
    38  			AutoRenew: *d.AutoRenew,
    39  		})
    40  	}
    41  
    42  	return
    43  }
    44  
    45  // Availability implementation.
    46  func (d *Domains) Availability(domain string) (*up.Domain, error) {
    47  	res, err := d.client.CheckDomainAvailability(&r.CheckDomainAvailabilityInput{
    48  		DomainName: &domain,
    49  	})
    50  
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  
    55  	if *res.Availability == "AVAILABLE" {
    56  		return &up.Domain{
    57  			Name:      domain,
    58  			Available: true,
    59  		}, nil
    60  	}
    61  
    62  	return &up.Domain{
    63  		Name:      domain,
    64  		Available: false,
    65  	}, nil
    66  }
    67  
    68  // Suggestions implementation.
    69  func (d *Domains) Suggestions(domain string) (domains []*up.Domain, err error) {
    70  	res, err := d.client.GetDomainSuggestions(&r.GetDomainSuggestionsInput{
    71  		DomainName:      &domain,
    72  		OnlyAvailable:   aws.Bool(true),
    73  		SuggestionCount: aws.Int64(15),
    74  	})
    75  
    76  	if err != nil {
    77  		return
    78  	}
    79  
    80  	for _, s := range res.SuggestionsList {
    81  		domains = append(domains, &up.Domain{
    82  			Name:      *s.DomainName,
    83  			Available: true,
    84  		})
    85  	}
    86  
    87  	return
    88  }
    89  
    90  // Purchase implementation.
    91  func (d *Domains) Purchase(domain string, contact up.DomainContact) error {
    92  	_, err := d.client.RegisterDomain(&r.RegisterDomainInput{
    93  		DomainName:        &domain,
    94  		AutoRenew:         aws.Bool(true),
    95  		DurationInYears:   aws.Int64(1),
    96  		RegistrantContact: contactDetails(contact),
    97  		AdminContact:      contactDetails(contact),
    98  		TechContact:       contactDetails(contact),
    99  	})
   100  
   101  	return err
   102  }
   103  
   104  // contactDetails returns route53 contact details.
   105  func contactDetails(c up.DomainContact) *r.ContactDetail {
   106  	return &r.ContactDetail{
   107  		AddressLine1: aws.String(c.Address),
   108  		City:         aws.String(c.City),
   109  		State:        aws.String(c.State),
   110  		ZipCode:      aws.String(c.ZipCode),
   111  		CountryCode:  aws.String(c.CountryCode),
   112  		Email:        aws.String(c.Email),
   113  		PhoneNumber:  aws.String(c.PhoneNumber),
   114  		FirstName:    aws.String(c.FirstName),
   115  		LastName:     aws.String(c.LastName),
   116  		ContactType:  aws.String("PERSON"),
   117  	}
   118  }