diff --git a/apps/app-config/connectors/connectors.def.ts b/apps/app-config/connectors/connectors.def.ts index 4465663d..cc622d02 100644 --- a/apps/app-config/connectors/connectors.def.ts +++ b/apps/app-config/connectors/connectors.def.ts @@ -1,4 +1,5 @@ // generated by _generateConnectorLists.ts. Do not modify by hand +import {default as connectorAircall} from '@openint/connector-aircall/def' import {default as connectorAirtable} from '@openint/connector-airtable/def' import {default as connectorApollo} from '@openint/connector-apollo/def' import {default as connectorBeancount} from '@openint/connector-beancount/def' @@ -54,6 +55,7 @@ import {default as connectorYodlee} from '@openint/connector-yodlee/def' import {default as connectorZohodesk} from '@openint/connector-zohodesk/def' export const defConnectors = { + aircall: connectorAircall, airtable: connectorAirtable, apollo: connectorApollo, beancount: connectorBeancount, diff --git a/apps/app-config/connectors/connectors.merged.ts b/apps/app-config/connectors/connectors.merged.ts index 7c12f90a..c4c1d31c 100644 --- a/apps/app-config/connectors/connectors.merged.ts +++ b/apps/app-config/connectors/connectors.merged.ts @@ -1,4 +1,6 @@ // generated by _generateConnectorLists.ts. Do not modify by hand +import {default as connectorAircall_def} from '@openint/connector-aircall/def' +import {default as connectorAircall_server} from '@openint/connector-aircall/server' import {default as connectorAirtable_def} from '@openint/connector-airtable/def' import {default as connectorAirtable_server} from '@openint/connector-airtable/server' import {default as connectorApollo_def} from '@openint/connector-apollo/def' @@ -104,6 +106,11 @@ import {default as connectorYodlee_server} from '@openint/connector-yodlee/serve import {default as connectorZohodesk_def} from '@openint/connector-zohodesk/def' import {default as connectorZohodesk_server} from '@openint/connector-zohodesk/server' +const connectorAircall = { + ...connectorAircall_def, + ...connectorAircall_server, +} + const connectorAirtable = { ...connectorAirtable_def, ...connectorAirtable_server, @@ -368,6 +375,7 @@ const connectorZohodesk = { } export const mergedConnectors = { + aircall: connectorAircall, airtable: connectorAirtable, apollo: connectorApollo, beancount: connectorBeancount, diff --git a/apps/app-config/connectors/connectors.server.ts b/apps/app-config/connectors/connectors.server.ts index 3a04c6e3..b00e315e 100644 --- a/apps/app-config/connectors/connectors.server.ts +++ b/apps/app-config/connectors/connectors.server.ts @@ -1,4 +1,5 @@ // generated by _generateConnectorLists.ts. Do not modify by hand +import {default as connectorAircall} from '@openint/connector-aircall/server' import {default as connectorAirtable} from '@openint/connector-airtable/server' import {default as connectorApollo} from '@openint/connector-apollo/server' import {default as connectorBeancount} from '@openint/connector-beancount/server' @@ -52,6 +53,7 @@ import {default as connectorYodlee} from '@openint/connector-yodlee/server' import {default as connectorZohodesk} from '@openint/connector-zohodesk/server' export const serverConnectors = { + aircall: connectorAircall, airtable: connectorAirtable, apollo: connectorApollo, beancount: connectorBeancount, diff --git a/apps/app-config/connectors/meta.js b/apps/app-config/connectors/meta.js index 84ef85f5..fbd20c99 100644 --- a/apps/app-config/connectors/meta.js +++ b/apps/app-config/connectors/meta.js @@ -1,6 +1,15 @@ // generated by _generateConnectorLists.ts. Do not modify by hand module.exports = [ + { + name: 'aircall', + dirName: 'connector-aircall', + varName: 'connectorAircall', + imports: { + def: '@openint/connector-aircall/def', + server: '@openint/connector-aircall/server', + }, + }, { name: 'airtable', dirName: 'connector-airtable', diff --git a/apps/app-config/package.json b/apps/app-config/package.json index 41d2f762..952e8a46 100644 --- a/apps/app-config/package.json +++ b/apps/app-config/package.json @@ -12,6 +12,7 @@ "dependencies": { "@clerk/nextjs": "5.6.0", "@openint/cdk": "workspace:*", + "@openint/connector-aircall": "workspace:*", "@openint/connector-airtable": "workspace:*", "@openint/connector-alphavantage": "workspace:*", "@openint/connector-apollo": "workspace:*", diff --git a/apps/web/public/_assets/logo-aircall.svg b/apps/web/public/_assets/logo-aircall.svg new file mode 100644 index 00000000..60067045 --- /dev/null +++ b/apps/web/public/_assets/logo-aircall.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/connectors/connector-aircall/def.ts b/connectors/connector-aircall/def.ts new file mode 100644 index 00000000..f6b6f295 --- /dev/null +++ b/connectors/connector-aircall/def.ts @@ -0,0 +1,33 @@ +import type {ConnectorDef, ConnectorSchemas} from '@openint/cdk' +import {connHelpers, zId} from '@openint/cdk' +import {R, z} from '@openint/util' + +export const AIRCALL_ENTITY_NAMES = ['call', 'contact'] as const + +export const aircallSchema = { + name: z.literal('aircall'), + connectionSettings: z.object({apiId: z.string(), apiToken: z.string()}), + sourceOutputEntities: R.mapToObj(AIRCALL_ENTITY_NAMES, (e) => [ + e, + z.unknown().optional(), + ]), + connectOutput: z.object({ + providerConfigKey: zId('ccfg'), + connectionId: zId('conn'), + }), +} satisfies ConnectorSchemas + +export const aircallHelpers = connHelpers(aircallSchema) + +export const aircallDef = { + name: 'aircall', + schemas: aircallSchema, + metadata: { + displayName: 'Aircall', + stage: 'beta', + verticals: ['crm'], + logoUrl: '/_assets/logo-aircall.svg', + }, +} satisfies ConnectorDef + +export default aircallDef diff --git a/connectors/connector-aircall/index.ts b/connectors/connector-aircall/index.ts new file mode 100644 index 00000000..81f31bd7 --- /dev/null +++ b/connectors/connector-aircall/index.ts @@ -0,0 +1,4 @@ +// codegen:start {preset: barrel, include: "./{*.{ts,tsx},*/index.{ts,tsx}}", exclude: "./**/*.{d,spec,test,fixture,gen,node}.{ts,tsx}"} +export * from './def' +export * from './server' +// codegen:end diff --git a/connectors/connector-aircall/package.json b/connectors/connector-aircall/package.json new file mode 100644 index 00000000..08bb7175 --- /dev/null +++ b/connectors/connector-aircall/package.json @@ -0,0 +1,12 @@ +{ + "name": "@openint/connector-aircall", + "version": "0.0.0", + "private": true, + "module": "./index.ts", + "dependencies": { + "@openint/cdk": "workspace:*", + "@openint/util": "workspace:*", + "@opensdks/runtime": "^0.0.19", + "@opensdks/sdk-greenhouse": "^0.0.8" + } +} diff --git a/connectors/connector-aircall/server.ts b/connectors/connector-aircall/server.ts new file mode 100644 index 00000000..94b25c0b --- /dev/null +++ b/connectors/connector-aircall/server.ts @@ -0,0 +1,65 @@ +import {initGreenhouseSDK, type greenhouseTypes} from '@opensdks/sdk-greenhouse' +import type {ConnectorServer} from '@openint/cdk' +import {type aircallSchema} from './def' + +export type AircallSDK = ReturnType + +export type AircallTypes = greenhouseTypes + +export type AircallObjectType = AircallTypes['components']['schemas'] + +export const aircallServer = { + newInstance: ({settings}) => { + // Aircall auth requires api_id and api_token + const aircall = initGreenhouseSDK({ + auth: { + basic: { + username: `${settings.apiId}:${settings.apiToken}`, + password: '', + }, + }, + }) + return aircall + }, + postConnect: async (connectOutput, _, context) => { + // Encoding credentials: + const apiId = context.connection?.settings.apiId + const apiToken = context.connection?.settings.apiToken + const encodedCredentials = Buffer.from(`${apiId}:${apiToken}`).toString( + 'base64', + ) + + const headers = { + Authorization: `Basic ${encodedCredentials}`, + } + + try { + const response = await fetch('https://api.aircall.io/v1/ping', { + method: 'GET', + headers, + }) + + // Check if the response was successful + if (!response.ok) { + console.error( + `HTTP error! status: ${response.status} - ${response.statusText}`, + ) + } + + const body = await response.text() + console.log('Response from Aircall Ping:', body) + } catch (error) { + console.error('Error during fetch:', error) + } + + return { + connectionExternalId: connectOutput.connectionId, + providerConfigKey: connectOutput.providerConfigKey, + } + }, +} satisfies ConnectorServer< + typeof aircallSchema, + ReturnType +> + +export default aircallServer diff --git a/packages/engine-frontend/hocs/WithConnectorConnect.tsx b/packages/engine-frontend/hocs/WithConnectorConnect.tsx index 4798d4c8..aa69a418 100644 --- a/packages/engine-frontend/hocs/WithConnectorConnect.tsx +++ b/packages/engine-frontend/hocs/WithConnectorConnect.tsx @@ -277,6 +277,29 @@ export const WithConnectorConnect = ({ )} + {ccfg.connector.name === 'aircall' && ( +
+ + + + + + +

+ Generate your API ID and Token with{' '} + + these instructions + {' '} +

+
+
+
+
+ )} {debug && ( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9304e575..454889d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -176,6 +176,9 @@ importers: '@openint/cdk': specifier: workspace:* version: link:../../kits/cdk + '@openint/connector-aircall': + specifier: workspace:* + version: link:../../connectors/connector-aircall '@openint/connector-airtable': specifier: workspace:* version: link:../../connectors/connector-airtable @@ -748,6 +751,21 @@ importers: specifier: '*' version: 5.74.0(esbuild@0.17.5) + connectors/connector-aircall: + dependencies: + '@openint/cdk': + specifier: workspace:* + version: link:../../kits/cdk + '@openint/util': + specifier: workspace:* + version: link:../../packages/util + '@opensdks/runtime': + specifier: ^0.0.19 + version: 0.0.19 + '@opensdks/sdk-greenhouse': + specifier: ^0.0.8 + version: 0.0.8 + connectors/connector-airtable: dependencies: '@openint/cdk':