Skip to content

Streaming HTTP API built upon ElasticSearch's percolation.

License

Notifications You must be signed in to change notification settings

af83/funnel_http

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FunnelHttp

Build Status

Funnel is for building Streaming APIs build upon ElasticSearch’s percolation.

Funnel supports ElasticSearch >= 1.1.

Funnel allow to register users / devices, associates some queries to user, and exposes a streaming endpoint for each user.

The common usecase is to store a query from a user and notify this user when a new document matching this query is available.

Doing things

Elixir must be installed.

Running things

Starting the HTTP API:

mix do deps.get, deps.compile, server

Testing things

mix test

Register

A user, or a device, can register to funnel by using the /register endpoint. This will return a token. This token must be used in all communications with the funnel's API.

curl -H "Content-Type: application/json" -H "Accept: application/json" -XPOST http://localhost:4000/register
{"token":"7d0ac81fbdd646dd9e883e3b007ce58d"}

The token can be passed as a parameter, or by using the Authorization header.

For the sake of readability, we assume those headers for all subsequent examples:

-H "Content-Type: application/json" -H "Accept: application/json" -H "Authorization: 7d0ac81fbdd646dd9e883e3b007ce58d"

Query

Adding query

Adding queries is done by using the /query endpoint. The payload must comply with the funnel's query serialization. These entries can accept a single query, or a list of queries.

A query is defined by a user's token, a set of metadata, and the elasticsearch query. metadata and query are mandatory.

curl -XPOST "http://localhost:4000/queries" -d '{"query":{query" : {"term" : {"field1" : "value1"}}}, "metadata":{"name":"Awesome Query"}}'
{"query_id":"c4d92d29273a4bec9618c65c3c33e9db","metadata":{"name":"Awesome Query"}}

Updating a query

curl -XPOST "http://localhost:4000/queries/c4d92d29273a4bec9618c65c3c33e9db" -d '{"query":{"query" : {"term" : {"field1" : "value1"}}},"metadata":{"name":"Awesome Query"}}'
{"query_id":"c4d92d29273a4bec9618c65c3c33e9db","metadata":{"name":"Awesome Query"}}

Deleting a query

curl -XDELETE "http://localhost:4000/queries/c4d92d29273a4bec9618c65c3c33e9db"
{"acknowledged":true}

Searching queries

Queries can be retrieved for a given token with the following:

curl -XGET "http://localhost:4000/queries"
[{"query_id":"c4d92d29273a4bec9618c65c3c33e9db","metadata":{"name":"Awesome Query"}]

Submiting documents

Adding messages is done by using the /feeding endpoint. The payload must comply with the funnel's message serialization.

curl -XPOST "http://localhost:4000/feeding" -d '{"doc":{"field1" : "value1"}}'

Streaming

Listening to a stream is done by using the /river endpoint. Message from this endpoint has the same serialization as the message sent to /feeding, with one addition: an entry query containing the query's name. River will send messages from all queries associated to the user/token.

Rivers uses Server-sent events to maintain an open connection.

curl "http://localhost:4000/river?token=7d0ac81fbdd646dd9e883e3b007ce58d"
data: {"query_ids":["c4d92d29273a4bec9618c65c3c33e9db"],"body":"{\"doc\":{\"field1\":\"value1\"}}"}

River provides a local cache. If a last_id params is given, any item more recent will be returned.

Monitoring

Funnel can be monitored on /status. Each resquest on this endpoint does a request on ElasticSearch root.

About

Streaming HTTP API built upon ElasticSearch's percolation.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages