1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#[cfg(feature = "field-extractors")]
pub(crate) fn user_data_by_query(
    conn: &mut ft_sdk::Connection,
    query: &str,
    param: &str,
) -> Result<(ft_sdk::auth::UserId, ft_sdk::auth::ProviderData), ft_sdk::auth::UserDataError> {
    use diesel::prelude::*;

    #[derive(diesel::QueryableByName)]
    #[diesel(table_name = ft_sdk::auth::fastn_user)]
    struct UD {
        id: i64,
        data: String,
    }

    let ud: UD = match diesel::sql_query(query)
        .bind::<diesel::sql_types::Text, _>(param)
        .load(conn)
    {
        Ok(v) if v.is_empty() => return Err(ft_sdk::auth::UserDataError::NoDataFound),
        Ok(v) if v.len() > 1 => return Err(ft_sdk::auth::UserDataError::MultipleRowsFound),
        Ok(mut v) => v.pop().unwrap(),
        Err(diesel::result::Error::NotFound) => {
            return Err(ft_sdk::auth::UserDataError::NoDataFound)
        }
        Err(e) => return Err(ft_sdk::auth::UserDataError::DatabaseError(e)),
    };

    Ok((ft_sdk::auth::UserId(ud.id), serde_json::from_str(&ud.data)?))
}

#[derive(diesel::QueryableByName, Debug)]
pub struct Counter {
    #[diesel(sql_type = diesel::sql_types::BigInt)]
    pub count: i64,
}