2021-06-25 05:17:26 +12:00
import {
Integration ,
DatasourceFieldTypes ,
QueryTypes ,
} from "./base/definitions"
2021-06-25 05:16:48 +12:00
module RestModule {
const fetch = require ( "node-fetch" )
interface RestConfig {
2021-06-25 05:17:26 +12:00
url : string
2021-06-25 05:16:48 +12:00
defaultHeaders : {
2021-06-25 05:17:26 +12:00
[ key : string ] : any
2021-06-25 05:16:48 +12:00
}
}
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 )
}
2021-06-25 05:17:26 +12:00
async read ( { path = "" , queryString = "" , headers = { } } ) {
2021-06-25 05:16:48 +12:00
this . headers = {
. . . this . config . defaultHeaders ,
. . . headers ,
}
const response = await fetch ( this . config . url + path + queryString , {
headers : this.headers ,
} )
return await this . parseResponse ( response )
}
2021-06-25 05:17:26 +12:00
async update ( { path = "" , queryString = "" , headers = { } , json = { } } ) {
2021-06-25 05:16:48 +12:00
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 )
}
2021-06-25 05:17:26 +12:00
async delete ( { path = "" , queryString = "" , headers = { } } ) {
2021-06-25 05:16:48 +12:00
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 ,
}
}