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

1use log::{debug, error};
2use sqlx::Row;
3
4use crate::{
5    configuration::subgraph::entities::ServiceEntityConfig,
6    data_sources::sql::{PoolEnum, SqlQuery},
7    sql_value::SqlValue,
8};
9
10use super::{ResponseRow, Services};
11
12impl Services {
13    pub async fn update_one(
14        entity: &ServiceEntityConfig,
15        pool_enum: &PoolEnum,
16        sql_query: &SqlQuery,
17    ) -> Result<Option<ResponseRow>, async_graphql::Error> {
18        debug!("Executing Update One Query: {:?}", sql_query);
19
20        match pool_enum {
21            PoolEnum::MySql(pool) => {
22                let identifier_query = match &sql_query.identifier_query {
23                    Some(query) => query,
24                    None => {
25                        error!("No identifier query found for entity: {}", entity.name);
26                        return Err(async_graphql::Error::new(format!(
27                            "No identifier query found for entity: {}",
28                            entity.name
29                        )));
30                    }
31                };
32                let mut identifier_query = sqlx::query(&identifier_query);
33                let mut update_query = sqlx::query(&sql_query.query);
34
35                for value in &sql_query.values {
36                    match value {
37                        SqlValue::String(v) | SqlValue::ObjectID(v) => {
38                            update_query = update_query.bind(v);
39                        }
40                        SqlValue::Int(v) => {
41                            update_query = update_query.bind(v);
42                        }
43                        SqlValue::Bool(v) => {
44                            update_query = update_query.bind(v);
45                        }
46                        SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
47                            for string in values {
48                                update_query = update_query.bind(string)
49                            }
50                        }
51                        SqlValue::IntList(values) => {
52                            for int in values {
53                                update_query = update_query.bind(int)
54                            }
55                        }
56                        SqlValue::BoolList(values) => {
57                            for bool in values {
58                                update_query = update_query.bind(bool)
59                            }
60                        }
61                        SqlValue::UUID(v) => {
62                            update_query = update_query.bind(v);
63                        }
64                        SqlValue::UUIDList(values) => {
65                            for uuid in values {
66                                update_query = update_query.bind(uuid)
67                            }
68                        }
69                        SqlValue::DateTime(v) => {
70                            update_query = update_query.bind(v);
71                        }
72                        SqlValue::DateTimeList(values) => {
73                            for datetime in values {
74                                update_query = update_query.bind(datetime)
75                            }
76                        }
77                    }
78                }
79
80                for value in &sql_query.where_values {
81                    match value {
82                        SqlValue::String(v) | SqlValue::ObjectID(v) => {
83                            update_query = update_query.bind(v);
84                            identifier_query = identifier_query.bind(v);
85                        }
86                        SqlValue::Int(v) => {
87                            update_query = update_query.bind(v);
88                            identifier_query = identifier_query.bind(v);
89                        }
90                        SqlValue::Bool(v) => {
91                            update_query = update_query.bind(v);
92                            identifier_query = identifier_query.bind(v);
93                        }
94                        SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
95                            for string in values {
96                                update_query = update_query.bind(string);
97                                identifier_query = identifier_query.bind(string);
98                            }
99                        }
100                        SqlValue::IntList(values) => {
101                            for int in values {
102                                update_query = update_query.bind(int);
103                                identifier_query = identifier_query.bind(int);
104                            }
105                        }
106                        SqlValue::BoolList(values) => {
107                            for bool in values {
108                                update_query = update_query.bind(bool);
109                                identifier_query = identifier_query.bind(bool);
110                            }
111                        }
112                        SqlValue::UUID(v) => {
113                            update_query = update_query.bind(v);
114                        }
115                        SqlValue::UUIDList(values) => {
116                            for uuid in values {
117                                update_query = update_query.bind(uuid);
118                                identifier_query = identifier_query.bind(uuid);
119                            }
120                        }
121                        SqlValue::DateTime(v) => {
122                            update_query = update_query.bind(v);
123                            identifier_query = identifier_query.bind(v);
124                        }
125                        SqlValue::DateTimeList(values) => {
126                            for datetime in values {
127                                update_query = update_query.bind(datetime);
128                                identifier_query = identifier_query.bind(datetime);
129                            }
130                        }
131                    }
132                }
133
134                let identifier_results = identifier_query.fetch_all(pool).await?;
135
136                if identifier_results.len() == 0 {
137                    error!("No results found for entity: {}", entity.name);
138                    return Err(async_graphql::Error::new(format!(
139                        "No results found for entity: {}",
140                        entity.name
141                    )));
142                }
143
144                if identifier_results.len() > 1 {
145                    error!("Multiple results found for entity: {}", entity.name);
146                    return Err(async_graphql::Error::new(format!(
147                        "Multiple results found for entity: {}",
148                        entity.name
149                    )));
150                }
151
152                let id: i64 = match identifier_results[0].get("id") {
153                    Some(id) => id,
154                    None => {
155                        error!("No primary key found for entity: {}", entity.name);
156                        return Err(async_graphql::Error::new(format!(
157                            "No primary key found for entity: {}",
158                            entity.name
159                        )));
160                    }
161                };
162
163                update_query.execute(pool).await?;
164
165                let response_query = format!(
166                    "SELECT * FROM {} WHERE id = {}",
167                    sql_query.table,
168                    id.to_string()
169                );
170                let response_query = sqlx::query(&response_query);
171
172                let find_one_result = response_query.fetch_one(pool).await?;
173
174                Ok(Some(ResponseRow::MySql(find_one_result)))
175            }
176            _ => Err(async_graphql::Error::from("Update One Not Supported")),
177        }
178    }
179}