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,14 @@
{
"Image generation API for banners and social media posts": "Bildgenerierung API für Banner und Social Media Beiträge",
"Public API Key": "Öffentlicher API-Schlüssel",
"Secret API Key": "Geheimer API-Schlüssel",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nUm Ihre GenerateBanners öffentlichen und geheimen API-Schlüssel zu erhalten, folgen Sie den folgenden Schritten:\n\n1. Gehe zur [GenerateBanners Homepage](https://www.generatebanners.com/).\n2. Melde dich an oder melde dich bei deinem Konto an.\n3. Gehe zu deiner [Kontoseite](https://www.generatebanners.com/app/account).\n4. Die öffentlichen und geheimen API-Schlüssel werden nun angezeigt, kopieren Sie sie einzeln in die richtigen Activepieces Felder.\n",
"Render Template": "Vorlage rendern",
"Render a GenerateBanners template": "GenerateBanner-Template rendern",
"Template": "Vorlage",
"File type": "Dateityp",
"Variables": "Variablen",
"Image (jpg)": "Bild (jpg)",
"Image (png)": "Bild (png)",
"Document (pdf)": "Dokument (pdf)"
}

View File

@@ -0,0 +1,14 @@
{
"Image generation API for banners and social media posts": "API de generación de imágenes para banners y publicaciones de redes sociales",
"Public API Key": "Clave pública de API",
"Secret API Key": "Clave API secreta",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n",
"Render Template": "Procesar plantilla",
"Render a GenerateBanners template": "Procesar una plantilla GenerateBanners",
"Template": "Plantilla",
"File type": "Tipo de archivo",
"Variables": "Variables",
"Image (jpg)": "Imagen (jpg)",
"Image (png)": "Imagen (png)",
"Document (pdf)": "Documento (pdf)"
}

View File

@@ -0,0 +1,14 @@
{
"Image generation API for banners and social media posts": "API de génération d'images pour les bannières et les publications des médias sociaux",
"Public API Key": "Clé d'API publique",
"Secret API Key": "Clé secrète API",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n",
"Render Template": "Modèle de rendu",
"Render a GenerateBanners template": "Rendre un modèle GenerateBanners",
"Template": "Gabarit",
"File type": "Type de fichier",
"Variables": "Variables",
"Image (jpg)": "Image (jpg)",
"Image (png)": "Image (png)",
"Document (pdf)": "Document (pdf)"
}

View File

@@ -0,0 +1,14 @@
{
"Image generation API for banners and social media posts": "バナーやソーシャルメディア投稿用の画像生成API",
"Public API Key": "パブリック API キー",
"Secret API Key": "シークレットAPIキー",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n",
"Render Template": "テンプレートをレンダリング",
"Render a GenerateBanners template": "GenerateBannersテンプレートをレンダリングする",
"Template": "テンプレート",
"File type": "ファイルの種類",
"Variables": "変数",
"Image (jpg)": "画像 (jpg)",
"Image (png)": "画像 (png)",
"Document (pdf)": "ドキュメント (pdf)"
}

View File

@@ -0,0 +1,14 @@
{
"Image generation API for banners and social media posts": "API voor afbeeldingen genereren voor banners en social media berichten",
"Public API Key": "Publieke API-sleutel",
"Secret API Key": "Geheime API Sleutel",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nOm publieke en geheime API-sleutels van uw GenerateBanners te verkrijgen, kunt u de volgende stappen zetten:\n\n1. Ga naar de [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Meld u aan of log in op uw account.\n3. Ga naar uw [accountpagina](https://www.generatebanners.com/app/account).\n4. De publieke en geheime API-sleutels worden nu weergegeven, kopieer ze één voor één naar de juiste Activepieces velden.\n",
"Render Template": "Sjabloon weergeven",
"Render a GenerateBanners template": "Geef een GenerateBanners sjabloon weer",
"Template": "Sjabloon",
"File type": "Soort bestand",
"Variables": "Variabelen",
"Image (jpg)": "Afbeelding (jpg)",
"Image (png)": "Afbeelding (png)",
"Document (pdf)": "Document (pdf)"
}

View File

@@ -0,0 +1,14 @@
{
"Image generation API for banners and social media posts": "API de geração de imagem para banners e mensagens de mídia social",
"Public API Key": "Chave pública da API",
"Secret API Key": "Chave secreta da API",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n",
"Render Template": "Modelo de Renderização",
"Render a GenerateBanners template": "Renderizar um modelo de GenerateBanners",
"Template": "Modelo",
"File type": "Tipo de arquivo",
"Variables": "Variáveis",
"Image (jpg)": "Imagem (jpg)",
"Image (png)": "Imagem (png)",
"Document (pdf)": "Documento (pdf)"
}

View File

@@ -0,0 +1,15 @@
{
"GenerateBanners": "Генерировать баннеры",
"Image generation API for banners and social media posts": "API генерации изображений для баннеров и сообщений в социальных сетях",
"Public API Key": "Публичный ключ API",
"Secret API Key": "Секретный API ключ",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nДля получения публичных и секретных ключей API GenerateBanners, вы можете выполнить следующие действия:\n\n1. Перейдите на страницу [GenerateBanner](https://www.generatebanners.com/).\n2. Зарегистрируйтесь или войдите в свою учетную запись.\n3. Перейдите на свою [страницу счета](https://www.generatebanners.com/app/account).\n4. Публичные и секретные ключи API теперь отображаются, скопируйте их по одному в правильные поля Activepieces .\n",
"Render Template": "Шаблон рендера",
"Render a GenerateBanners template": "Шаблон генерации баннеров",
"Template": "Шаблон",
"File type": "Тип файла",
"Variables": "Переменные",
"Image (jpg)": "Изображение (jpg)",
"Image (png)": "Изображение (png)",
"Document (pdf)": "Документ (pdf)"
}

View File

@@ -0,0 +1,14 @@
{
"Image generation API for banners and social media posts": "Image generation API for banners and social media posts",
"Public API Key": "Public API Key",
"Secret API Key": "Secret API Key",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n",
"Render Template": "Render Template",
"Render a GenerateBanners template": "Render a GenerateBanners template",
"Template": "Template",
"File type": "File type",
"Variables": "Variables",
"Image (jpg)": "Image (jpg)",
"Image (png)": "Image (png)",
"Document (pdf)": "Document (pdf)"
}

View File

@@ -0,0 +1,15 @@
{
"GenerateBanners": "GenerateBanners",
"Image generation API for banners and social media posts": "Image generation API for banners and social media posts",
"Public API Key": "Public API Key",
"Secret API Key": "Secret API Key",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n",
"Render Template": "Render Template",
"Render a GenerateBanners template": "Render a GenerateBanners template",
"Template": "Template",
"File type": "File type",
"Variables": "Variables",
"Image (jpg)": "Image (jpg)",
"Image (png)": "Image (png)",
"Document (pdf)": "Document (pdf)"
}

View File

@@ -0,0 +1,14 @@
{
"Image generation API for banners and social media posts": "Image generation API for banners and social media posts",
"Public API Key": "Public API Key",
"Secret API Key": "Secret API Key",
"\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n": "\nTo obtain your GenerateBanners public and secret API Keys, you can follow the steps below:\n\n1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).\n2. Sign up or log in into your account.\n3. Go to your [account page](https://www.generatebanners.com/app/account).\n4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.\n",
"Render Template": "Render Template",
"Render a GenerateBanners template": "Render a GenerateBanners template",
"Template": "模板",
"File type": "File type",
"Variables": "Variables",
"Image (jpg)": "Image (jpg)",
"Image (png)": "Image (png)",
"Document (pdf)": "Document (pdf)"
}

View File

@@ -0,0 +1,36 @@
import { PieceAuth, createPiece } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { renderTemplate } from './lib/actions/renderTemplate.action';
const markdownDescription = `
To obtain your GenerateBanners public and secret API Keys, you can follow the steps below:
1. Go to the [GenerateBanners homepage](https://www.generatebanners.com/).
2. Sign up or log in into your account.
3. Go to your [account page](https://www.generatebanners.com/app/account).
4. The public and secret API keys are now displayed, copy them one by one into the right Activepieces fields.
`;
export const generatebannersAuth = PieceAuth.BasicAuth({
description: markdownDescription,
required: true,
username: {
displayName: 'Public API Key',
},
password: {
displayName: 'Secret API Key',
},
});
export const generatebanners = createPiece({
displayName: 'GenerateBanners',
description: 'Image generation API for banners and social media posts',
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/generatebanners.png',
categories: [PieceCategory.CONTENT_AND_FILES],
authors: ["tpatel","kishanprmr","khaledmashaly","abuaboud"],
auth: generatebannersAuth,
actions: [renderTemplate],
triggers: [],
});

View File

@@ -0,0 +1,175 @@
import {
createAction,
Property,
BasicAuthPropertyValue,
} from '@activepieces/pieces-framework';
import {
AuthenticationType,
HttpRequest,
HttpMethod,
httpClient,
} from '@activepieces/pieces-common';
import { generatebannersAuth } from '../../';
export const renderTemplate = createAction({
auth: generatebannersAuth,
name: 'render_template',
description: 'Render a GenerateBanners template',
displayName: 'Render Template',
props: {
template_id: Property.Dropdown({
displayName: 'Template',
auth: generatebannersAuth,
required: true,
refreshers: [],
options: async ({ auth }) => {
const authentication = auth;
if (!authentication) {
return {
disabled: true,
options: [],
placeholder: 'Please enter your API key first.',
};
}
const response =
await httpClient.sendRequest<GenerateBannersTemplateList>({
method: HttpMethod.GET,
url: `https://api.generatebanners.com/api/v1/${authentication.username}/template`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication.password,
},
});
if (response.status === 200) {
return {
disabled: false,
options: response.body.templates.map((template) => {
return {
label: template.name,
value: template.id,
};
}),
};
}
return {
disabled: true,
options: [],
placeholder: 'Error fetching templates',
};
},
}),
filetype: Property.StaticDropdown({
displayName: 'File type',
required: true,
defaultValue: 'jpg',
options: {
options: [
{
label: 'Image (jpg)',
value: 'jpg',
},
{
label: 'Image (png)',
value: 'png',
},
{
label: 'Document (pdf)',
value: 'pdf',
},
],
},
}),
variables: Property.DynamicProperties({
displayName: 'Variables',
auth: generatebannersAuth,
required: true,
refreshers: ['template_id'],
props: async ({ auth, template_id }) => {
if (!auth || !template_id) {
return {};
}
const request: HttpRequest = {
method: HttpMethod.GET,
url: `https://api.generatebanners.com/api/v1/${auth['username']}/template/${template_id}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['password'],
},
};
const result = await httpClient.sendRequest(request);
if (result.status === 200) {
// Allowing any because the properties are defined on GenerateBanners
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const properties: any = {};
for (const variable of result.body['template']['variables']) {
if (!variable.hidden) {
switch (variable.property) {
case 'text':
properties[variable.name] = Property.LongText({
displayName: variable.name,
required: false,
});
break;
default:
properties[variable.name] = Property.ShortText({
displayName: variable.name,
required: false,
});
}
}
}
return properties;
} else {
return {};
}
},
}),
},
async run({ auth, propsValue }) {
// Build the querystring from the dynamic properties
const query = [];
if (propsValue.variables) {
const props = Object.entries(propsValue.variables);
for (const [propertyKey, propertyValue] of props) {
if (propertyValue) {
query.push(
`${propertyKey}=${encodeURIComponent(propertyValue as string)}`
);
}
}
}
// Get the signed url
const request: HttpRequest = {
method: HttpMethod.GET,
url: `https://api.generatebanners.com/api/v1/${auth.username}/template/${
propsValue.template_id
}/sign-url?filetype=${encodeURIComponent(
propsValue.filetype
)}&${query.join('&')}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth.password,
},
};
const result = await httpClient.sendRequest(request);
if (result.status === 200 || result.status === 202) {
// Return an url for more flexibility
return result.body['url'];
} else {
return {};
}
},
});
interface GenerateBannersTemplateList {
templates: GenerateBannersTemplate[];
}
interface GenerateBannersTemplate {
id: string;
name: string;
variables: [];
}