From 5739a7fee5f46472fc9c3cf3f904071cfca900b2 Mon Sep 17 00:00:00 2001 From: rudrapratik30 Date: Thu, 31 Jul 2025 14:43:17 +0530 Subject: [PATCH 01/13] [docs]: Aftership Plugin --- docs/docs/marketplace/marketplace_overview.md | 2 + docs/docs/marketplace/plugins/aftership.md | 185 ++++++++++++++++++ docs/sidebars.js | 3 +- .../plugins/aftership/connection.png | Bin 0 -> 74814 bytes .../marketplace/marketplace_overview.md | 2 + .../marketplace/plugins/aftership.md | 185 ++++++++++++++++++ .../version-3.5.0-LTS-sidebars.json | 3 +- 7 files changed, 378 insertions(+), 2 deletions(-) create mode 100644 docs/docs/marketplace/plugins/aftership.md create mode 100644 docs/static/img/marketplace/plugins/aftership/connection.png create mode 100644 docs/versioned_docs/version-3.5.0-LTS/marketplace/plugins/aftership.md diff --git a/docs/docs/marketplace/marketplace_overview.md b/docs/docs/marketplace/marketplace_overview.md index 736fa4755f..d9dc82df86 100644 --- a/docs/docs/marketplace/marketplace_overview.md +++ b/docs/docs/marketplace/marketplace_overview.md @@ -55,6 +55,8 @@ To remove a plugin, follow these steps: - On the `Installed` page, click on the `Remove` button of the related plugin that you wish to remove. ## Available Plugins + +- **[Aftership](/docs/marketplace/plugins/marketplace-plugin-aftership)** - **[Anthropic](/docs/marketplace/plugins/marketplace-plugin-anthropic)** - **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-awsredshift)** - **[AWS Textract](/docs/marketplace/plugins/marketplace-plugin-textract)** diff --git a/docs/docs/marketplace/plugins/aftership.md b/docs/docs/marketplace/plugins/aftership.md new file mode 100644 index 0000000000..e9aa0aff59 --- /dev/null +++ b/docs/docs/marketplace/plugins/aftership.md @@ -0,0 +1,185 @@ +--- +id: marketplace-plugin-aftership +title: Aftership +--- + +Integrating AfterShip with ToolJet enables teams to build custom internal tools for tracking and managing shipments in real time. With this integration, you can fetch delivery statuses, monitor carrier updates, and centralize logistics data within your ToolJet application, streamlining operations and improving customer support efficiency. + +## Connection + +To connect AfterShip with ToolJet you will need the API Key, which you can generate from [Aftership Tracking API](https://www.aftership.com/tracking-api). + +Aftership Configuration + +## Supported Operations + +### Tracking + +#### Basic Tracking Operations + +| Method | Endpoint | Description | +| ------ | ------------ | --------------------------- | +| GET | `/trackings` | Retrieve list of trackings. | +| POST | `/trackings` | Create a new tracking. | +| GET | `/couriers` | Get supported courier list. | + +#### ID + +| Method | Endpoint | Description | +| ------ | ----------------------------------- | ---------------------------- | +| GET | `/trackings/{id}` | Get tracking by ID. | +| PUT | `/trackings/{id}` | Update tracking by ID. | +| DELETE | `/trackings/{id}` | Delete tracking by ID. | +| POST | `/trackings/{id}/retrack` | Retrack an expired tracking. | +| POST | `/trackings/{id}/mark-as-completed` | Mark tracking as completed. | + +#### Detect + +| Method | Endpoint | Description | +| ------ | ------------------ | ---------------------------------- | +| POST | `/couriers/detect` | Detect courier by tracking number. | + +#### All + +| Method | Endpoint | Description | +| ------ | ------------------ | ---------------------------------- | +| GET | `/couriers/all` | Get all available couriers. | + +#### Predict Batch + +| Method | Endpoint | Description | +| ------ | ---------------------------------------- | ------------------------------------- | +| POST | `/estimated-delivery-date/predict-batch` | Predict estimated delivery for batch. | + +### Shipping + +#### Labels + +| Method | Endpoint | Description | +| ------ | -------------- | ----------------- | +| GET | `/labels` | Get labels | +| POST | `/labels` | Create a label | +| GET | `/labels/{id}` | Get a label by ID | + +#### Cancel Labels + +| Method | Endpoint | Description | +| ------ | --------------------- | --------------------------- | +| GET | `/cancel-labels` | Get the cancelled labels | +| POST | `/cancel-labels` | Cancel a label | +| GET | `/cancel-labels/{id}` | Get a cancelled label by ID | + +#### Rates + +| Method | Endpoint | Description | +| ------ | ------------- | ---------------- | +| GET | `/rates` | Get rates | +| POST | `/rates` | Calculate rates | +| GET | `/rates/{id}` | Get a rate by ID | + +#### Manifests + +| Method | Endpoint | Description | +| ------ | ----------------- | -------------------- | +| GET | `/manifests` | Get manifests | +| POST | `/manifests` | Create a manifest | +| GET | `/manifests/{id}` | Get a manifest by ID | + +#### Couriers + +| Method | Endpoint | Description | +| ------ | ----------- | ---------------- | +| GET | `/couriers` | Get all couriers | + +#### Address Validations + +| Method | Endpoint | Description | +| ------ | ---------------------- | ---------------------------- | +| POST | `/address-validations` | Create an address validation | + +#### Location + +| Method | Endpoint | Description | +| ------ | ------------ | ------------------------------------------- | +| GET | `/locations` | Get carrier locations (requires production) | + +#### Pickup + +| Method | Endpoint | Description | +| ------ | --------------- | ---------------------------------------------------- | +| GET | `/pickups` | Get pickups | +| POST | `/pickups` | Create a pickup (FedEx, UPS, DHL Express, Purolator) | +| GET | `/pickups/{id}` | Get a pickup by ID | + +#### Cancel Pickups + +| Method | Endpoint | Description | +| ------ | ---------------------- | ---------------------------- | +| GET | `/cancel-pickups` | Get the cancelled pickups | +| POST | `/cancel-pickups` | Cancel a pickup | +| GET | `/cancel-pickups/{id}` | Get a cancelled pickup by ID | + +#### Shipper Accounts + +| Method | Endpoint | Description | +| ------ | ------------------------------------ | ----------------------------------------- | +| GET | `/shipper-accounts` | Get shipper accounts | +| POST | `/shipper-accounts` | Create a shipper account | +| GET | `/shipper-accounts/{id}` | Get a shipper account by ID | +| DELETE | `/shipper-accounts/{id}` | Delete a shipper account | +| PUT | `/shipper-accounts/{id}/info` | Update shipper account's information | +| PUT | `/shipper-accounts/{id}/credentials` | Update shipper account's credentials | +| PUT | `/shipper-accounts/{id}/settings` | Update shipper account's settings (FedEx) | + +### Return + +#### Returns Management + +| Method | Endpoint | Description | +| ------ | --------------------------- | -------------------------------------------- | +| GET | `/returns` | Get returns with optional filtering | +| POST | `/returns` | Create a new return (supports only "Refund") | +| GET | `/returns/{return_id}` | Get return detail by return ID | +| GET | `/returns/rma/{rma_number}` | Get return detail by RMA number | + +#### Return Status Management + +| Method | Endpoint | Description | +| ------ | ----------------------------------- | ---------------------------- | +| POST | `/returns/{return_id}/approve` | Approve return by return ID | +| POST | `/returns/rma/{rma_number}/approve` | Approve return by RMA number | +| POST | `/returns/{return_id}/resolve` | Resolve return by return ID | +| POST | `/returns/rma/{rma_number}/resolve` | Resolve return by RMA number | +| POST | `/returns/{return_id}/reject` | Reject return by return ID | +| POST | `/returns/rma/{rma_number}/reject` | Reject return by RMA number | + +#### Item Management + +| Method | Endpoint | Description | +| ------ | ------------------------------------------- | ---------------------------------------------- | +| POST | `/returns/{return_id}/receive-items` | Record received items by return ID | +| POST | `/returns/rma/{rma_number}/receive-items` | Record received items by RMA number | +| PUT | `/returns/{return_id}/items/{item_id}` | Update return item (tags/images) by return ID | +| PUT | `/returns/rma/{rma_number}/items/{item_id}` | Update return item (tags/images) by RMA number | +| POST | `/returns/{return_id}/remove-items` | Remove items from return by return ID | +| POST | `/returns/rma/{rma_number}/remove-items` | Remove items from return by RMA number | + +#### Shipping Management + +| Method | Endpoint | Description | +| ------ | -------------------------------------------- | ---------------------------------- | +| POST | `/returns/{return_id}/attach-shipments` | Upload shipment info by return ID | +| POST | `/returns/rma/{rma_number}/attach-shipments` | Upload shipment info by RMA number | + +#### Dropoff Management + +| Method | Endpoint | Description | +| ------ | ------------------------------------------------------- | -------------------------------------- | +| POST | `/returns/rma/{rma_number}/dropoffs/{dropoff_id}/drops` | Record dropped-off items (QR dropoffs) | + +#### Utility Endpoints + +| Method | Endpoint | Description | +| ------ | --------------- | ---------------------------------------------------- | +| POST | `/returns/link` | Generate returns page deep link with pre-filled info | +| GET | `/item-tags` | Retrieve all available item tags | diff --git a/docs/sidebars.js b/docs/sidebars.js index 7d1cb9a7ca..6a3142af51 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -416,7 +416,8 @@ const sidebars = { 'marketplace/plugins/marketplace-plugin-weaviate', 'marketplace/plugins/marketplace-plugin-qdrant', 'marketplace/plugins/marketplace-plugin-azurerepos', - 'marketplace/plugins/marketplace-plugin-googlecalendar' + 'marketplace/plugins/marketplace-plugin-googlecalendar', + 'marketplace/plugins/marketplace-plugin-aftership' ], }, ], diff --git a/docs/static/img/marketplace/plugins/aftership/connection.png b/docs/static/img/marketplace/plugins/aftership/connection.png new file mode 100644 index 0000000000000000000000000000000000000000..294d09e6153be3b8e1501df28f358f88bdcb6cdd GIT binary patch literal 74814 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 f_EI3c0-x{b*YPN(q06rRO+N$~I%!2<1p8cqE literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/version-3.5.0-LTS/marketplace/marketplace_overview.md b/docs/versioned_docs/version-3.5.0-LTS/marketplace/marketplace_overview.md index d911dc2d2e..68bc389e6a 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/marketplace/marketplace_overview.md +++ b/docs/versioned_docs/version-3.5.0-LTS/marketplace/marketplace_overview.md @@ -55,6 +55,8 @@ To remove a plugin, follow these steps: - On the `Installed` page, click on the `Remove` button of the related plugin that you wish to remove. ## Available Plugins + +- **[Aftership](/docs/marketplace/plugins/marketplace-plugin-aftership)** - **[Anthropic](/docs/marketplace/plugins/marketplace-plugin-anthropic)** - **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-awsredshift)** - **[AWS Textract](/docs/marketplace/plugins/marketplace-plugin-textract)** diff --git a/docs/versioned_docs/version-3.5.0-LTS/marketplace/plugins/aftership.md b/docs/versioned_docs/version-3.5.0-LTS/marketplace/plugins/aftership.md new file mode 100644 index 0000000000..e9aa0aff59 --- /dev/null +++ b/docs/versioned_docs/version-3.5.0-LTS/marketplace/plugins/aftership.md @@ -0,0 +1,185 @@ +--- +id: marketplace-plugin-aftership +title: Aftership +--- + +Integrating AfterShip with ToolJet enables teams to build custom internal tools for tracking and managing shipments in real time. With this integration, you can fetch delivery statuses, monitor carrier updates, and centralize logistics data within your ToolJet application, streamlining operations and improving customer support efficiency. + +## Connection + +To connect AfterShip with ToolJet you will need the API Key, which you can generate from [Aftership Tracking API](https://www.aftership.com/tracking-api). + +Aftership Configuration + +## Supported Operations + +### Tracking + +#### Basic Tracking Operations + +| Method | Endpoint | Description | +| ------ | ------------ | --------------------------- | +| GET | `/trackings` | Retrieve list of trackings. | +| POST | `/trackings` | Create a new tracking. | +| GET | `/couriers` | Get supported courier list. | + +#### ID + +| Method | Endpoint | Description | +| ------ | ----------------------------------- | ---------------------------- | +| GET | `/trackings/{id}` | Get tracking by ID. | +| PUT | `/trackings/{id}` | Update tracking by ID. | +| DELETE | `/trackings/{id}` | Delete tracking by ID. | +| POST | `/trackings/{id}/retrack` | Retrack an expired tracking. | +| POST | `/trackings/{id}/mark-as-completed` | Mark tracking as completed. | + +#### Detect + +| Method | Endpoint | Description | +| ------ | ------------------ | ---------------------------------- | +| POST | `/couriers/detect` | Detect courier by tracking number. | + +#### All + +| Method | Endpoint | Description | +| ------ | ------------------ | ---------------------------------- | +| GET | `/couriers/all` | Get all available couriers. | + +#### Predict Batch + +| Method | Endpoint | Description | +| ------ | ---------------------------------------- | ------------------------------------- | +| POST | `/estimated-delivery-date/predict-batch` | Predict estimated delivery for batch. | + +### Shipping + +#### Labels + +| Method | Endpoint | Description | +| ------ | -------------- | ----------------- | +| GET | `/labels` | Get labels | +| POST | `/labels` | Create a label | +| GET | `/labels/{id}` | Get a label by ID | + +#### Cancel Labels + +| Method | Endpoint | Description | +| ------ | --------------------- | --------------------------- | +| GET | `/cancel-labels` | Get the cancelled labels | +| POST | `/cancel-labels` | Cancel a label | +| GET | `/cancel-labels/{id}` | Get a cancelled label by ID | + +#### Rates + +| Method | Endpoint | Description | +| ------ | ------------- | ---------------- | +| GET | `/rates` | Get rates | +| POST | `/rates` | Calculate rates | +| GET | `/rates/{id}` | Get a rate by ID | + +#### Manifests + +| Method | Endpoint | Description | +| ------ | ----------------- | -------------------- | +| GET | `/manifests` | Get manifests | +| POST | `/manifests` | Create a manifest | +| GET | `/manifests/{id}` | Get a manifest by ID | + +#### Couriers + +| Method | Endpoint | Description | +| ------ | ----------- | ---------------- | +| GET | `/couriers` | Get all couriers | + +#### Address Validations + +| Method | Endpoint | Description | +| ------ | ---------------------- | ---------------------------- | +| POST | `/address-validations` | Create an address validation | + +#### Location + +| Method | Endpoint | Description | +| ------ | ------------ | ------------------------------------------- | +| GET | `/locations` | Get carrier locations (requires production) | + +#### Pickup + +| Method | Endpoint | Description | +| ------ | --------------- | ---------------------------------------------------- | +| GET | `/pickups` | Get pickups | +| POST | `/pickups` | Create a pickup (FedEx, UPS, DHL Express, Purolator) | +| GET | `/pickups/{id}` | Get a pickup by ID | + +#### Cancel Pickups + +| Method | Endpoint | Description | +| ------ | ---------------------- | ---------------------------- | +| GET | `/cancel-pickups` | Get the cancelled pickups | +| POST | `/cancel-pickups` | Cancel a pickup | +| GET | `/cancel-pickups/{id}` | Get a cancelled pickup by ID | + +#### Shipper Accounts + +| Method | Endpoint | Description | +| ------ | ------------------------------------ | ----------------------------------------- | +| GET | `/shipper-accounts` | Get shipper accounts | +| POST | `/shipper-accounts` | Create a shipper account | +| GET | `/shipper-accounts/{id}` | Get a shipper account by ID | +| DELETE | `/shipper-accounts/{id}` | Delete a shipper account | +| PUT | `/shipper-accounts/{id}/info` | Update shipper account's information | +| PUT | `/shipper-accounts/{id}/credentials` | Update shipper account's credentials | +| PUT | `/shipper-accounts/{id}/settings` | Update shipper account's settings (FedEx) | + +### Return + +#### Returns Management + +| Method | Endpoint | Description | +| ------ | --------------------------- | -------------------------------------------- | +| GET | `/returns` | Get returns with optional filtering | +| POST | `/returns` | Create a new return (supports only "Refund") | +| GET | `/returns/{return_id}` | Get return detail by return ID | +| GET | `/returns/rma/{rma_number}` | Get return detail by RMA number | + +#### Return Status Management + +| Method | Endpoint | Description | +| ------ | ----------------------------------- | ---------------------------- | +| POST | `/returns/{return_id}/approve` | Approve return by return ID | +| POST | `/returns/rma/{rma_number}/approve` | Approve return by RMA number | +| POST | `/returns/{return_id}/resolve` | Resolve return by return ID | +| POST | `/returns/rma/{rma_number}/resolve` | Resolve return by RMA number | +| POST | `/returns/{return_id}/reject` | Reject return by return ID | +| POST | `/returns/rma/{rma_number}/reject` | Reject return by RMA number | + +#### Item Management + +| Method | Endpoint | Description | +| ------ | ------------------------------------------- | ---------------------------------------------- | +| POST | `/returns/{return_id}/receive-items` | Record received items by return ID | +| POST | `/returns/rma/{rma_number}/receive-items` | Record received items by RMA number | +| PUT | `/returns/{return_id}/items/{item_id}` | Update return item (tags/images) by return ID | +| PUT | `/returns/rma/{rma_number}/items/{item_id}` | Update return item (tags/images) by RMA number | +| POST | `/returns/{return_id}/remove-items` | Remove items from return by return ID | +| POST | `/returns/rma/{rma_number}/remove-items` | Remove items from return by RMA number | + +#### Shipping Management + +| Method | Endpoint | Description | +| ------ | -------------------------------------------- | ---------------------------------- | +| POST | `/returns/{return_id}/attach-shipments` | Upload shipment info by return ID | +| POST | `/returns/rma/{rma_number}/attach-shipments` | Upload shipment info by RMA number | + +#### Dropoff Management + +| Method | Endpoint | Description | +| ------ | ------------------------------------------------------- | -------------------------------------- | +| POST | `/returns/rma/{rma_number}/dropoffs/{dropoff_id}/drops` | Record dropped-off items (QR dropoffs) | + +#### Utility Endpoints + +| Method | Endpoint | Description | +| ------ | --------------- | ---------------------------------------------------- | +| POST | `/returns/link` | Generate returns page deep link with pre-filled info | +| GET | `/item-tags` | Retrieve all available item tags | diff --git a/docs/versioned_sidebars/version-3.5.0-LTS-sidebars.json b/docs/versioned_sidebars/version-3.5.0-LTS-sidebars.json index 0b08d243b1..efd17122c5 100644 --- a/docs/versioned_sidebars/version-3.5.0-LTS-sidebars.json +++ b/docs/versioned_sidebars/version-3.5.0-LTS-sidebars.json @@ -411,7 +411,8 @@ "marketplace/plugins/marketplace-plugin-azurerepos", "marketplace/plugins/marketplace-plugin-clickup", "marketplace/plugins/marketplace-plugin-prometheus", - "marketplace/plugins/marketplace-plugin-googlecalendar" + "marketplace/plugins/marketplace-plugin-googlecalendar", + "marketplace/plugins/marketplace-plugin-aftership" ] } ] From 23315c57dd13dbc5800318a61858d4547e0f558b Mon Sep 17 00:00:00 2001 From: Souvik Date: Mon, 4 Aug 2025 20:51:07 +0530 Subject: [PATCH 02/13] Automation: update test-system --- .github/workflows/update-test-system.yml | 148 +++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 .github/workflows/update-test-system.yml diff --git a/.github/workflows/update-test-system.yml b/.github/workflows/update-test-system.yml new file mode 100644 index 0000000000..7c2f5eb91f --- /dev/null +++ b/.github/workflows/update-test-system.yml @@ -0,0 +1,148 @@ +name: Manual Build and Deploy + +on: + workflow_dispatch: + inputs: + branch_name: + description: 'Git branch to build from' + required: true + default: 'main' + dockerfile_path: + description: 'Select Dockerfile' + required: true + type: choice + options: + - ./docker/ee/ee-production.Dockerfile + docker_tag: + description: 'Docker tag suffix (e.g., pre-release-14, 3.16-lts, etc.)' + required: true + test_system: + description: 'Select test system' + required: true + type: choice + options: + - app-builder-3.16-lts + - app-builder-pre-release + - platform-3.16-lts + - platform-pre-release + - marketplace-3.16-lts + - marketplace-pre-release + - ai-3.16-lts + - ai-pre-release + + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.branch_name }} + fetch-depth: 0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Generate full Docker tag + id: taggen + run: | + input_tag="${{ github.event.inputs.docker_tag }}" + if [[ "$input_tag" == *"/"* ]]; then + echo "tag=$input_tag" >> $GITHUB_OUTPUT + else + echo "tag=tooljet/tj-osv:$input_tag" >> $GITHUB_OUTPUT + fi + + - name: Build and Push Docker image + uses: docker/build-push-action@v4 + with: + context: . + file: ${{ github.event.inputs.dockerfile_path }} + push: true + tags: ${{ steps.taggen.outputs.tag }} + platforms: linux/amd64 + build-args: | + CUSTOM_GITHUB_TOKEN=${{ secrets.CUSTOM_GITHUB_TOKEN }} + BRANCH_NAME=${{ github.event.inputs.branch_name }} + + - name: Show the full Docker tag + run: echo "✅ Docker image built and pushed:${{ steps.taggen.outputs.tag }}" + + - name: Install SSH and JQ + run: sudo apt-get install -y jq openssh-client + + - name: Determine target host + id: vmhost + run: | + test_system="${{ github.event.inputs.test_system }}" + vm_host=$(echo '${{ secrets.VM_HOST_MAP_JSON }}' | jq -r --arg sys "$test_system" '.[$sys]') + if [[ -z "$vm_host" || "$vm_host" == "null" ]]; then + echo "VM mapping not found for $test_system" + exit 1 + fi + echo "host=$vm_host" >> $GITHUB_OUTPUT + + - name: Deploy to target environment + run: | + echo "$SSH_KEY" > key.pem + chmod 600 key.pem + + TARGET_SYSTEM="${{ github.event.inputs.test_system }}" + if [[ "$TARGET_SYSTEM" == *-3.16-lts ]]; then + REMOTE_DIR="lts-tooljet" + else + REMOTE_DIR="$TARGET_SYSTEM" + fi + + ssh -o StrictHostKeyChecking=no -i key.pem $SSH_USER@${{ steps.vmhost.outputs.host }} << EOF + set -e + cd ~ + echo "📁 Moving to deployment directory: \$REMOTE_DIR" + cd \$REMOTE_DIR + + echo "🔐 Docker login" + echo "${DOCKER_PASSWORD}" | sudo docker login --username "${DOCKER_USERNAME}" --password-stdin + + echo "🛑 Stopping and removing containers" + sudo docker-compose down + + echo "🗑️ Removing previous image" + existing_image=\$(grep TOOLJET_IMAGE .env | cut -d'=' -f2) + if [[ ! -z "\$existing_image" && "\$existing_image" != "${{ steps.taggen.outputs.tag }}" ]]; then + sudo docker rmi -f "\$existing_image" || true + fi + + echo "📝 Updating .env with new image" + sudo sed -i "s|^TOOLJET_IMAGE=.*|TOOLJET_IMAGE=${{ steps.taggen.outputs.tag }}|" .env + + echo "📥 Pulling latest image" + sudo docker pull "${{ steps.taggen.outputs.tag }}" + + echo "🚀 Starting container" + sudo docker-compose up -d + + echo "⏳ Waiting for container readiness" + timeout 240 bash -c ' + until docker logs Tooljet-app 2>&1 | grep -q "Ready to use at http://localhost:80"; do + sleep 2 + done + ' + + echo "🧹 Pruning old Docker images" + sudo docker image prune -f + + echo "✅ Deployment successful!" + EOF + env: + SSH_USER: ${{ secrets.AZURE_VM_USER }} + SSH_KEY: ${{ secrets.AZURE_VM_KEY }} + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} \ No newline at end of file From a4ff31790106614885e3366086b6898bf271711c Mon Sep 17 00:00:00 2001 From: rudrapratik30 Date: Fri, 8 Aug 2025 18:59:45 +0530 Subject: [PATCH 03/13] replicate 3.16 --- .../marketplace/marketplace_overview.md | 2 + .../marketplace/plugins/aftership.md | 185 ++++++++++++++++++ .../version-3.16.0-LTS-sidebars.json | 3 +- 3 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/aftership.md diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/marketplace_overview.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/marketplace_overview.md index 736fa4755f..d9dc82df86 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/marketplace_overview.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/marketplace_overview.md @@ -55,6 +55,8 @@ To remove a plugin, follow these steps: - On the `Installed` page, click on the `Remove` button of the related plugin that you wish to remove. ## Available Plugins + +- **[Aftership](/docs/marketplace/plugins/marketplace-plugin-aftership)** - **[Anthropic](/docs/marketplace/plugins/marketplace-plugin-anthropic)** - **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-awsredshift)** - **[AWS Textract](/docs/marketplace/plugins/marketplace-plugin-textract)** diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/aftership.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/aftership.md new file mode 100644 index 0000000000..e9aa0aff59 --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/aftership.md @@ -0,0 +1,185 @@ +--- +id: marketplace-plugin-aftership +title: Aftership +--- + +Integrating AfterShip with ToolJet enables teams to build custom internal tools for tracking and managing shipments in real time. With this integration, you can fetch delivery statuses, monitor carrier updates, and centralize logistics data within your ToolJet application, streamlining operations and improving customer support efficiency. + +## Connection + +To connect AfterShip with ToolJet you will need the API Key, which you can generate from [Aftership Tracking API](https://www.aftership.com/tracking-api). + +Aftership Configuration + +## Supported Operations + +### Tracking + +#### Basic Tracking Operations + +| Method | Endpoint | Description | +| ------ | ------------ | --------------------------- | +| GET | `/trackings` | Retrieve list of trackings. | +| POST | `/trackings` | Create a new tracking. | +| GET | `/couriers` | Get supported courier list. | + +#### ID + +| Method | Endpoint | Description | +| ------ | ----------------------------------- | ---------------------------- | +| GET | `/trackings/{id}` | Get tracking by ID. | +| PUT | `/trackings/{id}` | Update tracking by ID. | +| DELETE | `/trackings/{id}` | Delete tracking by ID. | +| POST | `/trackings/{id}/retrack` | Retrack an expired tracking. | +| POST | `/trackings/{id}/mark-as-completed` | Mark tracking as completed. | + +#### Detect + +| Method | Endpoint | Description | +| ------ | ------------------ | ---------------------------------- | +| POST | `/couriers/detect` | Detect courier by tracking number. | + +#### All + +| Method | Endpoint | Description | +| ------ | ------------------ | ---------------------------------- | +| GET | `/couriers/all` | Get all available couriers. | + +#### Predict Batch + +| Method | Endpoint | Description | +| ------ | ---------------------------------------- | ------------------------------------- | +| POST | `/estimated-delivery-date/predict-batch` | Predict estimated delivery for batch. | + +### Shipping + +#### Labels + +| Method | Endpoint | Description | +| ------ | -------------- | ----------------- | +| GET | `/labels` | Get labels | +| POST | `/labels` | Create a label | +| GET | `/labels/{id}` | Get a label by ID | + +#### Cancel Labels + +| Method | Endpoint | Description | +| ------ | --------------------- | --------------------------- | +| GET | `/cancel-labels` | Get the cancelled labels | +| POST | `/cancel-labels` | Cancel a label | +| GET | `/cancel-labels/{id}` | Get a cancelled label by ID | + +#### Rates + +| Method | Endpoint | Description | +| ------ | ------------- | ---------------- | +| GET | `/rates` | Get rates | +| POST | `/rates` | Calculate rates | +| GET | `/rates/{id}` | Get a rate by ID | + +#### Manifests + +| Method | Endpoint | Description | +| ------ | ----------------- | -------------------- | +| GET | `/manifests` | Get manifests | +| POST | `/manifests` | Create a manifest | +| GET | `/manifests/{id}` | Get a manifest by ID | + +#### Couriers + +| Method | Endpoint | Description | +| ------ | ----------- | ---------------- | +| GET | `/couriers` | Get all couriers | + +#### Address Validations + +| Method | Endpoint | Description | +| ------ | ---------------------- | ---------------------------- | +| POST | `/address-validations` | Create an address validation | + +#### Location + +| Method | Endpoint | Description | +| ------ | ------------ | ------------------------------------------- | +| GET | `/locations` | Get carrier locations (requires production) | + +#### Pickup + +| Method | Endpoint | Description | +| ------ | --------------- | ---------------------------------------------------- | +| GET | `/pickups` | Get pickups | +| POST | `/pickups` | Create a pickup (FedEx, UPS, DHL Express, Purolator) | +| GET | `/pickups/{id}` | Get a pickup by ID | + +#### Cancel Pickups + +| Method | Endpoint | Description | +| ------ | ---------------------- | ---------------------------- | +| GET | `/cancel-pickups` | Get the cancelled pickups | +| POST | `/cancel-pickups` | Cancel a pickup | +| GET | `/cancel-pickups/{id}` | Get a cancelled pickup by ID | + +#### Shipper Accounts + +| Method | Endpoint | Description | +| ------ | ------------------------------------ | ----------------------------------------- | +| GET | `/shipper-accounts` | Get shipper accounts | +| POST | `/shipper-accounts` | Create a shipper account | +| GET | `/shipper-accounts/{id}` | Get a shipper account by ID | +| DELETE | `/shipper-accounts/{id}` | Delete a shipper account | +| PUT | `/shipper-accounts/{id}/info` | Update shipper account's information | +| PUT | `/shipper-accounts/{id}/credentials` | Update shipper account's credentials | +| PUT | `/shipper-accounts/{id}/settings` | Update shipper account's settings (FedEx) | + +### Return + +#### Returns Management + +| Method | Endpoint | Description | +| ------ | --------------------------- | -------------------------------------------- | +| GET | `/returns` | Get returns with optional filtering | +| POST | `/returns` | Create a new return (supports only "Refund") | +| GET | `/returns/{return_id}` | Get return detail by return ID | +| GET | `/returns/rma/{rma_number}` | Get return detail by RMA number | + +#### Return Status Management + +| Method | Endpoint | Description | +| ------ | ----------------------------------- | ---------------------------- | +| POST | `/returns/{return_id}/approve` | Approve return by return ID | +| POST | `/returns/rma/{rma_number}/approve` | Approve return by RMA number | +| POST | `/returns/{return_id}/resolve` | Resolve return by return ID | +| POST | `/returns/rma/{rma_number}/resolve` | Resolve return by RMA number | +| POST | `/returns/{return_id}/reject` | Reject return by return ID | +| POST | `/returns/rma/{rma_number}/reject` | Reject return by RMA number | + +#### Item Management + +| Method | Endpoint | Description | +| ------ | ------------------------------------------- | ---------------------------------------------- | +| POST | `/returns/{return_id}/receive-items` | Record received items by return ID | +| POST | `/returns/rma/{rma_number}/receive-items` | Record received items by RMA number | +| PUT | `/returns/{return_id}/items/{item_id}` | Update return item (tags/images) by return ID | +| PUT | `/returns/rma/{rma_number}/items/{item_id}` | Update return item (tags/images) by RMA number | +| POST | `/returns/{return_id}/remove-items` | Remove items from return by return ID | +| POST | `/returns/rma/{rma_number}/remove-items` | Remove items from return by RMA number | + +#### Shipping Management + +| Method | Endpoint | Description | +| ------ | -------------------------------------------- | ---------------------------------- | +| POST | `/returns/{return_id}/attach-shipments` | Upload shipment info by return ID | +| POST | `/returns/rma/{rma_number}/attach-shipments` | Upload shipment info by RMA number | + +#### Dropoff Management + +| Method | Endpoint | Description | +| ------ | ------------------------------------------------------- | -------------------------------------- | +| POST | `/returns/rma/{rma_number}/dropoffs/{dropoff_id}/drops` | Record dropped-off items (QR dropoffs) | + +#### Utility Endpoints + +| Method | Endpoint | Description | +| ------ | --------------- | ---------------------------------------------------- | +| POST | `/returns/link` | Generate returns page deep link with pre-filled info | +| GET | `/item-tags` | Retrieve all available item tags | diff --git a/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json b/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json index bfe255d6bc..885725b5e9 100644 --- a/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json +++ b/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json @@ -426,7 +426,8 @@ "marketplace/plugins/marketplace-plugin-weaviate", "marketplace/plugins/marketplace-plugin-qdrant", "marketplace/plugins/marketplace-plugin-azurerepos", - "marketplace/plugins/marketplace-plugin-googlecalendar" + "marketplace/plugins/marketplace-plugin-googlecalendar", + "marketplace/plugins/marketplace-plugin-aftership" ] } ] From 751eaaa56bd5113f48d3024312b8b95e6b7b746a Mon Sep 17 00:00:00 2001 From: Souvik Date: Mon, 11 Aug 2025 12:25:30 +0530 Subject: [PATCH 04/13] Updates added --- .github/workflows/update-test-system.yml | 212 ++++++++++++++++++----- 1 file changed, 165 insertions(+), 47 deletions(-) diff --git a/.github/workflows/update-test-system.yml b/.github/workflows/update-test-system.yml index 7c2f5eb91f..546e1b3e52 100644 --- a/.github/workflows/update-test-system.yml +++ b/.github/workflows/update-test-system.yml @@ -12,7 +12,8 @@ on: required: true type: choice options: - - ./docker/ee/ee-production.Dockerfile + - ./docker/LTS/ee/ee-production.Dockerfile + - ./docker/pre-release/ee/ee-production.Dockerfile docker_tag: description: 'Docker tag suffix (e.g., pre-release-14, 3.16-lts, etc.)' required: true @@ -30,12 +31,46 @@ on: - ai-3.16-lts - ai-pre-release - jobs: build-and-deploy: runs-on: ubuntu-latest steps: + - name: ✅ Check user authorization + run: | + # Define allowed users + allowed_users=( + "${{ secrets.ALLOWED_USER1_USERNAME }}" + "${{ secrets.ALLOWED_USER2_USERNAME }}" + "${{ secrets.ALLOWED_USER3_USERNAME }}" + "${{ secrets.ALLOWED_USER4_USERNAME }}" + "${{ secrets.ALLOWED_USER5_USERNAME }}" + "${{ secrets.ALLOWED_USER6_USERNAME }}" + "${{ secrets.ALLOWED_USER7_USERNAME }}" + "${{ secrets.ALLOWED_USER8_USERNAME }}" + "${{ secrets.ALLOWED_USER9_USERNAME }}" + "${{ secrets.ALLOWED_USER10_USERNAME }}" + "${{ secrets.ALLOWED_USER11_USERNAME }}" + ) + + current_user="${{ github.actor }}" + authorized=false + + for user in "${allowed_users[@]}"; do + if [[ "$current_user" == "$user" ]]; then + authorized=true + break + fi + done + + if [[ "$authorized" == "false" ]]; then + echo "❌ User '$current_user' is not authorized to trigger this workflow." + echo "Authorized users: QA Team (Midhun, Ajith, Yukti Goyal, Mekhla Abhishek Asopa, Mani), DevOps Team (Adish, Souvik), Dev Team (Midhun G S, Akshay, Johnson, Kavin)" + exit 1 + else + echo "✅ User '$current_user' is authorized." + fi + - name: Checkout code uses: actions/checkout@v4 with: @@ -84,65 +119,148 @@ jobs: run: | test_system="${{ github.event.inputs.test_system }}" vm_host=$(echo '${{ secrets.VM_HOST_MAP_JSON }}' | jq -r --arg sys "$test_system" '.[$sys]') + if [[ -z "$vm_host" || "$vm_host" == "null" ]]; then echo "VM mapping not found for $test_system" exit 1 fi + echo "host=$vm_host" >> $GITHUB_OUTPUT - name: Deploy to target environment run: | echo "$SSH_KEY" > key.pem chmod 600 key.pem - + + IMAGE_TAG="${{ steps.taggen.outputs.tag }}" TARGET_SYSTEM="${{ github.event.inputs.test_system }}" - if [[ "$TARGET_SYSTEM" == *-3.16-lts ]]; then - REMOTE_DIR="lts-tooljet" - else - REMOTE_DIR="$TARGET_SYSTEM" - fi - + + # Debug: Show what we're deploying + echo "DEBUG: IMAGE_TAG=$IMAGE_TAG" + echo "DEBUG: TARGET_SYSTEM=$TARGET_SYSTEM" + ssh -o StrictHostKeyChecking=no -i key.pem $SSH_USER@${{ steps.vmhost.outputs.host }} << EOF - set -e - cd ~ - echo "📁 Moving to deployment directory: \$REMOTE_DIR" - cd \$REMOTE_DIR - - echo "🔐 Docker login" - echo "${DOCKER_PASSWORD}" | sudo docker login --username "${DOCKER_USERNAME}" --password-stdin - - echo "🛑 Stopping and removing containers" - sudo docker-compose down - - echo "🗑️ Removing previous image" - existing_image=\$(grep TOOLJET_IMAGE .env | cut -d'=' -f2) - if [[ ! -z "\$existing_image" && "\$existing_image" != "${{ steps.taggen.outputs.tag }}" ]]; then - sudo docker rmi -f "\$existing_image" || true + set -e + + IMAGE_TAG="$IMAGE_TAG" + TARGET_SYSTEM="$TARGET_SYSTEM" + + cd ~ + echo "📁 Finding correct deployment directory" + + # Debug: Show variables on remote host + echo "Debug on remote: IMAGE_TAG=\$IMAGE_TAG" + echo "Debug on remote: TARGET_SYSTEM=\$TARGET_SYSTEM" + + if [[ "\$TARGET_SYSTEM" == *-3.16-lts ]]; then + echo "Detected LTS system: \$TARGET_SYSTEM" + echo "🔍 Searching for LTS directories..." + + # Find LTS directories dynamically + LTS_DIRS=\$(ls -1d ./*-lts 2>/dev/null | grep -E '[0-9]+\.[0-9]+' | sed 's|^\./||' | sort -V; \\ + ls -1d ./*-lts 2>/dev/null | grep -Ev '[0-9]+\.[0-9]+' | sed 's|^\./||' | sort) + + if [[ -z "\$LTS_DIRS" ]]; then + echo "❌ No LTS directories found!" + echo "Available directories:" + ls -la | grep "^d" + exit 1 fi - - echo "📝 Updating .env with new image" - sudo sed -i "s|^TOOLJET_IMAGE=.*|TOOLJET_IMAGE=${{ steps.taggen.outputs.tag }}|" .env - - echo "📥 Pulling latest image" - sudo docker pull "${{ steps.taggen.outputs.tag }}" - - echo "🚀 Starting container" + + echo "Available LTS directories:" + echo "\$LTS_DIRS" + + # Choose the first available LTS directory + SELECTED_LTS_DIR=\$(echo "\$LTS_DIRS" | head -n 1) + + echo "📂 Selected LTS directory: \$SELECTED_LTS_DIR" + cd "\$SELECTED_LTS_DIR" + echo "✅ Now in directory: \$(pwd)" + else + echo "Detected pre-release system: \$TARGET_SYSTEM" + echo "📂 Moving to target directory: \$TARGET_SYSTEM" + cd ~ + echo "✅ Now in directory: \$(pwd)" + fi + + echo "🔐 Docker login" + echo "${{ secrets.DOCKER_PASSWORD }}" | sudo docker login --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin + + echo "current image" + cat .env | grep TOOLJET_IMAGE + + echo "📦 Reading current TOOLJET_IMAGE from .env" + CURRENT_IMAGE=\$(grep '^TOOLJET_IMAGE=' .env | cut -d '=' -f2- | tr -d '"' | tr -d "'") + echo "Found CURRENT_IMAGE: \$CURRENT_IMAGE" + + echo "🛑 Stopping containers" + sudo docker-compose down + + echo "📝 Updating .env with new image" + sudo sed -i "s|^TOOLJET_IMAGE=.*|TOOLJET_IMAGE=\$IMAGE_TAG|" .env + + echo "📥 Pulling new image: \$IMAGE_TAG" + if [ -z "\$IMAGE_TAG" ]; then + echo "❌ IMAGE_TAG is empty!" + exit 1 + fi + sudo docker pull "\$IMAGE_TAG" + + echo "🚀 Starting container in background" + sudo docker-compose up -d + + # Wait for ToolJet to start and show success message + echo "⏳ Waiting for ToolJet to start (timeout: 300 seconds)..." + SUCCESS_FOUND=false + TIMEOUT=300 + ELAPSED=0 + + while [ \$ELAPSED -lt \$TIMEOUT ]; do + # Check for success message in logs + if sudo docker-compose logs 2>/dev/null | grep -qE "🚀 TOOLJET APPLICATION STARTED SUCCESSFULLY|Ready to use at http://localhost:82 🚀|Ready to use at http://localhost:80"; then + echo "✅ Found success message in logs!" + SUCCESS_FOUND=true + break + fi + + echo "⏳ Still waiting... (\${ELAPSED}s elapsed)" + sleep 10 + ELAPSED=\$((ELAPSED + 10)) + done + + if [ "\$SUCCESS_FOUND" = false ]; then + echo "❌ Timeout reached without finding success logs" + echo "📄 Showing current logs for troubleshooting..." + sudo docker-compose logs --tail=50 + echo "" + echo "=== CONTAINER STATUS ===" + sudo docker-compose ps + echo "" + + echo "🛑 Starting rollback process..." + sudo docker-compose down + + echo "🔄 Reverting to previous image: \$CURRENT_IMAGE" + sudo sed -i "s|^TOOLJET_IMAGE=.*|TOOLJET_IMAGE=\$CURRENT_IMAGE|" .env + + echo "🔄 Starting previous image..." sudo docker-compose up -d - - echo "⏳ Waiting for container readiness" - timeout 240 bash -c ' - until docker logs Tooljet-app 2>&1 | grep -q "Ready to use at http://localhost:80"; do - sleep 2 - done - ' - - echo "🧹 Pruning old Docker images" - sudo docker image prune -f - - echo "✅ Deployment successful!" + echo "✅ Rollback completed!" + exit 1 + fi + + echo "✅ Deployment successful!" + + echo "📌 Storing successful deployment info in .env" + sudo sed -i "/^OLD_IMAGE=/d" .env + echo "OLD_IMAGE=\$CURRENT_IMAGE" | sudo tee -a .env + echo "📄 Final application logs:" + sudo docker-compose logs --tail=50 + + echo "🧹 Pruning old Docker images" + sudo docker image prune -a -f + EOF env: SSH_USER: ${{ secrets.AZURE_VM_USER }} - SSH_KEY: ${{ secrets.AZURE_VM_KEY }} - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} \ No newline at end of file + SSH_KEY: ${{ secrets.AZURE_VM_KEY }} \ No newline at end of file From c22ae7f49504da2b0f538e754297bc3961ebc8bc Mon Sep 17 00:00:00 2001 From: rudrapratik30 Date: Mon, 11 Aug 2025 17:11:55 +0530 Subject: [PATCH 05/13] aftershipppppp --- .../version-3.16.0-LTS/marketplace/marketplace_overview.md | 2 +- .../version-3.16.0-LTS/marketplace/plugins/aftership.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/marketplace_overview.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/marketplace_overview.md index d9dc82df86..1d50abeb8f 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/marketplace_overview.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/marketplace_overview.md @@ -56,7 +56,7 @@ To remove a plugin, follow these steps: ## Available Plugins -- **[Aftership](/docs/marketplace/plugins/marketplace-plugin-aftership)** +- **[AfterShip](/docs/marketplace/plugins/marketplace-plugin-aftership)** - **[Anthropic](/docs/marketplace/plugins/marketplace-plugin-anthropic)** - **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-awsredshift)** - **[AWS Textract](/docs/marketplace/plugins/marketplace-plugin-textract)** diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/aftership.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/aftership.md index e9aa0aff59..1a60872a1e 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/aftership.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/aftership.md @@ -1,6 +1,6 @@ --- id: marketplace-plugin-aftership -title: Aftership +title: AfterShip --- Integrating AfterShip with ToolJet enables teams to build custom internal tools for tracking and managing shipments in real time. With this integration, you can fetch delivery statuses, monitor carrier updates, and centralize logistics data within your ToolJet application, streamlining operations and improving customer support efficiency. From 77af1217be37e45b33d7717e33b2306a0fc942d1 Mon Sep 17 00:00:00 2001 From: Adish M <44204658+adishM98@users.noreply.github.com> Date: Tue, 12 Aug 2025 12:59:22 +0530 Subject: [PATCH 06/13] Fix EOF --- .github/workflows/update-test-system.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-test-system.yml b/.github/workflows/update-test-system.yml index 546e1b3e52..5517133021 100644 --- a/.github/workflows/update-test-system.yml +++ b/.github/workflows/update-test-system.yml @@ -263,4 +263,5 @@ jobs: EOF env: SSH_USER: ${{ secrets.AZURE_VM_USER }} - SSH_KEY: ${{ secrets.AZURE_VM_KEY }} \ No newline at end of file + SSH_KEY: ${{ secrets.AZURE_VM_KEY }} + From 14b3318b348e35fc7ea855c08bfd33ffed5f2eb8 Mon Sep 17 00:00:00 2001 From: Adish M <44204658+adishM98@users.noreply.github.com> Date: Tue, 12 Aug 2025 16:31:16 +0530 Subject: [PATCH 07/13] updated the allow username to avoid conflict with existing secrets --- .github/workflows/update-test-system.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/update-test-system.yml b/.github/workflows/update-test-system.yml index 5517133021..e015716e09 100644 --- a/.github/workflows/update-test-system.yml +++ b/.github/workflows/update-test-system.yml @@ -40,17 +40,17 @@ jobs: run: | # Define allowed users allowed_users=( - "${{ secrets.ALLOWED_USER1_USERNAME }}" - "${{ secrets.ALLOWED_USER2_USERNAME }}" - "${{ secrets.ALLOWED_USER3_USERNAME }}" - "${{ secrets.ALLOWED_USER4_USERNAME }}" - "${{ secrets.ALLOWED_USER5_USERNAME }}" - "${{ secrets.ALLOWED_USER6_USERNAME }}" - "${{ secrets.ALLOWED_USER7_USERNAME }}" - "${{ secrets.ALLOWED_USER8_USERNAME }}" - "${{ secrets.ALLOWED_USER9_USERNAME }}" - "${{ secrets.ALLOWED_USER10_USERNAME }}" - "${{ secrets.ALLOWED_USER11_USERNAME }}" + "${{ secrets.ALLOWED_USER1_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER2_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER3_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER4_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER5_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER6_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER7_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER8_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER9_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER10_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER11_TEST_SYSTEM }}" ) current_user="${{ github.actor }}" From 1246f23fc62b2b9549b74054afc6beb4cba2be7c Mon Sep 17 00:00:00 2001 From: Adish M <44204658+adishM98@users.noreply.github.com> Date: Tue, 12 Aug 2025 16:46:20 +0530 Subject: [PATCH 08/13] Update update-test-system.yml --- .github/workflows/update-test-system.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-test-system.yml b/.github/workflows/update-test-system.yml index e015716e09..f938cabafa 100644 --- a/.github/workflows/update-test-system.yml +++ b/.github/workflows/update-test-system.yml @@ -1,4 +1,4 @@ -name: Manual Build and Deploy +name: Update test system (LTS and pre-release) on: workflow_dispatch: From a7195b588e68c28cd3c000506f6086bf734b941f Mon Sep 17 00:00:00 2001 From: Adish M <44204658+adishM98@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:47:37 +0530 Subject: [PATCH 09/13] Update manual-docker-build.yml --- .github/workflows/manual-docker-build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/manual-docker-build.yml b/.github/workflows/manual-docker-build.yml index 5e8d4c8ca5..c2d8251318 100644 --- a/.github/workflows/manual-docker-build.yml +++ b/.github/workflows/manual-docker-build.yml @@ -10,6 +10,10 @@ on: dockerfile_path: description: 'Path to Dockerfile' required: true + type: choice + options: + - ./docker/LTS/ee/ee-production.Dockerfile + - ./docker/pre-release/ee/ee-production.Dockerfile docker_tag: description: 'Docker tag suffix (e.g., pre-release-14)' required: true From 67548b68f0f943162a6e198953cd2d82b35322d4 Mon Sep 17 00:00:00 2001 From: Souvik Date: Tue, 12 Aug 2025 18:26:50 +0530 Subject: [PATCH 10/13] added fix --- .github/workflows/update-test-system.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-test-system.yml b/.github/workflows/update-test-system.yml index f938cabafa..ac5554040f 100644 --- a/.github/workflows/update-test-system.yml +++ b/.github/workflows/update-test-system.yml @@ -51,6 +51,7 @@ jobs: "${{ secrets.ALLOWED_USER9_TEST_SYSTEM }}" "${{ secrets.ALLOWED_USER10_TEST_SYSTEM }}" "${{ secrets.ALLOWED_USER11_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER12_TEST_SYSTEM }}" ) current_user="${{ github.actor }}" @@ -65,7 +66,6 @@ jobs: if [[ "$authorized" == "false" ]]; then echo "❌ User '$current_user' is not authorized to trigger this workflow." - echo "Authorized users: QA Team (Midhun, Ajith, Yukti Goyal, Mekhla Abhishek Asopa, Mani), DevOps Team (Adish, Souvik), Dev Team (Midhun G S, Akshay, Johnson, Kavin)" exit 1 else echo "✅ User '$current_user' is authorized." From 855ab19f4a42665679f54d1e5bddf1135b4e63f4 Mon Sep 17 00:00:00 2001 From: Pratik Agrawal Date: Wed, 13 Aug 2025 11:55:37 +0530 Subject: [PATCH 11/13] [docs]: Microsoft Graph (#13554) * [wip] microsoft graph * [docs]: Microsoft Graph * replicate to 3.5 * replicate 3.16 --- docs/docs/marketplace/marketplace_overview.md | 1 + .../marketplace/plugins/microsoft-graph.md | 231 ++++++++++++++++++ docs/sidebars.js | 3 +- .../plugins/microsoft-graph/connection.png | Bin 0 -> 176348 bytes .../marketplace/marketplace_overview.md | 1 + .../marketplace/plugins/microsoft-graph.md | 231 ++++++++++++++++++ .../marketplace/marketplace_overview.md | 1 + .../marketplace/plugins/microsoft-graph.md | 231 ++++++++++++++++++ .../version-3.16.0-LTS-sidebars.json | 3 +- .../version-3.5.0-LTS-sidebars.json | 3 +- 10 files changed, 702 insertions(+), 3 deletions(-) create mode 100644 docs/docs/marketplace/plugins/microsoft-graph.md create mode 100644 docs/static/img/marketplace/plugins/microsoft-graph/connection.png create mode 100644 docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/microsoft-graph.md create mode 100644 docs/versioned_docs/version-3.5.0-LTS/marketplace/plugins/microsoft-graph.md diff --git a/docs/docs/marketplace/marketplace_overview.md b/docs/docs/marketplace/marketplace_overview.md index 736fa4755f..31914da7a3 100644 --- a/docs/docs/marketplace/marketplace_overview.md +++ b/docs/docs/marketplace/marketplace_overview.md @@ -67,6 +67,7 @@ To remove a plugin, follow these steps: - **[HarperDB](/docs/marketplace/plugins/marketplace-plugin-harperdb)** - **[Hugging Face](/docs/marketplace/plugins/marketplace-plugin-hugging_face)** - **[Jira](/docs/marketplace/plugins/marketplace-plugin-jira)** +- **[Microsoft Graph](/docs/marketplace/plugins/marketplace-plugin-microsoft_graph)** - **[Mistral AI](/docs/marketplace/plugins/marketplace-plugin-mistral_ai)** - **[OpenAI](/docs/marketplace/plugins/marketplace-plugin-openai)** - **[Pinecone](/docs/marketplace/plugins/marketplace-plugin-pinecone)** diff --git a/docs/docs/marketplace/plugins/microsoft-graph.md b/docs/docs/marketplace/plugins/microsoft-graph.md new file mode 100644 index 0000000000..415c22623b --- /dev/null +++ b/docs/docs/marketplace/plugins/microsoft-graph.md @@ -0,0 +1,231 @@ +--- +id: marketplace-plugin-microsoft_graph +title: Microsoft Graph +--- + +By integrating Microsoft Graph with ToolJet, you can interact with Microsoft 365 services such as Outlook Mail, Calendar, Users, and OneDrive. + +## Connection + +To connect ToolJet with Microsoft Graph, you’ll need the following credentials: + +- Tenant +- Access token URL +- Client ID +- Client secret + +Follow this [Microsoft guide](https://learn.microsoft.com/en-us/graph/auth-register-app-v2) to register an app and generate the required credentials. + +You can enable the **Authentication required for all users** toggle in the configuration panel. When enabled, each user will be redirected to the OAuth consent screen the first time a query from this data source is triggered in your application. This ensures that every user connects with their own Microsoft account securely. + +**Note**: After completing the OAuth flow, the query must be triggered again to fetch data from Microsoft Graph. + +Microsoft Graph Configuration + +## Supported Operations + +### Outlook + +#### Messages + +| Method | Endpoint | Description | +| ------ | ------------------------------------------ | ------------------------------------ | +| GET | `/me/messages` | List messages in the user's mailbox. | +| POST | `/me/messages` | Create a new draft message. | +| GET | `/me/messages/{message-id}` | Get a specific message by ID. | +| PATCH | `/me/messages/{message-id}` | Update a message. | +| DELETE | `/me/messages/{message-id}` | Delete a message. | +| POST | `/me/messages/{message-id}/forward` | Forward an existing message. | +| POST | `/me/messages/{message-id}/createForward` | Create a forward draft. | +| POST | `/me/messages/{message-id}/reply` | Reply to a message. | +| POST | `/me/messages/{message-id}/createReply` | Create a reply draft. | +| POST | `/me/messages/{message-id}/replyAll` | Reply all to a message. | +| POST | `/me/messages/{message-id}/createReplyAll` | Create a reply-all draft. | +| POST | `/me/messages/{message-id}/send` | Send a draft message. | +| POST | `/me/messages/{message-id}/move` | Move a message. | +| POST | `/me/messages/{message-id}/copy` | Copy a message. | +| POST | `/me/sendMail` | Send mail without creating a draft. | + +#### Mail Folders + +| Method | Endpoint | Description | +| ------ | ------------------------------------------------ | ------------------------------------- | +| GET | `/me/mailFolders` | List mail folders. | +| POST | `/me/mailFolders` | Create a mail folder. | +| GET | `/me/mailFolders/{mailFolder-id}` | Get specific mail folder. | +| PATCH | `/me/mailFolders/{mailFolder-id}` | Update a mail folder. | +| DELETE | `/me/mailFolders/{mailFolder-id}` | Delete a mail folder. | +| GET | `/me/mailFolders/{mailFolder-id}/messages` | List messages inside a folder. | +| GET | `/me/mailFolders/Inbox/messages/delta` | Track changes to inbox messages. | +| GET | `/me/mailFolders/{mailFolder-id}/messages/delta` | Track changes to a folder's messages. | +| GET | `/me/mailFolders/delta` | Track changes to all folders. | + +#### Categories and Rooms + +| Method | API Endpoint | Description | +| ------ | --------------------------------------------------- | ----------------------- | +| GET | `/me/outlook/masterCategories` | List master categories | +| POST | `/me/outlook/masterCategories` | Create a new category | +| GET | `/me/outlook/masterCategories/{outlookCategory-id}` | Get a specific category | +| PATCH | `/me/outlook/masterCategories/{outlookCategory-id}` | Update a category | +| DELETE | `/me/outlook/masterCategories/{outlookCategory-id}` | Delete a category | +| GET | `/me/findRooms` | List available rooms | +| GET | `/me/findRooms(RoomList='{roomList-emailAddress}')` | Find rooms by room list | +| GET | `/me/findRoomLists` | List room lists | + +### Calendar + +#### Default Calendar + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------- | ------------------------------------- | +| GET | `/me/calendar` | Get default calendar | +| PATCH | `/me/calendar` | Update default calendar | +| GET | `/me/calendar/events` | List events from default calendar | +| POST | `/me/calendar/events` | Create an event in default calendar | +| GET | `/me/calendar/calendarPermissions` | List calendar permissions | +| POST | `/me/calendar/calendarPermissions` | Grant permissions to default calendar | +| GET | `/me/calendar/calendarPermissions/{permissionId}` | Get specific calendar permission | +| PATCH | `/me/calendar/calendarPermissions/{permissionId}` | Update calendar permission | +| DELETE | `/me/calendar/calendarPermissions/{permissionId}` | Delete calendar permission | +| POST | `/me/calendar/getSchedule` | Get free/busy schedule info | + +#### User Calendars and Groups + +| Method | API Endpoint | Description | +| ------ | ---------------------------------------- | --------------------------------------- | +| GET | `/user/{userId}/calendar` | Get default calendar of a specific user | +| GET | `/me/calendars` | List user calendars | +| POST | `/me/calendars` | Create a new calendar | +| GET | `/me/calendars/{calendarId}` | Get a specific calendar | +| PATCH | `/me/calendars/{calendarId}` | Update a calendar | +| DELETE | `/me/calendars/{calendarId}` | Delete a calendar | +| GET | `/me/calendars/{calendarId}/events` | List events in a specific calendar | +| POST | `/me/calendars/{calendarId}/events` | Create event in a specific calendar | +| GET | `/me/calendarGroups` | List calendar groups | +| POST | `/me/calendarGroups` | Create a calendar group | +| GET | `/me/calendarGroups/{groupId}/calendars` | Get calendars in a group | +| POST | `/me/calendarGroups/{groupId}/calendars` | Add calendar to a group | + +#### Events + +| Method | API Endpoint | Description | +| ------ | ---------------------------------- | ----------------------------------- | +| GET | `/me/events/{eventId}` | Get an event by ID | +| PATCH | `/me/events/{eventId}` | Update an event | +| DELETE | `/me/events/{eventId}` | Delete an event | +| GET | `/me/events/{eventId}/instances` | List instances of a recurring event | +| GET | `/me/events/{eventId}/attachments` | List attachments of an event | +| POST | `/me/events/{eventId}/attachments` | Add attachments to an event | +| GET | `/me/calendarView` | Get calendar view of events | +| POST | `/me/findMeetingTimes` | Find meeting times | + +### Users + +#### User Management + +| Method | API Endpoint | Description | +| ------ | ------------------ | ---------------------- | +| GET | `/users` | List all users | +| POST | `/users` | Create a user | +| GET | `/users/{user-id}` | Get a specific user | +| PATCH | `/users/{user-id}` | Update a specific user | +| DELETE | `/users/{user-id}` | Delete a specific user | + +#### Profile + +| Method | API Endpoint | Description | +| ------ | ------------ | -------------------------------- | +| GET | `/me` | Get profile of signed-in user | +| PATCH | `/me` | Update profile of signed-in user | + +### Teams + +#### Teams and Chats + +| Method | API Endpoint | Description | +| ------ | ----------------- | ------------------------------ | +| GET | `/teams` | List teams | +| POST | `/teams` | Create a team | +| GET | `/chats` | List chats | +| POST | `/chats` | Create a chat | +| GET | `/me/joinedTeams` | List teams the user has joined | + +#### Chat Operations + +| Method | API Endpoint | Description | +| ------ | -------------------------------------------------- | -------------------------------- | +| GET | `/chats/{chat-id}` | Get a chat | +| PATCH | `/chats/{chat-id}` | Update a chat | +| DELETE | `/chats/{chat-id}` | Delete a chat | +| GET | `/chats/{chat-id}/members` | List members in a chat | +| POST | `/chats/{chat-id}/members` | Add members to a chat | +| POST | `/chats/{chat-id}/members/add` | Add members (alternate endpoint) | +| GET | `/chats/{chat-id}/members/{conversationMember-id}` | Get chat member details | +| PATCH | `/chats/{chat-id}/members/{conversationMember-id}` | Update chat member | +| DELETE | `/chats/{chat-id}/members/{conversationMember-id}` | Remove chat member | +| GET | `/chats/{chat-id}/messages` | List messages in a chat | +| POST | `/chats/{chat-id}/messages` | Send message in a chat | +| GET | `/chats/{chat-id}/messages/{chatMessage-id}` | Get a specific chat message | +| PATCH | `/chats/{chat-id}/messages/{chatMessage-id}` | Update a chat message | +| DELETE | `/chats/{chat-id}/messages/{chatMessage-id}` | Delete a chat message | +| GET | `/chats/getAllMessages` | Get all messages across chats | + +#### Team Operation + +| Method | API Endpoint | Description | +| ------ | ------------------------------ | -------------------------------- | +| GET | `/teams/{team-id}` | Get a team | +| PATCH | `/teams/{team-id}` | Update a team | +| DELETE | `/teams/{team-id}` | Delete a team | +| POST | `/teams/{team-id}/archive` | Archive a team | +| POST | `/teams/{team-id}/unarchive` | Unarchive a team | +| GET | `/teams/{team-id}/members` | List team members | +| POST | `/teams/{team-id}/members` | Add team members | +| POST | `/teams/{team-id}/members/add` | Add members (alternate endpoint) | + +#### Channels and Messages + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------------------------ | --------------------------------------- | +| GET | `/teams/{team-id}/allChannels` | List all channels in a team | +| GET | `/teams/{team-id}/channels` | List standard channels in a team | +| POST | `/teams/{team-id}/channels` | Create a channel in a team | +| GET | `/teams/{team-id}/channels/{channel-id}` | Get channel details | +| PATCH | `/teams/{team-id}/channels/{channel-id}` | Update a channel | +| DELETE | `/teams/{team-id}/channels/{channel-id}` | Delete a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/members` | List members in a channel | +| POST | `/teams/{team-id}/channels/{channel-id}/members` | Add members to a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/messages` | List messages in a channel | +| POST | `/teams/{team-id}/channels/{channel-id}/messages` | Send message in a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Get a specific channel message | +| PATCH | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Update a channel message | +| DELETE | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Delete a channel message | +| GET | `/teams/{team-id}/allChannels/{channel-id}` | Get specific channel under all channels | + +### OneDrive + +#### Root and Shared Content + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------- | ----------------------------------- | +| GET | `/me/drive/root/children` | List items in root folder | +| POST | `/me/drive/root/children` | Create a new file or folder in root | +| GET | `/me/drive/recent` | List recent files | +| GET | `/me/drive/sharedWithMe` | List files shared with the user | +| GET | `/me/drive/root/search(q='{search-query}')` | Search files by query | + +#### Specific Drives and Items + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------ | ------------------------------------- | +| GET | `/drives/{drive-id}/root/children` | List items in a specific drive's root | +| GET | `/drives/{drive-id}/items/{item-id}/children` | List children of a folder | +| POST | `/drives/{drive-id}/items/{item-id}/children` | Add item to folder | +| GET | `/drives/{drive-id}/items/{item-id}` | Get metadata for an item | +| PATCH | `/drives/{drive-id}/items/{item-id}` | Update metadata of an item | +| DELETE | `/drives/{drive-id}/items/{item-id}` | Delete an item | +| GET | `/drives/{drive-id}/items/{item-id}/content` | Download file content | +| PUT | `/drives/{drive-id}/items/{item-id}/content` | Upload file content | +| POST | `/drives/{drive-id}/items/{item-id}/createLink` | Create sharing link | +| GET | `/drives/{drive-id}/items/{item-id}/permissions` | Get item permissions | diff --git a/docs/sidebars.js b/docs/sidebars.js index 122914b4b8..3cc28e4df3 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -438,7 +438,8 @@ const sidebars = { 'marketplace/plugins/marketplace-plugin-weaviate', 'marketplace/plugins/marketplace-plugin-qdrant', 'marketplace/plugins/marketplace-plugin-azurerepos', - 'marketplace/plugins/marketplace-plugin-googlecalendar' + 'marketplace/plugins/marketplace-plugin-googlecalendar', + 'marketplace/plugins/marketplace-plugin-microsoft_graph' ], }, ], diff --git a/docs/static/img/marketplace/plugins/microsoft-graph/connection.png b/docs/static/img/marketplace/plugins/microsoft-graph/connection.png new file mode 100644 index 0000000000000000000000000000000000000000..cded771baa0117957c4113a6e772bbf9bc514c01 GIT binary patch literal 176348 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 + +## Supported Operations + +### Outlook + +#### Messages + +| Method | Endpoint | Description | +| ------ | ------------------------------------------ | ------------------------------------ | +| GET | `/me/messages` | List messages in the user's mailbox. | +| POST | `/me/messages` | Create a new draft message. | +| GET | `/me/messages/{message-id}` | Get a specific message by ID. | +| PATCH | `/me/messages/{message-id}` | Update a message. | +| DELETE | `/me/messages/{message-id}` | Delete a message. | +| POST | `/me/messages/{message-id}/forward` | Forward an existing message. | +| POST | `/me/messages/{message-id}/createForward` | Create a forward draft. | +| POST | `/me/messages/{message-id}/reply` | Reply to a message. | +| POST | `/me/messages/{message-id}/createReply` | Create a reply draft. | +| POST | `/me/messages/{message-id}/replyAll` | Reply all to a message. | +| POST | `/me/messages/{message-id}/createReplyAll` | Create a reply-all draft. | +| POST | `/me/messages/{message-id}/send` | Send a draft message. | +| POST | `/me/messages/{message-id}/move` | Move a message. | +| POST | `/me/messages/{message-id}/copy` | Copy a message. | +| POST | `/me/sendMail` | Send mail without creating a draft. | + +#### Mail Folders + +| Method | Endpoint | Description | +| ------ | ------------------------------------------------ | ------------------------------------- | +| GET | `/me/mailFolders` | List mail folders. | +| POST | `/me/mailFolders` | Create a mail folder. | +| GET | `/me/mailFolders/{mailFolder-id}` | Get specific mail folder. | +| PATCH | `/me/mailFolders/{mailFolder-id}` | Update a mail folder. | +| DELETE | `/me/mailFolders/{mailFolder-id}` | Delete a mail folder. | +| GET | `/me/mailFolders/{mailFolder-id}/messages` | List messages inside a folder. | +| GET | `/me/mailFolders/Inbox/messages/delta` | Track changes to inbox messages. | +| GET | `/me/mailFolders/{mailFolder-id}/messages/delta` | Track changes to a folder's messages. | +| GET | `/me/mailFolders/delta` | Track changes to all folders. | + +#### Categories and Rooms + +| Method | API Endpoint | Description | +| ------ | --------------------------------------------------- | ----------------------- | +| GET | `/me/outlook/masterCategories` | List master categories | +| POST | `/me/outlook/masterCategories` | Create a new category | +| GET | `/me/outlook/masterCategories/{outlookCategory-id}` | Get a specific category | +| PATCH | `/me/outlook/masterCategories/{outlookCategory-id}` | Update a category | +| DELETE | `/me/outlook/masterCategories/{outlookCategory-id}` | Delete a category | +| GET | `/me/findRooms` | List available rooms | +| GET | `/me/findRooms(RoomList='{roomList-emailAddress}')` | Find rooms by room list | +| GET | `/me/findRoomLists` | List room lists | + +### Calendar + +#### Default Calendar + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------- | ------------------------------------- | +| GET | `/me/calendar` | Get default calendar | +| PATCH | `/me/calendar` | Update default calendar | +| GET | `/me/calendar/events` | List events from default calendar | +| POST | `/me/calendar/events` | Create an event in default calendar | +| GET | `/me/calendar/calendarPermissions` | List calendar permissions | +| POST | `/me/calendar/calendarPermissions` | Grant permissions to default calendar | +| GET | `/me/calendar/calendarPermissions/{permissionId}` | Get specific calendar permission | +| PATCH | `/me/calendar/calendarPermissions/{permissionId}` | Update calendar permission | +| DELETE | `/me/calendar/calendarPermissions/{permissionId}` | Delete calendar permission | +| POST | `/me/calendar/getSchedule` | Get free/busy schedule info | + +#### User Calendars and Groups + +| Method | API Endpoint | Description | +| ------ | ---------------------------------------- | --------------------------------------- | +| GET | `/user/{userId}/calendar` | Get default calendar of a specific user | +| GET | `/me/calendars` | List user calendars | +| POST | `/me/calendars` | Create a new calendar | +| GET | `/me/calendars/{calendarId}` | Get a specific calendar | +| PATCH | `/me/calendars/{calendarId}` | Update a calendar | +| DELETE | `/me/calendars/{calendarId}` | Delete a calendar | +| GET | `/me/calendars/{calendarId}/events` | List events in a specific calendar | +| POST | `/me/calendars/{calendarId}/events` | Create event in a specific calendar | +| GET | `/me/calendarGroups` | List calendar groups | +| POST | `/me/calendarGroups` | Create a calendar group | +| GET | `/me/calendarGroups/{groupId}/calendars` | Get calendars in a group | +| POST | `/me/calendarGroups/{groupId}/calendars` | Add calendar to a group | + +#### Events + +| Method | API Endpoint | Description | +| ------ | ---------------------------------- | ----------------------------------- | +| GET | `/me/events/{eventId}` | Get an event by ID | +| PATCH | `/me/events/{eventId}` | Update an event | +| DELETE | `/me/events/{eventId}` | Delete an event | +| GET | `/me/events/{eventId}/instances` | List instances of a recurring event | +| GET | `/me/events/{eventId}/attachments` | List attachments of an event | +| POST | `/me/events/{eventId}/attachments` | Add attachments to an event | +| GET | `/me/calendarView` | Get calendar view of events | +| POST | `/me/findMeetingTimes` | Find meeting times | + +### Users + +#### User Management + +| Method | API Endpoint | Description | +| ------ | ------------------ | ---------------------- | +| GET | `/users` | List all users | +| POST | `/users` | Create a user | +| GET | `/users/{user-id}` | Get a specific user | +| PATCH | `/users/{user-id}` | Update a specific user | +| DELETE | `/users/{user-id}` | Delete a specific user | + +#### Profile + +| Method | API Endpoint | Description | +| ------ | ------------ | -------------------------------- | +| GET | `/me` | Get profile of signed-in user | +| PATCH | `/me` | Update profile of signed-in user | + +### Teams + +#### Teams and Chats + +| Method | API Endpoint | Description | +| ------ | ----------------- | ------------------------------ | +| GET | `/teams` | List teams | +| POST | `/teams` | Create a team | +| GET | `/chats` | List chats | +| POST | `/chats` | Create a chat | +| GET | `/me/joinedTeams` | List teams the user has joined | + +#### Chat Operations + +| Method | API Endpoint | Description | +| ------ | -------------------------------------------------- | -------------------------------- | +| GET | `/chats/{chat-id}` | Get a chat | +| PATCH | `/chats/{chat-id}` | Update a chat | +| DELETE | `/chats/{chat-id}` | Delete a chat | +| GET | `/chats/{chat-id}/members` | List members in a chat | +| POST | `/chats/{chat-id}/members` | Add members to a chat | +| POST | `/chats/{chat-id}/members/add` | Add members (alternate endpoint) | +| GET | `/chats/{chat-id}/members/{conversationMember-id}` | Get chat member details | +| PATCH | `/chats/{chat-id}/members/{conversationMember-id}` | Update chat member | +| DELETE | `/chats/{chat-id}/members/{conversationMember-id}` | Remove chat member | +| GET | `/chats/{chat-id}/messages` | List messages in a chat | +| POST | `/chats/{chat-id}/messages` | Send message in a chat | +| GET | `/chats/{chat-id}/messages/{chatMessage-id}` | Get a specific chat message | +| PATCH | `/chats/{chat-id}/messages/{chatMessage-id}` | Update a chat message | +| DELETE | `/chats/{chat-id}/messages/{chatMessage-id}` | Delete a chat message | +| GET | `/chats/getAllMessages` | Get all messages across chats | + +#### Team Operation + +| Method | API Endpoint | Description | +| ------ | ------------------------------ | -------------------------------- | +| GET | `/teams/{team-id}` | Get a team | +| PATCH | `/teams/{team-id}` | Update a team | +| DELETE | `/teams/{team-id}` | Delete a team | +| POST | `/teams/{team-id}/archive` | Archive a team | +| POST | `/teams/{team-id}/unarchive` | Unarchive a team | +| GET | `/teams/{team-id}/members` | List team members | +| POST | `/teams/{team-id}/members` | Add team members | +| POST | `/teams/{team-id}/members/add` | Add members (alternate endpoint) | + +#### Channels and Messages + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------------------------ | --------------------------------------- | +| GET | `/teams/{team-id}/allChannels` | List all channels in a team | +| GET | `/teams/{team-id}/channels` | List standard channels in a team | +| POST | `/teams/{team-id}/channels` | Create a channel in a team | +| GET | `/teams/{team-id}/channels/{channel-id}` | Get channel details | +| PATCH | `/teams/{team-id}/channels/{channel-id}` | Update a channel | +| DELETE | `/teams/{team-id}/channels/{channel-id}` | Delete a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/members` | List members in a channel | +| POST | `/teams/{team-id}/channels/{channel-id}/members` | Add members to a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/messages` | List messages in a channel | +| POST | `/teams/{team-id}/channels/{channel-id}/messages` | Send message in a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Get a specific channel message | +| PATCH | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Update a channel message | +| DELETE | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Delete a channel message | +| GET | `/teams/{team-id}/allChannels/{channel-id}` | Get specific channel under all channels | + +### OneDrive + +#### Root and Shared Content + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------- | ----------------------------------- | +| GET | `/me/drive/root/children` | List items in root folder | +| POST | `/me/drive/root/children` | Create a new file or folder in root | +| GET | `/me/drive/recent` | List recent files | +| GET | `/me/drive/sharedWithMe` | List files shared with the user | +| GET | `/me/drive/root/search(q='{search-query}')` | Search files by query | + +#### Specific Drives and Items + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------ | ------------------------------------- | +| GET | `/drives/{drive-id}/root/children` | List items in a specific drive's root | +| GET | `/drives/{drive-id}/items/{item-id}/children` | List children of a folder | +| POST | `/drives/{drive-id}/items/{item-id}/children` | Add item to folder | +| GET | `/drives/{drive-id}/items/{item-id}` | Get metadata for an item | +| PATCH | `/drives/{drive-id}/items/{item-id}` | Update metadata of an item | +| DELETE | `/drives/{drive-id}/items/{item-id}` | Delete an item | +| GET | `/drives/{drive-id}/items/{item-id}/content` | Download file content | +| PUT | `/drives/{drive-id}/items/{item-id}/content` | Upload file content | +| POST | `/drives/{drive-id}/items/{item-id}/createLink` | Create sharing link | +| GET | `/drives/{drive-id}/items/{item-id}/permissions` | Get item permissions | diff --git a/docs/versioned_docs/version-3.5.0-LTS/marketplace/marketplace_overview.md b/docs/versioned_docs/version-3.5.0-LTS/marketplace/marketplace_overview.md index d911dc2d2e..18f7fbdc5b 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/marketplace/marketplace_overview.md +++ b/docs/versioned_docs/version-3.5.0-LTS/marketplace/marketplace_overview.md @@ -67,6 +67,7 @@ To remove a plugin, follow these steps: - **[HarperDB](/docs/marketplace/plugins/marketplace-plugin-harperdb)** - **[Hugging Face](/docs/marketplace/plugins/marketplace-plugin-hugging_face)** - **[Jira](/docs/marketplace/plugins/marketplace-plugin-jira)** +- **[Microsoft Graph](/docs/marketplace/plugins/marketplace-plugin-microsoft_graph)** - **[Mistral AI](/docs/marketplace/plugins/marketplace-plugin-mistral_ai)** - **[OpenAI](/docs/marketplace/plugins/marketplace-plugin-openai)** - **[Pinecone](/docs/marketplace/plugins/marketplace-plugin-pinecone)** diff --git a/docs/versioned_docs/version-3.5.0-LTS/marketplace/plugins/microsoft-graph.md b/docs/versioned_docs/version-3.5.0-LTS/marketplace/plugins/microsoft-graph.md new file mode 100644 index 0000000000..415c22623b --- /dev/null +++ b/docs/versioned_docs/version-3.5.0-LTS/marketplace/plugins/microsoft-graph.md @@ -0,0 +1,231 @@ +--- +id: marketplace-plugin-microsoft_graph +title: Microsoft Graph +--- + +By integrating Microsoft Graph with ToolJet, you can interact with Microsoft 365 services such as Outlook Mail, Calendar, Users, and OneDrive. + +## Connection + +To connect ToolJet with Microsoft Graph, you’ll need the following credentials: + +- Tenant +- Access token URL +- Client ID +- Client secret + +Follow this [Microsoft guide](https://learn.microsoft.com/en-us/graph/auth-register-app-v2) to register an app and generate the required credentials. + +You can enable the **Authentication required for all users** toggle in the configuration panel. When enabled, each user will be redirected to the OAuth consent screen the first time a query from this data source is triggered in your application. This ensures that every user connects with their own Microsoft account securely. + +**Note**: After completing the OAuth flow, the query must be triggered again to fetch data from Microsoft Graph. + +Microsoft Graph Configuration + +## Supported Operations + +### Outlook + +#### Messages + +| Method | Endpoint | Description | +| ------ | ------------------------------------------ | ------------------------------------ | +| GET | `/me/messages` | List messages in the user's mailbox. | +| POST | `/me/messages` | Create a new draft message. | +| GET | `/me/messages/{message-id}` | Get a specific message by ID. | +| PATCH | `/me/messages/{message-id}` | Update a message. | +| DELETE | `/me/messages/{message-id}` | Delete a message. | +| POST | `/me/messages/{message-id}/forward` | Forward an existing message. | +| POST | `/me/messages/{message-id}/createForward` | Create a forward draft. | +| POST | `/me/messages/{message-id}/reply` | Reply to a message. | +| POST | `/me/messages/{message-id}/createReply` | Create a reply draft. | +| POST | `/me/messages/{message-id}/replyAll` | Reply all to a message. | +| POST | `/me/messages/{message-id}/createReplyAll` | Create a reply-all draft. | +| POST | `/me/messages/{message-id}/send` | Send a draft message. | +| POST | `/me/messages/{message-id}/move` | Move a message. | +| POST | `/me/messages/{message-id}/copy` | Copy a message. | +| POST | `/me/sendMail` | Send mail without creating a draft. | + +#### Mail Folders + +| Method | Endpoint | Description | +| ------ | ------------------------------------------------ | ------------------------------------- | +| GET | `/me/mailFolders` | List mail folders. | +| POST | `/me/mailFolders` | Create a mail folder. | +| GET | `/me/mailFolders/{mailFolder-id}` | Get specific mail folder. | +| PATCH | `/me/mailFolders/{mailFolder-id}` | Update a mail folder. | +| DELETE | `/me/mailFolders/{mailFolder-id}` | Delete a mail folder. | +| GET | `/me/mailFolders/{mailFolder-id}/messages` | List messages inside a folder. | +| GET | `/me/mailFolders/Inbox/messages/delta` | Track changes to inbox messages. | +| GET | `/me/mailFolders/{mailFolder-id}/messages/delta` | Track changes to a folder's messages. | +| GET | `/me/mailFolders/delta` | Track changes to all folders. | + +#### Categories and Rooms + +| Method | API Endpoint | Description | +| ------ | --------------------------------------------------- | ----------------------- | +| GET | `/me/outlook/masterCategories` | List master categories | +| POST | `/me/outlook/masterCategories` | Create a new category | +| GET | `/me/outlook/masterCategories/{outlookCategory-id}` | Get a specific category | +| PATCH | `/me/outlook/masterCategories/{outlookCategory-id}` | Update a category | +| DELETE | `/me/outlook/masterCategories/{outlookCategory-id}` | Delete a category | +| GET | `/me/findRooms` | List available rooms | +| GET | `/me/findRooms(RoomList='{roomList-emailAddress}')` | Find rooms by room list | +| GET | `/me/findRoomLists` | List room lists | + +### Calendar + +#### Default Calendar + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------- | ------------------------------------- | +| GET | `/me/calendar` | Get default calendar | +| PATCH | `/me/calendar` | Update default calendar | +| GET | `/me/calendar/events` | List events from default calendar | +| POST | `/me/calendar/events` | Create an event in default calendar | +| GET | `/me/calendar/calendarPermissions` | List calendar permissions | +| POST | `/me/calendar/calendarPermissions` | Grant permissions to default calendar | +| GET | `/me/calendar/calendarPermissions/{permissionId}` | Get specific calendar permission | +| PATCH | `/me/calendar/calendarPermissions/{permissionId}` | Update calendar permission | +| DELETE | `/me/calendar/calendarPermissions/{permissionId}` | Delete calendar permission | +| POST | `/me/calendar/getSchedule` | Get free/busy schedule info | + +#### User Calendars and Groups + +| Method | API Endpoint | Description | +| ------ | ---------------------------------------- | --------------------------------------- | +| GET | `/user/{userId}/calendar` | Get default calendar of a specific user | +| GET | `/me/calendars` | List user calendars | +| POST | `/me/calendars` | Create a new calendar | +| GET | `/me/calendars/{calendarId}` | Get a specific calendar | +| PATCH | `/me/calendars/{calendarId}` | Update a calendar | +| DELETE | `/me/calendars/{calendarId}` | Delete a calendar | +| GET | `/me/calendars/{calendarId}/events` | List events in a specific calendar | +| POST | `/me/calendars/{calendarId}/events` | Create event in a specific calendar | +| GET | `/me/calendarGroups` | List calendar groups | +| POST | `/me/calendarGroups` | Create a calendar group | +| GET | `/me/calendarGroups/{groupId}/calendars` | Get calendars in a group | +| POST | `/me/calendarGroups/{groupId}/calendars` | Add calendar to a group | + +#### Events + +| Method | API Endpoint | Description | +| ------ | ---------------------------------- | ----------------------------------- | +| GET | `/me/events/{eventId}` | Get an event by ID | +| PATCH | `/me/events/{eventId}` | Update an event | +| DELETE | `/me/events/{eventId}` | Delete an event | +| GET | `/me/events/{eventId}/instances` | List instances of a recurring event | +| GET | `/me/events/{eventId}/attachments` | List attachments of an event | +| POST | `/me/events/{eventId}/attachments` | Add attachments to an event | +| GET | `/me/calendarView` | Get calendar view of events | +| POST | `/me/findMeetingTimes` | Find meeting times | + +### Users + +#### User Management + +| Method | API Endpoint | Description | +| ------ | ------------------ | ---------------------- | +| GET | `/users` | List all users | +| POST | `/users` | Create a user | +| GET | `/users/{user-id}` | Get a specific user | +| PATCH | `/users/{user-id}` | Update a specific user | +| DELETE | `/users/{user-id}` | Delete a specific user | + +#### Profile + +| Method | API Endpoint | Description | +| ------ | ------------ | -------------------------------- | +| GET | `/me` | Get profile of signed-in user | +| PATCH | `/me` | Update profile of signed-in user | + +### Teams + +#### Teams and Chats + +| Method | API Endpoint | Description | +| ------ | ----------------- | ------------------------------ | +| GET | `/teams` | List teams | +| POST | `/teams` | Create a team | +| GET | `/chats` | List chats | +| POST | `/chats` | Create a chat | +| GET | `/me/joinedTeams` | List teams the user has joined | + +#### Chat Operations + +| Method | API Endpoint | Description | +| ------ | -------------------------------------------------- | -------------------------------- | +| GET | `/chats/{chat-id}` | Get a chat | +| PATCH | `/chats/{chat-id}` | Update a chat | +| DELETE | `/chats/{chat-id}` | Delete a chat | +| GET | `/chats/{chat-id}/members` | List members in a chat | +| POST | `/chats/{chat-id}/members` | Add members to a chat | +| POST | `/chats/{chat-id}/members/add` | Add members (alternate endpoint) | +| GET | `/chats/{chat-id}/members/{conversationMember-id}` | Get chat member details | +| PATCH | `/chats/{chat-id}/members/{conversationMember-id}` | Update chat member | +| DELETE | `/chats/{chat-id}/members/{conversationMember-id}` | Remove chat member | +| GET | `/chats/{chat-id}/messages` | List messages in a chat | +| POST | `/chats/{chat-id}/messages` | Send message in a chat | +| GET | `/chats/{chat-id}/messages/{chatMessage-id}` | Get a specific chat message | +| PATCH | `/chats/{chat-id}/messages/{chatMessage-id}` | Update a chat message | +| DELETE | `/chats/{chat-id}/messages/{chatMessage-id}` | Delete a chat message | +| GET | `/chats/getAllMessages` | Get all messages across chats | + +#### Team Operation + +| Method | API Endpoint | Description | +| ------ | ------------------------------ | -------------------------------- | +| GET | `/teams/{team-id}` | Get a team | +| PATCH | `/teams/{team-id}` | Update a team | +| DELETE | `/teams/{team-id}` | Delete a team | +| POST | `/teams/{team-id}/archive` | Archive a team | +| POST | `/teams/{team-id}/unarchive` | Unarchive a team | +| GET | `/teams/{team-id}/members` | List team members | +| POST | `/teams/{team-id}/members` | Add team members | +| POST | `/teams/{team-id}/members/add` | Add members (alternate endpoint) | + +#### Channels and Messages + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------------------------ | --------------------------------------- | +| GET | `/teams/{team-id}/allChannels` | List all channels in a team | +| GET | `/teams/{team-id}/channels` | List standard channels in a team | +| POST | `/teams/{team-id}/channels` | Create a channel in a team | +| GET | `/teams/{team-id}/channels/{channel-id}` | Get channel details | +| PATCH | `/teams/{team-id}/channels/{channel-id}` | Update a channel | +| DELETE | `/teams/{team-id}/channels/{channel-id}` | Delete a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/members` | List members in a channel | +| POST | `/teams/{team-id}/channels/{channel-id}/members` | Add members to a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/messages` | List messages in a channel | +| POST | `/teams/{team-id}/channels/{channel-id}/messages` | Send message in a channel | +| GET | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Get a specific channel message | +| PATCH | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Update a channel message | +| DELETE | `/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}` | Delete a channel message | +| GET | `/teams/{team-id}/allChannels/{channel-id}` | Get specific channel under all channels | + +### OneDrive + +#### Root and Shared Content + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------- | ----------------------------------- | +| GET | `/me/drive/root/children` | List items in root folder | +| POST | `/me/drive/root/children` | Create a new file or folder in root | +| GET | `/me/drive/recent` | List recent files | +| GET | `/me/drive/sharedWithMe` | List files shared with the user | +| GET | `/me/drive/root/search(q='{search-query}')` | Search files by query | + +#### Specific Drives and Items + +| Method | API Endpoint | Description | +| ------ | ------------------------------------------------ | ------------------------------------- | +| GET | `/drives/{drive-id}/root/children` | List items in a specific drive's root | +| GET | `/drives/{drive-id}/items/{item-id}/children` | List children of a folder | +| POST | `/drives/{drive-id}/items/{item-id}/children` | Add item to folder | +| GET | `/drives/{drive-id}/items/{item-id}` | Get metadata for an item | +| PATCH | `/drives/{drive-id}/items/{item-id}` | Update metadata of an item | +| DELETE | `/drives/{drive-id}/items/{item-id}` | Delete an item | +| GET | `/drives/{drive-id}/items/{item-id}/content` | Download file content | +| PUT | `/drives/{drive-id}/items/{item-id}/content` | Upload file content | +| POST | `/drives/{drive-id}/items/{item-id}/createLink` | Create sharing link | +| GET | `/drives/{drive-id}/items/{item-id}/permissions` | Get item permissions | diff --git a/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json b/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json index bfe255d6bc..2d4d80dfbb 100644 --- a/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json +++ b/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json @@ -426,7 +426,8 @@ "marketplace/plugins/marketplace-plugin-weaviate", "marketplace/plugins/marketplace-plugin-qdrant", "marketplace/plugins/marketplace-plugin-azurerepos", - "marketplace/plugins/marketplace-plugin-googlecalendar" + "marketplace/plugins/marketplace-plugin-googlecalendar", + "marketplace/plugins/marketplace-plugin-microsoft_graph" ] } ] diff --git a/docs/versioned_sidebars/version-3.5.0-LTS-sidebars.json b/docs/versioned_sidebars/version-3.5.0-LTS-sidebars.json index 58c22690f3..0565454c79 100644 --- a/docs/versioned_sidebars/version-3.5.0-LTS-sidebars.json +++ b/docs/versioned_sidebars/version-3.5.0-LTS-sidebars.json @@ -402,7 +402,8 @@ "marketplace/plugins/marketplace-plugin-azurerepos", "marketplace/plugins/marketplace-plugin-clickup", "marketplace/plugins/marketplace-plugin-prometheus", - "marketplace/plugins/marketplace-plugin-googlecalendar" + "marketplace/plugins/marketplace-plugin-googlecalendar", + "marketplace/plugins/marketplace-plugin-microsoft_graph" ] } ] From 11a4e1ec2faf4b3d356336b5f6cb8da6bdf7f728 Mon Sep 17 00:00:00 2001 From: Souvik Date: Wed, 13 Aug 2025 23:53:18 +0530 Subject: [PATCH 12/13] Updated ami docs 2.50-LTS to 3.16-LTS --- docs/versioned_docs/version-2.50.0-LTS/setup/ami.md | 10 +++++----- docs/versioned_docs/version-3.0.0-LTS/setup/ami.md | 8 ++++---- docs/versioned_docs/version-3.16.0-LTS/setup/ami.md | 12 ++++++------ docs/versioned_docs/version-3.5.0-LTS/setup/ami.md | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/ami.md b/docs/versioned_docs/version-2.50.0-LTS/setup/ami.md index f78bb5d38f..93aa2077c8 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/ami.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/ami.md @@ -57,19 +57,19 @@ Follow the steps below to deploy ToolJet on AWS AMI instances. If there are self signed HTTPS endpoints that ToolJet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. ::: -8. `TOOLJET_DB_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. +8. `TOOLJET_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. Examples: - `TOOLJET_DB_HOST=http://12.34.56.78` or - `TOOLJET_DB_HOST=https://yourdomain.com` or - `TOOLJET_DB_HOST=https://tooljet.yourdomain.com` + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` :::info We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. ::: :::info - Please make sure that `TOOLJET_DB_HOST` starts with either `http://` or `https://` + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` ::: 9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/ami.md b/docs/versioned_docs/version-3.0.0-LTS/setup/ami.md index a8106dced1..c1a82ee4cf 100644 --- a/docs/versioned_docs/version-3.0.0-LTS/setup/ami.md +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/ami.md @@ -60,16 +60,16 @@ Follow the steps below to deploy ToolJet on AWS AMI instances. 8. `TOOLJET_DB_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. Examples: - `TOOLJET_DB_HOST=http://12.34.56.78` or - `TOOLJET_DB_HOST=https://yourdomain.com` or - `TOOLJET_DB_HOST=https://tooljet.yourdomain.com` + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` :::info We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. ::: :::info - Please make sure that `TOOLJET_DB_HOST` starts with either `http://` or `https://` + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` ::: 9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/ami.md b/docs/versioned_docs/version-3.16.0-LTS/setup/ami.md index 0ffaddc88a..77adf42d00 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/ami.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/ami.md @@ -22,7 +22,7 @@ Follow the steps below to deploy ToolJet on AWS AMI instances. 1. Setup a PostgreSQL database and make sure that the database is accessible from the EC2 instance. 2. Login to your AWS management console and go to the EC2 management page. 3. Under the **Images** section, click on the **AMIs** button. -4. Find the [ToolJet version](https://github.com/ToolJet/ToolJet/releases) you want to deploy. Now, from the AMI search page, select the search type as "Public Images" and input the version you'd want `AMI Name : tooljet_vX.X.X.ubuntu-jammy` in the search bar. +4. Find the [ToolJet version](https://github.com/ToolJet/ToolJet/releases) you want to deploy. Now, from the AMI search page, select the search type as "Public Images" and input the version you'd want `AMI Name : tooljet_vX.X.X.ubuntu_jammy` in the search bar. 5. Select ToolJet's AMI and bootup an EC2 instance.
Creating a new security group is recommended. For example, if the installation should receive traffic from the internet, the inbound rules of the security group should look like this: @@ -57,19 +57,19 @@ Follow the steps below to deploy ToolJet on AWS AMI instances. If there are self signed HTTPS endpoints that ToolJet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. ::: -8. `TOOLJET_DB_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. +8. `TOOLJET_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. Examples: - `TOOLJET_DB_HOST=http://12.34.56.78` or - `TOOLJET_DB_HOST=https://yourdomain.com` or - `TOOLJET_DB_HOST=https://tooljet.yourdomain.com` + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` :::info We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. ::: :::info - Please make sure that `TOOLJET_DB_HOST` starts with either `http://` or `https://` + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` ::: 9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. diff --git a/docs/versioned_docs/version-3.5.0-LTS/setup/ami.md b/docs/versioned_docs/version-3.5.0-LTS/setup/ami.md index a7f5894a3d..ca70c4c551 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/setup/ami.md +++ b/docs/versioned_docs/version-3.5.0-LTS/setup/ami.md @@ -61,19 +61,19 @@ Follow the steps below to deploy ToolJet on AWS AMI instances. If there are self signed HTTPS endpoints that ToolJet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. ::: -8. `TOOLJET_DB_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. +8. `TOOLJET_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. Examples: - `TOOLJET_DB_HOST=http://12.34.56.78` or - `TOOLJET_DB_HOST=https://yourdomain.com` or - `TOOLJET_DB_HOST=https://tooljet.yourdomain.com` + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` :::info We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. ::: :::info - Please make sure that `TOOLJET_DB_HOST` starts with either `http://` or `https://` + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` ::: 9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. From c5962e50fb1008090d45b42eb190feef0223195c Mon Sep 17 00:00:00 2001 From: Pratik Agrawal Date: Thu, 14 Aug 2025 18:29:20 +0530 Subject: [PATCH 13/13] [docs]: GitSync Migration Changes (#13735) * wip * gitsync migration changes * feedback updates --- .../gitsync/connect-to-git-repo/connection.md | 7 +- .../connect-to-git-repo/github-config.md | 79 ++++++++++--------- .../connect-to-git-repo/gitlab-config.md | 8 +- .../connect-to-git-repo/ssh/gitsync-config.md | 34 ++------ 4 files changed, 58 insertions(+), 70 deletions(-) diff --git a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/connection.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/connection.md index 7d6c75ba10..473bd7448f 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/connection.md +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/connection.md @@ -10,11 +10,10 @@ The table below provides a comparison between SSH and HTTPS connection methods t | Feature | HTTPS | SSH | |---------|-----|-------| -| **Connection type** | Individual git connection (Currently we only support [GitHub](/docs/development-lifecycle/gitsync/connect-to-git-repo/github-config) and [GitLab](/docs/development-lifecycle/gitsync/connect-to-git-repo/gitlab-config)) | Single connection which work for any git provider
( Example: [GitHub](/docs/development-lifecycle/gitsync/connect-to-git-repo/ssh/ssh-config#github), [Gitea](/docs/development-lifecycle/gitsync/connect-to-git-repo/ssh/ssh-config#gitea), [GitLab](/docs/development-lifecycle/gitsync/connect-to-git-repo/ssh/ssh-config#gitlab), etc. ) | +| **Connection type** | Individual git connection (Currently we only support [GitHub](/docs/development-lifecycle/gitsync/connect-to-git-repo/github-config) and [GitLab](/docs/development-lifecycle/gitsync/connect-to-git-repo/gitlab-config)) | Single connection which work for any git provider. (Example: [GitHub](/docs/development-lifecycle/gitsync/connect-to-git-repo/ssh/ssh-config#github), [Gitea](/docs/development-lifecycle/gitsync/connect-to-git-repo/ssh/ssh-config#gitea), [GitLab](/docs/development-lifecycle/gitsync/connect-to-git-repo/ssh/ssh-config#gitlab), etc.) | | **Port Blocking** | No port blocking issues | May face port blocking due to firewall issues | -| **Branch Configuration** | Can be configured directly from the ToolJet UI | Must be configured using environment variables | -| **Default Branch** | main | master | -| **Require Github App** | Yes | No | +| **Branch Configuration** | Can be configured directly from the ToolJet UI | Can be configured directly from the ToolJet UI | +| **Default Branch** | main | main | ToolJet allows you to set up multiple Git repository configurations. However, only one configuration can be active at any given time for a workspace. When switching between configurations, the previously active configuration will be automatically deactivated. diff --git a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/github-config.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/github-config.md index e097e64a17..f66f83ceec 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/github-config.md +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/github-config.md @@ -13,70 +13,75 @@ sidebar_label: GitHub Configuration Paid feature -The GitHub Configuration for GitSync introduces a more flexible way to connect your ToolJet instance to a Git repository. Compared to traditional SSH-based setups, it works over HTTPS, helping you avoid SSH port blocks, and lets you choose branches directly from the UI. +The GitHub Configuration for GitSync introduces a more flexible way to connect your ToolJet instance to a Git repository. It works over HTTPS, helping you avoid SSH port blocks, and lets you choose branches directly from the UI. Role Required: **Admin** -### 1. **Create a New Repository** +### 1. Create a New Repository Create a new repository on your GitHub. The repository can be public or private. You can also use an existing repository. Make sure that the repository is empty. -### 2. **Create the GitHub App** +### 2. Create the GitHub App [Setup a GitHub App](https://github.com/settings/apps/new) and make sure it is created by the same owner as the Git repository. If you have multiple ToolJet instances, use this same GitHub App across all instances. - - GitSync - - Enter your App details on the **Register new GitHub App** page and make sure to update the following fields: - - Uncheck the **Expire user authorization tokens** and **Active** checkbox under **Identifying and authorizing users** and **Webhook** sections respectively. - - Add the following Repository permissions: + GitSync + + Enter your App details on the **Register new GitHub App** page and make sure to uncheck the **Expire user authorization tokens** and **Active** checkbox under **Identifying and authorizing users** and **Webhook** sections respectively. + + :::note + Add the following Repository permissions: - Contents: Read & Write - Pull requests: Read & Write + ::: - After creating the GitHub App, you will be directed to the **GitHub App Settings** page. Here, make sure to copy the **App ID**. Next, generate the **Private key** (`.pem `key), download it, and store it securely. This information will be essential later when configuring GitSync. + After creating the GitHub App, you will be directed to the **GitHub App Settings** page. + :::note + Make sure to copy the **App ID**. + ::: + Next, generate the **Private key** (`.pem `key), download it, and store it securely. This information will be essential later when configuring GitSync. GitSync -### 3. **Install the GitHub App** +### 3. Install the GitHub App To install your GitHub App, follow these steps: - - Click on Install App on the **GitHub App Settings** page. - GitSync + GitSync - Click the **Install** button next to your organization. - Select repositories option and select the repositories you want to connect to ToolJet. - - You’ll be redirected to the installation page. The number at the end of the URL is the **installation ID**. Save this for later. - - ``` - https://github.com/settings/installations/:installation_id - ``` + - You’ll be redirected to the installation page. The number at the end of the URL is the **installation ID**. Save this for later.
+ ``` + https://github.com/settings/installations/:installation_id + ``` ### 4. Configure GitHub in GitSync Navigate to the **Workspace settings** page and click on the **Configure git** tab. Then, enter the required configuration values after selecting GitHub as your repository provider. - - - -GitSync - + GitSync The table below describes each configuration values: #### Repository -| **Setting** | **Description** | -|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------| -| **Repo URL** | The URL of the repository you created to use with ToolJet. (e.g `https://github.com/your-org/repo-name.git`) | -| **Branch name** | Branch name of your repo. By default, it uses the main branch. | + +| **Setting** | **Description** | +|-------------|----------------| +| **Repo URL** | The URL of the repository you created to use with ToolJet. (e.g `https://github.com/your-org/repo-name.git`) | +| **Branch name** | Branch name of your repo. By default, it uses the main branch. | #### Self-hosted GitHub (Optional) -| **Setting** | **Description** | -|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------| -| **GitHub enterprise URL** | The domain used to access your self-hosted GitHub instance. If you use GitHub Cloud, you can leave this blank. | -| **GitHub enterprise API URL** | The API endpoint for your self-hosted GitHub instance. If you use GitHub Cloud, you can leave this blank. (e.g. `https://[hostname]/api/v3/`) | + +| **Setting** | **Description** | +|-------------|-----------------| +| **GitHub enterprise URL** | The domain used to access your self-hosted GitHub instance. If you use GitHub Cloud, you can leave this blank. | +| **GitHub enterprise API URL** | The API endpoint for your self-hosted GitHub instance. If you use GitHub Cloud, you can leave this blank. (e.g. `https://[hostname]/api/v3/`) | #### App Access -| **Setting** | **Description** | -|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------| -| **GitHub app ID** | The [GitHub App ID](https://docs.github.com/en/developers/apps/identifying-and-authorizing-users-for-github-apps#authenticating-with-a-github-app). | -| **GitHub app installation ID** | The [GitHub installation ID](https://docs.github.com/en/developers/apps/managing-github-apps/installing-github-apps#installing-a-github-app). | -| **GitHub app private key** | Private key you downloaded after App creation. | +| **Setting** | **Description** | +|-------------|------------------| +| **GitHub app ID** | The [GitHub App ID](https://docs.github.com/en/developers/apps/identifying-and-authorizing-users-for-github-apps#authenticating-with-a-github-app). | +| **GitHub app installation ID** | The [GitHub installation ID](https://docs.github.com/en/developers/apps/managing-github-apps/installing-github-apps#installing-a-github-app). | +| **GitHub app private key** | Private key you downloaded after App creation. | - Once you've entered the necessary configurations, click **Save Changes**. Your ToolJet instance will now be connected to your GitHub repository. \ No newline at end of file +Once you've entered the necessary configurations, click **Save Changes**. Your ToolJet instance will now be connected to your GitHub repository. + +:::note +You can use the same credentials to configure a specific repository across multiple instances or workspaces. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/gitlab-config.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/gitlab-config.md index d83a9c8fbc..ee194a5fec 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/gitlab-config.md +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/gitlab-config.md @@ -13,7 +13,7 @@ title: GitLab Configuration -The GitLab configuration for git sync offers a flexible way to connect your ToolJet workspace to a GitLab repository. This setup uses HTTPS instead of the traditional SSH-based method, eliminating the need to manage SSH keys and bypassing SSH port blocks. You can also select and switch repository branches directly within the ToolJet interface. +The GitLab configuration for git sync offers a flexible way to connect your ToolJet workspace to a GitLab repository. This setup uses HTTPS, eliminating the need to manage SSH keys and bypassing SSH port blocks. You can also select and switch repository branches directly within the ToolJet interface. Role Required: **Admin** @@ -68,4 +68,8 @@ The table below describes each configuration values: | **GitLab Project access token** | The [GitLab project token](https://docs.gitlab.com/user/project/settings/project_access_tokens/#create-a-project-access-token). | - Once you've entered the necessary configurations, click **Save Changes**. Your workspace will now be connected to your GitLab project. \ No newline at end of file + Once you've entered the necessary configurations, click **Save Changes**. Your workspace will now be connected to your GitLab project. + +:::note +You can use the same credentials to configure a specific repository across multiple instances or workspaces. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/ssh/gitsync-config.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/ssh/gitsync-config.md index c5854f7a35..1d24f7ba26 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/ssh/gitsync-config.md +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/gitsync/connect-to-git-repo/ssh/gitsync-config.md @@ -12,7 +12,7 @@ title: Configure GitSync Paid feature -In this guide, we will explore how to configure GitSync using GitHub as the repository manager. By default GitSync is configured for the **master** branch, but this can be configured to a different branch as well, refer to **[Configuring GitSync on a Different Branch](#configuring-gitsync-on-a-different-branch)** section for more information. +In this guide, we will explore how to configure GitSync using GitHub as the repository manager. By default GitSync is configured for the **main** branch, but this can be configured to a different branch as well, refer to **[Configuring GitSync on a Different Branch](#configuring-gitsync-on-a-different-branch)** section for more information. For more information on using other repository managers, such as GitLab or Gitea, refer to the **[SSH Configuration for Git Repo Manager](/docs/development-lifecycle/gitsync/connect-to-git-repo/ssh/ssh-config)** guide. @@ -53,53 +53,33 @@ Role Required: **Admin** GitSync -6. Go to the **Settings** tab of the GitHub repository, and click on the **Deploy keys** tab. Click on the **Add deploy key** button. - GitSync +6. Go to the **Settings** tab of the GitHub repository, and click on the **Deploy keys** tab. Click on the **Add deploy key** button. Enter a title for the SSH key in the **Title** field. Paste the SSH key generated from the ToolJet. + GitSync -7. Enter a title for the SSH key in the **Title** field. - -8. Paste the SSH key generated from the ToolJet. - -9. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](/docs/development-lifecycle/gitsync/push). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](/docs/development-lifecycle/gitsync/pull). - -10. Finally, click on the **Add key** button. +7. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](/docs/development-lifecycle/gitsync/push). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](/docs/development-lifecycle/gitsync/pull). Finally, click on the **Add key** button. GitSync To deploy the SSH key for other git repository manager, such as GitLab and Gitea, follow the **[SSH Configuration](/docs/development-lifecycle/gitsync/connect-to-git-repo/ssh/ssh-config#deploy-the-ssh-key)** guide. -11. After deploying the SSH Key, go to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message. +8. After deploying the SSH Key, go to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message. GitSync ## Configuring GitSync on a Different Branch ToolJet GitSync allows you to sync your applications with a Git repository to enable version control and team collaboration. By default, GitSync operates on the `main` branch, but in multi-environment setups (like staging, production, or feature development), teams often need to sync with custom branches. ToolJet supports this by allowing you to configure a custom Git branch for syncing. -You can configure the GitSync target branch in two ways: -### Using the ToolJet UI (Recommended) - -ToolJet now supports setting the Git branch directly through the UI when configuring GitSync for a workspace. +ToolJet supports setting the Git branch directly through the UI when configuring GitSync for a workspace. - You’ll find an optional Target Branch input while setting up GitSync. - - Simply enter the desired branch name (e.g., develop, release/v1, etc.). - - If left empty: - - For new users, the default branch will be **main**. - - For existing users, the default will be master to maintain backward compatibility. This is the preferred way to set the target branch going forward. GitSync -### Using the Environment Variable -ToolJet also supports configuring the target branch using an environment variable. This is configured at the instance level and applies globally to all workspaces with GitSync enabled. The branch specified here must exist in all Git repositories used for GitSync across your workspaces. - -To set this, add the following to your .env file:
-`GITSYNC_TARGET_BRANCH` = **branch-name** - :::note -- Existing GitSync users, who want to use a custom Git branch must first create a new custom branch from the master branch in the Git repository manager. -- If both the UI configuration and the environment variable are set, the environment variable (`GITSYNC_TARGET_BRANCH`) will take precedence over the UI setting. +Existing GitSync users, who want to use a custom Git branch must first create a new custom branch from the main branch in the Git repository manager. ::: \ No newline at end of file