seagull-js/seagull

View on GitHub
packages/deploy-aws/src/aws_sdk_handler/handle_acm.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { ACM, config } from 'aws-sdk'

import { findAliasConfig } from '../lib'

export async function checkForAliasConfig(pkgJson: any, handler: ACMHandler) {
  const domains: string[] = pkgJson.seagull && pkgJson.seagull.domains
  const needAliases = domains && domains.length > 0
  return needAliases ? await getAliasConfig(domains, handler) : undefined
}

async function getAliasConfig(domains: string[], handler: ACMHandler) {
  const arns = await handler.listCertificates()
  const getArnDomains = async (arn: string) => getCertDomains(arn, handler)
  const arnsWithSchemata = await Promise.all(arns.map(getArnDomains))
  return findAliasConfig(arnsWithSchemata, domains)
}

async function getCertDomains(acmCertRef: string, handler: ACMHandler) {
  return { acmCertRef, names: await handler.describeCertificate(acmCertRef) }
}

export class ACMHandler {
  private acm: ACM

  constructor() {
    const credentials = config.credentials
    this.acm = new ACM({ credentials, region: 'us-east-1' })
  }

  async listCertificates() {
    const params = { CertificateStatuses: ['ISSUED'] }
    const response = await this.acm.listCertificates(params).promise()
    const certSumList = (response && response.CertificateSummaryList) || []
    const arns = certSumList.map(certSum => certSum && certSum.CertificateArn)
    return arns.filter(arn => arn !== undefined) as string[]
  }

  async describeCertificate(acmCertRef: string) {
    const params = { CertificateArn: acmCertRef }
    const description = await this.acm.describeCertificate(params).promise()
    const cert = description.Certificate
    return (cert && cert.SubjectAlternativeNames) || []
  }
}