Skip to content
\n
    \n
  1. Define your own GraphQL Input Object like in the example you've linked. Also I suggest taking a look at OpenCRUD:
  2. \n
\n
#[derive(GraphQLInputObject)]\nstruct UserFilter {\n    and: Option<Vec<Box<UserFilter>>>,\n    or: Option<Vec<Box<UserFilter>>>,\n    id: Option<i32>,\n    name: Option<String>,\n}
\n
\nFull example\n
use std::env;\n\nuse actix_cors::Cors;\nuse actix_web::{\n    http::header,\n    middleware,\n    web::{self, Data},\n    App, Error, HttpResponse, HttpServer,\n};\nuse juniper::{\n    graphql_object, EmptyMutation, EmptySubscription, GraphQLInputObject, GraphQLObject, RootNode,\n};\nuse juniper_actix::{graphiql_handler, graphql_handler, playground_handler};\n\n#[derive(Clone, GraphQLObject)]\npub struct User {\n    id: i32,\n    name: String,\n}\n\n#[derive(GraphQLInputObject)]\nstruct UserFilter {\n    and: Option<Vec<Box<UserFilter>>>,\n    or: Option<Vec<Box<UserFilter>>>,\n    id: Option<i32>,\n    name: Option<String>,\n}\n\nstruct Query;\n\n#[graphql_object]\nimpl Query {\n    fn users(filter: UserFilter) -> Vec<User> {\n        // TODO: actual query\n        filter\n            .and\n            .into_iter()\n            .chain(filter.or)\n            .flatten()\n            .filter_map(|u| {\n                (u.id.is_some() || u.name.is_some()).then(|| User {\n                    id: u.id.unwrap_or(1),\n                    name: u.name.unwrap_or_else(|| \"unknown\".to_owned()),\n                })\n            })\n            .collect()\n    }\n}\n\ntype Schema = RootNode<'static, Query, EmptyMutation, EmptySubscription>;\n\nfn schema() -> Schema {\n    Schema::new(Query, EmptyMutation::new(), EmptySubscription::new())\n}\n\nasync fn graphiql_route() -> Result<HttpResponse, Error> {\n    graphiql_handler(\"/graphql\", None).await\n}\nasync fn playground_route() -> Result<HttpResponse, Error> {\n    playground_handler(\"/graphql\", None).await\n}\nasync fn graphql_route(\n    req: actix_web::HttpRequest,\n    payload: web::Payload,\n    schema: Data<Schema>,\n) -> Result<HttpResponse, Error> {\n    graphql_handler(&schema, &(), req, payload).await\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n    env::set_var(\"RUST_LOG\", \"info\");\n    env_logger::init();\n\n    let server = HttpServer::new(move || {\n        App::new()\n            .app_data(Data::new(schema()))\n            .wrap(\n                Cors::default()\n                    .allow_any_origin()\n                    .allowed_methods(vec![\"POST\", \"GET\"])\n                    .allowed_headers(vec![header::AUTHORIZATION, header::ACCEPT])\n                    .allowed_header(header::CONTENT_TYPE)\n                    .supports_credentials()\n                    .max_age(3600),\n            )\n            .wrap(middleware::Compress::default())\n            .wrap(middleware::Logger::default())\n            .service(\n                web::resource(\"/graphql\")\n                    .route(web::post().to(graphql_route))\n                    .route(web::get().to(graphql_route)),\n            )\n            .service(web::resource(\"/playground\").route(web::get().to(playground_route)))\n            .service(web::resource(\"/graphiql\").route(web::get().to(graphiql_route)))\n    });\n    server.bind(\"127.0.0.1:8080\").unwrap().run().await\n}
\n

Querying at localhost:8080/playground:

\n
query {\n  users(filter: { or: [{ id: 10, name: \"ten\" }, { id: 12 }, { name: \"Ben\" }] }) {\n    id\n    name\n  }\n}
\n

Response:

\n
{\n  \"data\": {\n    \"users\": [\n      {\n        \"id\": 10,\n        \"name\": \"ten\"\n      },\n      {\n        \"id\": 12,\n        \"name\": \"unknown\"\n      },\n      {\n        \"id\": 1,\n        \"name\": \"Ben\"\n      }\n    ]\n  }\n}
\n
","upvoteCount":2,"url":"https://github.com/graphql-rust/juniper/discussions/1116#discussioncomment-3930691"}}}
Discussion options

You must be logged in to vote

@twiclo GraphQL doesn't have native support for the operations, so your options are:

  1. Accept String! query and parse it on the backend. Shopify does this
{
  products(first: 5, query: "(title:Caramel Apple) OR (inventory_total:>500 inventory_total:<=1000)" ) {
    edges {
      node {
        id
        title
        createdAt
        totalInventory
      }
    }
  }
}
  1. Define your own GraphQL Input Object like in the example you've linked. Also I suggest taking a look at OpenCRUD:
#[derive(GraphQLInputObject)]
struct UserFilter {
    and: Option<Vec<Box<UserFilter>>>,
    or: Option<Vec<Box<UserFilter>>>,
    id: Option<i32>,
    name: Option<String>,
}
Full example
use std::env;

use

Replies: 1 comment 3 replies

Comment options

You must be logged in to vote
3 replies
@twiclo
Comment options

@twiclo
Comment options

@ilslv
Comment options

Answer selected by ilslv
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
2 participants