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

Add admin docs for the windmill integration #12153

Merged
merged 11 commits into from
Sep 24, 2024
2 changes: 2 additions & 0 deletions admin_manual/contents.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ Table of contents
office/index
reference/index
ai/index
webhook_listeners/index
windmill_workflows/index
configuration_database/index
configuration_mimetypes/index
maintenance/index
Expand Down
140 changes: 140 additions & 0 deletions admin_manual/webhook_listeners/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
=================
Webhook Listeners
=================

.. _webhook_listeners:

Nextcloud supports listening to internal events via webhooks.

Installation
------------

* Enable the ``webhook_listeners`` app that comes bundled with Nextcloud

.. code-block:: bash

occ app:enable webhook_listeners

Listening to events
-------------------

You can use the OCS API to add webhooks for specific events: https://docs.nextcloud.com/server/latest/developer_manual/_static/openapi.html#/operations/webhook_listeners-webhooks-index

Note: When authenticating with the OCS API to register webhooks the account you authenticate as must have administrator rights or delegated administrator rights.

Filters
~~~~~~~

When registering a webhook listener, you can specify a filter parameter. The value of this parameter must be a JSON object whose properties represent filter conditions. The ``{}`` is an empty query, meaning no specific criteria, so all events are matched.

If you would like to match events fired by a specific user, you can pass ``{ "user.uid": "bob" }`` to match all events fired in the context of user ``"bob"``.

If you would like to enforce multiple criteria, you can simply pass multiple properties ``{ "event.tableId": 42, "event.rowId": 3 }``

You can also use additional comparison operators (``$eq, $ne, $gt, $gte, $lt, $lte, $in, $nin``) as well as logical operators (``$and, $or, $not, $nor``). For example use ``{ "time" : { "$lt": 1711971024 } }`` to accept only events prior to April 1st 2024 and ``{ "time" : { "$not": { "$lt": 1711971024 } } }`` to accept events after April 1st 2024.

Check failure on line 34 in admin_manual/webhook_listeners/index.rst

View workflow job for this annotation

GitHub Actions / Check spelling

nin ==> inn, min, bin, nine
Copy link
Member

Choose a reason for hiding this comment

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

@marcelklehr could you please try to find a workaround for the failing spell check? This line causes red CI for all new PRs. Thanks


Nextcloud Webhook Events
------------------------

This is a non-exhaustive list of available events. It features the event ID and the available variables for filtering.
marcelklehr marked this conversation as resolved.
Show resolved Hide resolved

* OCA\\Tables\\Event\\RowAddedEvent

.. code-block:: text

array{
"user": array {"uid": string, "displayName": string},
"time": int,
"event": array{
"class": string,
"tableId": int,
"rowId": int,
"previousValues": null|array<int, mixed>,
"values": null|array<int, mixed>
}
}

* OCA\\Tables\\Event\\RowDeletedEvent

.. code-block:: text

array{
"user": array {"uid": string, "displayName": string},
"time": int,
"event": array{
"class": string,
"tableId": int,
"rowId": int,
"previousValues": null|array<int, mixed>,
"values": null|array<int, mixed>
}
}

* OCA\\Tables\\Event\\RowUpdatedEvent

.. code-block:: text

array{
"user": array {"uid": string, "displayName": string},
"time": int,
"event": array{
"class": string,
"tableId": int,
"rowId": int,
"previousValues": null|array<int, mixed>,
"values": null|array<int, mixed>
}
}

* OCP\\Files\\Events\\Node\\BeforeNodeCreatedEvent

.. code-block:: text

array{
"user": array {"uid": string, "displayName": string},
"time": int,
"event": array{
"class": string,
"node": array{"id": string, "path": string}
}
}

* OCP\\Files\\Events\\Node\\BeforeNodeWrittenEvent

.. code-block:: text

array{
"user": array {"uid": string, "displayName": string},
"time": int,
"event": array{
"class": string,
"node": array{"id": string, "path": string}
}
}

* OCP\\Files\\Events\\Node\\BeforeNodeDeletedEvent

.. code-block:: text

array{
"user": array {"uid": string, "displayName": string},
"time": int,
"event": array{
"class": string,
"node": array{"id": string, "path": string}
}
}

* OCP\\Files\\Events\\Node\\BeforeNodeRenamedEvent

.. code-block:: text

array{
"user": array {"uid": string, "displayName": string},
"time": int,
"event": array{
"class": string,
"source": array{"id": string, "path": string}
"target": array{"id": string, "path": string}
}
}
60 changes: 60 additions & 0 deletions admin_manual/windmill_workflows/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
==================
Windmill Workflows
==================

Nextcloud integrates the Windmill workflow engine (https://www.windmill.dev/) to allow advanced custom workflows interacting with your Nextcloud instance.

Installation
------------

* Install Windmill

* Either as a standalone install or via the Windmill External App in Nextcloud (see :ref:`External Apps<ai-app_api>`)

* Enable the ``webhook_listeners`` app that comes with Nextcloud

.. code-block:: bash

occ app:enable webhook_listeners

Selecting the right Workspace
-----------------------------

When installing Windmill as an ExApp make sure to select the right workspace on the first run: Only the pre-existing "nextcloud" workspace is hooked up to nextcloud's internal event system, all other workspaces will need manual webhook setups for each workflow.
marcelklehr marked this conversation as resolved.
Show resolved Hide resolved

Building a workflow
-------------------

Each workflow in windmill is a listener to a Nextcloud Webhook Event. If you are using the ExApp-packaged windmill, it will automatically register webhooks for the workflows you build using the following mechanism. If you are not using the ExApp-packaged windmill install then you will have to register webhooks for your workflows manually via the webhook_listeners API: see https://docs.nextcloud.com/server/latest/developer_manual/_static/openapi.html#/operations/webhook_listeners-webhooks-index
marcelklehr marked this conversation as resolved.
Show resolved Hide resolved

The magic listener script
~~~~~~~~~~~~~~~~~~~~~~~~~

The first script in any workflow you build that should listen to a nextcloud webhook must be ``CORE:LISTEN_TO_EVENT``. It must be an empty script with two parameters that you should fill statically: ``events``, which is a list of event IDs to listen to and ``filters`` a filter condition that allows more fine grained filtering for which events should be used. The filter condition as well as the available events with their payloads is documented in :ref:`the webhook_listeners documentation<webhook_listeners>`.
marcelklehr marked this conversation as resolved.
Show resolved Hide resolved

Nextcloud Scripts
-----------------

Nextcloud makes available a variety of scripts to be used in Windmill for interfacing with Nextcloud apps. You can find them
at https://hub.windmill.dev/ or in your windmill instance when selecting existing scripts for creating a new workflow.
marcelklehr marked this conversation as resolved.
Show resolved Hide resolved

Authentication
~~~~~~~~~~~~~~

All bricks have the option to use "AppAPI Authentication" or normal authentication using a Nextcloud resource in Windmill. When using normal authentication you will need to provide the correct password or app password of the user on behalf of whom you want to execute the script. When using "AppAPI Authentication" you can impersonate any Nextcloud user. This will only work when using the ExApp-packaged version of windmill.

Passing values between blocks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When specifying script inputs you can either fill the parameters with static values or make references to the workflow input and the previous workflow steps.

In order to reference the workflow input, use the ``flow_input`` variable. For example, ``flow_input.event.form.hash`` will reference the hash of a form from a nextcloud Forms event.

In order to reference results from previous steps in your parameters, use the ``results`` variable with the id of the step to reference as a sub property. For example, ``results.e.submission.answers`` to use the answers of of a form submission retrieved via the "Get form submission from Nextcloud Forms" script.
marcelklehr marked this conversation as resolved.
Show resolved Hide resolved

Approval/Suspend steps
~~~~~~~~~~~~~~~~~~~~~~

Windmill allows using so-called approval steps, which are essentially asynchronous scripts that wait for the call to an additional webhook URL. The most prominent use case for this are approval workflows where you get automated input from somewhere which needs to be approved by a human. Once the human approves or disapproves by triggering the webhook URL the workflow will resume.

Using the scripts provided for Nextcloud, you can send approval links to the humans in charge of approving via Nextcloud Talk or a simple notification in Nextcloud. Of course, you may also use any of the other scripts for sending messages available in the Windmill hub.
Copy link
Member

Choose a reason for hiding this comment

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

Maybe this needs more details like mentioning the approve_links app, talk about the branching if the approval is rejected (once we have tested it properly).