Skip to main content
Version: v3.x (DDN)

Apollo Federation

Introduction

Hasura DDN itself can be used as a subgraph in a supergraph created by Apollo Federation. This page is to help you understand how to use Hasura in conjunction with an existing Apollo supergraph. Alternatively, if you're looking for a guide on how to build a federated Hasura DDN supergraph, check out our getting started guide.

Apollo Federation is a way to compose multiple GraphQL services (called subgraphs) into a unified API (called a supergraph).

Supergraphs and Subgraph terminology in Hasura DDN and Apollo Federation

Some of the naming used in Apollo Federation conflicts with the same names used in Hasura. Here is a quick glossary to help you understand the terms better:

TermHasuraApollo Federation
SubgraphA subgraph in Hasura is the notion of a module of Hasura supergraph metadata.A subgraph in Apollo Federation is a standalone GraphQL service.
SupergraphA supergraph in Hasura is the collection of subgraph metadata and the resultant GraphQL API that is created.A supergraph in Apollo Federation is a unified GraphQL API that is created by stitching multiple subgraph APIs.

Using DDN as a subgraph

Hasura DDN is compliant with the Apollo Federation subgraph specification, so you can plug Hasura DDN in as a subgraph in your Apollo federated supergraph.

Enabling Apollo Federation fields in Hasura DDN metadata

You will need to edit the GraphqlConfig for the supergraph to enable the fields required for schema stitching by the Apollo supergraph router. You will have to add the following in the definition for GraphqlConfig (usually in supergraph/graphql-config.hml file):

apolloFederation:
enableRootFields: true

An example of the graphql-config.hml file with apollo federation fields enabled:

kind: GraphqlConfig
version: v1
definition:
query:
rootOperationTypeName: Query
mutation:
rootOperationTypeName: Mutation
apolloFederation:
enableRootFields: true

Marking a Type as an Apollo Entity

Types defined in Hasura DDN can also be marked as Apollo Entities. This will allow the same type to be resolved from DDN (and your other subgraphs that defines the type) as well.

To mark a type as an entity, you will have to edit the metadata for the ObjectType and the Model which will be used to resolve the type.

  1. Add the keys for the ObjectType. The keys can be defined as following in the definition.graphql for ObjectType:

    apolloFederation:
    keys: # The fields that uniquely identifies the entity
    - fields:
    - id
  2. Mark the Model that should act as the source for the entity. This can be done by adding the following in the definition.graphql for Model:

    apolloFederation:
    entitySource: true
Single direction Federation support

Apollo Federation support in DDN only allows extending Apollo subgraphs with DDN types.

The other way i.e. extending DDN types with other Apollo subgraphs is not currently possible.

Consider the following configuration:

The Review type defined in DDN:

type Review {
id: ID!
productId: ID!
rating: Int!
comment: String
}

The Product type defined in an Apollo subgraph:

type Product @key(fields: "id") {
id: ID!
name: String!
}

In this example we cannot extend the Review type in DDN with the Product type from another Apollo subgraph.