feat: add freescout app with new event trigger (#2287)

* added FreeScout plugin

* docs: add freescout in sidebar

* docs(freescout): add missing app icon

* refactor(freescout): rename filter as eventType

---------

Co-authored-by: Ali BARIN <ali.barin53@gmail.com>
This commit is contained in:
Krzysztof DK
2025-01-16 17:28:53 +01:00
committed by GitHub
parent bf29ba5c17
commit 79b0d083e6
15 changed files with 289 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="256.000000pt" height="256.000000pt" viewBox="0 0 256.000000 256.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,256.000000) scale(0.100000,-0.100000)"
fill="#0078D7" stroke="none">
<path d="M1120 2544 c-220 -44 -286 -64 -425 -136 -331 -170 -574 -485 -656
-850 -27 -120 -38 -419 -18 -512 28 -134 72 -219 156 -302 72 -70 153 -108
265 -124 160 -22 303 23 414 129 39 36 49 42 63 33 41 -30 160 -85 210 -99 78
-21 220 -20 306 1 214 54 387 228 441 441 35 143 16 318 -50 441 -112 208
-311 327 -546 327 -235 0 -434 -119 -546 -327 -49 -92 -65 -171 -71 -346 -3
-85 -10 -163 -15 -173 -5 -10 -27 -31 -50 -47 -73 -53 -163 -32 -205 49 -60
118 -29 435 61 621 198 406 644 609 1075 489 418 -117 708 -541 660 -967 -64
-573 -607 -944 -1159 -791 -41 12 -93 30 -114 40 -46 22 -46 22 -46 10 0 -4
-27 -49 -60 -99 -33 -51 -60 -94 -60 -98 0 -3 -15 -26 -32 -51 -31 -43 -32
-45 -14 -59 36 -26 201 -85 301 -107 143 -31 406 -31 547 0 486 110 861 485
971 971 31 140 31 404 0 544 -109 484 -485 862 -965 969 -91 20 -375 35 -438
23z m252 -1025 c29 -11 69 -36 90 -56 41 -40 78 -126 78 -183 0 -57 -37 -143
-78 -183 -43 -42 -127 -77 -182 -77 -55 0 -139 35 -182 77 -41 40 -78 126 -78
181 0 62 31 133 80 182 77 77 173 98 272 59z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,44 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'screenName',
label: 'Screen Name',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description:
'Screen name of your connection to be used on Automatisch UI.',
clickToCopy: false,
},
{
key: 'instanceUrl',
label: 'FreeScout instance URL',
type: 'string',
required: true,
readOnly: false,
description: 'Your FreeScout instance URL.',
docUrl: 'https://automatisch.io/docs/freescout#instance-url',
clickToCopy: false,
},
{
key: 'apiKey',
label: 'API Key',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'FreeScout API key of your account.',
docUrl: 'https://automatisch.io/docs/freescout#api-key',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

@@ -0,0 +1,6 @@
const isStillVerified = async ($) => {
await $.http.get('/api/mailboxes');
return true;
};
export default isStillVerified;

View File

@@ -0,0 +1,5 @@
const verifyCredentials = async ($) => {
await $.http.get('/api/mailboxes');
};
export default verifyCredentials;

View File

@@ -0,0 +1,9 @@
const addAuthHeader = ($, requestConfig) => {
if ($.auth.data?.apiKey) {
requestConfig.headers['X-FreeScout-API-Key'] = $.auth.data.apiKey;
}
return requestConfig;
};
export default addAuthHeader;

View File

@@ -0,0 +1,6 @@
const setBaseUrl = ($, requestConfig) => {
requestConfig.baseURL = $.auth.data.instanceUrl;
return requestConfig;
};
export default setBaseUrl;

View File

@@ -0,0 +1,52 @@
const webhookFilters = [
{
value: 'convo.assigned',
label: 'Conversation assigned',
},
{
value: 'convo.created',
label: 'Conversation created',
},
{
value: 'convo.deleted',
label: 'Conversation deleted',
},
{
value: 'convo.deleted_forever',
label: 'Conversation deleted forever',
},
{
value: 'convo.restored',
label: 'Conversation restored from Deleted folder',
},
{
value: 'convo.moved',
label: 'Conversation moved',
},
{
value: 'convo.status',
label: 'Conversation status updated',
},
{
value: 'convo.customer.reply.created',
label: 'Customer replied',
},
{
value: 'convo.agent.reply.created',
label: 'Agent replied',
},
{
value: 'convo.note.created',
label: 'Note added',
},
{
value: 'customer.created',
label: 'Customer create',
},
{
value: 'customer.updated',
label: 'Customer update',
},
];
export default webhookFilters;

View File

@@ -0,0 +1,18 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import triggers from './triggers/index.js';
import setBaseUrl from './common/set-base-url.js';
export default defineApp({
name: 'FreeScout',
key: 'freescout',
iconUrl: '{BASE_URL}/apps/freescout/assets/favicon.svg',
supportsConnections: true,
baseUrl: 'https://freescout.net',
primaryColor: '#F5D05E',
authDocUrl: '{DOCS_URL}/apps/freescout/connection',
beforeRequest: [setBaseUrl, addAuthHeader],
auth,
triggers,
});

View File

@@ -0,0 +1,3 @@
import newEvent from './new-event/index.js';
export default [newEvent];

View File

@@ -0,0 +1,61 @@
import Crypto from 'crypto';
import isEmpty from 'lodash/isEmpty.js';
import defineTrigger from '../../../../helpers/define-trigger.js';
import webhookFilters from '../../common/webhook-filters.js';
export default defineTrigger({
name: 'New event',
key: 'newEvent',
type: 'webhook',
description: 'Triggers when a new event occurs.',
arguments: [
{
label: 'Event type',
key: 'eventType',
type: 'dropdown',
required: true,
description: 'Pick an event type to receive events for.',
variables: false,
options: webhookFilters,
},
],
async run($) {
const dataItem = {
raw: $.request.body,
meta: {
internalId: Crypto.randomUUID(),
},
};
$.pushTriggerItem(dataItem);
},
async testRun($) {
const lastExecutionStep = await $.getLastExecutionStep();
if (!isEmpty(lastExecutionStep?.dataOut)) {
$.pushTriggerItem({
raw: lastExecutionStep.dataOut,
meta: {
internalId: '',
},
});
}
},
async registerHook($) {
const payload = {
url: $.webhookUrl,
events: [$.step.parameters.eventType],
};
const response = await $.http.post('/api/webhooks', payload);
await $.flow.setRemoteWebhookId(response.data?.id?.toString());
},
async unregisterHook($) {
await $.http.delete(`/api/webhooks/${$.flow.remoteWebhookId}`);
},
});

View File

@@ -19,6 +19,7 @@ exports[`App model > list should have list of applications keys 1`] = `
"flickr",
"flowers-software",
"formatter",
"freescout",
"ghost",
"github",
"gitlab",