subgraph/data_sources/sql/services/create_one/
mod.rs

1use bson::doc;
2use log::{debug, error};
3
4use crate::{
5    configuration::subgraph::{
6        data_sources::sql::DialectEnum, entities::ServiceEntityConfig, SubGraphConfig,
7    },
8    data_sources::sql::{PoolEnum, SqlDataSource, SqlQuery},
9    sql_value::SqlValue,
10};
11
12use super::{ResponseRow, Services};
13
14impl Services {
15    pub async fn create_one(
16        entity: &ServiceEntityConfig,
17        pool_enum: &PoolEnum,
18        sql_query: &SqlQuery,
19        dialect: DialectEnum,
20        subgraph_config: &SubGraphConfig,
21    ) -> Result<Option<ResponseRow>, async_graphql::Error> {
22        debug!("Executing Create One Query: {:?}", sql_query);
23
24        match pool_enum {
25            PoolEnum::MySql(pool) => {
26                let mut query = sqlx::query(&sql_query.query);
27
28                for value in &sql_query.values {
29                    match value {
30                        SqlValue::String(v) | SqlValue::ObjectID(v) => {
31                            query = query.bind(v);
32                        }
33                        SqlValue::Int(v) => {
34                            query = query.bind(v);
35                        }
36                        SqlValue::Bool(v) => {
37                            query = query.bind(v);
38                        }
39                        SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
40                            for string in values {
41                                query = query.bind(string)
42                            }
43                        }
44                        SqlValue::IntList(values) => {
45                            for int in values {
46                                query = query.bind(int)
47                            }
48                        }
49                        SqlValue::BoolList(values) => {
50                            for bool in values {
51                                query = query.bind(bool)
52                            }
53                        }
54                        SqlValue::UUID(v) => {
55                            query = query.bind(v);
56                        }
57                        SqlValue::UUIDList(values) => {
58                            for uuid in values {
59                                query = query.bind(uuid)
60                            }
61                        }
62                        SqlValue::DateTime(v) => {
63                            query = query.bind(v);
64                        }
65                        SqlValue::DateTimeList(values) => {
66                            for datetime in values {
67                                query = query.bind(datetime)
68                            }
69                        }
70                    }
71                }
72
73                let last_inserted_id = query.execute(pool).await?.last_insert_id();
74
75                let input_document = doc! {
76                    "query": {
77                        "id": last_inserted_id as i32,
78                    }
79                };
80
81                let (find_one_query, ..) = SqlDataSource::create_find_one_query(
82                    entity,
83                    &sql_query.table,
84                    &dialect,
85                    &input_document,
86                    subgraph_config,
87                    None,
88                )?;
89
90                let result = sqlx::query(&find_one_query)
91                    .bind(last_inserted_id)
92                    .fetch_one(pool)
93                    .await?;
94
95                Ok(Some(ResponseRow::MySql(result)))
96            }
97            PoolEnum::Postgres(pool) => {
98                let mut query = sqlx::query(&sql_query.query);
99
100                for value in &sql_query.values {
101                    match value {
102                        SqlValue::String(v) | SqlValue::ObjectID(v) => {
103                            query = query.bind(v);
104                        }
105                        SqlValue::Int(v) => {
106                            query = query.bind(v);
107                        }
108                        SqlValue::Bool(v) => {
109                            query = query.bind(v);
110                        }
111                        SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
112                            for string in values {
113                                query = query.bind(string)
114                            }
115                        }
116                        SqlValue::IntList(values) => {
117                            for int in values {
118                                query = query.bind(int)
119                            }
120                        }
121                        SqlValue::BoolList(values) => {
122                            for bool in values {
123                                query = query.bind(bool)
124                            }
125                        }
126                        SqlValue::UUID(v) => {
127                            query = query.bind(v);
128                        }
129                        SqlValue::UUIDList(values) => {
130                            for uuid in values {
131                                query = query.bind(uuid)
132                            }
133                        }
134                        SqlValue::DateTime(v) => {
135                            query = query.bind(v);
136                        }
137                        SqlValue::DateTimeList(values) => {
138                            for datetime in values {
139                                query = query.bind(datetime)
140                            }
141                        }
142                    }
143                }
144
145                let result = query.fetch_one(pool).await?;
146
147                Ok(Some(ResponseRow::Postgres(result)))
148            }
149            PoolEnum::SqLite(pool) => {
150                let mut query = sqlx::query(&sql_query.query);
151
152                for value in &sql_query.values {
153                    match value {
154                        SqlValue::String(v) | SqlValue::ObjectID(v) => {
155                            query = query.bind(v);
156                        }
157                        SqlValue::Int(v) => {
158                            query = query.bind(v);
159                        }
160                        SqlValue::Bool(v) => {
161                            query = query.bind(v);
162                        }
163                        SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
164                            for string in values {
165                                query = query.bind(string)
166                            }
167                        }
168                        SqlValue::IntList(values) => {
169                            for int in values {
170                                query = query.bind(int)
171                            }
172                        }
173                        SqlValue::BoolList(values) => {
174                            for bool in values {
175                                query = query.bind(bool)
176                            }
177                        }
178                        SqlValue::UUID(v) => {
179                            query = query.bind(v);
180                        }
181                        SqlValue::UUIDList(values) => {
182                            for uuid in values {
183                                query = query.bind(uuid)
184                            }
185                        }
186                        SqlValue::DateTime(v) => {
187                            query = query.bind(v);
188                        }
189                        SqlValue::DateTimeList(values) => {
190                            for datetime in values {
191                                query = query.bind(datetime)
192                            }
193                        }
194                    }
195                }
196
197                let last_inserted_rowid = query
198                    .execute(pool)
199                    .await
200                    .map_err(|e| {
201                        error!("Error executing sqlite create statement: {}", e);
202                        e
203                    })?
204                    .last_insert_rowid();
205
206                let input_document = doc! {
207                    "query": {
208                        "id": last_inserted_rowid as i32,
209                    }
210                };
211
212                let (find_one_query, ..) = SqlDataSource::create_find_one_query(
213                    entity,
214                    &sql_query.table,
215                    &dialect,
216                    &input_document,
217                    subgraph_config,
218                    None,
219                )?;
220
221                let result = sqlx::query(&find_one_query)
222                    .bind(last_inserted_rowid)
223                    .fetch_one(pool)
224                    .await
225                    .map_err(|e| {
226                        error!("Error refetching result: {}", e);
227                        e
228                    })?;
229
230                Ok(Some(ResponseRow::SqLite(result)))
231            }
232        }
233    }
234}