2021-06-24 19:17:26 +02:00
import {
Integration ,
2022-08-11 14:50:05 +02:00
DatasourceFieldType ,
QueryType ,
2022-08-11 12:48:58 +02:00
IntegrationBase ,
} from "@budibase/types"
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
const { Client } = require ( "@elastic/elasticsearch" )
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
interface ElasticsearchConfig {
url : string
}
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
const SCHEMA : Integration = {
docs : "https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/index.html" ,
description :
"Elasticsearch is a search engine based on the Lucene library. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents." ,
friendlyName : "ElasticSearch" ,
type : "Non-relational" ,
datasource : {
url : {
type : DatasourceFieldType . STRING ,
required : true ,
default : "http://localhost:9200" ,
2021-06-24 19:16:48 +02:00
} ,
2022-08-12 18:03:06 +02:00
} ,
query : {
create : {
type : QueryType . FIELDS ,
customisable : true ,
fields : {
index : {
type : DatasourceFieldType . STRING ,
required : true ,
2021-06-24 19:16:48 +02:00
} ,
} ,
2022-08-12 18:03:06 +02:00
} ,
read : {
type : QueryType . FIELDS ,
customisable : true ,
fields : {
index : {
type : DatasourceFieldType . STRING ,
required : true ,
2021-06-24 19:16:48 +02:00
} ,
} ,
2022-08-12 18:03:06 +02:00
} ,
update : {
type : QueryType . FIELDS ,
customisable : true ,
fields : {
id : {
type : DatasourceFieldType . STRING ,
required : true ,
} ,
index : {
type : DatasourceFieldType . STRING ,
required : true ,
2021-06-24 19:16:48 +02:00
} ,
} ,
2022-08-12 18:03:06 +02:00
} ,
delete : {
type : QueryType . FIELDS ,
fields : {
index : {
type : DatasourceFieldType . STRING ,
required : true ,
} ,
id : {
type : DatasourceFieldType . STRING ,
required : true ,
2021-06-24 19:16:48 +02:00
} ,
} ,
} ,
2022-08-12 18:03:06 +02:00
} ,
}
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
class ElasticSearchIntegration implements IntegrationBase {
private config : ElasticsearchConfig
private client : any
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
constructor ( config : ElasticsearchConfig ) {
this . config = config
this . client = new Client ( { node : config.url } )
}
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
async create ( query : { index : string ; json : object } ) {
const { index , json } = query
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
try {
const result = await this . client . index ( {
index ,
body : json ,
} )
return result . body
} catch ( err ) {
console . error ( "Error writing to elasticsearch" , err )
throw err
} finally {
await this . client . close ( )
2021-06-24 19:16:48 +02:00
}
2022-08-12 18:03:06 +02:00
}
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
async read ( query : { index : string ; json : object } ) {
const { index , json } = query
try {
const result = await this . client . search ( {
index : index ,
body : json ,
} )
return result . body . hits . hits . map ( ( { _source } : any ) = > _source )
} catch ( err ) {
console . error ( "Error querying elasticsearch" , err )
throw err
} finally {
await this . client . close ( )
2021-06-24 19:16:48 +02:00
}
2022-08-12 18:03:06 +02:00
}
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
async update ( query : { id : string ; index : string ; json : object } ) {
const { id , index , json } = query
try {
const result = await this . client . update ( {
id ,
index ,
body : json ,
} )
return result . body
} catch ( err ) {
console . error ( "Error querying elasticsearch" , err )
throw err
} finally {
await this . client . close ( )
2021-06-24 19:16:48 +02:00
}
2022-08-12 18:03:06 +02:00
}
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
async delete ( query : object ) {
try {
const result = await this . client . delete ( query )
return result . body
} catch ( err ) {
console . error ( "Error deleting from elasticsearch" , err )
throw err
} finally {
await this . client . close ( )
2021-06-24 19:16:48 +02:00
}
}
2022-08-12 18:03:06 +02:00
}
2021-06-24 19:16:48 +02:00
2022-08-12 18:03:06 +02:00
export default {
schema : SCHEMA ,
integration : ElasticSearchIntegration ,
2021-06-24 19:16:48 +02:00
}