REST Utils API development - IKANOW/Aleph2 GitHub Wiki

Implementation Thoughts:

We want to allow access to these areas via a generic API:

  1. Management DB

1A. Bucket Store

1B. Bucket Status

1C. Shared Library

1D. Bucket State (harvest|enrich|analytic)

1E. Library State (TODO get clarity on this)

  1. Bucket Data Services Crud (e.g. bucketX.search_index_service)

We can support 1 endpoint that parses the url to point to the correct services (or just 2 endpoints, one for each type if they are sufficiently different in the end?)

http://API_SERVER/aleph2_api/<service.read|write.identifier>

or (if we can't route easily with ///* and get the distinct pieces easily)

http://API_SERVER/aleph2_api/<service>/<read|write>/<identifier>

Where:

SERVICE = name of service we want to get

  • management_db (1)
  • data_service (2)

READ|WRITE = type of crud service we want returned (because permissions vary on services)

  • read = get read only crud e.g. service_context(service).getReadableCrud(...)
  • write = get writable crud e.g. service_context(service).getWritableCrud(...)

IDENTIFIER = which crud to grab

management_db

  • bucket_store = bucket crud service
  • bucket_status = bucket status crud service
  • shared_library = shared library crud service
  • bucket_state (harvest|enrich|analytics) = bucket state crud service?
  • library_state = library state crud service? data_service
  • search_index = search index service
  • storage = storage service
  • etc, etc for each service

Query/Params/Reponse

bucket store: GET - get a bucket URL PARAM? - ID DATA - Queryspec json

  • aleph2_api/management_db/read/bucket_store/
  • aleph2_api/management_db/read/bucket_store -d '{"full_name":"/burch/bucket/testdata1"}'

POST - insert a new bucket via post data (update if an id/full_name is included or just fail out say you need to PUT because it already exists?) DATA - bucket json PUT - update an existing bucket (must give id or queryspec) URL PARAM - ID DATA - queryspec json + updatespec json DELETE - remove bucket URL PARAM - ID DATA - queryspec json

Running Current Dev API -

  1. Import both (as well as required deps, such as data_model, aleph2_search_index_service_elasticsearch): https://github.com/IKANOW/Aleph2-contrib/tree/master/aleph2_rest_utils https://github.com/IKANOW/Aleph2-examples/tree/master/aleph2_rest_utils_web

  2. Update the web.xml https://github.com/IKANOW/Aleph2-examples/blob/master/aleph2_rest_utils_web/WebContent/WEB-INF/web.xml to point to an aleph2 config file on your filesys (or the one attached in source here: https://github.com/IKANOW/Aleph2-examples/blob/master/aleph2_rest_utils_web/example_config/v1_sync_service.properties)

  3. Run aleph2_rest_utils_web on a tomcat server (or whatever servlet you use) (the web.xml is here https://github.com/IKANOW/Aleph2-examples/blob/master/aleph2_rest_utils_web/WebContent/WEB-INF/web.xml)

  4. example calls: READ: Count 1 bucket results: GET http://localhost:8080/aleph2_rest_utils_web/aleph2_api/count/data_service/read/search_index?buckets=/bucket/burch/storm_test_demo3 Count 2 bucket results: GET http://localhost:8080/aleph2_rest_utils_web/aleph2_api/count/data_service/read/search_index?buckets=/bucket/burch/storm_test_demo2,/bucket/burch/storm_test_demo3 Query 1 bucket results (limit 20): POST -d '{"when":{"keyA":"isa"}}' http://localhost:8080/aleph2_rest_utils_web/aleph2_api/query/data_service/read/search_index?buckets=/bucket/burch/storm_test_demo3&limit=20 Query 2 bucket results (limit 20): POST -d '{"when":{"keyA":"isa"}}' http://localhost:8080/aleph2_rest_utils_web/aleph2_api/query/data_service/read/search_index?buckets=/bucket/burch/storm_test_demo2,/bucket/burch/storm_test_demo3&limit=20 Query single result by id+bucket: GET http://localhost:8080/aleph2_rest_utils_web/aleph2_api/data_service/read/search_index/AVANMa4lTZC4L-HUX8FB?buckets=/bucket/burch/storm_test_demo3

Query Language: https://github.com/IKANOW/Aleph2-contrib/blob/master/aleph2_rest_utils/src/main/java/com/ikanow/aleph2/aleph2_rest_utils/QueryComponentBean.java

Supports single operator queries or multi queries: Single operators:

when (equals): {"when":{"key":"value"}} whenNot (not equals): {"whenNot":{"key":"value"}}

withAny: {"withAny":{"key":["value1","value2"]}} withAll: withPresent (exists): {"withPresent":["key1","key2"]} withNotPresent (doesn't exist):

rangeAbove: {"rangeAbove":{"key":{"value":true}}} rangeBelow: {"rangeBelow":{"key":{"value":true}}} rangeIn: {"rangeAbove":{"key":{{"value":true},{"value":true}}}}

Multi Queries: and: {"and":[{"when":{"key":"value"}},{"when":{"key":"value"}}]} or: {"or":[{"when":{"key":"value"}},{"when":{"key":"value"}}]}

⚠️ **GitHub.com Fallback** ⚠️