1pub fn user_data_by_query(
2 conn: &mut ft_sdk::Connection,
3 query: &str,
4 param: &str,
5) -> Result<
6 (
7 ft_sdk::auth::UserId,
8 Option<String>,
9 ft_sdk::auth::ProviderData,
10 ),
11 ft_sdk::auth::UserDataError,
12> {
13 use diesel::prelude::*;
14
15 #[derive(diesel::QueryableByName)]
16 #[diesel(table_name = ft_sdk::auth::fastn_user)]
17 struct UD {
18 id: i64,
19 identity: Option<String>,
20 data: String,
21 }
22
23 let ud: UD = match diesel::sql_query(query)
24 .bind::<diesel::sql_types::Text, _>(param)
25 .load(conn)
26 {
27 Ok(v) if v.is_empty() => return Err(ft_sdk::auth::UserDataError::NoDataFound),
28 Ok(v) if v.len() > 1 => return Err(ft_sdk::auth::UserDataError::MultipleRowsFound),
29 Ok(mut v) => v.pop().unwrap(),
30 Err(diesel::result::Error::NotFound) => {
31 return Err(ft_sdk::auth::UserDataError::NoDataFound)
32 }
33 Err(e) => return Err(ft_sdk::auth::UserDataError::DatabaseError(e)),
34 };
35
36 Ok((
37 ft_sdk::auth::UserId(ud.id),
38 ud.identity,
39 serde_json::from_str(&ud.data)?,
40 ))
41}
42
43#[derive(diesel::QueryableByName, Debug)]
44pub struct Counter {
45 #[diesel(sql_type = diesel::sql_types::BigInt)]
46 pub count: i64,
47}