new: [server] /children and /parents end-points added

The two new endpoints `children` and `parents` allow to paginate over the large-set of parents or
children.

- The first value is the SHA1 value having children or parents.
- The second value is the number of elements to get (by default is 100 if
the value is set to 0).
- The third value is the cursor to paginate over the element (for
starting the cursor must be set to 0).

A sample usage:

~~~~
adulau@kolmogorov ~ $ curl -s http://127.0.0.1:5000/children/31C43D24d696BC5F5309CCBFA5BDEF65A7170439/10/0  | jq .
{
  "children": [
    "003587440172055C75130EF1A063C3BB050C3251",
    "007C1E16B3F0F2E48C114E458308397953C7D224",
    "014D1060C674FBBCEAFFD94B85D60AD00618B56B",
    "01A2FACD61D157FC80DD0C5F6B525CC9EDE4B6DE",
    "01D1A98F559966A05923A74EE239C6BBEEB0FDAC",
    "01D381F2FCDD1BDF642AF83C9E96083F2C8D1C03",
    "02B37BA21D1831C120C1C9C1D41893B4DB424EE7",
    "02DED521ADCF17AA8818EA1142F63E05F558E668",
    "0364E0EFE65D9B6502084813189B4D888C117859",
    "05C9A276A0E03F7A5F99DE5CC8911583FD8FD60E"
  ],
  "cursor": "05C9A276A0E03F7A5F99DE5CC8911583FD8FD60E",
  "total": 774
}
adulau@kolmogorov ~ $ curl -s http://127.0.0.1:5000/children/31C43D24d696BC5F5309CCBFA5BDEF65A7170439/10/05C9A276A0E03F7A5F99DE5CC8911583FD8FD60E  | jq .
{
  "children": [
    "063EC5526DA21372D77AFC3C40F694478521829B",
    "0647EA948ED37383F74CC68A94E2DC3CBC2A9E4E",
    "0648AAAC06A76A58CB1E999882447BBDEEA42C57",
    "06A62F10F269824FFD75A917A35ACD3F2461981C",
    "0727FE9E2437B15B3F879C7617973AE11E55BA13",
    "074A0CA7131AE8FD9665CFE68A0C124EB6AD0170",
    "075B11AE383071BDA9BE66E336C916F6E6E1F49C",
    "081A336DE7D636F95F0150B7708C614592CBBDAE",
    "08DF546EE44D4B7546FCE5A7B7E284CA35F1B059",
    "0947CE713B69C2318CA684BBB63912621CC17A6A"
  ],
  "cursor": "0947CE713B69C2318CA684BBB63912621CC17A6A",
  "total": 774
}
~~~~
This commit is contained in:
Alexandre Dulaunoy 2022-05-21 17:43:24 +02:00
parent 74efc57b3d
commit baf2b82f7b
Signed by: adulau
GPG key ID: 09E2CD4944E6CBCD

View file

@ -357,6 +357,58 @@ class lookup(Resource):
return h return h
@api.route('/parents/<string:sha1>/<int:count>/<string:cursor>')
@api.doc(
description="Return parents from a given SHA1. A number of element to return and an offset must be given. If not set it will be the 100 first elements. A cursor must be given to paginate over. The starting cursor is 0."
)
class parents(Resource):
def get(self, sha1, count, cursor):
if check_sha1(value=sha1) is False:
return {
'message': 'SHA1 value incorrect, expecting a SHA1 value in hex format.'
}, 400
sha1 = check_sha1(value=sha1)
if not count:
count = 100
if not cursor:
cursor = 0
if not rdb.exists("p:{}".format(sha1)):
return {'message': 'The SHA1 value has no known parent.'}, 404
parents = []
cursor, parents = rdb.sscan("p:{}".format(sha1), count=count, cursor=cursor)
h = {}
h['parents'] = parents
h['cursor'] = cursor
h['total'] = rdb.scard("p:{}".format(sha1))
return h
@api.route('/children/<string:sha1>/<int:count>/<string:cursor>')
@api.doc(
description="Return children from a given SHA1. A number of element to return and an offset must be given. If not set it will be the 100 first elements. A cursor must be given to paginate over. The starting cursor is 0."
)
class children(Resource):
def get(self, sha1, count, cursor):
if check_sha1(value=sha1) is False:
return {
'message': 'SHA1 value incorrect, expecting a SHA1 value in hex format.'
}, 400
sha1 = check_sha1(value=sha1)
if not count:
count = 100
if not cursor:
cursor = 0
if not rdb.exists("c:{}".format(sha1)):
return {'message': 'The SHA1 value has no known child.'}, 404
children = []
cursor, children = rdb.sscan("c:{}".format(sha1), count=count, cursor=cursor)
h = {}
h['children'] = children
h['cursor'] = cursor
h['total'] = rdb.scard("c:{}".format(sha1))
return h
@api.route('/info') @api.route('/info')
@api.doc(description="Info about the hashlookup database") @api.doc(description="Info about the hashlookup database")
class info(Resource): class info(Resource):