subgraph/data_sources/sql/services/update_one/
mod.rs1use 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}