Composition Rules - WunderGraph
Root fields
EDG Root fields must define their respective event directive and a valid response type:
| Root type | Directive | Response type |
|---|---|---|
| Query | @edfs__natsRequest | A non-nullable entity object |
| Mutation | @edfs__natsPublish | edfs__PublishResult! |
| @edfs__kafkaPublish | edfs__PublishResult! |
|
| @edfs__redisPublish | edfs__PublishResult! |
|
| Subscription | @edfs__natsSubscribe | A non-nullable entity object |
| @edfs__kafkaSubscribe | A non-nullable entity object | |
| @edfs__redisSubscribe | A non-nullable entity object |
Note that the edfs__NatsStreamConfiguration input object must always be defined to satisfy the @edfs__natsSubscribe directive:
input edfs__NatsStreamConfiguration {
consumerInactiveThreshold: Int! = 30
consumerName: String!
streamName: String!
}
Here is an example of a valid EDG mutation:
directive @edfs__natsPublish(
subject: String!,
providerId: String! = "default"
) on FIELD_DEFINITION
type Mutation {
updateUser(
id: ID!, update: UpdateUserInput!
): edfs__PublishResult! @edfs__natsPublish(subject: "updateUser.{{ args.id }}")
}
type edfs__PublishResult {
success: Boolean!
}
type UpdateUserInput {
forename: String!
surname: String!
}
Attempting to return a type other than edfs__PublishResult! from a EDG Mutation root field will result in a compositional error.
Root field arguments and event subjects
Arguments can be defined on a root field, which can then be passed to event subjects or topics through an argument template. Argument templates are supported for NATS subjects and Kafka topics. With Kafka, the rendered topics must already exist, so the subscription filter is still useful when you want to split a stream without pre-creating many topics. The argument template should follow the period delimiter of your subject or topic. The args refers to the field arguments, which has its own period delimiter, followed by a name of a field argument. This argument name must match exactly to a corresponding field argument name.
eventSubject.{{ args.nameOfAFieldArgument }}
type Subscription {
# note that the arg template names correspond to the field argument names
userUpdated(myArgumentName: Int!, another: Int!): User! @edfs__natsSubscribe(
subjects: ["users.{{ args.myArgumentName }}", "users.{{ args.another }}"]
)
}
type User @key(fields: "id", resolvable: false) {
id: @external
}
Entity definitions
EDG entities must be “minimal stubs”. This means that only the fields (and nested fields) that form part of its primary key should be included:
- The primary key must contain the “resolvable” argument set to false.
- Fields (including nested fields) must form part of the primary key.
- Fields (including nested fields) must be declared
@external.
Here is an example of a valid EDG entity object definition:
type User @key(fields: "id object { id }", resolvable: false) @external {
id: Int!
object: Object!
}
type Object {
id: Int! @external
}
Other definitions
The EDGs must not define any objects and fields that do not form part of an entity’s primary key. Most other definitions are simply ignored, unless, for example, a root field requires an input object.