Skip to content

Commit

Permalink
Throw an error when no domainName is configured
Browse files Browse the repository at this point in the history
  • Loading branch information
Andres Koetsier committed Aug 11, 2022
1 parent a251d8b commit 74c045e
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 12 deletions.
2 changes: 1 addition & 1 deletion packages/@aws-cdk/aws-appsync/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ const zone = route53.HostedZone.fromHostedZoneAttributes(this, `HostedZone`, {
new route53.CnameRecord(this, `CnameApiRecord`, {
recordName: 'api',
zone,
domainName: api.appSyncDomainName!,
domainName: api.appSyncDomainName,
});
```

Expand Down
24 changes: 14 additions & 10 deletions packages/@aws-cdk/aws-appsync/lib/graphqlapi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -470,13 +470,6 @@ export class GraphqlApi extends GraphqlApiBase {
*/
public readonly apiKey?: string;

/**
* the associated custom AppSync domain, if present
*
* @default - no custom associated domain
*/
public readonly appSyncDomainName?: string;

/**
* the CloudWatch Log Group for this API
*/
Expand All @@ -485,6 +478,7 @@ export class GraphqlApi extends GraphqlApiBase {
private schemaResource: CfnGraphQLSchema;
private api: CfnGraphQLApi;
private apiKeyResource?: CfnApiKey;
private domainNameResource?: CfnDomainName;

constructor(scope: Construct, id: string, props: GraphqlApiProps) {
super(scope, id);
Expand Down Expand Up @@ -517,18 +511,17 @@ export class GraphqlApi extends GraphqlApiBase {
this.schemaResource = this.schema.bind(this);

if (props.domainName) {
const domainName = new CfnDomainName(this, 'DomainName', {
this.domainNameResource = new CfnDomainName(this, 'DomainName', {
domainName: props.domainName.domainName,
certificateArn: props.domainName.certificate.certificateArn,
description: `domain for ${this.name} at ${this.graphqlUrl}`,
});
this.appSyncDomainName = domainName.attrAppSyncDomainName;
const domainNameAssociation = new CfnDomainNameApiAssociation(this, 'DomainAssociation', {
domainName: props.domainName.domainName,
apiId: this.apiId,
});

domainNameAssociation.addDependsOn(domainName);
domainNameAssociation.addDependsOn(this.domainNameResource);
}

if (modes.some((mode) => mode.authorizationType === AuthorizationType.API_KEY)) {
Expand Down Expand Up @@ -781,4 +774,15 @@ export class GraphqlApi extends GraphqlApiBase {
public addSubscription(fieldName: string, field: ResolvableField): ObjectType {
return this.schema.addSubscription(fieldName, field);
}


/**
* The AppSyncDomainName of the associated custom domain
*/
public get appSyncDomainName(): string {
if (!this.domainNameResource) {
throw new Error('Cannot retrieve the appSyncDomainName without a domainName configuration');
}
return this.domainNameResource.attrAppSyncDomainName;
}
}
13 changes: 12 additions & 1 deletion packages/@aws-cdk/aws-appsync/test/appsync-domain.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ describe('Tests of AppSync Domain Name', () => {
);
});

test('domainNameAppSyncDomainName exposes the domain of the associated AWS::AppSync::DomainName', () => {
test('appSyncDomainName exposes the domain of the associated AWS::AppSync::DomainName', () => {
const api = new appsync.GraphqlApi(stack, 'baseApi', {
name: 'api',
schema: appsync.Schema.fromAsset(
Expand All @@ -55,4 +55,15 @@ describe('Tests of AppSync Domain Name', () => {

expect(stack.resolve(api.appSyncDomainName)).toEqual({ 'Fn::GetAtt': ['baseApiDomainName52E3D63D', 'AppSyncDomainName'] });
});

test('appSyncDomainName should throw an error when no custom domain has been configured', () => {
const api = new appsync.GraphqlApi(stack, 'baseApi', {
name: 'api',
schema: appsync.Schema.fromAsset(
path.join(__dirname, 'appsync.test.graphql'),
),
});

expect(() => api.appSyncDomainName).toThrow('Cannot retrieve the appSyncDomainName without a domainName configuration');
});
});

0 comments on commit 74c045e

Please sign in to comment.