Lambda Webhooks Example
It is a common need to populate a “Created At” date whenever a new data is created. Using Lambda Webhooks, the population of this field can be offloaded from the clients to a Dgraph Lambda. Lambda Webhooks are special kind of lambdas that are automatically invoked whenever data belonging to a GraphQL type is added, modified, or deleted.
Steps to run this example are as follows.
The GraphQL Schema
type Author @lambdaOnMutate(add: true, update: true, delete: true) {
id: ID!
name: String! @search(by: [hash, trigram])
createdAt: DateTime
}
In the schema provided, there is a type Author
which has an id
, and name
as well as a createAt
field. The createdAt
field is to be populated with the date when a new Author
is created.
Please note that a special directive, lambdaOnMutate
is configured. This configureation allowd Dgraph to invoke a lambda whenever an Author
is added, updated or deleted.
Configuring the lambda
async function addAuthorWebhook({event, dql, graphql, authHeader}) {
// execute what you want on addition of an author
// maybe send a welcome mail to the author
console.log("new author added")
console.log(event.add.rootUIDs[0])
const createdDate = new Date()
const createdAt = createdDate.toISOString();
console.log(createdAt)
const results = await graphql(`mutation UpdateCreatedDate($id: ID!, $createdAt: DateTime!) {
updateAuthor(input: {filter: {id: [$id] }, set: {createdAt: $createdAt}}) {
author {
id
name
createdAt
}
}
}
`, {"id": event.add.rootUIDs[0], "createdAt" : createdAt})
}
async function updateAuthorWebhook({event, dql, graphql, authHeader}) {
// execute what you want on updation of an author
// maybe send a mail to the author informing that few details have been updated
}
async function deleteAuthorWebhook({event, dql, graphql, authHeader}) {
// execute what you want on deletion of an author
// maybe mail the author saying they have been removed from the platform
}
self.addWebHookResolvers({
"Author.add": addAuthorWebhook,
"Author.update": updateAuthorWebhook,
"Author.delete": deleteAuthorWebhook,
})
The addAuthorWebhook
function configured such that it is invoked whenever a new Author
is added. The addAuthorWebhook
receives an event
object which contains the context of the add, update or delete action. In this example, the event contains the uid
of the newly created Author
in the field event.add.rootUIDs[0]
.
Mutation to add an Author
mutation AddAuthor {
addAuthor(input: {name: "John"}) {
numUids
}
}
This mutation will add an Author
. Please note that only the name
is provided by the client and the createdAt
field is not provided by the client. Upon execution of this mutation, the addAuthorWebhook
function configured previously will be invoked by Dgraph. This function retrieves the uid
of the newly created Author
and updates the createdAt
attribute for this uid
.
When you query the data subsequently, you will now see the following data. The createdAt
field is now populated with a date.
{
"id": "0xd",
"name": "John",
"createdAt": "2021-07-16T05:28:06.433Z"
}
Summary
In this example, we saw an example of the lambda webhook using the lambdaOnMutate
directive. We used a lambda webhook to auto-populate the createdAt
attribute for a newly created Author
. The advantage of this approach is that the client need not pass attributes that can be determined on the server side. This keeps the client code lightweight and easy to manage.