From 83235724336760b13e318c73ac42d5e101433de5 Mon Sep 17 00:00:00 2001 From: DimuthuMadushan Date: Tue, 4 Jul 2023 17:25:00 +0530 Subject: [PATCH] Add GraphQL input constraint validation bbe --- .../graphql_input_constraint_validation.bal | 27 +++++++++++++++++++ ...hql_input_constraint_validation.client.out | 2 ++ ...raphql_input_constraint_validation.graphql | 3 +++ .../graphql_input_constraint_validation.md | 25 +++++++++++++++++ ...aphql_input_constraint_validation.metatags | 2 ++ ...hql_input_constraint_validation.server.out | 1 + examples/index.json | 8 ++++++ 7 files changed, 68 insertions(+) create mode 100644 examples/graphql-input-constraint-validation/graphql_input_constraint_validation.bal create mode 100644 examples/graphql-input-constraint-validation/graphql_input_constraint_validation.client.out create mode 100644 examples/graphql-input-constraint-validation/graphql_input_constraint_validation.graphql create mode 100644 examples/graphql-input-constraint-validation/graphql_input_constraint_validation.md create mode 100644 examples/graphql-input-constraint-validation/graphql_input_constraint_validation.metatags create mode 100644 examples/graphql-input-constraint-validation/graphql_input_constraint_validation.server.out diff --git a/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.bal b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.bal new file mode 100644 index 0000000000..930061a1a6 --- /dev/null +++ b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.bal @@ -0,0 +1,27 @@ +import ballerina/constraint; +import ballerina/graphql; + +public type Profile record {| + // Define constraints for the fields + @constraint:String { + maxLength: 5 + } + string name; + + @constraint:Int { + minValue: 0 + } + int age; + + @constraint:Float { + maxValue: 3.0 + } + float height; +|}; + +service /graphql on new graphql:Listener(9090) { + + resource function get name(Profile profile) returns string { + return profile.name; + } +} diff --git a/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.client.out b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.client.out new file mode 100644 index 0000000000..0c599c451b --- /dev/null +++ b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.client.out @@ -0,0 +1,2 @@ +curl -X POST -H "Content-type: application/json" -d '{ "query": "query{ name(profile:{name:\"Harry Potter\", age: -4, height:6})}" }' 'http://localhost:9090/graphql' +{"errors":[{"message":"Input validation failed in the field \"name\": Validation failed for '$.age:minValue','$.height:maxValue','$.name:maxLength' constraint(s).", "locations":[{"line":1, "column":8}], "path":["name"]}], "data":null} diff --git a/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.graphql b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.graphql new file mode 100644 index 0000000000..e6c451c715 --- /dev/null +++ b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.graphql @@ -0,0 +1,3 @@ +{ + name(profile: {name: "Harry Potter", age: -4, height: 6}) +} diff --git a/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.md b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.md new file mode 100644 index 0000000000..af82c598ba --- /dev/null +++ b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.md @@ -0,0 +1,25 @@ +# GraphQL service - Input constraint validation + +GraphQL input constraint validation allows you to define and enforce constraints on input arguments. These constraints ensure that the provided input values meet certain criteria before they are processed. The input constraints can be configured using the `@constraint` annotation provided by the Ballerina constraint package. The constraint validation can be enabled or disabled using the `validation` field in the `graphql:ServiceConfig`. By default, the validation field is set to `true`. + +::: code graphql_input_constraint_validation.bal ::: + +Run the service by executing the following command. + +::: out graphql_input_constraint_validation.server.out ::: + +Send the following document to the GraphQL endpoint to test the service. + +::: code graphql_input_constraint_validation.graphql ::: + +To send the document, execute the following cURL command in a separate terminal. + +::: out graphql_input_constraint_validation.client.out ::: + +>**Tip:** You can invoke the above service via the [GraphQL client](/learn/by-example/graphql-client-query-endpoint/). + +## Related links +- [Constraint annotation - API documentation](https://lib.ballerina.io/ballerina/constraint/latest#Annotations) +- [GraphQL constraint config - API documentation](https://ballerina.io/spec/graphql/#1018-constraint-configurations) +- [`constraint` module - API documentation](https://lib.ballerina.io/ballerina/constraint/latest) +- [`graphql` module - API documentation](https://lib.ballerina.io/ballerina/graphql/latest) diff --git a/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.metatags b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.metatags new file mode 100644 index 0000000000..91702e62da --- /dev/null +++ b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.metatags @@ -0,0 +1,2 @@ +description: A GraphQL service endpoint written in Ballerina. +keywords: ballerina, ballerina by example, bbe, graphql, graphql input constraint validation, graphql constraint validation diff --git a/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.server.out b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.server.out new file mode 100644 index 0000000000..a817f59c0e --- /dev/null +++ b/examples/graphql-input-constraint-validation/graphql_input_constraint_validation.server.out @@ -0,0 +1 @@ +$ bal run graphql_input_constraint_validation.bal diff --git a/examples/index.json b/examples/index.json index a38a413e7f..6467745241 100644 --- a/examples/index.json +++ b/examples/index.json @@ -2459,6 +2459,14 @@ "disablePlayground": true, "isLearnByExample": false }, + { + "name": "Input constraint validation", + "url": "graphql-input-constraint-validation", + "verifyBuild": true, + "verifyOutput": false, + "disablePlayground": true, + "isLearnByExample": false + }, { "name": "File upload", "url": "graphql-file-upload",