diff --git a/rfc/0003 RFC GraphQL API for Duniter Client.md b/rfc/0003 RFC GraphQL API for Duniter Client.md index be052dcc0123953dab439332a90d159bba290353..5c91c8b3cfc4144a5304347b8bc564570640da21 100644 --- a/rfc/0003 RFC GraphQL API for Duniter Client.md +++ b/rfc/0003 RFC GraphQL API for Duniter Client.md @@ -52,7 +52,7 @@ The various implementation, for example the javascript one, are under the MIT li https://code.facebook.com/posts/121714468491809/relicensing-the-graphql-specification/ -## Librairies +## Server Librairies GraphQl use queries that need to be parsed by the server implementation. So the use of a library avoid to write ourselves the base code. @@ -68,6 +68,10 @@ Rust library is available [here](https://github.com/graphql-rust/juniper) http://graphql.org/code/#server-libraries +## Client Libraries + +http://graphql.org/code/#graphql-clients + ## GraphQL Verification API This is the name proposed for this API implementation. @@ -113,9 +117,14 @@ They can be used on data in the blockchain or in the pool, as below : ## Types -We explore here each type of document to request. +We can request different types: + +- Data: a GraphQL json representation of the type of state requested from a document or an agregation of documents. +- Raw: a GraphQL json containing a raw document. +- Merckle Tree: a GraphQL json containing the root of the merckle tree from a state. +- Lists: a list of state or others types enumerated above. Lists are limited to a maximum number by default and must be paginated. -### Identity +### Identity example #### Identities data @@ -141,19 +150,19 @@ The data we need when we request Identity informations are : **GraphQL Request:** -Parameters are mandatory, this is the key to retrieve the Indentity. +Parameters are mandatory, this is the key to retrieve the Identity. Fields are optional like in any GrahQL query. ```javascript - { + query getIdentity { Identity(uid: "john", pubkey: "z7rDt7...", blockstamp: "22765-1AD84...") { member signature written outdistanced sentry - MembershipState - RevokeState + Membership + Revoke } } ``` @@ -168,12 +177,12 @@ Fields are optional like in any GrahQL query. "written": True "outdistanced": False, "sentry": True, - "MembershipState": { + "Membership": { "type": "IN", "blockstamp": "22965-7FD42...", "timestamp": "229658678", }, - "RevokeState": { + "Revoke": { "revoked": True, "blockstamp": "22965-7FD42...", "timestamp": "229658678", @@ -185,7 +194,7 @@ Fields are optional like in any GrahQL query. To get the full raw document type: ```javascript -{ +query getIdentityRaw { IdentityRaw(uid: "john", pubkey: "z7rDt7...", blockstamp: "22765-1AD84...") } ``` @@ -234,7 +243,7 @@ merckle check is done on raw document fields. Send the verification request: ```javascript -{ +query getIdentityMerckleTree { IdentityMerckleTree(uid: "john", pubkey: "z7rDt7...", blockstamp: "22765-1AD84...") } ``` @@ -249,6 +258,38 @@ Return the root of the merckle tree: } ``` -## The GraphQL server code +**Query a list of identities UID:** + +For all list queries, an offset and a limit variable are specified by default. +You can use these to paginate your list and avoid a "timebomb" request. + +*A "timebomb" request is a request on an infinitly growing list of entities, +leading to slower and bigger responses that can, at the end, crash the server.* + +```javascript +query getIdentities($offset: Int = 0, $limit: Int = 1000) { + Identities { + uid + } +} +``` + +List response: + +```javascript +{ + "data": { + "Identities": [ + { + "uid": "Alice" + }, + { + "uid": "Bob" + } + ] +} +``` + +**Send an Identity Document:** -To do +TODO