194 lines
4.6 KiB
TypeScript
194 lines
4.6 KiB
TypeScript
|
import { Integration, DatasourceFieldTypes, QueryTypes } from "./base/definitions"
|
||
|
|
||
|
module RestModule {
|
||
|
const fetch = require("node-fetch")
|
||
|
|
||
|
interface RestConfig {
|
||
|
url: string,
|
||
|
defaultHeaders: {
|
||
|
[key: string]: any,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const SCHEMA: Integration = {
|
||
|
docs: "https://github.com/node-fetch/node-fetch",
|
||
|
description:
|
||
|
"Representational state transfer (REST) is a de-facto standard for a software architecture for interactive applications that typically use multiple Web services. ",
|
||
|
friendlyName: "REST API",
|
||
|
datasource: {
|
||
|
url: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
default: "localhost",
|
||
|
required: true,
|
||
|
},
|
||
|
defaultHeaders: {
|
||
|
type: DatasourceFieldTypes.OBJECT,
|
||
|
required: false,
|
||
|
default: {},
|
||
|
},
|
||
|
},
|
||
|
query: {
|
||
|
create: {
|
||
|
readable: true,
|
||
|
displayName: "POST",
|
||
|
type: QueryTypes.FIELDS,
|
||
|
urlDisplay: true,
|
||
|
fields: {
|
||
|
path: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
},
|
||
|
queryString: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
},
|
||
|
headers: {
|
||
|
type: DatasourceFieldTypes.OBJECT,
|
||
|
},
|
||
|
requestBody: {
|
||
|
type: DatasourceFieldTypes.JSON,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
read: {
|
||
|
displayName: "GET",
|
||
|
readable: true,
|
||
|
type: QueryTypes.FIELDS,
|
||
|
urlDisplay: true,
|
||
|
fields: {
|
||
|
path: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
},
|
||
|
queryString: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
},
|
||
|
headers: {
|
||
|
type: DatasourceFieldTypes.OBJECT,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
update: {
|
||
|
displayName: "PUT",
|
||
|
readable: true,
|
||
|
type: QueryTypes.FIELDS,
|
||
|
urlDisplay: true,
|
||
|
fields: {
|
||
|
path: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
},
|
||
|
queryString: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
},
|
||
|
headers: {
|
||
|
type: DatasourceFieldTypes.OBJECT,
|
||
|
},
|
||
|
requestBody: {
|
||
|
type: DatasourceFieldTypes.JSON,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
delete: {
|
||
|
displayName: "DELETE",
|
||
|
type: QueryTypes.FIELDS,
|
||
|
urlDisplay: true,
|
||
|
fields: {
|
||
|
path: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
},
|
||
|
queryString: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
},
|
||
|
headers: {
|
||
|
type: DatasourceFieldTypes.OBJECT,
|
||
|
},
|
||
|
requestBody: {
|
||
|
type: DatasourceFieldTypes.JSON,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
class RestIntegration {
|
||
|
private config: RestConfig
|
||
|
private headers: {
|
||
|
[key: string]: string
|
||
|
} = {}
|
||
|
|
||
|
constructor(config: RestConfig) {
|
||
|
this.config = config
|
||
|
}
|
||
|
|
||
|
async parseResponse(response: any) {
|
||
|
switch (this.headers.Accept) {
|
||
|
case "application/json":
|
||
|
return await response.json()
|
||
|
case "text/html":
|
||
|
return await response.text()
|
||
|
default:
|
||
|
return await response.json()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async create({ path = "", queryString = "", headers = {}, json = {} }) {
|
||
|
this.headers = {
|
||
|
...this.config.defaultHeaders,
|
||
|
...headers,
|
||
|
}
|
||
|
|
||
|
const response = await fetch(this.config.url + path + queryString, {
|
||
|
method: "POST",
|
||
|
headers: this.headers,
|
||
|
body: JSON.stringify(json),
|
||
|
})
|
||
|
|
||
|
return await this.parseResponse(response)
|
||
|
}
|
||
|
|
||
|
async read({path = "", queryString = "", headers = {}}) {
|
||
|
this.headers = {
|
||
|
...this.config.defaultHeaders,
|
||
|
...headers,
|
||
|
}
|
||
|
|
||
|
const response = await fetch(this.config.url + path + queryString, {
|
||
|
headers: this.headers,
|
||
|
})
|
||
|
|
||
|
return await this.parseResponse(response)
|
||
|
}
|
||
|
|
||
|
async update({path = "", queryString = "", headers = {}, json = {}}) {
|
||
|
this.headers = {
|
||
|
...this.config.defaultHeaders,
|
||
|
...headers,
|
||
|
}
|
||
|
|
||
|
const response = await fetch(this.config.url + path + queryString, {
|
||
|
method: "POST",
|
||
|
headers: this.headers,
|
||
|
body: JSON.stringify(json),
|
||
|
})
|
||
|
|
||
|
return await this.parseResponse(response)
|
||
|
}
|
||
|
|
||
|
async delete({path = "", queryString = "", headers = {}}) {
|
||
|
this.headers = {
|
||
|
...this.config.defaultHeaders,
|
||
|
...headers,
|
||
|
}
|
||
|
|
||
|
const response = await fetch(this.config.url + path + queryString, {
|
||
|
method: "DELETE",
|
||
|
headers: this.headers,
|
||
|
})
|
||
|
|
||
|
return await this.parseResponse(response)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
schema: SCHEMA,
|
||
|
integration: RestIntegration,
|
||
|
}
|
||
|
}
|