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,79 @@
{
"Manage contacts in Microsoft 365 People": "Kontakte in Microsoft 365 Personen verwalten",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Melden Sie sich bei [Microsoft Azure Portal](https://portal.azure.com/).\n. Von der linken Seitenleiste gehen Sie zur **Microsoft Enfra ID**.\n3. Unter **Verwalten** klicken Sie auf **App-Registrierungen**.\n4. Klicken Sie auf die **Neue Registrierung** Schaltfläche.\n5. Geben Sie einen **Name** für Ihre App ein.\n6. Für **unterstützte Kontotypen**, auswählen:\n - **Konten in jedem Organisationsverzeichnis (jeder Microsoft-Entra-ID-Mieter - Multitenant) und persönlichen Microsoft-Konten**\n - Oder wählen Sie nach Ihren Anforderungen aus.\n7. In **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Application (Client) ID**.\n10. Vom linken Menü gehen Sie zu **Zertifikate & Geheimnisse**.\n - Unter **Kundengeheimnis**, klicke **Neues Kundengeheimnis**.\n - Geben Sie eine Beschreibung an, setzen Sie ein Ablaufdatum und klicken Sie auf **Hinzufügen**.\n - Kopieren Sie den **Wert** des Client-Geheimnisses (dies wird nicht wieder angezeigt).\n11. Gehe zu **API Berechtigungen** vom linken Menü.\n - Klicke **Berechtigung hinzufügen**.\n - Wähle **Microsoft Graph** → **delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Kontakte. eadWrite\n - offline_access \n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
"Create a Contact": "Kontakt erstellen",
"Delete a Contact": "Kontakt löschen",
"Update a Contact": "Kontakt aktualisieren",
"Create a Contact Folder": "Kontaktordner erstellen",
"Get a Contact Folder": "Kontakt-Ordner anfordern",
"Search Contacts": "Kontakte suchen",
"Custom API Call": "Eigener API-Aufruf",
"Create a new contact in People with detailed attributes (email, phone, address, etc.).": "Erstellen Sie einen neuen Kontakt in People mit detaillierten Attributen (E-Mail, Telefon, Adresse, etc.).",
"Permanently remove a contact.": "Kontakt dauerhaft entfernen.",
"Modify fields of an existing contact.": "Felder eines bestehenden Kontakts ändern.",
"Organize contacts by adding a new contact folder.": "Organisieren Sie Kontakte durch Hinzufügen eines neuen Kontaktordners.",
"Retrieve metadata (name, ID) of a specified contact folder.": "Abrufen von Metadaten (Name, ID) eines angegebenen Kontaktordners.",
"Find contacts by name, email, or other properties.": "Suchen Sie Kontakte nach Namen, E-Mail oder anderen Eigenschaften.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Display Name": "Anzeigename",
"Given Name": "Vorname",
"Middle Name": "Mittlerer Name",
"Surname": "Nachname",
"Email Addresses": "E-Mail-Adressen",
"Mobile Phone": "Handy",
"Assistant Name": "Assistentenname",
"Birthday": "Geburtstag",
"Business Street": "Geschäftsstraße",
"Business City": "Business-Stadt",
"Business State": "Betriebszustand",
"Business Postal Code": "Postleitzahl",
"Business Country or Region": "Wirtschaftsland oder Region",
"Children": "Kinder",
"Company Name": "Firmenname",
"Department": "Abteilung",
"Home Street": "Hauptstraße",
"Home City": "Heimatstadt",
"Home State": "Heimatstaat",
"Home Postal Code": "Postleitzahl",
"Home Country or Region": "Heimatland oder Region",
"Instant Messaging Addresses": "Adressen für Instant Messaging",
"Initials": "Initials",
"Job Title": "Job Titel",
"Manager": "Manager",
"Nick Name": "Spitzname",
"Office Location": "Bürostandort",
"Other Street": "Andere Straße",
"Other City": "Andere Stadt",
"Other State": "Anderer Staat",
"Other Postal Code": "Andere Postleitzahl",
"Other Country or Region": "Anderes Land oder Region",
"Parent Folder": "Eltern-Ordner",
"Personal Notes": "Persönliche Notizen",
"Profession": "Beruf",
"Spouse Name": "Name des Ehepartners",
"Title": "Titel",
"Contact": "Kontakt",
"Contact Folder Name": "Kontaktordnername",
"Contact Folder": "Kontakt-Ordner",
"Search Value": "Suchwert",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"Select a parent folder": "Übergeordneten Ordner auswählen",
"Select a Contact": "Kontakt auswählen",
"Select a contact folder": "Kontaktordner auswählen",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New or Updated Contact": "Neuer oder aktualisierter Kontakt",
"Triggers when a contact is created or updated in Microsoft 365 People.": "Wird ausgelöst, wenn ein Kontakt in Microsoft 365 People erstellt oder aktualisiert wird."
}

View File

@@ -0,0 +1,79 @@
{
"Manage contacts in Microsoft 365 People": "Administrar contactos en Microsoft 365 Personas",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create a Contact": "Crear un contacto",
"Delete a Contact": "Eliminar un Contacto",
"Update a Contact": "Actualizar un contacto",
"Create a Contact Folder": "Crear una carpeta de contactos",
"Get a Contact Folder": "Obtener una carpeta de contactos",
"Search Contacts": "Buscar contactos",
"Custom API Call": "Llamada API personalizada",
"Create a new contact in People with detailed attributes (email, phone, address, etc.).": "Crear un nuevo contacto en Personas con atributos detallados (correo electrónico, teléfono, dirección, etc.).",
"Permanently remove a contact.": "Eliminar permanentemente un contacto.",
"Modify fields of an existing contact.": "Modificar campos de un contacto existente.",
"Organize contacts by adding a new contact folder.": "Organizar contactos añadiendo una nueva carpeta de contactos.",
"Retrieve metadata (name, ID) of a specified contact folder.": "Recuperar metadatos (nombre, ID) de una carpeta de contacto especificada.",
"Find contacts by name, email, or other properties.": "Encuentre contactos por nombre, correo electrónico u otras propiedades.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Display Name": "Mostrar nombre",
"Given Name": "Nombre dado",
"Middle Name": "Segundo nombre",
"Surname": "Apellido",
"Email Addresses": "Direcciones de email",
"Mobile Phone": "Teléfono móvil",
"Assistant Name": "Nombre del Asistente",
"Birthday": "Cumpleaños",
"Business Street": "Calle de negocios",
"Business City": "Ciudad de los negocios",
"Business State": "Estado de negocio",
"Business Postal Code": "Código postal comercial",
"Business Country or Region": "País de negocios o región",
"Children": "Niños",
"Company Name": "Nombre De La Empresa",
"Department": "Departamento",
"Home Street": "Calle Home",
"Home City": "Ciudad de casa",
"Home State": "Estado de origen",
"Home Postal Code": "Código postal de inicio",
"Home Country or Region": "País de origen o región",
"Instant Messaging Addresses": "Direcciones de mensajería instantánea",
"Initials": "Initials",
"Job Title": "Trabajo",
"Manager": "Gerente",
"Nick Name": "Apodo",
"Office Location": "Ubicación de la oficina",
"Other Street": "Otra calle",
"Other City": "Otra ciudad",
"Other State": "Otro Estado",
"Other Postal Code": "Otro código postal",
"Other Country or Region": "Otro país o región",
"Parent Folder": "Carpeta padre",
"Personal Notes": "Notas personales",
"Profession": "Profesión",
"Spouse Name": "Nombre de Spouse",
"Title": "Título",
"Contact": "Contacto",
"Contact Folder Name": "Nombre de la carpeta de contactos",
"Contact Folder": "Carpeta de contacto",
"Search Value": "Valor de búsqueda",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"Select a parent folder": "Seleccione una carpeta padre",
"Select a Contact": "Seleccione un contacto",
"Select a contact folder": "Seleccione una carpeta de contactos",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New or Updated Contact": "Contacto nuevo o actualizado",
"Triggers when a contact is created or updated in Microsoft 365 People.": "Dispara cuando un contacto se crea o actualiza en Microsoft 365 personas."
}

View File

@@ -0,0 +1,79 @@
{
"Manage contacts in Microsoft 365 People": "Gérer les contacts dans Microsoft 365 Personnes",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create a Contact": "Créer un contact",
"Delete a Contact": "Supprimer un contact",
"Update a Contact": "Mettre à jour un contact",
"Create a Contact Folder": "Créer un dossier de contact",
"Get a Contact Folder": "Obtenir un dossier de contact",
"Search Contacts": "Rechercher dans les contacts",
"Custom API Call": "Appel d'API personnalisé",
"Create a new contact in People with detailed attributes (email, phone, address, etc.).": "Créer un nouveau contact dans les Personnes avec des attributs détaillés (e-mail, téléphone, adresse, etc.).",
"Permanently remove a contact.": "Supprimer définitivement un contact.",
"Modify fields of an existing contact.": "Modifier les champs d'un contact existant.",
"Organize contacts by adding a new contact folder.": "Organiser les contacts en ajoutant un nouveau dossier de contact.",
"Retrieve metadata (name, ID) of a specified contact folder.": "Récupérer les métadonnées (nom, ID) d'un dossier de contact spécifié.",
"Find contacts by name, email, or other properties.": "Trouver des contacts par nom, email ou autres propriétés.",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un endpoint spécifique",
"Display Name": "Display Name",
"Given Name": "Nom donné",
"Middle Name": "Deuxième prénom",
"Surname": "Nom de famille",
"Email Addresses": "Adresses e-mail",
"Mobile Phone": "Téléphone mobile",
"Assistant Name": "Nom de l'assistant",
"Birthday": "Date d'anniversaire",
"Business Street": "Rue des Affaires",
"Business City": "Ville d'affaires",
"Business State": "Etat de l'Entreprise",
"Business Postal Code": "Code postal de l'entreprise",
"Business Country or Region": "Pays d'affaires ou région",
"Children": "Enfants",
"Company Name": "Nom de lentreprise",
"Department": "Service",
"Home Street": "Rue de la maison",
"Home City": "Ville natale",
"Home State": "État de la maison",
"Home Postal Code": "Code postal de la maison",
"Home Country or Region": "Pays ou région d'origine",
"Instant Messaging Addresses": "Adresses de messagerie instantanée",
"Initials": "Initials",
"Job Title": "Titre du poste",
"Manager": "Responsable",
"Nick Name": "Pseudo",
"Office Location": "Lieu du bureau",
"Other Street": "Autre Rue",
"Other City": "Autre Ville",
"Other State": "Autre État",
"Other Postal Code": "Autre code postal",
"Other Country or Region": "Autre pays ou région",
"Parent Folder": "Dossier parent",
"Personal Notes": "Notes personnelles",
"Profession": "Profession",
"Spouse Name": "Nom de l'épouse",
"Title": "Titre de la page",
"Contact": "Contacter",
"Contact Folder Name": "Nom du dossier de contact",
"Contact Folder": "Dossier des contacts",
"Search Value": "Valeur de la recherche",
"Method": "Méthode",
"Headers": "En-têtes",
"Query Parameters": "Paramètres de requête",
"Body": "Corps",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'expiration (en secondes)",
"Select a parent folder": "Sélectionnez un dossier parent",
"Select a Contact": "Sélectionnez un contact",
"Select a contact folder": "Sélectionnez un dossier de contact",
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New or Updated Contact": "Contact nouveau ou mis à jour",
"Triggers when a contact is created or updated in Microsoft 365 People.": "Déclenche lorsqu'un contact est créé ou mis à jour dans Microsoft 365 People."
}

View File

@@ -0,0 +1,79 @@
{
"Manage contacts in Microsoft 365 People": "Microsoft 365ユーザーの連絡先を管理",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create a Contact": "連絡先を作成",
"Delete a Contact": "連絡先を削除",
"Update a Contact": "連絡先を更新",
"Create a Contact Folder": "連絡先フォルダを作成",
"Get a Contact Folder": "連絡先フォルダを取得",
"Search Contacts": "連絡先を検索",
"Custom API Call": "カスタムAPI通話",
"Create a new contact in People with detailed attributes (email, phone, address, etc.).": "詳細な属性(メール、電話、住所など)を持つ人に新しい連絡先を作成します。",
"Permanently remove a contact.": "コンタクトを完全に削除します。",
"Modify fields of an existing contact.": "既存の連絡先のフィールドを変更します。",
"Organize contacts by adding a new contact folder.": "新しい連絡先フォルダを追加して連絡先を整理します。",
"Retrieve metadata (name, ID) of a specified contact folder.": "指定した連絡先フォルダのメタデータ (名前、ID) を取得します。",
"Find contacts by name, email, or other properties.": "名前、電子メール、またはその他のプロパティで連絡先を検索します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Display Name": "表示名",
"Given Name": "与えられた名前",
"Middle Name": "ミドルネーム",
"Surname": "姓",
"Email Addresses": "メールアドレス",
"Mobile Phone": "携帯電話",
"Assistant Name": "アシスタント名",
"Birthday": "誕生日",
"Business Street": "Business Street",
"Business City": "市区町村名",
"Business State": "ビジネス状態",
"Business Postal Code": "ビジネス郵便番号",
"Business Country or Region": "事業国または地域",
"Children": "子供",
"Company Name": "会社名",
"Department": "部門",
"Home Street": "ホーム",
"Home City": "在住都市",
"Home State": "本国の状態",
"Home Postal Code": "在宅郵便番号",
"Home Country or Region": "自宅の国または地域",
"Instant Messaging Addresses": "インスタントメッセージアドレス",
"Initials": "Initials",
"Job Title": "役職名",
"Manager": "マネージャー",
"Nick Name": "ニック名",
"Office Location": "事務所の場所",
"Other Street": "その他の番地",
"Other City": "その他の市区町村名",
"Other State": "都道府県(その他)",
"Other Postal Code": "その他の郵便番号",
"Other Country or Region": "その他の国または地域",
"Parent Folder": "親フォルダ",
"Personal Notes": "パーソナルノート",
"Profession": "プロフェッショナル",
"Spouse Name": "配偶者名",
"Title": "タイトル",
"Contact": "お問い合わせ",
"Contact Folder Name": "連絡先フォルダ名",
"Contact Folder": "連絡先フォルダ",
"Search Value": "検索値",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"Select a parent folder": "親フォルダを選択",
"Select a Contact": "連絡先を選択",
"Select a contact folder": "連絡先フォルダを選択",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New or Updated Contact": "新規または更新された連絡先",
"Triggers when a contact is created or updated in Microsoft 365 People.": "連絡先が Microsoft 365 Peopleで作成または更新されたときにトリガーされます。"
}

View File

@@ -0,0 +1,79 @@
{
"Manage contacts in Microsoft 365 People": "Beheer contacten in Microsoft 365 mensen",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI** selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik op **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **Waarde** van de client secret (dit zal niet meer worden getoond).\n11. Ga naar **API-rechten** vanuit het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **gedelegeerde rechten**.\n - Voeg de volgende toepassingsgebieden toe:\n - Contacten. eadWrite\n - offline_access \n - Klik **Permissies toevoegen**.\n12. Kopieer uw **Client ID** en **Client Secret**.\n",
"Create a Contact": "Een contactpersoon aanmaken",
"Delete a Contact": "Verwijder een contactpersoon",
"Update a Contact": "Een contactpersoon bijwerken",
"Create a Contact Folder": "Maak een contactpersonenmap",
"Get a Contact Folder": "Een contactpersonenmap verkrijgen",
"Search Contacts": "Contactpersonen zoeken",
"Custom API Call": "Custom API Call",
"Create a new contact in People with detailed attributes (email, phone, address, etc.).": "Maak een nieuw contact aan in Mensen met gedetailleerde attributen (e-mail, telefoon, adres, enz.).",
"Permanently remove a contact.": "Verwijder een contact definitief.",
"Modify fields of an existing contact.": "Velden van een bestaand contact wijzigen.",
"Organize contacts by adding a new contact folder.": "Contacten organiseren door een nieuwe contactmap toe te voegen.",
"Retrieve metadata (name, ID) of a specified contact folder.": "Metadata ophalen (naam, ID) van een opgegeven map met contactpersonen.",
"Find contacts by name, email, or other properties.": "Contactpersonen zoeken op naam, e-mail of andere eigenschappen.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Display Name": "Weergavenaam",
"Given Name": "Gegeven naam",
"Middle Name": "Tweede naam",
"Surname": "Achternaam",
"Email Addresses": "E-mail adressen",
"Mobile Phone": "Telefoon (mobiel)",
"Assistant Name": "Assistent Naam",
"Birthday": "Verjaardag",
"Business Street": "Zakelijke straat",
"Business City": "Zakelijke stad",
"Business State": "Zakelijke status",
"Business Postal Code": "Zakelijke postcode",
"Business Country or Region": "Zakelijk land of regio",
"Children": "Onderliggende",
"Company Name": "Bedrijfsnaam",
"Department": "Afdeling",
"Home Street": "Thuis straat",
"Home City": "Thuis stad",
"Home State": "Thuis status",
"Home Postal Code": "Home Postal Code",
"Home Country or Region": "Thuis land of regio",
"Instant Messaging Addresses": "Instant Messaging adressen",
"Initials": "Initials",
"Job Title": "Job titel",
"Manager": "Beheerder",
"Nick Name": "Naam naam",
"Office Location": "Kantoor locatie",
"Other Street": "Bezoekadres straat",
"Other City": "Bezoekadres Plaats",
"Other State": "Bezoekadres status",
"Other Postal Code": "Andere postcode",
"Other Country or Region": "Ander land of regio",
"Parent Folder": "Bovenliggende map",
"Personal Notes": "Persoonlijke notities",
"Profession": "Speciaal",
"Spouse Name": "Naam echtgenote",
"Title": "Aanspreektitel",
"Contact": "Contactpersoon",
"Contact Folder Name": "Naam contactpersoonmap",
"Contact Folder": "Contactpersonen map",
"Search Value": "Waarde zoeken",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"Select a parent folder": "Selecteer een bovenliggende map",
"Select a Contact": "Selecteer een contactpersoon",
"Select a contact folder": "Selecteer een map met contactpersonen",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New or Updated Contact": "Nieuw of bijgewerkt contact",
"Triggers when a contact is created or updated in Microsoft 365 People.": "Triggert wanneer een contact wordt aangemaakt of bijgewerkt in Microsoft 365 mensen."
}

View File

@@ -0,0 +1,79 @@
{
"Manage contacts in Microsoft 365 People": "Gerenciar contatos no Microsoft 365 People",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **aplicativo (cliente) ID**.\n10. Do menu à esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (não será mostrado novamente).\n11. Vá para **Permissões da API** no menu à esquerda.\n - Clique em **Adicionar permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicionar os seguintes escopos:\n - Contatos. eadWrite\n - offline_access \n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
"Create a Contact": "Criar um contato",
"Delete a Contact": "Excluir um contato",
"Update a Contact": "Atualizar um contato",
"Create a Contact Folder": "Criar uma pasta de contato",
"Get a Contact Folder": "Obter uma pasta de contato",
"Search Contacts": "Pesquisar contatos",
"Custom API Call": "Chamada de API personalizada",
"Create a new contact in People with detailed attributes (email, phone, address, etc.).": "Criar um novo contato em Pessoas com atributos detalhados (e-mail, telefone, etc.).",
"Permanently remove a contact.": "Remover um contato permanentemente.",
"Modify fields of an existing contact.": "Modificar os campos de um contato existente.",
"Organize contacts by adding a new contact folder.": "Organize os contatos adicionando uma nova pasta de contatos.",
"Retrieve metadata (name, ID) of a specified contact folder.": "Recuperar metadados (nome, ID) de uma pasta de contatos especificada.",
"Find contacts by name, email, or other properties.": "Encontrar contatos por nome, e-mail ou outras propriedades.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Display Name": "Nome de Exibição",
"Given Name": "Nome Dado",
"Middle Name": "Nome do Meio",
"Surname": "Sobrenome",
"Email Addresses": "Endereços de e-mail",
"Mobile Phone": "Telefone Celular",
"Assistant Name": "Nome do Assistente",
"Birthday": "Aniversário",
"Business Street": "Rua comercial",
"Business City": "Cidade Empresarial",
"Business State": "Estado Comercial",
"Business Postal Code": "Código Postal de Negócios",
"Business Country or Region": "País comercial ou região",
"Children": "Crianças",
"Company Name": "Nome da Empresa",
"Department": "Departamento",
"Home Street": "Rua Inicial",
"Home City": "Cidade residencial",
"Home State": "Estado residencial",
"Home Postal Code": "Código Postal",
"Home Country or Region": "País de origem ou região",
"Instant Messaging Addresses": "Endereços de mensagens instantâneas",
"Initials": "Initials",
"Job Title": "Título do Cargo",
"Manager": "Administrador",
"Nick Name": "Nome do Apelido",
"Office Location": "Local do Escritório",
"Other Street": "Endereço Alternativo",
"Other City": "Cidade Alternativo",
"Other State": "Estado Alternativo",
"Other Postal Code": "Outro Código Postal",
"Other Country or Region": "Outro país ou região",
"Parent Folder": "Pasta pai",
"Personal Notes": "Notas Pessoais",
"Profession": "Profissão",
"Spouse Name": "Nome do Spouse",
"Title": "Título",
"Contact": "contato",
"Contact Folder Name": "Nome da pasta de contato",
"Contact Folder": "Pasta de contato",
"Search Value": "Pesquisar Valor",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"Select a parent folder": "Selecione uma pasta pai",
"Select a Contact": "Selecione um contato",
"Select a contact folder": "Selecione uma pasta de contato",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New or Updated Contact": "Contato novo ou atualizado",
"Triggers when a contact is created or updated in Microsoft 365 People.": "Aciona quando um contato é criado ou atualizado nas pessoas do Microsoft 365."
}

View File

@@ -0,0 +1,79 @@
{
"Manage contacts in Microsoft 365 People": "Manage contacts in Microsoft 365 People",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create a Contact": "Create a Contact",
"Delete a Contact": "Delete a Contact",
"Update a Contact": "Update a Contact",
"Create a Contact Folder": "Create a Contact Folder",
"Get a Contact Folder": "Get a Contact Folder",
"Search Contacts": "Search Contacts",
"Custom API Call": "Custom API Call",
"Create a new contact in People with detailed attributes (email, phone, address, etc.).": "Create a new contact in People with detailed attributes (email, phone, address, etc.).",
"Permanently remove a contact.": "Permanently remove a contact.",
"Modify fields of an existing contact.": "Modify fields of an existing contact.",
"Organize contacts by adding a new contact folder.": "Organize contacts by adding a new contact folder.",
"Retrieve metadata (name, ID) of a specified contact folder.": "Retrieve metadata (name, ID) of a specified contact folder.",
"Find contacts by name, email, or other properties.": "Find contacts by name, email, or other properties.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Display Name": "Display Name",
"Given Name": "Given Name",
"Middle Name": "Middle Name",
"Surname": "Surname",
"Email Addresses": "Email Addresses",
"Mobile Phone": "Mobile Phone",
"Assistant Name": "Assistant Name",
"Birthday": "Birthday",
"Business Street": "Business Street",
"Business City": "Business City",
"Business State": "Business State",
"Business Postal Code": "Business Postal Code",
"Business Country or Region": "Business Country or Region",
"Children": "Children",
"Company Name": "Company Name",
"Department": "Department",
"Home Street": "Home Street",
"Home City": "Home City",
"Home State": "Home State",
"Home Postal Code": "Home Postal Code",
"Home Country or Region": "Home Country or Region",
"Instant Messaging Addresses": "Instant Messaging Addresses",
"Initials": "Initials",
"Job Title": "Job Title",
"Manager": "Manager",
"Nick Name": "Nick Name",
"Office Location": "Office Location",
"Other Street": "Other Street",
"Other City": "Other City",
"Other State": "Other State",
"Other Postal Code": "Other Postal Code",
"Other Country or Region": "Other Country or Region",
"Parent Folder": "Parent Folder",
"Personal Notes": "Personal Notes",
"Profession": "Profession",
"Spouse Name": "Spouse Name",
"Title": "Title",
"Contact": "Contact",
"Contact Folder Name": "Contact Folder Name",
"Contact Folder": "Contact Folder",
"Search Value": "Search Value",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Select a parent folder": "Select a parent folder",
"Select a Contact": "Select a Contact",
"Select a contact folder": "Select a contact folder",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New or Updated Contact": "New or Updated Contact",
"Triggers when a contact is created or updated in Microsoft 365 People.": "Triggers when a contact is created or updated in Microsoft 365 People."
}

View File

@@ -0,0 +1,79 @@
{
"Manage contacts in Microsoft 365 People": "Manage contacts in Microsoft 365 People",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create a Contact": "Create a Contact",
"Delete a Contact": "Delete a Contact",
"Update a Contact": "Update a Contact",
"Create a Contact Folder": "Create a Contact Folder",
"Get a Contact Folder": "Get a Contact Folder",
"Search Contacts": "Search Contacts",
"Custom API Call": "自定义 API 呼叫",
"Create a new contact in People with detailed attributes (email, phone, address, etc.).": "Create a new contact in People with detailed attributes (email, phone, address, etc.).",
"Permanently remove a contact.": "Permanently remove a contact.",
"Modify fields of an existing contact.": "Modify fields of an existing contact.",
"Organize contacts by adding a new contact folder.": "Organize contacts by adding a new contact folder.",
"Retrieve metadata (name, ID) of a specified contact folder.": "Retrieve metadata (name, ID) of a specified contact folder.",
"Find contacts by name, email, or other properties.": "Find contacts by name, email, or other properties.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Display Name": "显示名称",
"Given Name": "Given Name",
"Middle Name": "Middle Name",
"Surname": "Surname",
"Email Addresses": "Email Addresses",
"Mobile Phone": "Mobile Phone",
"Assistant Name": "Assistant Name",
"Birthday": "Birthday",
"Business Street": "Business Street",
"Business City": "Business City",
"Business State": "Business State",
"Business Postal Code": "Business Postal Code",
"Business Country or Region": "Business Country or Region",
"Children": "Children",
"Company Name": "Company Name",
"Department": "Department",
"Home Street": "Home Street",
"Home City": "Home City",
"Home State": "Home State",
"Home Postal Code": "Home Postal Code",
"Home Country or Region": "Home Country or Region",
"Instant Messaging Addresses": "Instant Messaging Addresses",
"Initials": "Initials",
"Job Title": "Job Title",
"Manager": "Manager",
"Nick Name": "Nick Name",
"Office Location": "Office Location",
"Other Street": "Other Street",
"Other City": "Other City",
"Other State": "Other State",
"Other Postal Code": "Other Postal Code",
"Other Country or Region": "Other Country or Region",
"Parent Folder": "父文件夹",
"Personal Notes": "Personal Notes",
"Profession": "Profession",
"Spouse Name": "Spouse Name",
"Title": "标题",
"Contact": "Contact",
"Contact Folder Name": "Contact Folder Name",
"Contact Folder": "Contact Folder",
"Search Value": "搜索值",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"Select a parent folder": "Select a parent folder",
"Select a Contact": "Select a Contact",
"Select a contact folder": "Select a contact folder",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New or Updated Contact": "New or Updated Contact",
"Triggers when a contact is created or updated in Microsoft 365 People.": "Triggers when a contact is created or updated in Microsoft 365 People."
}

View File

@@ -0,0 +1,37 @@
import { createCustomApiCallAction } from '@activepieces/pieces-common';
import { createPiece, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { createContact } from './lib/actions/create-contact';
import { createContactFolder } from './lib/actions/create-contact-folder';
import { deleteContact } from './lib/actions/delete-contact';
import { getContactFolder } from './lib/actions/get-contact-folder';
import { searchContacts } from './lib/actions/search-contacts';
import { updateContact } from './lib/actions/update-contact';
import { microsoft365PeopleAuth } from './lib/common/auth';
import { newOrUpdatedContact } from './lib/triggers/new-or-updated-contact';
export const microsoft365People = createPiece({
displayName: 'Microsoft 365 People',
description: 'Manage contacts in Microsoft 365 People',
auth: microsoft365PeopleAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/microsoft-365-people.png',
authors: ['LuizDMM'],
actions: [
createContact,
deleteContact,
updateContact,
createContactFolder,
getContactFolder,
// Search Actions
searchContacts,
// Custom API call
createCustomApiCallAction({
auth: microsoft365PeopleAuth,
baseUrl: () => 'https://graph.microsoft.com/v1.0/',
authMapping: async (auth) => ({
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`,
}),
}),
],
triggers: [newOrUpdatedContact],
});

View File

@@ -0,0 +1,22 @@
import { createAction } from '@activepieces/pieces-framework';
import { microsoft365PeopleAuth } from '../common/auth';
import { microsoft365PeopleCommon } from '../common/common';
export const createContactFolder = createAction({
auth: microsoft365PeopleAuth,
name: 'createContactFolder',
displayName: 'Create a Contact Folder',
description: 'Organize contacts by adding a new contact folder.',
props: microsoft365PeopleCommon.contactFolderProperties(),
async run({ auth, propsValue }) {
const contactFolder = {
displayName: propsValue.displayName,
parentFolderId: propsValue.parentFolder,
};
return await microsoft365PeopleCommon.createContactFolder({
auth,
contactFolder,
});
},
});

View File

@@ -0,0 +1,75 @@
import { createAction } from '@activepieces/pieces-framework';
import { Contact, EmailAddress } from '@microsoft/microsoft-graph-types';
import { microsoft365PeopleAuth } from '../common/auth';
import { microsoft365PeopleCommon } from '../common/common';
export const createContact = createAction({
auth: microsoft365PeopleAuth,
name: 'createContact',
displayName: 'Create a Contact',
description:'Create a new contact in People with detailed attributes (email, phone, address, etc.).',
props: microsoft365PeopleCommon.contactProperties(),
async run({ auth, propsValue }) {
const childrenNames: string[] =
(propsValue.children as Array<{ name: string }> | undefined)?.map(
(child) => child.name
) ?? [];
const emailAddresses: EmailAddress[] =
(propsValue.emailAddresses as Array<EmailAddress> | undefined) ?? [];
const imAddresses: string[] =
(propsValue.imAddresses as Array<{ address: string }> | undefined)?.map(
(im) => im.address
) ?? [];
const contact: Contact = {
assistantName: propsValue.assistantName,
birthday: propsValue.birthday,
businessAddress: {
street: propsValue.businessStreet,
city: propsValue.businessCity,
state: propsValue.businessState,
postalCode: propsValue.businessPostalCode,
countryOrRegion: propsValue.businessCountryOrRegion,
},
children: childrenNames,
companyName: propsValue.companyName,
department: propsValue.department,
displayName: propsValue.displayName,
emailAddresses: emailAddresses,
givenName: propsValue.givenName,
homeAddress: {
street: propsValue.homeStreet,
city: propsValue.homeCity,
state: propsValue.homeState,
postalCode: propsValue.homePostalCode,
countryOrRegion: propsValue.homeCountryOrRegion,
},
imAddresses,
initials: propsValue.initials,
jobTitle: propsValue.jobTitle,
manager: propsValue.manager,
middleName: propsValue.middleName,
mobilePhone: propsValue.mobilePhone,
nickName: propsValue.nickName,
officeLocation: propsValue.officeLocation,
otherAddress: {
street: propsValue.otherStreet,
city: propsValue.otherCity,
state: propsValue.otherState,
postalCode: propsValue.otherPostalCode,
countryOrRegion: propsValue.otherCountryOrRegion,
},
parentFolderId: propsValue.parentFolder,
personalNotes: propsValue.personalNotes,
profession: propsValue.profession,
spouseName: propsValue.spouseName,
surname: propsValue.surname,
title: propsValue.title,
};
return await microsoft365PeopleCommon.createContact({
auth,
contact,
});
},
});

View File

@@ -0,0 +1,24 @@
import { createAction } from '@activepieces/pieces-framework';
import { microsoft365PeopleAuth } from '../common/auth';
import { microsoft365PeopleCommon } from '../common/common';
export const deleteContact = createAction({
auth: microsoft365PeopleAuth,
name: 'deleteContact',
displayName: 'Delete a Contact',
description: 'Permanently remove a contact.',
props: {
contactId: microsoft365PeopleCommon.contactDropdown(),
},
async run(context) {
const { contactId } = context.propsValue;
if (!contactId) {
throw new Error('Contact ID is required.');
}
return await microsoft365PeopleCommon.deleteContact({
auth: context.auth,
contactId,
});
},
});

View File

@@ -0,0 +1,20 @@
import { createAction } from '@activepieces/pieces-framework';
import { microsoft365PeopleAuth } from '../common/auth';
import { microsoft365PeopleCommon } from '../common/common';
export const getContactFolder = createAction({
auth: microsoft365PeopleAuth,
name: 'getContactFolder',
displayName: 'Get a Contact Folder',
description: 'Retrieve metadata (name, ID) of a specified contact folder.',
props: { contactFolder: microsoft365PeopleCommon.contactFolderDropdown("Contact Folder", "Select a contact folder", true) },
async run({ auth, propsValue }) {
if (!propsValue.contactFolder) {
throw new Error('Contact folder is required.');
}
return await microsoft365PeopleCommon.getContactFolder({
auth,
contactFolderId: propsValue.contactFolder,
});
},
});

View File

@@ -0,0 +1,24 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { microsoft365PeopleAuth } from '../common/auth';
import { microsoft365PeopleCommon } from '../common/common';
export const searchContacts = createAction({
auth: microsoft365PeopleAuth,
name: 'searchContacts',
displayName: 'Search Contacts',
description: 'Find contacts by name, email, or other properties.',
props: {
searchValue: Property.ShortText({
displayName: 'Search Value',
description: 'Find contacts by name, email, or other properties.',
required: true,
}),
},
async run({ auth, propsValue }) {
const { searchValue } = propsValue;
return microsoft365PeopleCommon.listContacts({ auth, queryParams: {
$search: `"${searchValue}"`,
} });
},
});

View File

@@ -0,0 +1,84 @@
import { createAction } from '@activepieces/pieces-framework';
import { Contact, EmailAddress } from '@microsoft/microsoft-graph-types';
import { microsoft365PeopleAuth } from '../common/auth';
import { microsoft365PeopleCommon } from '../common/common';
export const updateContact = createAction({
auth: microsoft365PeopleAuth,
name: 'updateContact',
displayName: 'Update a Contact',
description: 'Modify fields of an existing contact.',
props: {
contactId: microsoft365PeopleCommon.contactDropdown(),
...microsoft365PeopleCommon.contactProperties(),
},
async run({ auth, propsValue }) {
const contactId = propsValue.contactId;
if (!contactId || typeof contactId !== 'string') {
throw new Error('contactId is required.');
}
const childrenNames: string[] | undefined = (
propsValue.children as Array<{ name: string }> | undefined
)?.map((child) => child.name);
const emailAddresses: EmailAddress[] | undefined =
propsValue.emailAddresses as Array<EmailAddress> | undefined;
const imAddresses: string[] | undefined = (
propsValue.imAddresses as Array<{ address: string }> | undefined
)?.map((im) => im.address);
// Use the JSON methods to create the contact object without any undefined values
const contact: Contact = JSON.parse(
JSON.stringify({
assistantName: propsValue.assistantName,
birthday: propsValue.birthday,
businessAddress: {
street: propsValue.businessStreet,
city: propsValue.businessCity,
state: propsValue.businessState,
postalCode: propsValue.businessPostalCode,
countryOrRegion: propsValue.businessCountryOrRegion,
},
children: childrenNames,
companyName: propsValue.companyName,
department: propsValue.department,
displayName: propsValue.displayName,
emailAddresses: emailAddresses,
givenName: propsValue.givenName,
homeAddress: {
street: propsValue.homeStreet,
city: propsValue.homeCity,
state: propsValue.homeState,
postalCode: propsValue.homePostalCode,
countryOrRegion: propsValue.homeCountryOrRegion,
},
imAddresses,
initials: propsValue.initials,
jobTitle: propsValue.jobTitle,
manager: propsValue.manager,
middleName: propsValue.middleName,
mobilePhone: propsValue.mobilePhone,
nickName: propsValue.nickName,
officeLocation: propsValue.officeLocation,
otherAddress: {
street: propsValue.otherStreet,
city: propsValue.otherCity,
state: propsValue.otherState,
postalCode: propsValue.otherPostalCode,
countryOrRegion: propsValue.otherCountryOrRegion,
},
parentFolderId: propsValue.parentFolder,
personalNotes: propsValue.personalNotes,
profession: propsValue.profession,
spouseName: propsValue.spouseName,
surname: propsValue.surname,
title: propsValue.title,
})
);
return microsoft365PeopleCommon.updateContact({
auth,
contactId,
contact,
});
},
});

View File

@@ -0,0 +1,37 @@
import { PieceAuth } from "@activepieces/pieces-framework";
const authDesc = `
1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).
2. From the left sidebar, go to **Microsoft Enfra ID**.
3. Under **Manage**, click on **App registrations**.
4. Click the **New registration** button.
5. Enter a **Name** for your app.
6. For **Supported account types**, choose:
- **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**
- Or select based on your requirement.
7. In **Redirect URI**, select **Web** and add the given URL.
8. Click **Register**.
9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.
10. From the left menu, go to **Certificates & secrets**.
- Under **Client secrets**, click **New client secret**.
- Provide a description, set an expiry, and click **Add**.
- Copy the **Value** of the client secret (this will not be shown again).
11. Go to **API permissions** from the left menu.
- Click **Add a permission**.
- Select **Microsoft Graph** → **Delegated permissions**.
- Add the following scopes:
- Contacts.ReadWrite
- offline_access
- Click **Add permissions**.
12. Copy your **Client ID** and **Client Secret**.
`
export const microsoft365PeopleAuth = PieceAuth.OAuth2({
description: authDesc,
authUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
tokenUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
required: true,
scope: ['Contacts.ReadWrite', "offline_access"],
prompt: 'omit',
});

View File

@@ -0,0 +1,376 @@
import { OAuth2PropertyValue, Property } from '@activepieces/pieces-framework';
import { Client } from '@microsoft/microsoft-graph-client';
import { Contact, ContactFolder } from '@microsoft/microsoft-graph-types';
import { microsoft365PeopleAuth } from './auth';
export type authProps = { auth: OAuth2PropertyValue };
type createContactProps = authProps & { contact: Contact };
type listContactProps = authProps & { queryParams?: Record<string, any> };
type updateContactProps = authProps & { contactId: string; contact: Contact };
type getContactProps = authProps & { contactId: string };
type deleteContactProps = getContactProps;
type createContactFolderProps = authProps & { contactFolder: ContactFolder };
type getContactFolderProps = authProps & { contactFolderId: string };
type deleteContactFolderProps = getContactFolderProps;
export const microsoft365PeopleCommon = {
// Initialize Microsoft Graph client
getClient: ({ auth }: authProps) => {
return Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
},
// Logged user profile
getMe: async ({ auth }: authProps) => {
const client = microsoft365PeopleCommon.getClient({ auth });
const user = await client.api('/me').get();
return user;
},
// Contact methods
getContact: async ({ auth, contactId }: getContactProps) => {
const client = microsoft365PeopleCommon.getClient({ auth });
const response = await client.api(`/me/contacts/${contactId}`).get();
return response;
},
listContacts: async ({
auth,
queryParams,
}: listContactProps): Promise<Contact[]> => {
const client = microsoft365PeopleCommon.getClient({ auth });
let apiRequest = client.api('/me/contacts');
if (queryParams) {
Object.entries(queryParams).forEach(([key, value]) => {
apiRequest = apiRequest.query({ [key]: value });
});
}
const response = await apiRequest.get();
return response.value;
},
createContact: async ({ auth, contact }: createContactProps) => {
const client = microsoft365PeopleCommon.getClient({ auth });
const response = await client.api('/me/contacts').post(contact);
return response;
},
updateContact: async ({ auth, contactId, contact }: updateContactProps) => {
const client = microsoft365PeopleCommon.getClient({ auth });
const response = await client
.api(`/me/contacts/${contactId}`)
.patch(contact);
return response;
},
deleteContact: async ({ auth, contactId }: deleteContactProps) => {
const client = microsoft365PeopleCommon.getClient({ auth });
await client.api(`/me/contacts/${contactId}`).delete();
return { success: true };
},
// Contact folder methods
listContactFolders: async ({ auth }: authProps): Promise<ContactFolder[]> => {
const client = microsoft365PeopleCommon.getClient({ auth });
const response = await client.api('/me/contactFolders').get();
return response.value;
},
createContactFolder: async ({
auth,
contactFolder,
}: createContactFolderProps) => {
const client = microsoft365PeopleCommon.getClient({ auth });
const response = await client.api('/me/contactFolders').post(contactFolder);
return response;
},
getContactFolder: async ({
auth,
contactFolderId,
}: getContactFolderProps) => {
const client = microsoft365PeopleCommon.getClient({ auth });
const response = await client
.api(`/me/contactFolders/${contactFolderId}`)
.get();
return response;
},
deleteContactFolder: async ({
auth,
contactFolderId,
}: deleteContactFolderProps) => {
const client = microsoft365PeopleCommon.getClient({ auth });
await client.api(`/me/contactFolders/${contactFolderId}`).delete();
return { success: true };
},
// Dropdowns
contactDropdown: (
displayName = 'Contact',
description = 'Select a Contact',
required = true
) =>
Property.Dropdown({
auth: microsoft365PeopleAuth,
displayName,
description,
required,
refreshers: ['auth'],
refreshOnSearch: false,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
};
}
const contacts = await microsoft365PeopleCommon.listContacts({
auth: auth as OAuth2PropertyValue,
});
const options = contacts.map((contact) => ({
label: contact.displayName ?? '',
value: contact.id,
}));
return {
placeholder:
options.length === 0
? "You don't have any contacts."
: 'Select a contact',
options: options,
disabled: options.length === 0,
};
},
}),
contactFolderDropdown: (
displayName = 'Contact Folder',
description = 'Select an option',
required = true
) =>
Property.Dropdown({
auth: microsoft365PeopleAuth,
displayName,
description,
required,
refreshers: ['auth'],
refreshOnSearch: false,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
};
}
const contactFolders =
await microsoft365PeopleCommon.listContactFolders({
auth: auth as OAuth2PropertyValue,
});
const options = contactFolders.map((folder) => ({
label: folder.displayName ?? '',
value: folder.id,
}));
return {
placeholder:
options.length === 0
? "You don't have any folders created."
: 'Select a folder',
options: options,
disabled: options.length === 0,
};
},
}),
// Properties
contactProperties: () => ({
displayName: Property.ShortText({
displayName: 'Display Name',
required: false,
}),
givenName: Property.ShortText({
displayName: 'Given Name',
required: false,
}),
middleName: Property.ShortText({
displayName: 'Middle Name',
required: false,
}),
surname: Property.ShortText({
displayName: 'Surname',
required: false,
}),
emailAddresses: Property.Array({
displayName: 'Email Addresses',
required: false,
properties: {
address: Property.ShortText({
displayName: 'Email Address',
required: true,
}),
name: Property.ShortText({
displayName: 'Name',
required: false,
}),
},
}),
mobilePhone: Property.ShortText({
displayName: 'Mobile Phone',
required: false,
}),
assistantName: Property.ShortText({
displayName: 'Assistant Name',
required: false,
}),
birthday: Property.DateTime({
displayName: 'Birthday',
required: false,
}),
businessStreet: Property.ShortText({
displayName: 'Business Street',
required: false,
}),
businessCity: Property.ShortText({
displayName: 'Business City',
required: false,
}),
businessState: Property.ShortText({
displayName: 'Business State',
required: false,
}),
businessPostalCode: Property.ShortText({
displayName: 'Business Postal Code',
required: false,
}),
businessCountryOrRegion: Property.ShortText({
displayName: 'Business Country or Region',
required: false,
}),
children: Property.Array({
displayName: 'Children',
required: false,
properties: {
name: Property.ShortText({
displayName: 'Name',
required: true,
}),
},
}),
companyName: Property.ShortText({
displayName: 'Company Name',
required: false,
}),
department: Property.ShortText({
displayName: 'Department',
required: false,
}),
homeStreet: Property.ShortText({
displayName: 'Home Street',
required: false,
}),
homeCity: Property.ShortText({
displayName: 'Home City',
required: false,
}),
homeState: Property.ShortText({
displayName: 'Home State',
required: false,
}),
homePostalCode: Property.ShortText({
displayName: 'Home Postal Code',
required: false,
}),
homeCountryOrRegion: Property.ShortText({
displayName: 'Home Country or Region',
required: false,
}),
imAddresses: Property.Array({
displayName: 'Instant Messaging Addresses',
required: false,
properties: {
address: Property.ShortText({
displayName: 'IM Address',
required: true,
}),
},
}),
initials: Property.ShortText({
displayName: 'Initials',
required: false,
}),
jobTitle: Property.ShortText({
displayName: 'Job Title',
required: false,
}),
manager: Property.ShortText({
displayName: 'Manager',
required: false,
}),
nickName: Property.ShortText({
displayName: 'Nick Name',
required: false,
}),
officeLocation: Property.ShortText({
displayName: 'Office Location',
required: false,
}),
otherStreet: Property.ShortText({
displayName: 'Other Street',
required: false,
}),
otherCity: Property.ShortText({
displayName: 'Other City',
required: false,
}),
otherState: Property.ShortText({
displayName: 'Other State',
required: false,
}),
otherPostalCode: Property.ShortText({
displayName: 'Other Postal Code',
required: false,
}),
otherCountryOrRegion: Property.ShortText({
displayName: 'Other Country or Region',
required: false,
}),
parentFolder: microsoft365PeopleCommon.contactFolderDropdown(
'Parent Folder',
'Select a parent folder',
false
),
personalNotes: Property.LongText({
displayName: 'Personal Notes',
required: false,
}),
profession: Property.ShortText({
displayName: 'Profession',
required: false,
}),
spouseName: Property.ShortText({
displayName: 'Spouse Name',
required: false,
}),
title: Property.ShortText({
displayName: 'Title',
required: false,
}),
}),
contactFolderProperties: () => ({
displayName: Property.ShortText({
displayName: 'Contact Folder Name',
required: true,
}),
parentFolder: microsoft365PeopleCommon.contactFolderDropdown(
'Parent Folder',
'Select a parent folder',
false
),
}),
};

View File

@@ -0,0 +1,60 @@
import {
DedupeStrategy,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
createTrigger,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import dayjs from 'dayjs';
import { microsoft365PeopleAuth } from '../common/auth';
import { microsoft365PeopleCommon } from '../common/common';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof microsoft365PeopleAuth>,
Record<string, never>
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, lastFetchEpochMS }) => {
const contacts = await microsoft365PeopleCommon.listContacts({
auth,
queryParams:lastFetchEpochMS ===0?{$top:'10'} :{
$filter: `lastModifiedDateTime gt ${dayjs(lastFetchEpochMS).toISOString()}`,
$orderby: 'lastModifiedDateTime desc',
},
});
return contacts.map((contact) => ({
epochMilliSeconds: dayjs(contact.lastModifiedDateTime).valueOf(),
data: contact,
}));
},
};
export const newOrUpdatedContact = createTrigger({
auth: microsoft365PeopleAuth,
name: 'newOrUpdatedContact',
displayName: 'New or Updated Contact',
description:
'Triggers when a contact is created or updated in Microsoft 365 People.',
props: {},
sampleData: {},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(polling, context);
},
async onEnable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onEnable(polling, { store, auth, propsValue });
},
async onDisable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onDisable(polling, { store, auth, propsValue });
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
});