Skip to content

Commit a1daefc

Browse files
committed
feat: support integrations without schema
1 parent df6fa1e commit a1daefc

File tree

7 files changed

+57
-24
lines changed

7 files changed

+57
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { SingleIntegrationData } from './definition'
2+
import { SingleIntegrationDefinition } from './single-integration.definition'
3+
import { IntegrationAuthDefinition } from './types/IntegrationAuthDefinition'
4+
5+
export abstract class BaseIntegrationDefinition extends SingleIntegrationDefinition {
6+
abstract title: string
7+
abstract logo: string
8+
categories: string[] = []
9+
10+
getIntegrationsData(): Promise<SingleIntegrationData[]> | SingleIntegrationData[] {
11+
return [
12+
{
13+
parentKey: this.parentKey,
14+
integrationKey: this.integrationKey,
15+
integrationVersion: this.integrationVersion,
16+
schemaUrl: this.schemaUrl,
17+
noSchemaFile: true,
18+
},
19+
]
20+
}
21+
22+
// TODO: support auth without schema
23+
protected async getAuthDefinition(): Promise<IntegrationAuthDefinition | null> {
24+
return null
25+
}
26+
}

libs/definitions/src/definition.ts

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export interface SingleIntegrationData {
3232
schemaUrl: string | null
3333
deprecated?: boolean
3434
metadata?: any
35+
noSchemaFile?: boolean
3536
}
3637

3738
export interface RequestInterceptorOptions {

libs/definitions/src/integration-definitions/graphql/graphql.definition.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { SingleIntegrationDefinition } from '@app/definitions/single-integration.definition'
1+
import { BaseIntegrationDefinition } from '@app/definitions/base-integration.definition'
22
import { GraphQLRequestAction } from './actions/graphql-request.action'
33
import { NewItemInGraphqlQueryTrigger } from './trigger/new-item-in-graphql-query.trigger'
44

5-
export class GraphqlDefinition extends SingleIntegrationDefinition {
5+
export class GraphqlDefinition extends BaseIntegrationDefinition {
6+
title = 'GraphQL'
7+
logo = 'https://raw.githubusercontent.com/chainjet/assets/master/integrations/graphql.svg'
68
integrationKey = 'graphql'
79
integrationVersion = '1'
8-
schemaUrl = null
10+
categories = ['popular', 'chainjet']
911

1012
triggers = [new NewItemInGraphqlQueryTrigger()]
1113
actions = [new GraphQLRequestAction()]

libs/definitions/src/integration-definitions/mailchain/mailchain.definition.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export class MailChainDefinition extends SingleIntegrationDefinition {
1313
actions = [new SendEmailAction()]
1414

1515
async createOrUpdateIntegrationAccount(schema: OpenAPIObject): Promise<IntegrationAccount | null> {
16-
const authDefinition = await this._getAuthDefinition()
16+
const authDefinition = await this.getAuthDefinition()
1717
if (!authDefinition) {
1818
return null
1919
}

libs/definitions/src/services/integration-installer.service.ts

+22-6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { IntegrationService } from '../../../../apps/api/src/integrations/servic
1212
import { getItemSchemaFromRes } from '../../../../apps/runner/src/utils/trigger.utils'
1313
import { decycle, retrocycle } from '../../../common/src/utils/json.utils'
1414
import { addEllipsis, stripMarkdown, stripMarkdownSync } from '../../../common/src/utils/string.utils'
15+
import { BaseIntegrationDefinition } from '../base-integration.definition'
1516
import {
1617
dereferenceJsonSchema,
1718
prepareInputsJsonSchema,
@@ -26,11 +27,7 @@ import { SchemaUtils } from '../schema/utils/schema.utils'
2627
export class IntegrationInstallerService {
2728
private readonly logger = new Logger(IntegrationInstallerService.name)
2829

29-
constructor(
30-
private readonly integrationService: IntegrationService,
31-
private readonly integrationTriggerService: IntegrationTriggerService,
32-
private readonly integrationActionService: IntegrationActionService,
33-
) {}
30+
constructor() {}
3431

3532
/**
3633
* Creates or updates integration(s), integration account(s) and integration operations
@@ -285,7 +282,26 @@ export class IntegrationInstallerService {
285282
): Promise<OpenAPIObject | null> {
286283
const schemaUrl = fetchSchemas ? integrationData.schemaUrl : null
287284

288-
const { integrationKey, integrationVersion } = integrationData
285+
const { integrationKey, integrationVersion, noSchemaFile } = integrationData
286+
287+
if (noSchemaFile) {
288+
const baseDefinition = definition as BaseIntegrationDefinition
289+
if (!baseDefinition.title) {
290+
throw new Error('Missing integration title')
291+
}
292+
return {
293+
openapi: '3.0.0',
294+
info: {
295+
title: baseDefinition.title,
296+
version: '1',
297+
'x-categories': baseDefinition.categories,
298+
'x-logo': {
299+
url: baseDefinition.logo,
300+
},
301+
},
302+
paths: {},
303+
}
304+
}
289305

290306
let schema = await SchemaUtils.getSchema({
291307
integrationKey,

libs/definitions/src/single-integration.definition.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export abstract class SingleIntegrationDefinition extends Definition {
3333
}
3434

3535
async createOrUpdateIntegrationAccount(schema: OpenAPIObject): Promise<IntegrationAccount | null> {
36-
const authDefinition = await this._getAuthDefinition()
36+
const authDefinition = await this.getAuthDefinition()
3737
if (!authDefinition) {
3838
return null
3939
}
@@ -47,7 +47,7 @@ export abstract class SingleIntegrationDefinition extends Definition {
4747
})
4848
}
4949

50-
async _getAuthDefinition(): Promise<IntegrationAuthDefinition | null> {
50+
protected async getAuthDefinition(): Promise<IntegrationAuthDefinition | null> {
5151
const integrationSchema = await SchemaUtils.getSchema({
5252
integrationKey: this.integrationKey,
5353
integrationVersion: this.integrationVersion,

schemas/openapi3/graphql-1.json

-12
This file was deleted.

0 commit comments

Comments
 (0)