Skip to content

HenriqueLBorges/simple-api

Repository files navigation

Simple - API

A REST API that peforms operations on a sample JSON users' array.

Services

The Simple API is a multi-container docker application composed by:

Simple - API

The REST API.

Apache Kafka

The messaging system.

Logstash

The data processing pipeline.

Elasticsearch

The search and analytics engine.

Kibana

The data visualization dashboard.

How to build?

cd into projects root folder.

  > sbt
  sbt:simple-api> assembly

The fat JAR will be at /simple-api/target/scala-2.12/simple-api.jar

How everything works

The API logs requests into Apache Kafka. Logstash is always consuming messages from Apache Kafka topics, processing them and inserting into Elasticsearch. Kibana connects to the Elasticsearch and enable us to visualize the data generated by the API.

Example: { "_index": "requisitions", "_type": "_doc", "_id": "P-20wG8B_CeZzsGvZjlV", "_version": 1, "_score": 0, "_source": { "response": null, "@timestamp": "2020-01-20T02:07:25.657Z", "reply_time": 1359, "@version": "1", "endpoint": "/singleProperty", "error": "head of empty list", "message": "{\"endpoint\":\"/singleProperty\",\"ip\":\"127.0.0.1\",\"method\":\"GET\",\"reply_time\":1359,\"response\":null,\"error\":\"head of empty list\"}", "method": "GET", "ip": "127.0.0.1" }, "fields": { "@timestamp": [ "2020-01-20T02:07:25.657Z" ] } }

Endpoints

singleProperty

Queries a single property inside the JSON data and returns all the respective values.

  • URL

    /singleProperty

  • Method:

    GET

    Optional:

    property=String

  • Sample Call:

      curl -X GET \
      'http://localhost:8080/singleProperty?property=address.geo.lat' \
      -H 'Accept: */*' \
      -H 'Accept-Encoding: gzip, deflate' \
      -H 'Authorization: Bearer 123' \
      -H 'Host: localhost:8080'
    
  • Success Response:

    • Code: 200
      Content: [ "-37.3159", "-43.9509", "-68.6102", "29.4572", "-31.8129", "-71.4197", "24.8918", "-14.3990", "24.6463", "-38.2386" ]

All users

Filter properties from the users Array and return a new users' array containing thoses properties.

  • URL

    /allUsers

  • Method:

    GET

  • URL Params

    Optional:

    property=String

  • Sample Call:

      curl -X GET \
      'http://localhost:8080/allUsers?property=email,name,address.geo.lat' \
      -H 'Accept: */*' \
      -H 'Accept-Encoding: gzip, deflate' \
      -H 'Authorization: Bearer 123' \
      -H 'Host: localhost:8080'  
    
  • Success Response:

    • Code: 200
      Content: [ { "address.geo.lat": "-31.8129", "name": "Lucio_Hettinger@annie.ca", "email": "Chelsey Dietrich" }, { "address.geo.lat": "-38.2386", "name": "Rey.Padberg@karina.biz", "email": "Clementina DuBuque" }, { "address.geo.lat": "-68.6102", "name": "Nathan@yesenia.net", "email": "Clementine Bauch" }, { "address.geo.lat": "-43.9509", "name": "Shanna@melissa.tv", "email": "Ervin Howell" }, { "address.geo.lat": "24.6463", "name": "Chaim_McDermott@dana.io", "email": "Glenna Reichert" }, { "address.geo.lat": "24.8918", "name": "Telly.Hoeger@billy.biz", "email": "Kurtis Weissnat" }, { "address.geo.lat": "-37.3159", "name": "Sincere@april.biz", "email": "Leanne Graham" }, { "address.geo.lat": "-71.4197", "name": "Karley_Dach@jasper.info", "email": "Mrs. Dennis Schulist" }, { "address.geo.lat": "-14.3990", "name": "Sherwood@rosamond.me", "email": "Nicholas Runolfsdottir V" }, { "address.geo.lat": "29.4572", "name": "Julianne.OConner@kory.org", "email": "Patricia Lebsack" } ]
  • Notes:

    <The first property passed as parameter will be used to order the array.>

Search

Filters users based on a key and value pair.

  • URL

    /search

  • Method:

    GET

  • URL Params

    Optional:

    property=String

    value=String

  • Sample Call:

      curl -X GET \
      'http://0.0.0.0:8080/search?property=suite&value=%2A' \
      -H 'Accept: */*' \
      -H 'Accept-Encoding: gzip, deflate' \
      -H 'Host: 0.0.0.0:8080' \
    
  • Success Response:

    • Code: 200
      Content: [ { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } }, "phone": "1-770-736-8031 x56442", "website": "hildegard.org", "company": { "name": "Romaguera-Crona", "catchPhrase": "Multi-layered client-server neural-net", "bs": "harness real-time e-markets" } }, { "id": 2, "name": "Ervin Howell", "username": "Antonette", "email": "Shanna@melissa.tv", "address": { "street": "Victor Plains", "suite": "Suite 879", "city": "Wisokyburgh", "zipcode": "90566-7771", "geo": { "lat": "-43.9509", "lng": "-34.4618" } }, "phone": "010-692-6593 x09125", "website": "anastasia.net", "company": { "name": "Deckow-Crist", "catchPhrase": "Proactive didactic contingency", "bs": "synergize scalable supply-chains" } }, { "id": 3, "name": "Clementine Bauch", "username": "Samantha", "email": "Nathan@yesenia.net", "address": { "street": "Douglas Extension", "suite": "Suite 847", "city": "McKenziehaven", "zipcode": "59590-4157", "geo": { "lat": "-68.6102", "lng": "-47.0653" } }, "phone": "1-463-123-4447", "website": "ramiro.info", "company": { "name": "Romaguera-Jacobson", "catchPhrase": "Face to face bifurcated interface", "bs": "e-enable strategic applications" } }, { "id": 4, "name": "Patricia Lebsack", "username": "Karianne", "email": "Julianne.OConner@kory.org", "address": { "street": "Hoeger Mall", "suite": "Apt. 692", "city": "South Elvis", "zipcode": "53919-4257", "geo": { "lat": "29.4572", "lng": "-164.2990" } }, "phone": "493-170-9623 x156", "website": "kale.biz", "company": { "name": "Robel-Corkery", "catchPhrase": "Multi-tiered zero tolerance productivity", "bs": "transition cutting-edge web services" } }, { "id": 5, "name": "Chelsey Dietrich", "username": "Kamren", "email": "Lucio_Hettinger@annie.ca", "address": { "street": "Skiles Walks", "suite": "Suite 351", "city": "Roscoeview", "zipcode": "33263", "geo": { "lat": "-31.8129", "lng": "62.5342" } }, "phone": "(254)954-1289", "website": "demarco.info", "company": { "name": "Keebler LLC", "catchPhrase": "User-centric fault-tolerant solution", "bs": "revolutionize end-to-end systems" } }, { "id": 6, "name": "Mrs. Dennis Schulist", "username": "Leopoldo_Corkery", "email": "Karley_Dach@jasper.info", "address": { "street": "Norberto Crossing", "suite": "Apt. 950", "city": "South Christy", "zipcode": "23505-1337", "geo": { "lat": "-71.4197", "lng": "71.7478" } }, "phone": "1-477-935-8478 x6430", "website": "ola.org", "company": { "name": "Considine-Lockman", "catchPhrase": "Synchronised bottom-line interface", "bs": "e-enable innovative applications" } }, { "id": 7, "name": "Kurtis Weissnat", "username": "Elwyn.Skiles", "email": "Telly.Hoeger@billy.biz", "address": { "street": "Rex Trail", "suite": "Suite 280", "city": "Howemouth", "zipcode": "58804-1099", "geo": { "lat": "24.8918", "lng": "21.8984" } }, "phone": "210.067.6132", "website": "elvis.io", "company": { "name": "Johns Group", "catchPhrase": "Configurable multimedia task-force", "bs": "generate enterprise e-tailers" } }, { "id": 8, "name": "Nicholas Runolfsdottir V", "username": "Maxime_Nienow", "email": "Sherwood@rosamond.me", "address": { "street": "Ellsworth Summit", "suite": "Suite 729", "city": "Aliyaview", "zipcode": "45169", "geo": { "lat": "-14.3990", "lng": "-120.7677" } }, "phone": "586.493.6943 x140", "website": "jacynthe.com", "company": { "name": "Abernathy Group", "catchPhrase": "Implemented secondary concept", "bs": "e-enable extensible e-tailers" } }, { "id": 9, "name": "Glenna Reichert", "username": "Delphine", "email": "Chaim_McDermott@dana.io", "address": { "street": "Dayna Park", "suite": "Suite 449", "city": "Bartholomebury", "zipcode": "76495-3109", "geo": { "lat": "24.6463", "lng": "-168.8889" } }, "phone": "(775)976-6794 x41206", "website": "conrad.com", "company": { "name": "Yost and Sons", "catchPhrase": "Switchable contextually-based project", "bs": "aggregate real-time technologies" } }, { "id": 10, "name": "Clementina DuBuque", "username": "Moriah.Stanton", "email": "Rey.Padberg@karina.biz", "address": { "street": "Kattie Turnpike", "suite": "Suite 198", "city": "Lebsackbury", "zipcode": "31428-2261", "geo": { "lat": "-38.2386", "lng": "57.2232" } }, "phone": "024-648-3804", "website": "ambrose.net", "company": { "name": "Hoeger LLC", "catchPhrase": "Centralized empowering task-force", "bs": "target end-to-end models" } } ]
  • Notes:

    <If you pass "*" to the value parameter the search will only verify the property ignoring it's value.>

Releases

No releases published

Packages

No packages published

Languages