entity_async_graphql/filter/
mod.rs

1use async_graphql::InputObject;
2use entity::{Filter, Predicate, Query};
3
4mod float;
5pub use float::*;
6
7mod primitive;
8pub use primitive::*;
9
10/// Represents a wrapper around an ent query [`Filter`] that exposes a GraphQL API.
11#[derive(Clone, InputObject)]
12#[graphql(rename_fields = "snake_case")]
13pub struct GqlEntFilter {
14    /// Filter by ent's id
15    id: Option<GqlPredicate_Id>,
16
17    /// Filter by ent's type
18    #[graphql(name = "type")]
19    r#type: Option<GqlPredicate_String>,
20
21    /// Filter by ent's creation timestamp
22    created: Option<GqlPredicate_u64>,
23
24    /// Filter by ent's last updated timestamp
25    last_updated: Option<GqlPredicate_u64>,
26
27    /// Filter by ent's fields
28    fields: Option<Vec<GqlEntFieldFilter>>,
29
30    /// Filter by ent's edges
31    edges: Option<Vec<GqlEntEdgeFilter>>,
32}
33
34impl From<GqlEntFilter> for Query {
35    /// Converts [`GqlEntFilter`] to [`Query`] by chaining together all conditions
36    /// contained within the GraphQL filter in this order:
37    ///
38    /// 1. id
39    /// 2. type
40    /// 3. created
41    /// 4. last_updated
42    /// 5. fields
43    /// 6. edges
44    fn from(x: GqlEntFilter) -> Self {
45        let mut query = Query::default();
46
47        if let Some(pred) = x.id {
48            query.add_filter(Filter::where_id(Predicate::from(pred)));
49        }
50
51        if let Some(pred) = x.r#type {
52            query.add_filter(Filter::where_type(Predicate::from(pred)));
53        }
54
55        if let Some(pred) = x.created {
56            query.add_filter(Filter::where_created(Predicate::from(pred)));
57        }
58
59        if let Some(pred) = x.last_updated {
60            query.add_filter(Filter::where_last_updated(Predicate::from(pred)));
61        }
62
63        if let Some(gql_filters) = x.fields {
64            for f in gql_filters {
65                query.add_filter(Filter::where_field(f.name, f.predicate));
66            }
67        }
68
69        if let Some(gql_filters) = x.edges {
70            for f in gql_filters {
71                let edge_query = Query::from(f.filter.as_ref().clone());
72                for edge_filter in edge_query {
73                    query.add_filter(Filter::where_edge(&f.name, edge_filter));
74                }
75            }
76        }
77
78        query
79    }
80}
81
82#[derive(Clone, InputObject)]
83#[graphql(rename_fields = "snake_case")]
84pub struct GqlEntFieldFilter {
85    name: String,
86    predicate: GqlPredicate_Value,
87}
88
89#[derive(Clone, InputObject)]
90#[graphql(rename_fields = "snake_case")]
91pub struct GqlEntEdgeFilter {
92    name: String,
93    filter: Box<GqlEntFilter>,
94}