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,33 @@
{
"extends": [
"../../../../.eslintrc.base.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-productboard
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-productboard` to build the library.

View File

@@ -0,0 +1,10 @@
{
"name": "@activepieces/piece-productboard",
"version": "0.0.2",
"type": "commonjs",
"main": "./src/index.js",
"types": "./src/index.d.ts",
"dependencies": {
"tslib": "^2.3.0"
}
}

View File

@@ -0,0 +1,65 @@
{
"name": "pieces-productboard",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/productboard/src",
"projectType": "library",
"release": {
"version": {
"manifestRootsToUpdate": [
"dist/{projectRoot}"
],
"currentVersionResolver": "git-tag",
"fallbackCurrentVersionResolver": "disk"
}
},
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/productboard",
"tsConfig": "packages/pieces/community/productboard/tsconfig.lib.json",
"packageJson": "packages/pieces/community/productboard/package.json",
"main": "packages/pieces/community/productboard/src/index.ts",
"assets": [
"packages/pieces/community/productboard/*.md",
{
"input": "packages/pieces/community/productboard/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"nx-release-publish": {
"options": {
"packageRoot": "dist/{projectRoot}"
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/productboard",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -0,0 +1,54 @@
{
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboard ist ein Produkt-Management-Tool, das Ihnen hilft, Ihre ProduktRoadmap und -funktionen zu verwalten.",
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Ihr Productboard-API-Schlüssel.\n\nUm Ihren API-Schlüssel zu erhalten:\n1. Gehen Sie zu https://app.productboard.com/\n2. Melden Sie sich bei Ihrem Konto\n3 3 an. Gehen Sie zu Einstellungen → Integrationen → Öffentliche API\n4. Generieren Sie einen neuen API-Schlüssel\n5. Kopieren Sie den Schlüssel und fügen Sie ihn hier ein",
"Create Feature": "Feature erstellen",
"Create Note": "Notiz erstellen",
"Update Feature": "Funktion aktualisieren",
"Get Feature": "Feature holen",
"Create a new feature in Productboard": "Erstellen Sie eine neue Funktion in Produktboard",
"Creates a new note in Productboard": "Erstellt eine neue Notiz in Produktboard",
"Updates an existing feature in Productboard.": "Aktualisiert ein vorhandenes Feature in Productboard.",
"Retrieves an existing feature.": "Ruft eine vorhandene Funktion ab.",
"Feature Name": "Objektname",
"Description": "Beschreibung",
"Type": "Typ",
"Status": "Status",
"Parent Type": "Elterntyp",
"Parent": "Elternteil",
"Archived": "Archiviert",
"Note Title": "Notiztitel",
"Content": "Inhalt",
"User Email": "Benutzer-E-Mail",
"Company Domain": "Firmendomäne",
"Display URL": "URL anzeigen",
"Source Origin": "Ursprung",
"Source Record ID": "Quelldatensatz-ID",
"Tags": "Tags",
"Feature": "Feature",
"Name of the feature": "Name der Funktion",
"Description of the feature": "Beschreibung der Funktion",
"Type of the feature": "Typ der Funktion",
"Current status of the feature": "Aktueller Status der Funktion",
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Ein Flag zeigt an, ob das Feature archiviert ist. Wenn null wird standardmäßig `false` verwendet.",
"Title of the feedback note": "Titel der Feedback-Notiz",
"HTML-encoded rich text content of the feedback note": "HTML-kodierter Rich Text Inhalt der Feedback-Notiz",
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "E-Mail-Adresse eines Benutzers, der zur Notiz hinzugefügt werden soll. Dieses Feld kann nicht mit `Unternehmensdomäne` kombiniert werden.",
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domain einer Firma, mit der die Notiz verlinkt werden soll. Dieses Feld kann nicht mit `Benutzer E-Mail` kombiniert werden.",
"URL where the external entity can be accessed.": "URL, auf die die externe Entität zugegriffen werden kann.",
"A unique string identifying the external system from which the data came.": "Ein eindeutiger String, der das externe System identifiziert, von dem die Daten stammen.",
"The unique id of the record in the origin system.": "Die einzigartige ID des Datensatzes im Ursprungssystem.",
"A set of tags for categorizing the note.": "Ein Satz von Tags für die Kategorisierung der Notiz.",
"The feature to update.": "Die zu aktualisierende Funktion.",
"New name for the feature.": "Neuer Name für das Feature.",
"New description for the feature.": "Neue Beschreibung für das Feature.",
"New status for the feature.": "Neuer Status für das Feature.",
"Whether the feature is archived.": "Ob die Funktion archiviert ist.",
"The feature to retrieve.": "Die Funktion, die abgerufen werden soll.",
"Subfeature": "Unterfunktion",
"New Feature": "Neue Funktion",
"New Note": "Neue Notiz",
"Updated Feature": "Aktualisierte Funktion",
"Triggers when a new feature is created in Productboard": "Trigger wenn eine neue Funktion in Productboard erstellt wird",
"Triggers when a new note is created in Productboard": "Löst aus, wenn eine neue Notiz in Productboard erstellt wird",
"Triggers when an existing feature is updated in Productboard": "Wird ausgelöst, wenn ein vorhandenes Feature in Productboard aktualisiert wird"
}

View File

@@ -0,0 +1,54 @@
{
"Productboard is a product management tool that helps you manage your product roadmap and features.": "El cuadro de producto es una herramienta de gestión de productos que le ayuda a administrar su mapa de ruta de producto y sus características.",
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Tu clave API del Tablero de Productos.\n\nPara obtener tu clave API:\n1. Ve a https://app.productboard.com/\n2. Inicia sesión en tu cuenta\n3. Vaya a Ajustes → Integraciones → API pública\n4. Genere una nueva clave API\n5. Copie la clave y péguela aquí",
"Create Feature": "Crear Característica",
"Create Note": "Crear nota",
"Update Feature": "Actualizar Característica",
"Get Feature": "Obtener Característica",
"Create a new feature in Productboard": "Crear una nueva característica en el cuadro de productos",
"Creates a new note in Productboard": "Crea una nueva nota en el cuadro de producto",
"Updates an existing feature in Productboard.": "Actualiza una característica existente en el Panel de Productos.",
"Retrieves an existing feature.": "Recupera una característica existente.",
"Feature Name": "Nombre de la característica",
"Description": "Descripción",
"Type": "Tipo",
"Status": "Estado",
"Parent Type": "Tipo de padre",
"Parent": "Padres",
"Archived": "Archivado",
"Note Title": "Título de nota",
"Content": "Contenido",
"User Email": "Email de usuario",
"Company Domain": "Dominio de la empresa",
"Display URL": "Mostrar URL",
"Source Origin": "Origen de origen",
"Source Record ID": "ID de registro de origen",
"Tags": "Etiquetas",
"Feature": "Característica",
"Name of the feature": "Nombre de la característica",
"Description of the feature": "Descripción de la característica",
"Type of the feature": "Tipo de característica",
"Current status of the feature": "Estado actual de la característica",
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Una bandera que denota si la función está archivada. Si es nula, por defecto será `false`.",
"Title of the feedback note": "Título de la nota de comentarios",
"HTML-encoded rich text content of the feedback note": "Contenido de texto enriquecido codificado en HTML de la nota de comentarios",
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Dirección de correo electrónico de un usuario a adjuntar a la nota. Este campo no puede combinarse con `Dominio de la empresa`.",
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Dominio de una empresa a la que la nota debe estar enlazada. Este campo no puede combinarse con `Email del usuario`.",
"URL where the external entity can be accessed.": "URL donde se puede acceder a la entidad externa.",
"A unique string identifying the external system from which the data came.": "Una cadena única que identifica el sistema externo del cual proceden los datos.",
"The unique id of the record in the origin system.": "El identificador único del registro en el sistema de origen.",
"A set of tags for categorizing the note.": "Un conjunto de etiquetas para categorizar la nota.",
"The feature to update.": "La característica a actualizar.",
"New name for the feature.": "Nuevo nombre para la característica.",
"New description for the feature.": "Nueva descripción para la característica.",
"New status for the feature.": "Nuevo estado para la función.",
"Whether the feature is archived.": "Si la característica está archivada.",
"The feature to retrieve.": "La característica a recuperar.",
"Subfeature": "Subfunción",
"New Feature": "Nueva característica",
"New Note": "Nueva nota",
"Updated Feature": "Característica actualizada",
"Triggers when a new feature is created in Productboard": "Dispara cuando se crea una nueva característica en el cuadro de productos",
"Triggers when a new note is created in Productboard": "Dispara cuando se crea una nueva nota en el cuadro de productos",
"Triggers when an existing feature is updated in Productboard": "Dispara cuando una característica existente se actualiza en el cuadro de productos"
}

View File

@@ -0,0 +1,54 @@
{
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Produtboard est un outil de gestion de produits qui vous aide à gérer votre feuille de route et les fonctionnalités de votre produit.",
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Votre clé API de Productboard.\n\nPour obtenir votre clé API :\n1. Allez sur https://app.productboard.com/\n2. Connectez-vous à votre compte\n3. Allez dans Paramètres → Intégrations → API publique\n4. Générez une nouvelle clé API\n5. Copiez la clé et collez-la ici",
"Create Feature": "Créer une fonctionnalité",
"Create Note": "Créer une note",
"Update Feature": "Mettre à jour la fonctionnalité",
"Get Feature": "Obtenir la fonctionnalité",
"Create a new feature in Productboard": "Créer une nouvelle fonctionnalité dans le Productboard",
"Creates a new note in Productboard": "Crée une nouvelle note dans le tableau de produit",
"Updates an existing feature in Productboard.": "Met à jour une fonctionnalité existante dans Productboard.",
"Retrieves an existing feature.": "Récupère une fonctionnalité existante.",
"Feature Name": "Nom de la fonctionnalité",
"Description": "Libellé",
"Type": "Type de texte",
"Status": "Statut",
"Parent Type": "Type parent",
"Parent": "Parent",
"Archived": "Archivé",
"Note Title": "Titre de la note",
"Content": "Contenus",
"User Email": "E-mail de l'utilisateur",
"Company Domain": "Domaine de la société",
"Display URL": "URL d'affichage",
"Source Origin": "Origine source",
"Source Record ID": "ID de l'enregistrement source",
"Tags": "Tags",
"Feature": "Fonctionnalité",
"Name of the feature": "Nom de la caractéristique",
"Description of the feature": "Description de la fonctionnalité",
"Type of the feature": "Type de la fonction",
"Current status of the feature": "Statut actuel de la fonctionnalité",
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Un drapeau indiquant si la fonctionnalité est archivée. Si null, elle sera par défaut `false`.",
"Title of the feedback note": "Titre de la note de commentaire",
"HTML-encoded rich text content of the feedback note": "Contenu en texte riche encodé en HTML de la note de rétroaction",
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Adresse email d'un utilisateur à attacher à la note. Ce champ ne peut pas être combiné avec le `Domaine de l'Entreprise`.",
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domaine d'une entreprise à laquelle la note doit être liée. Ce champ ne peut pas être combiné avec `User Email`.",
"URL where the external entity can be accessed.": "URL où l'entité externe peut être accédée.",
"A unique string identifying the external system from which the data came.": "Une chaîne de caractères unique identifiant le système externe d'où proviennent les données.",
"The unique id of the record in the origin system.": "L'identifiant unique de l'enregistrement dans le système d'origine.",
"A set of tags for categorizing the note.": "Un ensemble de balises pour catégoriser la note.",
"The feature to update.": "La fonctionnalité à mettre à jour.",
"New name for the feature.": "Nouveau nom pour la fonctionnalité.",
"New description for the feature.": "Nouvelle description pour la fonctionnalité.",
"New status for the feature.": "Nouveau statut pour la fonctionnalité.",
"Whether the feature is archived.": "Si la fonctionnalité est archivée.",
"The feature to retrieve.": "La fonction à récupérer.",
"Subfeature": "Sous-fonctionnalité",
"New Feature": "Nouvelle fonctionnalité",
"New Note": "Nouvelle note",
"Updated Feature": "Fonctionnalité mise à jour",
"Triggers when a new feature is created in Productboard": "Déclenche quand une nouvelle fonctionnalité est créée dans la carte produit",
"Triggers when a new note is created in Productboard": "Déclenche quand une nouvelle note est créée dans le Productboard",
"Triggers when an existing feature is updated in Productboard": "Déclenche quand une fonctionnalité existante est mise à jour dans la carte produit"
}

View File

@@ -0,0 +1,54 @@
{
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboardは、製品のロードマップと機能を管理するための製品管理ツールです。",
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here",
"Create Feature": "機能を作成",
"Create Note": "ノートを作成",
"Update Feature": "機能の更新",
"Get Feature": "機能を取得する",
"Create a new feature in Productboard": "製品ボードに新しい機能を作成",
"Creates a new note in Productboard": "Productboardに新しいートを作成",
"Updates an existing feature in Productboard.": "Productboardの既存の機能を更新します。",
"Retrieves an existing feature.": "既存の機能を取得します。",
"Feature Name": "機能名",
"Description": "説明",
"Type": "タイプ",
"Status": "ステータス",
"Parent Type": "親タイプ",
"Parent": "親",
"Archived": "アーカイブ済み",
"Note Title": "ノートタイトル",
"Content": "コンテンツ",
"User Email": "ユーザーのメールアドレス",
"Company Domain": "会社ドメイン",
"Display URL": "URLを表示",
"Source Origin": "ソース元",
"Source Record ID": "ソースレコードID",
"Tags": "タグ",
"Feature": "機能",
"Name of the feature": "機能の名前",
"Description of the feature": "機能の説明",
"Type of the feature": "機能の種類",
"Current status of the feature": "機能の現在の状態",
"A flag denoting if the feature is archived. If null, it will default to `false`.": "この機能がアーカイブされている場合を示すフラグ。null の場合、デフォルトは `false` になります。",
"Title of the feedback note": "フィードバックノートのタイトル",
"HTML-encoded rich text content of the feedback note": "フィードバックノートの HTML エンコードされたリッチテキストコンテンツ",
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "ノートに添付するユーザーのメールアドレス。このフィールドは `Company Domain` と組み合わせることはできません。",
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "メモをリンクさせる必要がある会社のドメイン。このフィールドは `User Email` と組み合わせることはできません。",
"URL where the external entity can be accessed.": "外部エンティティにアクセスできるURL。",
"A unique string identifying the external system from which the data came.": "データが来た外部システムを識別する独自の文字列。",
"The unique id of the record in the origin system.": "オリジンシステム内のレコードの一意の id です。",
"A set of tags for categorizing the note.": "ノートを分類するためのタグのセット。",
"The feature to update.": "更新する機能",
"New name for the feature.": "この機能の新しい名前。",
"New description for the feature.": "この機能の新しい説明。",
"New status for the feature.": "この機能の新しいステータスです。",
"Whether the feature is archived.": "フィーチャーがアーカイブされているかどうか。",
"The feature to retrieve.": "取得する機能",
"Subfeature": "サブ機能",
"New Feature": "新機能",
"New Note": "新しいメモ",
"Updated Feature": "更新された機能",
"Triggers when a new feature is created in Productboard": "Productboardで新しい機能が作成されたときにトリガーします",
"Triggers when a new note is created in Productboard": "Productboardで新しいートが作成されたときにトリガーします",
"Triggers when an existing feature is updated in Productboard": "Productboardで既存の機能が更新されたときにトリガーします"
}

View File

@@ -0,0 +1,54 @@
{
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboard is een tool voor productbeheer die je helpt je productroadmap en -functies te beheren.",
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Uw Productboard API-sleutel.\n\nOm uw API-sleutel te verkrijgen:\n1. Ga naar https://app.productboard.com/\n2. Log in op uw account\n3. Ga naar Instellingen → Integraties → Publieke API\n4. Genereer een nieuwe API Key\n5. Kopieer de Key en plak hem hier",
"Create Feature": "Functie aanmaken",
"Create Note": "Notitie aanmaken",
"Update Feature": "Functie bijwerken",
"Get Feature": "Functie verkrijgen",
"Create a new feature in Productboard": "Maak een nieuwe functie aan op het Productbord",
"Creates a new note in Productboard": "Maakt een nieuwe notitie aan op Productbord",
"Updates an existing feature in Productboard.": "Werkt een bestaande functie bij in het productbord.",
"Retrieves an existing feature.": "Haal een bestaande functie op.",
"Feature Name": "Naam functie",
"Description": "Beschrijving",
"Type": "Type",
"Status": "status",
"Parent Type": "Bovenliggend type",
"Parent": "Bovenliggende",
"Archived": "Gearchiveerd",
"Note Title": "Notitie titel",
"Content": "Inhoud",
"User Email": "E-mail van gebruiker",
"Company Domain": "Bedrijfsdomein",
"Display URL": "Toon URL",
"Source Origin": "Bron oorsprong",
"Source Record ID": "Bron record ID",
"Tags": "Labels",
"Feature": "Functie",
"Name of the feature": "Naam van de functie",
"Description of the feature": "Beschrijving van de functie",
"Type of the feature": "Type van de functie",
"Current status of the feature": "Huidige status van de functie",
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Een vlag denoten als de functie is gearchiveerd. Als deze leeg is zal het standaard `false` zijn.",
"Title of the feedback note": "Titel van de feedback notitie",
"HTML-encoded rich text content of the feedback note": "HTML-gecodeerde rich tekst inhoud van de feedbacknotitie",
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "E-mailadres van een gebruiker die aan de notitie moet worden gekoppeld. Dit veld kan niet worden gecombineerd met `BedrijfDomain`.",
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domein van een bedrijf waaraan de notitie moet worden gekoppeld. Dit veld kan niet worden gecombineerd met `Gebruiker E-mail`.",
"URL where the external entity can be accessed.": "URL waar de externe entiteit kan worden benaderd.",
"A unique string identifying the external system from which the data came.": "Een unieke tekenreeks die het externe systeem identificeert waar de gegevens vandaan komen.",
"The unique id of the record in the origin system.": "Het unieke id van het record in het oorsprongssysteem.",
"A set of tags for categorizing the note.": "Een set van tags voor het categoriseren van de notitie.",
"The feature to update.": "De functie om bij te werken",
"New name for the feature.": "Nieuwe naam voor deze functie.",
"New description for the feature.": "Nieuwe beschrijving van de functie",
"New status for the feature.": "Nieuwe status voor deze functie.",
"Whether the feature is archived.": "Of de functie is gearchiveerd.",
"The feature to retrieve.": "De functie om op te halen.",
"Subfeature": "Subfunctie",
"New Feature": "Nieuwe functie",
"New Note": "Nieuwe notitie",
"Updated Feature": "Bijgewerkte functie",
"Triggers when a new feature is created in Productboard": "Triggert wanneer een nieuwe functie wordt aangemaakt op het Productbord",
"Triggers when a new note is created in Productboard": "Triggert wanneer een nieuwe notitie wordt aangemaakt op het Productbord",
"Triggers when an existing feature is updated in Productboard": "Triggert wanneer een bestaande functie wordt bijgewerkt in het Productbord"
}

View File

@@ -0,0 +1,54 @@
{
"Productboard is a product management tool that helps you manage your product roadmap and features.": "O Painel de Produto é uma ferramenta de gerenciamento de produtos que o ajuda a gerenciar o seu roteiro e recursos do produto.",
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Sua chave de API Productboard.\n\nPara obter a sua chave de API:\n1. Vá para https://app.productboard.com/\n2. Entre na sua conta\n3. Vá para Configurações → Integrações → API pública\n4. Gerar uma nova chave de API\n5. Copie a chave e cole-a aqui",
"Create Feature": "Criar Recurso",
"Create Note": "Criar Nota",
"Update Feature": "Atualizar Recurso",
"Get Feature": "Obter recurso",
"Create a new feature in Productboard": "Criar um novo recurso no Tabela de Produto",
"Creates a new note in Productboard": "Cria uma nova nota no Tabela de Produto",
"Updates an existing feature in Productboard.": "Atualiza um recurso existente no Quadro de Produtos.",
"Retrieves an existing feature.": "Recupera um recurso existente.",
"Feature Name": "Nome da funcionalidade",
"Description": "Descrição",
"Type": "tipo",
"Status": "Estado",
"Parent Type": "Tipo de Origem",
"Parent": "Antecessor",
"Archived": "Arquivado",
"Note Title": "Título da Nota",
"Content": "Conteúdo",
"User Email": "Email do Usuário",
"Company Domain": "Domínio da empresa",
"Display URL": "Exibir URL",
"Source Origin": "Origem da fonte",
"Source Record ID": "ID do registro de origem",
"Tags": "Etiquetas",
"Feature": "Funcionalidade",
"Name of the feature": "Nome da funcionalidade",
"Description of the feature": "Descrição da funcionalidade",
"Type of the feature": "Tipo do recurso",
"Current status of the feature": "Status atual do recurso",
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Uma bandeira indicando se o recurso está arquivado. Se estiver nulo, será por padrão `false`.",
"Title of the feedback note": "Título da nota de feedback",
"HTML-encoded rich text content of the feedback note": "Conteúdo de texto rico codificado em HTML da nota de feedback",
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Endereço de e-mail de um usuário a ser anexado à nota. Este campo não pode ser combinado com o `Domínio da Empresa`.",
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domínio de uma empresa a nota deve estar vinculada. Este campo não pode ser combinado com `E-mail do Usuário`.",
"URL where the external entity can be accessed.": "URL onde a entidade externa pode ser acessada.",
"A unique string identifying the external system from which the data came.": "Uma string única que identifica o sistema externo de onde os dados vieram.",
"The unique id of the record in the origin system.": "O ID exclusivo do registro no sistema de origem.",
"A set of tags for categorizing the note.": "Um conjunto de tags para categorizar a nota.",
"The feature to update.": "O recurso a atualizar.",
"New name for the feature.": "Novo nome para o recurso.",
"New description for the feature.": "Nova descrição para o recurso.",
"New status for the feature.": "Novo status para o recurso.",
"Whether the feature is archived.": "Se o recurso está arquivado.",
"The feature to retrieve.": "O recurso a recuperar.",
"Subfeature": "Subrecurso",
"New Feature": "Nova Funcionalidade",
"New Note": "Nova anotação",
"Updated Feature": "Recurso atualizado",
"Triggers when a new feature is created in Productboard": "Dispara quando uma nova funcionalidade é criada no Painel de Produto",
"Triggers when a new note is created in Productboard": "Dispara quando uma nova nota é criada no Quadro de Produtos",
"Triggers when an existing feature is updated in Productboard": "Dispara quando uma funcionalidade existente é atualizada no Painel de Produto"
}

View File

@@ -0,0 +1,54 @@
{
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboard is a product management tool that helps you manage your product roadmap and features.",
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here",
"Create Feature": "Create Feature",
"Create Note": "Create Note",
"Update Feature": "Update Feature",
"Get Feature": "Get Feature",
"Create a new feature in Productboard": "Create a new feature in Productboard",
"Creates a new note in Productboard": "Creates a new note in Productboard",
"Updates an existing feature in Productboard.": "Updates an existing feature in Productboard.",
"Retrieves an existing feature.": "Retrieves an existing feature.",
"Feature Name": "Feature Name",
"Description": "Description",
"Type": "Type",
"Status": "Status",
"Parent Type": "Parent Type",
"Parent": "Parent",
"Archived": "Archived",
"Note Title": "Note Title",
"Content": "Content",
"User Email": "User Email",
"Company Domain": "Company Domain",
"Display URL": "Display URL",
"Source Origin": "Source Origin",
"Source Record ID": "Source Record ID",
"Tags": "Tags",
"Feature": "Feature",
"Name of the feature": "Name of the feature",
"Description of the feature": "Description of the feature",
"Type of the feature": "Type of the feature",
"Current status of the feature": "Current status of the feature",
"A flag denoting if the feature is archived. If null, it will default to `false`.": "A flag denoting if the feature is archived. If null, it will default to `false`.",
"Title of the feedback note": "Title of the feedback note",
"HTML-encoded rich text content of the feedback note": "HTML-encoded rich text content of the feedback note",
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.",
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domain of a company the note should be linked to. This field can't be combined with `User Email`.",
"URL where the external entity can be accessed.": "URL where the external entity can be accessed.",
"A unique string identifying the external system from which the data came.": "A unique string identifying the external system from which the data came.",
"The unique id of the record in the origin system.": "The unique id of the record in the origin system.",
"A set of tags for categorizing the note.": "A set of tags for categorizing the note.",
"The feature to update.": "The feature to update.",
"New name for the feature.": "New name for the feature.",
"New description for the feature.": "New description for the feature.",
"New status for the feature.": "New status for the feature.",
"Whether the feature is archived.": "Whether the feature is archived.",
"The feature to retrieve.": "The feature to retrieve.",
"Subfeature": "Subfeature",
"New Feature": "New Feature",
"New Note": "New Note",
"Updated Feature": "Updated Feature",
"Triggers when a new feature is created in Productboard": "Triggers when a new feature is created in Productboard",
"Triggers when a new note is created in Productboard": "Triggers when a new note is created in Productboard",
"Triggers when an existing feature is updated in Productboard": "Triggers when an existing feature is updated in Productboard"
}

View File

@@ -0,0 +1,54 @@
{
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboard is a product management tool that helps you manage your product roadmap and features.",
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here",
"Create Feature": "Create Feature",
"Create Note": "Create Note",
"Update Feature": "Update Feature",
"Get Feature": "Get Feature",
"Create a new feature in Productboard": "Create a new feature in Productboard",
"Creates a new note in Productboard": "Creates a new note in Productboard",
"Updates an existing feature in Productboard.": "Updates an existing feature in Productboard.",
"Retrieves an existing feature.": "Retrieves an existing feature.",
"Feature Name": "Feature Name",
"Description": "描述",
"Type": "类型",
"Status": "状态",
"Parent Type": "Parent Type",
"Parent": "Parent",
"Archived": "Archived",
"Note Title": "Note Title",
"Content": "Content",
"User Email": "User Email",
"Company Domain": "Company Domain",
"Display URL": "Display URL",
"Source Origin": "Source Origin",
"Source Record ID": "Source Record ID",
"Tags": "标签",
"Feature": "Feature",
"Name of the feature": "Name of the feature",
"Description of the feature": "Description of the feature",
"Type of the feature": "Type of the feature",
"Current status of the feature": "Current status of the feature",
"A flag denoting if the feature is archived. If null, it will default to `false`.": "A flag denoting if the feature is archived. If null, it will default to `false`.",
"Title of the feedback note": "Title of the feedback note",
"HTML-encoded rich text content of the feedback note": "HTML-encoded rich text content of the feedback note",
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.",
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domain of a company the note should be linked to. This field can't be combined with `User Email`.",
"URL where the external entity can be accessed.": "URL where the external entity can be accessed.",
"A unique string identifying the external system from which the data came.": "A unique string identifying the external system from which the data came.",
"The unique id of the record in the origin system.": "The unique id of the record in the origin system.",
"A set of tags for categorizing the note.": "A set of tags for categorizing the note.",
"The feature to update.": "The feature to update.",
"New name for the feature.": "New name for the feature.",
"New description for the feature.": "New description for the feature.",
"New status for the feature.": "New status for the feature.",
"Whether the feature is archived.": "Whether the feature is archived.",
"The feature to retrieve.": "The feature to retrieve.",
"Subfeature": "Subfeature",
"New Feature": "New Feature",
"New Note": "New Note",
"Updated Feature": "Updated Feature",
"Triggers when a new feature is created in Productboard": "Triggers when a new feature is created in Productboard",
"Triggers when a new note is created in Productboard": "Triggers when a new note is created in Productboard",
"Triggers when an existing feature is updated in Productboard": "Triggers when an existing feature is updated in Productboard"
}

View File

@@ -0,0 +1,32 @@
import { createPiece } from "@activepieces/pieces-framework";
import { productboardAuth } from "./lib/common/auth";
import { createFeature } from "./lib/actions/create-feature";
import { createNote } from "./lib/actions/create-note";
import { updateFeature } from "./lib/actions/update-feature";
import { getFeature } from "./lib/actions/get-feature";
import { newFeature } from "./lib/triggers/new-feature";
import { newNote } from "./lib/triggers/new-note";
import { updatedFeature } from "./lib/triggers/updated-feature";
import { PieceCategory } from "@activepieces/shared";
export const productboard = createPiece({
displayName: "Productboard",
auth: productboardAuth,
description: "Productboard is a product management tool that helps you manage your product roadmap and features.",
categories: [PieceCategory.PRODUCTIVITY],
minimumSupportedRelease: '0.36.1',
logoUrl: "https://cdn.activepieces.com/pieces/productboard.png",
authors: ["owuzo", "onyedikachi-david"],
actions: [
createFeature,
createNote,
updateFeature,
getFeature,
],
triggers: [
newFeature,
newNote,
updatedFeature,
],
});

View File

@@ -0,0 +1,171 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { productboardAuth } from '../common/auth';
import { productboardCommon } from '../common/client';
export const createFeature = createAction({
name: 'create_feature',
displayName: 'Create Feature',
description: 'Create a new feature in Productboard',
auth: productboardAuth,
props: {
name: Property.ShortText({
displayName: 'Feature Name',
description: 'Name of the feature',
required: true,
}),
description: Property.LongText({
displayName: 'Description',
description: 'Description of the feature',
required: true,
}),
type: Property.StaticDropdown({
displayName: 'Type',
description: 'Type of the feature',
required: true,
options: {
options: [
{ label: 'Feature', value: 'feature' },
{ label: 'Subfeature', value: 'subfeature' },
]
}
}),
status: Property.Dropdown({
auth: productboardAuth,
displayName: 'Status',
description: 'Current status of the feature',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please authenticate first'
};
}
const response = await productboardCommon.apiCall({
auth: auth,
method: HttpMethod.GET,
resourceUri: '/feature-statuses'
});
const statuses = response.body['data'] ?? [];
return {
disabled: false,
options: statuses.map((status: { id: string; name: string }) => ({
label: status.name,
value: status.id
}))
};
}
}),
parent_type: Property.DynamicProperties({
auth: productboardAuth,
displayName: 'Parent Type',
required: true,
refreshers: ['type'],
props: async (props) => {
const typeValue = props['type'] as unknown as string
const fields: { [key: string]: any } = {}
if (typeValue === 'subfeature') {
fields['parent_type'] = Property.StaticDropdown({
displayName: 'Parent Type',
required: true,
options: {
options: [
{ label: 'Feature', value: 'feature' },
]
}
})
} else {
fields['parent_type'] = Property.StaticDropdown({
displayName: 'Parent Type',
required: true,
options: {
options: [
{ label: 'Product', value: 'product' },
{ label: 'Component', value: 'component' },
]
}
})
}
return fields
}
}),
parent_id: Property.Dropdown({
auth: productboardAuth,
displayName: 'Parent',
required: true,
refreshers: ['parent_type'],
options: async (props) => {
const auth = props['auth']
const parent_type = props['parent_type'] as unknown as { parent_type: string }
if (!auth) return { disabled: true, options: [], placeholder: 'Please authenticate first' };
if (!parent_type) return { disabled: true, options: [], placeholder: 'Please select a parent type first' };
const parentTypeValue = parent_type.parent_type
let resourceUri = ''
if (parentTypeValue === 'product') resourceUri = '/products'
else if (parentTypeValue === 'component') resourceUri = '/components'
else if (parentTypeValue === 'feature') resourceUri = '/features'
if (!resourceUri) return { disabled: true, options: [], placeholder: 'Invalid parent type' };
const response = await productboardCommon.apiCall({
auth: auth,
method: HttpMethod.GET,
resourceUri: resourceUri
});
const items = response.body['data'] || [];
let filteredItems = items;
if (parentTypeValue === 'feature') {
filteredItems = items.filter((item: { type: string }) => item.type === 'feature');
}
return {
disabled: false,
options: filteredItems.map((item: { id: string; name: string }) => ({
label: item.name,
value: item.id
}))
};
}
}),
archived: Property.Checkbox({
displayName: 'Archived',
description: 'A flag denoting if the feature is archived. If null, it will default to `false`.',
required: false,
}),
},
async run(context) {
const { name, description, type, status, parent_type, parent_id, archived } = context.propsValue;
const feature: Record<string, any> = {
data: {
name,
description: `<p>${description}</p>`,
type,
status: {
id: status,
},
parent: {
[(parent_type as { parent_type: string }).parent_type]: {
id: parent_id,
},
},
archived: archived,
},
};
const response = await productboardCommon.apiCall({
auth: context.auth,
method: HttpMethod.POST,
resourceUri: '/features',
body: feature,
});
return response.body;
},
});

View File

@@ -0,0 +1,108 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { productboardAuth } from '../common/auth';
import { productboardCommon } from '../common/client';
export const createNote = createAction({
name: 'create_note',
displayName: 'Create Note',
description: 'Creates a new note in Productboard',
auth: productboardAuth,
props: {
title: Property.ShortText({
displayName: 'Note Title',
description: 'Title of the feedback note',
required: true,
}),
content: Property.LongText({
displayName: 'Content',
description: 'HTML-encoded rich text content of the feedback note',
required: true,
}),
user_email: Property.ShortText({
displayName: 'User Email',
description: "Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.",
required: false,
}),
company_domain: Property.ShortText({
displayName: 'Company Domain',
description: "Domain of a company the note should be linked to. This field can't be combined with `User Email`.",
required: false,
}),
display_url: Property.ShortText({
displayName: 'Display URL',
description: 'URL where the external entity can be accessed.',
required: false,
}),
source_origin: Property.ShortText({
displayName: 'Source Origin',
description: 'A unique string identifying the external system from which the data came.',
required: false,
}),
source_record_id: Property.ShortText({
displayName: 'Source Record ID',
description: 'The unique id of the record in the origin system.',
required: false,
}),
tags: Property.Array({
displayName: 'Tags',
description: 'A set of tags for categorizing the note.',
required: false,
properties: {
tag: Property.ShortText({
displayName: 'Tag',
required: true,
}),
},
}),
},
async run(context) {
const {
title,
content,
user_email,
company_domain,
display_url,
source_origin,
source_record_id,
tags,
} = context.propsValue;
const note: Record<string, any> = {
title,
content,
};
if (user_email) {
note['user'] = { email: user_email };
}
if (company_domain) {
note['company'] = { domain: company_domain };
}
if (display_url) {
note['display_url'] = display_url;
}
if (source_origin && source_record_id) {
note['source'] = {
origin: source_origin,
record_id: source_record_id,
};
}
if (tags) {
note['tags'] = (tags as { tag: string }[]).map((t) => t.tag);
}
const response = await productboardCommon.apiCall({
auth: context.auth,
method: HttpMethod.POST,
resourceUri: '/notes',
body: note,
});
return response.body;
},
});

View File

@@ -0,0 +1,53 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { productboardAuth } from '../common/auth';
import { productboardCommon } from '../common/client';
export const getFeature = createAction({
name: 'get_feature',
displayName: 'Get Feature',
description: 'Retrieves an existing feature.',
auth: productboardAuth,
props: {
feature_id: Property.Dropdown({
auth: productboardAuth,
displayName: 'Feature',
description: 'The feature to retrieve.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please authenticate first'
};
}
const response = await productboardCommon.apiCall({
auth: auth,
method: HttpMethod.GET,
resourceUri: '/features'
});
const features = response.body['data'] ?? [];
return {
disabled: false,
options: features.map((feature: { id: string; name: string }) => ({
label: feature.name,
value: feature.id
}))
};
}
})
},
async run(context) {
const { feature_id } = context.propsValue;
const response = await productboardCommon.apiCall({
auth: context.auth,
method: HttpMethod.GET,
resourceUri: `/features/${feature_id}`,
});
return response.body;
},
});

View File

@@ -0,0 +1,122 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { productboardAuth } from '../common/auth';
import { productboardCommon } from '../common/client';
export const updateFeature = createAction({
name: 'update_feature',
displayName: 'Update Feature',
description: 'Updates an existing feature in Productboard.',
auth: productboardAuth,
props: {
feature_id: Property.Dropdown({
auth: productboardAuth,
displayName: 'Feature',
description: 'The feature to update.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please authenticate first'
};
}
const response = await productboardCommon.apiCall({
auth: auth,
method: HttpMethod.GET,
resourceUri: '/features'
});
const features = response.body['data'] ?? [];
return {
disabled: false,
options: features.map((feature: { id: string; name: string }) => ({
label: feature.name,
value: feature.id
}))
};
}
}),
name: Property.ShortText({
displayName: 'Feature Name',
description: 'New name for the feature.',
required: false,
}),
description: Property.LongText({
displayName: 'Description',
description: 'New description for the feature.',
required: false,
}),
status: Property.Dropdown({
auth: productboardAuth,
displayName: 'Status',
description: 'New status for the feature.',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please authenticate first'
};
}
const response = await productboardCommon.apiCall({
auth: auth,
method: HttpMethod.GET,
resourceUri: '/feature-statuses'
});
const statuses = response.body['data'] ?? [];
return {
disabled: false,
options: statuses.map((status: { id: string; name: string }) => ({
label: status.name,
value: status.id
}))
};
}
}),
archived: Property.Checkbox({
displayName: 'Archived',
description: 'Whether the feature is archived.',
required: false,
}),
},
async run(context) {
const { feature_id, name, description, status, archived } = context.propsValue;
const feature: Record<string, any> = {
data: {},
};
if (name) {
feature['data'].name = name;
}
if (description) {
feature['data'].description = description;
}
if (status) {
feature['data'].status = { id: status };
}
if (archived !== undefined) {
feature['data'].archived = archived;
}
if (Object.keys(feature['data']).length === 0) {
return { success: true, message: 'No fields to update.' };
}
const response = await productboardCommon.apiCall({
auth: context.auth,
method: HttpMethod.PATCH,
resourceUri: `/features/${feature_id}`,
body: feature,
});
return response.body;
},
});

View File

@@ -0,0 +1,14 @@
import { PieceAuth } from '@activepieces/pieces-framework';
export const productboardAuth = PieceAuth.SecretText({
displayName: 'API Key',
description: `Your Productboard API Key.
To obtain your API Key:
1. Go to https://app.productboard.com/
2. Log in to your account
3. Go to Settings → Integrations → Public API
4. Generate a new API Key
5. Copy the Key and paste it here`,
required: true,
});

View File

@@ -0,0 +1,35 @@
import { httpClient, HttpMethod, AuthenticationType } from '@activepieces/pieces-common';
import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
import { productboardAuth } from './auth';
const PRODUCTBOARD_API_BASE_URL = 'https://api.productboard.com';
export const productboardCommon = {
baseUrl: PRODUCTBOARD_API_BASE_URL,
async apiCall({
auth,
method,
resourceUri,
body = undefined,
queryParams = undefined,
}: {
auth: AppConnectionValueForAuthProperty<typeof productboardAuth>;
method: HttpMethod;
resourceUri: string;
body?: any;
queryParams?: Record<string, string>;
}) {
return await httpClient.sendRequest({
method: method,
url: `${PRODUCTBOARD_API_BASE_URL}${resourceUri}`,
body,
queryParams,
headers: {
'Authorization': `Bearer ${auth.secret_text}`,
'X-Version': '1',
'Content-Type': 'application/json',
}
});
}
};

View File

@@ -0,0 +1,64 @@
import { productboardAuth } from '../common/auth';
import { HttpMethod } from '@activepieces/pieces-common';
import {
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { productboardCommon } from '../common/client';
export const newFeature = createTrigger({
name: 'new_feature',
displayName: 'New Feature',
description: 'Triggers when a new feature is created in Productboard',
auth: productboardAuth,
type: TriggerStrategy.WEBHOOK,
props: {},
sampleData: {
data: {
id: 'c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
eventType: 'feature.created',
links: {
target: 'https://api.productboard.com/features/c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
},
},
},
onEnable: async (context) => {
const { webhookUrl, auth } = context;
const response = await productboardCommon.apiCall({
auth,
method: HttpMethod.POST,
resourceUri: '/webhooks',
body: {
data: {
name: 'Activepieces - New Feature',
events: [
{
eventType: 'feature.created',
},
],
notification: {
url: webhookUrl,
version: 1,
},
},
},
});
await context.store.put('webhook_id', response.body['data'].id);
return response.body;
},
onDisable: async (context) => {
const { auth } = context;
const webhookId = await context.store.get('webhook_id');
if (webhookId) {
await productboardCommon.apiCall({
auth,
method: HttpMethod.DELETE,
resourceUri: `/webhooks/${webhookId}`,
});
}
},
run: async (context) => {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { productboardAuth } from '../common/auth';
import { HttpMethod } from '@activepieces/pieces-common';
import {
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { productboardCommon } from '../common/client';
export const newNote = createTrigger({
name: 'new_note',
displayName: 'New Note',
description: 'Triggers when a new note is created in Productboard',
auth: productboardAuth,
type: TriggerStrategy.WEBHOOK,
props: {},
sampleData: {
data: {
id: 'c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
eventType: 'note.created',
links: {
target: 'https://api.productboard.com/notes/c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
},
},
},
onEnable: async (context) => {
const { webhookUrl, auth } = context;
const response = await productboardCommon.apiCall({
auth,
method: HttpMethod.POST,
resourceUri: '/webhooks',
body: {
data: {
name: 'Activepieces - New Note',
events: [
{
eventType: 'note.created',
},
],
notification: {
url: webhookUrl,
version: 1,
},
},
},
});
await context.store.put('webhook_id', response.body['data'].id);
return response.body;
},
onDisable: async (context) => {
const { auth } = context;
const webhookId = await context.store.get('webhook_id');
if (webhookId) {
await productboardCommon.apiCall({
auth,
method: HttpMethod.DELETE,
resourceUri: `/webhooks/${webhookId}`,
});
}
},
run: async (context) => {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,64 @@
import { productboardAuth } from '../common/auth';
import { HttpMethod } from '@activepieces/pieces-common';
import {
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { productboardCommon } from '../common/client';
export const updatedFeature = createTrigger({
name: 'updated_feature',
displayName: 'Updated Feature',
description: 'Triggers when an existing feature is updated in Productboard',
auth: productboardAuth,
type: TriggerStrategy.WEBHOOK,
props: {},
sampleData: {
data: {
id: 'c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
eventType: 'feature.updated',
links: {
target: 'https://api.productboard.com/features/c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
},
},
},
onEnable: async (context) => {
const { webhookUrl, auth } = context;
const response = await productboardCommon.apiCall({
auth,
method: HttpMethod.POST,
resourceUri: '/webhooks',
body: {
data: {
name: 'Activepieces - Updated Feature',
events: [
{
eventType: 'feature.updated',
},
],
notification: {
url: webhookUrl,
version: 1,
},
},
},
});
await context.store.put('webhook_id', response.body['data'].id);
return response.body;
},
onDisable: async (context) => {
const { auth } = context;
const webhookId = await context.store.get('webhook_id');
if (webhookId) {
await productboardCommon.apiCall({
auth,
method: HttpMethod.DELETE,
resourceUri: `/webhooks/${webhookId}`,
});
}
},
run: async (context) => {
return [context.payload.body];
},
});

View File

@@ -0,0 +1,20 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"importHelpers": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"include": ["src/**/*.ts"]
}