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,19 @@
{
"Saleor API URL": "Saleor API URL",
"Saleor token": "Saleor Token",
"Your Saleor GraphQL API endpoint": "Ihr Saleor GraphQL API Endpunkt",
"Your token": "Dein Token",
"Saleor": "Verkäufer",
"Raw GraphQL query": "Rohe GraphQL-Abfrage",
"Get an order": "Bestellen",
"Add Order Note": "Bestellnotiz hinzufügen",
"Perform a raw GraphQL query": "Eine rohe GraphQL-Abfrage ausführen",
"Get an order according to the ID": "Erhalten Sie eine Bestellung gemäß der ID",
"Add a note to a Saleor order": "Eine Notiz zu einer Saleor Bestellung hinzufügen",
"Query": "Abfrage",
"Parameters": "Parameter",
"The ID of the order": "Die ID der Bestellung",
"Order ID": "Bestell-ID",
"Note Message": "Notiznachricht",
"The content of the note": "Der Inhalt der Notiz"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor API URL": "Saleor API URL",
"Saleor token": "Token de venta",
"Your Saleor GraphQL API endpoint": "Su terminal API de Saleor GraphQL",
"Your token": "Tu token",
"Saleor": "Vendedor",
"Raw GraphQL query": "Consulta GraphQL Raw",
"Get an order": "Obtener un pedido",
"Add Order Note": "Añadir nota de pedido",
"Perform a raw GraphQL query": "Realizar una consulta GraphQL sin procesar",
"Get an order according to the ID": "Obtener un pedido de acuerdo con el ID",
"Add a note to a Saleor order": "Añadir una nota a un pedido de venta",
"Query": "Consulta",
"Parameters": "Parámetros",
"The ID of the order": "El ID del pedido",
"Order ID": "ID del pedido",
"Note Message": "Mensaje de nota",
"The content of the note": "El contenido de la nota"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor API URL": "Saleor API URL",
"Saleor token": "Jeton de vendeur",
"Your Saleor GraphQL API endpoint": "Votre point de terminaison API Saleor GraphQL",
"Your token": "Votre jeton",
"Saleor": "Vendeur",
"Raw GraphQL query": "Requête GraphQL brute",
"Get an order": "Obtenir une commande",
"Add Order Note": "Ajouter une note de commande",
"Perform a raw GraphQL query": "Effectuer une requête GraphQL brute",
"Get an order according to the ID": "Obtenir une commande selon l'ID",
"Add a note to a Saleor order": "Ajouter une note à une commande de vendeur",
"Query": "Requête",
"Parameters": "Paramètres",
"The ID of the order": "L'ID de la prescription",
"Order ID": "ID de la commande",
"Note Message": "Message de note",
"The content of the note": "Le contenu de la note"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor API URL": "Saleor API URL",
"Saleor token": "販売トークン",
"Your Saleor GraphQL API endpoint": "Saleor GraphQL エンドポイント",
"Your token": "あなたのトークン",
"Saleor": "販売",
"Raw GraphQL query": "生のGraphQLクエリ",
"Get an order": "注文を取得",
"Add Order Note": "注文の追加",
"Perform a raw GraphQL query": "生のGraphQLクエリを実行します",
"Get an order according to the ID": "IDに従って注文を取得する",
"Add a note to a Saleor order": "販売注文にメモを追加する",
"Query": "クエリ",
"Parameters": "パラメータ",
"The ID of the order": "注文のID",
"Order ID": "注文ID",
"Note Message": "メモメッセージ",
"The content of the note": "メモの内容"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor API URL": "Saleor API URL",
"Saleor token": "Verkoop token",
"Your Saleor GraphQL API endpoint": "Uw Verkoper GraphQL API eindpunt",
"Your token": "Jouw token",
"Saleor": "Verkoper",
"Raw GraphQL query": "Onbewerkte GraphQL query",
"Get an order": "Vraag een bestelling aan",
"Add Order Note": "Voeg bestellingsnotitie toe",
"Perform a raw GraphQL query": "Een rauwe GraphQL query uitvoeren",
"Get an order according to the ID": "Ontvang een bestelling volgens het ID",
"Add a note to a Saleor order": "Voeg een notitie toe aan een verkooporder",
"Query": "Zoekopdracht",
"Parameters": "Parameters",
"The ID of the order": "Het ID van de bestelling",
"Order ID": "Bestelling ID",
"Note Message": "Bericht bij notitie",
"The content of the note": "De inhoud van de notitie"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor API URL": "Saleor API URL",
"Saleor token": "Token de vendedor",
"Your Saleor GraphQL API endpoint": "Seu ponto de extremidade API do Saleor GraphQL",
"Your token": "Seu token",
"Saleor": "Vendedor",
"Raw GraphQL query": "Consulta de Raw GraphQL",
"Get an order": "Obter um pedido",
"Add Order Note": "Adicionar Nota do Pedido",
"Perform a raw GraphQL query": "Execute uma consulta raw do GraphQL",
"Get an order according to the ID": "Obter um pedido de acordo com o ID",
"Add a note to a Saleor order": "Adicionar uma nota a um pedido de venda",
"Query": "Requisição",
"Parameters": "Parâmetros",
"The ID of the order": "O ID do pedido",
"Order ID": "ID da encomenda",
"Note Message": "Mensagem de Nota",
"The content of the note": "O conteúdo da nota"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor": "Продавец",
"Saleor API URL": "Saleor API URL",
"Saleor token": "Маркер продажи",
"Your Saleor GraphQL API endpoint": "Ваша конечная точка GraphQL API продаж",
"Your token": "Ваш токен",
"Raw GraphQL query": "Запрос сырых GraphQL",
"Get an order": "Получить заказ",
"Add Order Note": "Добавить заметку к заказу",
"Perform a raw GraphQL query": "Выполнить необработанный запрос GraphQL",
"Get an order according to the ID": "Получить заказ по идентификатору",
"Add a note to a Saleor order": "Добавить заметку к заказу Saleor",
"Query": "Запрос",
"Parameters": "Параметры",
"The ID of the order": "ID заказа",
"Order ID": "ID Заказа",
"Note Message": "Примечание",
"The content of the note": "Содержание записки"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor API URL": "Saleor API URL",
"Saleor token": "Saleor token",
"Your Saleor GraphQL API endpoint": "Your Saleor GraphQL API endpoint",
"Your token": "Your token",
"Saleor": "Saleor",
"Raw GraphQL query": "Raw GraphQL query",
"Get an order": "Get an order",
"Add Order Note": "Add Order Note",
"Perform a raw GraphQL query": "Perform a raw GraphQL query",
"Get an order according to the ID": "Get an order according to the ID",
"Add a note to a Saleor order": "Add a note to a Saleor order",
"Query": "Query",
"Parameters": "Parameters",
"The ID of the order": "The ID of the order",
"Order ID": "Order ID",
"Note Message": "Note Message",
"The content of the note": "The content of the note"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor": "Saleor",
"Saleor API URL": "Saleor API URL",
"Saleor token": "Saleor token",
"Your Saleor GraphQL API endpoint": "Your Saleor GraphQL API endpoint",
"Your token": "Your token",
"Raw GraphQL query": "Raw GraphQL query",
"Get an order": "Get an order",
"Add Order Note": "Add Order Note",
"Perform a raw GraphQL query": "Perform a raw GraphQL query",
"Get an order according to the ID": "Get an order according to the ID",
"Add a note to a Saleor order": "Add a note to a Saleor order",
"Query": "Query",
"Parameters": "Parameters",
"The ID of the order": "The ID of the order",
"Order ID": "Order ID",
"Note Message": "Note Message",
"The content of the note": "The content of the note"
}

View File

@@ -0,0 +1,19 @@
{
"Saleor API URL": "Saleor API URL",
"Saleor token": "Saleor token",
"Your Saleor GraphQL API endpoint": "Your Saleor GraphQL API endpoint",
"Your token": "Your token",
"Saleor": "Saleor",
"Raw GraphQL query": "Raw GraphQL query",
"Get an order": "Get an order",
"Add Order Note": "Add Order Note",
"Perform a raw GraphQL query": "Perform a raw GraphQL query",
"Get an order according to the ID": "Get an order according to the ID",
"Add a note to a Saleor order": "Add a note to a Saleor order",
"Query": "Query",
"Parameters": "Parameters",
"The ID of the order": "The ID of the order",
"Order ID": "Order ID",
"Note Message": "Note Message",
"The content of the note": "The content of the note"
}

View File

@@ -0,0 +1,35 @@
import { createPiece, PieceAuth, Property } from "@activepieces/pieces-framework";
import { saleorRawGraphqlQuery } from "./lib/actions/raw-graphql-query";
import { getOrder } from "./lib/actions/get-order";
import { addOrderNote } from "./lib/actions/add-note-to-order";
export const saleorAuth = PieceAuth.CustomAuth({
description: 'Saleor',
required: true,
props: {
apiUrl: Property.ShortText({
displayName: 'Saleor API URL',
required: true,
description: 'Your Saleor GraphQL API endpoint'
}),
token: Property.ShortText({
displayName: 'Saleor token',
required: true,
description: 'Your token'
}),
}
})
export const saleor = createPiece({
displayName: "Saleor",
auth: saleorAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: "https://cdn.activepieces.com/pieces/saleor.png",
authors: ["Kevinyu-alan"],
actions: [
saleorRawGraphqlQuery,
getOrder,
addOrderNote
],
triggers: [],
});

View File

@@ -0,0 +1,58 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { saleorAuth } from '../..';
import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces-common';
export const addOrderNote = createAction({
name: 'addOrderNote',
displayName: 'Add Order Note',
description: 'Add a note to a Saleor order',
auth: saleorAuth,
props: {
orderId: Property.ShortText({
displayName: 'Order ID',
description: 'The ID of the order',
required: true
}),
message: Property.LongText({
displayName: 'Note Message',
description: 'The content of the note',
required: true
})
},
async run({auth, propsValue}) {
const { orderId, message } = propsValue;
const { token, apiUrl } = auth.props;
const query = `
mutation AddOrderNote($orderId: ID!, $message: String!) {
orderNoteAdd(
order: $orderId,
input: {
message: $message,
}
) {
order {
id
number
}
}
}
`
const response = await httpClient.sendRequest({
url: apiUrl,
method: HttpMethod.POST,
body: JSON.stringify({
query: query,
variables: { orderId, message }
}),
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: token,
},
});
return response;
}
});

View File

@@ -0,0 +1,72 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { saleorAuth } from '../..';
import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces-common';
export const getOrder = createAction({
name: 'getOrder',
displayName: 'Get an order',
description: 'Get an order according to the ID',
auth: saleorAuth,
props: {
orderId: Property.ShortText({
displayName: 'The ID of the order',
required: true
}),
},
async run({auth, propsValue}) {
const orderId = propsValue.orderId
const { token, apiUrl } = auth.props;
const query = `
query GetOrder($orderId: ID!) {
order(id: $orderId) {
id
number
created
status
total {
gross {
amount
currency
}
}
user {
email
firstName
lastName
}
lines {
productName
variantName
quantity
unitPrice {
gross {
amount
currency
}
}
}
}
}
`
const response = await httpClient.sendRequest({
url: apiUrl,
method: HttpMethod.POST,
body: JSON.stringify({
query: query,
variables: { orderId }
}),
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: token,
},
});
return response;
},
});

View File

@@ -0,0 +1,34 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { saleorAuth } from '../..';
import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces-common';
export const saleorRawGraphqlQuery = createAction({
name: 'rawGraphqlQuery',
displayName: 'Raw GraphQL query',
description: 'Perform a raw GraphQL query',
auth: saleorAuth,
props: {
query: Property.LongText({ displayName: 'Query', required: true }),
variables: Property.Object({ displayName: 'Parameters', required: false }),
},
async run({auth, propsValue}) {
const { query, variables } = propsValue;
const { token, apiUrl } = auth.props;
const response = await httpClient.sendRequest({
url: apiUrl,
method: HttpMethod.POST,
body: JSON.stringify({
query: query,
variables: variables,
}),
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: token,
},
});
return response;
},
});