REST Utils API development - IKANOW/Aleph2 GitHub Wiki
We want to allow access to these areas via a generic API:
- 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)
- 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:
- management_db (1)
- data_service (2)
- read = get read only crud e.g. service_context(service).getReadableCrud(...)
- write = get writable crud e.g. service_context(service).getWritableCrud(...)
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
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
-
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
-
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)
-
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)
-
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"}}]}