Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zeebe api tutorial #4058

Merged
merged 5 commits into from
Aug 9, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/apis-tools/zeebe-api-rest/sidebar-schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module.exports = {
"Zeebe API (REST)": [
"apis-tools/zeebe-api-rest/zeebe-api-rest-overview",
"apis-tools/zeebe-api-rest/zeebe-api-rest-authentication",
"apis-tools/zeebe-api-rest/zeebe-api-tutorial",
{
Specifications: require("./specifications/sidebar.js"),
},
Expand Down
178 changes: 178 additions & 0 deletions docs/apis-tools/zeebe-api-rest/tutorial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
---
id: zeebe-api-tutorial
title: Tutorial
description: "New to the Zeebe API? Step through our tutorial to assign and unassign a user to and from a Zeebe user task."
---

In this tutorial, we'll step through examples to highlight the capabilities of the Zeebe API, such as assigning and unassigning a user to and from a Zeebe user task.

## Prerequisites

- If you haven't done so already, [create a cluster](/guides/create-cluster.md).
- Upon cluster creation, [create your first client](/guides/setup-client-connection-credentials.md). Ensure you check the `Zeebe` client scope box.

:::note
Make sure you keep the generated client credentials in a safe place. The **Client secret** will not be shown again. For your convenience, you can also download the client information to your computer.
:::

- In this tutorial, we utilize a JavaScript-written [GitHub repository](https://github.com/camunda/camunda-api-tutorials) to write and run requests. Clone this repo before getting started.
- Ensure you have [Node.js](https://nodejs.org/en/download) installed as this will be used for methods that can be called by the CLI (outlined later in this guide). Run `npm install` to ensure you have updated dependencies.

## Getting started

- You need authentication to access the API endpoints. Find more information [here](./zeebe-api-rest-authentication.md).

## Set up authentication

If you're interested in how we use a library to handle auth for our code, or to get started, examine the `auth.js` file in the GitHub repository. This file contains a function named `getAccessToken` which executes an OAuth 2.0 protocol to retrieve authentication credentials based on your client id and client secret. Then, we return the actual token that can be passed as an authorization header in each request.

To set up your credentials, create an `.env` file which will be protected by the `.gitignore` file. You will need to add your `ZEEBE_CLIENT_ID`, `ZEEBE_CLIENT_SECRET`, `ZEEBE_BASE_URL`, and `ZEEBE_AUDIENCE`, which is `zeebe.camunda.io` in a Camunda 8 SaaS environment. For example, your audience may be defined as `ZEEBE_AUDIENCE=zeebe.camunda.io`.

These keys will be consumed by the `auth.js` file to execute the OAuth protocol, and should be saved when you generate your client credentials in [prerequisites](#prerequisites).

Examine the existing `.env.example` file for an example of how your `.env` file should look upon completion. Do not place your credentials in the `.env.example` file, as this example file is not protected by the `.gitignore`.

:::note

In this tutorial, we will execute arguments to assign and unassign a user to and from a Zeebe user task. You can examine the framework for processing these arguments in the `cli.js` file before getting started.

:::

## Assign a Zeebe user task (POST)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Since Zeebe user tasks are a bit of a new concept, it might be worth mentioning briefly in this tutorial that task assignment happened in Tasklist previously. We don't have to add this now, but it might be something to get broader feedback on.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In addition, I think we should call out that they can capture a Zeebe user task ID, which they will use to assign/unassign in this API, from Tasklist....but it has to be a Zeebe task, not a legacy task.

We could link them to this doc, which describes the difference between zeebe user tasks & legacy user tasks. It's an important distinction that I personally overlooked, and I think it's likely that readers will do the same.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjusted in latest commit 👍


First, let's script an API call to assign a Zeebe user task.

To do this, take the following steps:

1. In the file named `zeebe.js`, outline the authentication and authorization configuration in the first few lines. This will pull in your `.env` variables to obtain an access token before making any API calls:

```javascript
const authorizationConfiguration = {
clientId: process.env.ZEEBE_CLIENT_ID,
clientSecret: process.env.ZEEBE_CLIENT_SECRET,
audience: process.env.ZEEBE_AUDIENCE,
};
```

2. Examine the function `async function assignUser([userTaskKey, assignee])` below this configuration. This is where you will script out your API call.
3. Within the function, you must first apply an access token for this request, so your function should now look like the following:
christinaausley marked this conversation as resolved.
Show resolved Hide resolved

```javascript
async function assignUser([userTaskKey, assignee]) {
const accessToken = await getAccessToken(authorizationConfiguration);
}
```

4. Using your generated client credentials from [prerequisites](#prerequisites), capture your Zeebe API URL beneath your call for an access token by defining `zeebeApiUrl`:

`const zeebeApiUrl = process.env.ZEEBE_BASE_URL`

5. On the next line, script the API endpoint to assign a Zeebe user task.:

```javascript
const url = `${ZeebeApiUrl}/user-tasks/${userTaskKey}/assignment`;
```

6. Configure your POST request to the appropriate endpoint, including an authorization header based on the previously acquired `accessToken`:

```javascript
const options = {
method: "POST",
url,
headers: {
Accept: "application/json",
Authorization: `Bearer ${accessToken}`,
},
data: {
// The body contains information about the new assignment.
assignee: assignee,
},
};
```

7. Call the add endpoint, process the results from the API call, and emit an error message from the server if necessary:
christinaausley marked this conversation as resolved.
Show resolved Hide resolved

```javascript
try {
// Call the add endpoint.
const response = await axios(options);

// Process the results from the API call.
if (response.status === 204) {
console.log(`User task assigned to ${assignee}.`);
} else {
// Emit an unexpected error message.
console.error("Unable to assign this user!");
}
} catch (error) {
// Emit an error from the server.
console.error(error.message);
}
```

8. In your terminal, run `node cli.js zeebe assign <task id> <[email protected]>`, where `<task id>` is the Zeebe user task ID, and `<[email protected]>` is the assignee's email address.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 You could consider having the user assign their own email address if they want to see it in the UIs.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗒️ if you were wondering, like me, what would happen if one assigned a task via the API to a user not in their organization, the answer is:

It will work just fine.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, I don't have a specific suggestion, but this might also be a good place to specify where they got a Zeebe user task ID from. ("The ID you've captured from Tasklist" or something like that)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjusted in latest commit 👍


:::note
This `assign` command is connected to the `assignUser` function at the bottom of the `zeebe.js` file, and executed by the `cli.js` file. While we will assign and unassign users in this tutorial, you may add additional arguments depending on the API calls you would like to make.
:::

If you have a valid user and task ID, the assignment will now output. If you have an invalid API name or action name, or no arguments provided, or improper/insufficient credentials configured, an error message will output as outlined in the `cli.js` file.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non-blocking feedback: I was surprised that the action wasn't required in the API reference docs.

A custom action value that will be accessible from user task events resulting from this endpoint invocation. If not provided, it will default to "assign".

I did see that this is consistent (if no action is provided, it will default) everywhere except when unassigning a user. I'll let you decide if you want to call this out and how you want to note it. Alternatively, you can wait for feedback on this.


## Unassign a Zeebe user task (DELETE)

To unassign a user from a Zeebe user task, you can use the same Zeebe user task ID from the previous exercise and take the following steps:

1. Outline your function, similar to the steps above:

```javascript
async function unassignUser([userTaskKey]) {
const accessToken = await getAccessToken(authorizationConfiguration);

const ZeebeApiUrl = process.env.ZEEBE_BASE_URL;

const url = `${ZeebeApiUrl}/user-tasks/${userTaskKey}/assignee`;
}
```

2. Configure the API call using the DELETE method:

```javascript
const options = {
method: "DELETE",
url,
headers: {
Accept: "application/json",
Authorization: `Bearer ${accessToken}`,
},
};
```

3. Process the results from the API call. For example:

```javascript
try {
// Call the delete endpoint.
const response = await axios(options);

// Process the results from the API call.
if (response.status === 204) {
console.log("User task has been unassigned!");
} else {
// Emit an unexpected error message.
console.error("Unable to unassign this user task!");
}
} catch (error) {
// Emit an error from the server.
console.error(error.message);
}
```

4. In your terminal, run `node cli.js zeebe unassign <task id>`, where `<task id>` is the Zeebe user task ID.

## If you get stuck

Having trouble configuring your API calls or want to examine an example of the completed tutorial? Navigate to the `completed` folder in the [GitHub repository](https://github.com/camunda/camunda-api-tutorials/tree/main/completed), where you can view an example `zeebe.js` file.

## Next steps

You can script several additional API calls as outlined in the [Zeebe API reference material](./zeebe-api-rest-overview.md).
Loading