Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,26 @@
{
"Store or retrieve data from key/value database": "Daten aus der Schlüssel/Wert-Datenbank speichern oder abrufen",
"Get": "Erhalten",
"Put": "Legen",
"Append": "Anhängen",
"Remove": "Entfernen",
"Add To List": "Zur Liste hinzufügen",
"Remove from List": "Aus Liste entfernen",
"Get a value from storage": "Einen Wert vom Speicher erhalten",
"Put a value in storage": "Geben Sie einen Wert in den Speicher ein",
"Append to a value in storage": "An einen Wert im Speicher anhängen",
"Remove a value from storage": "Einen Wert vom Speicher entfernen",
"Add Items to a list.": "Elemente zu einer Liste hinzufügen.",
"Remove Item from a list": "Element aus einer Liste entfernen",
"Key": "Schlüssel",
"Default Value": "Standardwert",
"Store Scope": "Store-Bereich",
"Value": "Wert",
"Separator": "Trennzeichen",
"Ignore if value exists": "Ignorieren, wenn Wert vorhanden ist",
"The storage scope of the value.": "Der Speicherbereich des Wertes.",
"Separator between added values, use \\n for newlines": "Trennzeichen zwischen den hinzugefügten Werten verwenden Sie \\n für Zeilenumbrüche",
"Project": "Projekt",
"Flow": "Ablauf",
"Run": "Ausführung"
}

View File

@@ -0,0 +1,26 @@
{
"Store or retrieve data from key/value database": "Guardar o recuperar datos de la base de datos/valor",
"Get": "Obtener",
"Put": "Poner",
"Append": "Añadir",
"Remove": "Eliminar",
"Add To List": "Añadir a la lista",
"Remove from List": "Eliminar de la lista",
"Get a value from storage": "Obtener un valor del almacenamiento",
"Put a value in storage": "Poner un valor en el almacenamiento",
"Append to a value in storage": "Añadir a un valor en el almacenamiento",
"Remove a value from storage": "Eliminar un valor del almacenamiento",
"Add Items to a list.": "Añadir elementos a una lista.",
"Remove Item from a list": "Eliminar elemento de una lista",
"Key": "Clave",
"Default Value": "Valor por defecto",
"Store Scope": "Alcance de tienda",
"Value": "Valor",
"Separator": "Separador",
"Ignore if value exists": "Ignorar si el valor existe",
"The storage scope of the value.": "El alcance del almacenamiento del valor.",
"Separator between added values, use \\n for newlines": "Separador entre valores añadidos, use \\n para nuevas líneas",
"Project": "Projekt",
"Flow": "Flujo",
"Run": "Ejecutar"
}

View File

@@ -0,0 +1,26 @@
{
"Store or retrieve data from key/value database": "Stocker ou récupérer des données depuis la base de données clé/valeur",
"Get": "GET",
"Put": "PUT",
"Append": "Rajouter",
"Remove": "Retirer",
"Add To List": "Ajouter à la liste",
"Remove from List": "Retirer de la liste",
"Get a value from storage": "Récupérer la valeur stockée pour une clé",
"Put a value in storage": "Définir ou écraser la valeur stockée pour une clé",
"Append to a value in storage": "Ajouter une valeur derrière la valeur stockée",
"Remove a value from storage": "Retirer une valeur du stockage",
"Add Items to a list.": "Ajouter des éléments à une liste.",
"Remove Item from a list": "Retirer des éléments d'une liste",
"Key": "Clé",
"Default Value": "Valeur par défaut",
"Store Scope": "Périmètre du stockage",
"Value": "Valeur",
"Separator": "Séparateur",
"Ignore if value exists": "Ignorer si la valeur existe",
"The storage scope of the value.": "Le périmètre de stockage de la valeur.",
"Separator between added values, use \\n for newlines": "Séparateur entre les valeurs ajoutées, utilisez \\n pour les nouvelles lignes",
"Project": "Votre compte",
"Flow": "Votre Flow",
"Run": "Exécution de votre Flow"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,26 @@
{
"Store or retrieve data from key/value database": "キー/値データベースからデータを保存または取得します",
"Get": "取得",
"Put": "Put",
"Append": "追加",
"Remove": "削除",
"Add To List": "リストに追加",
"Remove from List": "リストから削除",
"Get a value from storage": "ストレージから値を取得する",
"Put a value in storage": "ストレージに値を置く",
"Append to a value in storage": "ストレージ内の値に追加",
"Remove a value from storage": "ストレージから値を削除",
"Add Items to a list.": "リストにアイテムを追加します。",
"Remove Item from a list": "リストからアイテムを削除",
"Key": "キー",
"Default Value": "デフォルト値",
"Store Scope": "ストアスコープ",
"Value": "値",
"Separator": "区切り記号",
"Ignore if value exists": "値が存在する場合は無視",
"The storage scope of the value.": "値のストレージスコープ。",
"Separator between added values, use \\n for newlines": "値の間の区切り文字。改行には \\n を使用します。",
"Project": "プロジェクト",
"Flow": "フロー",
"Run": "実行"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,26 @@
{
"Store or retrieve data from key/value database": "Gegevens opslaan of ophalen uit de key/value database",
"Get": "Verkrijg",
"Put": "Zet",
"Append": "Toevoegen",
"Remove": "Verwijderen",
"Add To List": "Toevoegen aan lijst",
"Remove from List": "Verwijderen uit lijst",
"Get a value from storage": "Haal een waarde op uit de opslag",
"Put a value in storage": "Zet een waarde in de opslag",
"Append to a value in storage": "Voeg toe aan een waarde in de opslag",
"Remove a value from storage": "Een waarde uit de opslag verwijderen",
"Add Items to a list.": "Voeg items toe aan een lijst.",
"Remove Item from a list": "Item uit een lijst verwijderen",
"Key": "Sleutel",
"Default Value": "Standaard waarde",
"Store Scope": "Sla Toepassingsgebied op",
"Value": "Waarde",
"Separator": "Scheidingsteken",
"Ignore if value exists": "Negeren als waarde bestaat",
"The storage scope of the value.": "Het opslagbereik van de waarde.",
"Separator between added values, use \\n for newlines": "Scheidingsteken tussen toegevoegde waarden, gebruik \\n voor nieuwe regels",
"Project": "Project",
"Flow": "Stroom",
"Run": "Uitvoeren"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,26 @@
{
"Store or retrieve data from key/value database": "Armazenar ou recuperar dados de banco de dados chave/valor",
"Get": "Receber",
"Put": "Colocar",
"Append": "Anexar",
"Remove": "Remover",
"Add To List": "Adicionar à lista",
"Remove from List": "Remover da lista",
"Get a value from storage": "Obter um valor do armazenamento",
"Put a value in storage": "Coloque um valor no armazenamento",
"Append to a value in storage": "Acrescentar a um valor no armazenamento",
"Remove a value from storage": "Remover um valor do armazenamento",
"Add Items to a list.": "Adicionar itens a uma lista.",
"Remove Item from a list": "Remover o item de uma lista",
"Key": "Chave",
"Default Value": "Valor Padrão",
"Store Scope": "Escopo de Loja",
"Value": "Valor",
"Separator": "Separador",
"Ignore if value exists": "Ignorar se o valor existe",
"The storage scope of the value.": "O escopo de armazenamento do valor.",
"Separator between added values, use \\n for newlines": "Separador entre valores adicionados, use \\n para novas linhas",
"Project": "Projecto",
"Flow": "Fluxo",
"Run": "Executar"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Хранилище",
"Store or retrieve data from key/value database": "Хранить или получать данные из базы данных ключ/значение",
"Get": "Приобрести",
"Put": "Положить",
"Append": "Добавить",
"Remove": "Remove",
"Add To List": "Добавить в список",
"Remove from List": "Удалить из списка",
"Get a value from storage": "Получить значение из хранилища",
"Put a value in storage": "Поместите значение в хранилище",
"Append to a value in storage": "Добавить к значению в хранилище",
"Remove a value from storage": "Удалить значение из хранилища",
"Add Items to a list.": "Добавить элементы в список.",
"Remove Item from a list": "Удалить элемент из списка",
"Key": "Спецификация",
"Default Value": "Значение по умолчанию",
"Store Scope": "Область магазина",
"Value": "Значение",
"Separator": "Разделитель",
"Ignore if value exists": "Игнорировать, если значение существует",
"The storage scope of the value.": "Область хранения значения.",
"Separator between added values, use \\n for newlines": "Разделитель между добавленными значениями, используйте \\n для новых строк",
"Project": "Проект",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,26 @@
{
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,27 @@
{
"Storage": "Storage",
"Store or retrieve data from key/value database": "Store or retrieve data from key/value database",
"Get": "Get",
"Put": "Put",
"Append": "Append",
"Remove": "Remove",
"Add To List": "Add To List",
"Remove from List": "Remove from List",
"Get a value from storage": "Get a value from storage",
"Put a value in storage": "Put a value in storage",
"Append to a value in storage": "Append to a value in storage",
"Remove a value from storage": "Remove a value from storage",
"Add Items to a list.": "Add Items to a list.",
"Remove Item from a list": "Remove Item from a list",
"Key": "Key",
"Default Value": "Default Value",
"Store Scope": "Store Scope",
"Value": "Value",
"Separator": "Separator",
"Ignore if value exists": "Ignore if value exists",
"The storage scope of the value.": "The storage scope of the value.",
"Separator between added values, use \\n for newlines": "Separator between added values, use \\n for newlines",
"Project": "Project",
"Flow": "Flow",
"Run": "Run"
}

View File

@@ -0,0 +1,26 @@
{
"Store or retrieve data from key/value database": "存储或从密钥/值数据库检索数据",
"Get": "获取",
"Put": "放入...",
"Append": "追加文件",
"Remove": "删除",
"Add To List": "添加到列表",
"Remove from List": "从列表中删除",
"Get a value from storage": "从存储获取一个值",
"Put a value in storage": "将一个值放入存储",
"Append to a value in storage": "附加到存储中的值",
"Remove a value from storage": "从存储中删除一个值",
"Add Items to a list.": "添加项目到列表。",
"Remove Item from a list": "从列表中删除项目",
"Key": "关键字",
"Default Value": "默认值",
"Store Scope": "商店范围",
"Value": "值",
"Separator": "分隔符",
"Ignore if value exists": "忽略如果值存在",
"The storage scope of the value.": "值的存储范围。",
"Separator between added values, use \\n for newlines": "添加值之间的分隔符,换行符为 \\n",
"Project": "项目",
"Flow": "流",
"Run": "运行"
}

View File

@@ -0,0 +1,27 @@
import { PieceAuth, createPiece } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { storageAddtoList } from './lib/actions/store-add-to-list';
import { storageAppendAction } from './lib/actions/store-append-action';
import { storageGetAction } from './lib/actions/store-get-action';
import { storagePutAction } from './lib/actions/store-put-action';
import { storageRemoveFromList } from './lib/actions/store-remove-from-list';
import { storageRemoveValue } from './lib/actions/store-remove-value';
export const storage = createPiece({
displayName: 'Storage',
description: 'Store or retrieve data from key/value database',
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/store.png',
categories: [PieceCategory.CORE],
auth: PieceAuth.None(),
authors: ["JanHolger","fardeenpanjwani-codeglo","Abdallah-Alwarawreh","Salem-Alaa","kishanprmr","MoShizzle","khaledmashaly","abuaboud"],
actions: [
storageGetAction,
storagePutAction,
storageAppendAction,
storageRemoveValue,
storageAddtoList,
storageRemoveFromList,
],
triggers: [],
});

View File

@@ -0,0 +1,55 @@
import { Property, StoreScope } from "@activepieces/pieces-framework"
export enum PieceStoreScope {
PROJECT = 'COLLECTION',
FLOW = 'FLOW',
RUN = 'RUN',
}
const testRunId = 'test-run-id-CbVidYfEuCRpUanfEb3RU';
export function getScopeAndKey(params: Params): { scope: StoreScope, key: string } {
switch (params.scope) {
case PieceStoreScope.PROJECT:
return { scope: StoreScope.PROJECT, key: params.key }
case PieceStoreScope.FLOW:
return { scope: StoreScope.FLOW, key: params.key }
case PieceStoreScope.RUN:
// Use a consistent test run ID when testing to allow store operations to work together
{
const runId = params.isTestMode ? testRunId : params.runId
return { scope: StoreScope.FLOW, key: `run_${runId}/${params.key}` }
}
}
}
type Params = {
runId: string
key: string
scope: PieceStoreScope
isTestMode: boolean
}
export const common = {
store_scope: Property.StaticDropdown({
displayName: 'Store Scope',
description: 'The storage scope of the value.',
required: true,
options: {
options: [
{
label: 'Project',
value: PieceStoreScope.PROJECT,
},
{
label: 'Flow',
value: PieceStoreScope.FLOW,
},
{
label: 'Run',
value: PieceStoreScope.RUN,
},
],
},
defaultValue: PieceStoreScope.PROJECT,
})
}

View File

@@ -0,0 +1,90 @@
import { ActionContext, ArrayProperty, CheckboxProperty, createAction, PieceAuthProperty, Property, ShortTextProperty, StaticDropdownProperty } from '@activepieces/pieces-framework';
import { z } from 'zod';
import { propsValidation } from '@activepieces/pieces-common';
import deepEqual from 'deep-equal';
import { common, getScopeAndKey, PieceStoreScope } from './common';
async function executeStorageAddToList(context: ActionContext<PieceAuthProperty | undefined, {
key: ShortTextProperty<true>;
value: ArrayProperty<true>;
ignore_if_exists: CheckboxProperty<false>;
store_scope: StaticDropdownProperty<PieceStoreScope, true>;
}>, isTestMode = false) {
await propsValidation.validateZod(context.propsValue, {
key: z.string().max(128),
});
const { key, scope } = getScopeAndKey({
runId: context.run.id,
key: context.propsValue['key'],
scope: context.propsValue.store_scope,
isTestMode,
});
const inputItems = context.propsValue.value ?? [];
let parsedInputItems: unknown[] = [];
try {
parsedInputItems = typeof inputItems === 'string' ? JSON.parse(inputItems) : inputItems;
if (!Array.isArray(parsedInputItems)) {
throw new Error(`Provided value is not a list.`);
}
} catch (err) {
throw new Error(`An unexpected error occurred: ${(err as Error).message}`);
}
// Get existing items from store
let items = (await context.store.get(key, scope)) ?? [];
try {
if (typeof items === 'string') {
items = JSON.parse(items);
}
if (!Array.isArray(items)) {
throw new Error(`Key ${context.propsValue['key']} is not a list.`);
}
} catch (err) {
throw new Error(`An unexpected error occurred: ${(err as Error).message}`);
}
if (context.propsValue['ignore_if_exists']) {
for (const newItem of parsedInputItems) {
const exists = items.some((existingItem) => deepEqual(existingItem, newItem));
if (!exists) {
items.push(newItem);
}
}
} else {
items.push(...parsedInputItems);
}
return context.store.put(key, items, scope);
}
export const storageAddtoList = createAction({
name: 'add_to_list',
displayName: 'Add To List',
description: 'Add Items to a list.',
errorHandlingOptions: {
continueOnFailure: {
hide: true,
},
retryOnFailure: {
hide: true,
},
},
props: {
key: Property.ShortText({
displayName: 'Key',
required: true,
}),
value: Property.Array({
displayName: 'Value',
required: true,
}),
ignore_if_exists: Property.Checkbox({
displayName: 'Ignore if value exists',
required: false,
}),
store_scope: common.store_scope,
},
async run(context) {
return await executeStorageAddToList(context, false);
},
async test(context) {
return await executeStorageAddToList(context, true);
},
});

View File

@@ -0,0 +1,79 @@
import {
ActionContext,
createAction,
PieceAuthProperty,
Property,
ShortTextProperty,
StaticDropdownProperty,
} from '@activepieces/pieces-framework';
import { common, getScopeAndKey, PieceStoreScope } from './common';
import { z } from 'zod';
import { propsValidation } from '@activepieces/pieces-common';
import { isNil } from '@activepieces/shared';
async function executeStorageAppend(context: ActionContext<PieceAuthProperty | undefined, {
key: ShortTextProperty<true>;
value: ShortTextProperty<true>;
separator: ShortTextProperty<false>;
store_scope: StaticDropdownProperty<PieceStoreScope, true>;
}>, isTestMode = false) {
await propsValidation.validateZod(context.propsValue, {
key: z.string().max(128),
});
const { key, scope } = getScopeAndKey({
runId: context.run.id,
key: context.propsValue['key'],
scope: context.propsValue.store_scope,
isTestMode,
});
const oldValue = (await context.store.get(key, scope)) || '';
if (typeof oldValue !== 'string') {
throw new Error(`Key ${context.propsValue.key} is not a string`);
}
const appendValue = context.propsValue.value;
if (appendValue === '' || isNil(appendValue)) {
return oldValue;
}
let separator = context.propsValue.separator || '';
separator = separator.replace(/\\n/g, '\n'); // Allow newline escape sequence
const newValue =
oldValue + (oldValue.length > 0 ? separator : '') + appendValue;
return await context.store.put(key, newValue, scope);
}
export const storageAppendAction = createAction({
name: 'append',
displayName: 'Append',
description: 'Append to a value in storage',
errorHandlingOptions: {
continueOnFailure: {
hide: true,
},
retryOnFailure: {
hide: true,
},
},
props: {
key: Property.ShortText({
displayName: 'Key',
required: true,
}),
value: Property.ShortText({
displayName: 'Value',
required: true,
}),
separator: Property.ShortText({
displayName: 'Separator',
description: 'Separator between added values, use \\n for newlines',
required: false,
}),
store_scope: common.store_scope,
},
async run(context) {
return await executeStorageAppend(context, false);
},
async test(context) {
return await executeStorageAppend(context, true);
},
});

View File

@@ -0,0 +1,84 @@
import {
ActionContext,
createAction,
PieceAuthProperty,
Property,
ShortTextProperty,
StaticDropdownProperty,
StoreScope,
} from '@activepieces/pieces-framework';
import { getScopeAndKey, PieceStoreScope } from './common';
import { z } from 'zod';
import { propsValidation } from '@activepieces/pieces-common';
async function executeStorageGet(context: ActionContext<PieceAuthProperty | undefined, {
key: ShortTextProperty<true>;
defaultValue: ShortTextProperty<false>;
store_scope: StaticDropdownProperty<PieceStoreScope, true>;
}>, isTestMode = false) {
await propsValidation.validateZod(context.propsValue, {
key: z.string().max(128),
});
const { key, scope } = getScopeAndKey({
runId: context.run.id,
key: context.propsValue['key'],
scope: context.propsValue.store_scope,
isTestMode,
});
return (
(await context.store.get(key, scope)) ?? context.propsValue['defaultValue']
);
}
export const storageGetAction = createAction({
name: 'get',
displayName: 'Get',
description: 'Get a value from storage',
errorHandlingOptions: {
continueOnFailure: {
hide: true,
},
retryOnFailure: {
hide: true,
},
},
props: {
key: Property.ShortText({
displayName: 'Key',
required: true,
}),
defaultValue: Property.ShortText({
displayName: 'Default Value',
required: false,
}),
store_scope: Property.StaticDropdown({
displayName: 'Store Scope',
description: 'The storage scope of the value.',
required: true,
options: {
options: [
{
label: 'Project',
value: PieceStoreScope.PROJECT,
},
{
label: 'Flow',
value: PieceStoreScope.FLOW,
},
{
label: 'Run',
value: PieceStoreScope.RUN,
},
],
},
defaultValue: StoreScope.PROJECT,
}),
},
async run(context) {
return await executeStorageGet(context, false);
},
async test(context) {
return await executeStorageGet(context, true);
},
});

View File

@@ -0,0 +1,64 @@
import {
ActionContext,
createAction,
PieceAuthProperty,
Property,
ShortTextProperty,
StaticDropdownProperty,
} from '@activepieces/pieces-framework';
import { common, getScopeAndKey, PieceStoreScope } from './common';
import { z } from 'zod';
import { propsValidation } from '@activepieces/pieces-common';
async function executeStoragePut(context: ActionContext<PieceAuthProperty | undefined, {
key: ShortTextProperty<true>;
value: ShortTextProperty<true>;
store_scope: StaticDropdownProperty<PieceStoreScope, true>;
}>, isTestMode = false) {
await propsValidation.validateZod(context.propsValue, {
key: z.string().max(128),
});
const { key, scope } = getScopeAndKey({
runId: context.run.id,
key: context.propsValue['key'],
scope: context.propsValue.store_scope,
isTestMode,
});
return await context.store.put(
key,
context.propsValue['value'],
scope
);
}
export const storagePutAction = createAction({
name: 'put',
displayName: 'Put',
description: 'Put a value in storage',
errorHandlingOptions: {
continueOnFailure: {
hide: true,
},
retryOnFailure: {
hide: true,
},
},
props: {
key: Property.ShortText({
displayName: 'Key',
required: true,
}),
value: Property.ShortText({
displayName: 'Value',
required: true,
}),
store_scope: common.store_scope,
},
async run(context) {
return await executeStoragePut(context, false);
},
async test(context) {
return await executeStoragePut(context, true);
},
});

View File

@@ -0,0 +1,86 @@
import {
ActionContext,
createAction,
PieceAuthProperty,
Property,
ShortTextProperty,
StaticDropdownProperty,
} from '@activepieces/pieces-framework';
import { z } from 'zod';
import { propsValidation } from '@activepieces/pieces-common';
import deepEqual from 'deep-equal';
import { common, getScopeAndKey, PieceStoreScope } from './common';
async function executeStorageRemoveFromList(context: ActionContext<PieceAuthProperty | undefined, {
key: ShortTextProperty<true>;
value: ShortTextProperty<true>;
store_scope: StaticDropdownProperty<PieceStoreScope, true>;
}>, isTestMode = false) {
await propsValidation.validateZod(context.propsValue, {
key: z.string().max(128),
});
const { key, scope } = getScopeAndKey({
runId: context.run.id,
key: context.propsValue['key'],
scope: context.propsValue.store_scope,
isTestMode,
});
const items =
(await context.store.get(
key,
scope,
)) ?? [];
if (!Array.isArray(items)) {
throw new Error(`Key ${context.propsValue['key']} is not an array`);
}
for (let i = 0; i < items.length; i++) {
if (deepEqual(items[i], context.propsValue['value'])) {
items.splice(i, 1);
return await context.store.put(
key,
items,
scope,
);
}
}
if (items.includes(context.propsValue['value'])) {
items.splice(items.indexOf(context.propsValue['value']), 1);
}
return await context.store.put(
key,
items,
scope,
);
}
export const storageRemoveFromList = createAction({
name: 'remove_from_list',
displayName: 'Remove from List',
description: 'Remove Item from a list',
errorHandlingOptions: {
continueOnFailure: {
hide: true,
},
retryOnFailure: {
hide: true,
},
},
props: {
key: Property.ShortText({
displayName: 'Key',
required: true,
}),
value: Property.ShortText({
displayName: 'Value',
required: true,
}),
store_scope: common.store_scope,
},
async run(context) {
return await executeStorageRemoveFromList(context, false);
},
async test(context) {
return await executeStorageRemoveFromList(context, true);
},
});

View File

@@ -0,0 +1,58 @@
import {
ActionContext,
createAction,
PieceAuthProperty,
Property,
ShortTextProperty,
StaticDropdownProperty,
} from '@activepieces/pieces-framework';
import { common, getScopeAndKey, PieceStoreScope } from './common';
import { z } from 'zod';
import { propsValidation } from '@activepieces/pieces-common';
async function executeStorageRemoveValue(context: ActionContext<PieceAuthProperty | undefined, {
key: ShortTextProperty<true>;
store_scope: StaticDropdownProperty<PieceStoreScope, true>;
}>, isTestMode = false) {
await propsValidation.validateZod(context.propsValue, {
key: z.string().max(128),
});
const { key, scope } = getScopeAndKey({
runId: context.run.id,
key: context.propsValue['key'],
scope: context.propsValue.store_scope,
isTestMode,
});
await context.store.delete(key, scope);
return {
success: true,
};
}
export const storageRemoveValue = createAction({
name: 'remove_value',
displayName: 'Remove',
description: 'Remove a value from storage',
errorHandlingOptions: {
continueOnFailure: {
hide: true,
},
retryOnFailure: {
hide: true,
},
},
props: {
key: Property.ShortText({
displayName: 'Key',
required: true,
}),
store_scope: common.store_scope,
},
async run(context) {
return await executeStorageRemoveValue(context, false);
},
async test(context) {
return await executeStorageRemoveValue(context, true);
},
});