A REST API that peforms operations on a sample JSON users' array.
The Simple API is a multi-container docker application composed by:
The REST API.
The messaging system.
The data processing pipeline.
The search and analytics engine.
The data visualization dashboard.
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
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" ] } }
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" ]
- Code: 200
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" } ]
- Code: 200
-
Notes:
<The first property passed as parameter will be used to order the array.>
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" } } ]
- Code: 200
-
Notes:
<If you pass "*" to the value parameter the search will only verify the property ignoring it's value.>