use super::CredentialsStoreOperations;
use crate::biome::credentials::store::diesel::{
schema::user_credentials, CredentialsStoreError, UsernameId,
};
use crate::biome::credentials::store::UserCredentialsModel;
use diesel::prelude::*;
pub(in crate::biome::credentials) trait CredentialsStoreGetUsernamesOperation {
fn get_usernames(&self) -> Result<Vec<UsernameId>, CredentialsStoreError>;
}
impl<'a, C> CredentialsStoreGetUsernamesOperation for CredentialsStoreOperations<'a, C>
where
C: diesel::Connection,
<C as diesel::Connection>::Backend: diesel::backend::SupportsDefaultKeyword,
<C as diesel::Connection>::Backend: 'static,
i64: diesel::deserialize::FromSql<diesel::sql_types::BigInt, C::Backend>,
String: diesel::deserialize::FromSql<diesel::sql_types::Text, C::Backend>,
{
fn get_usernames(&self) -> Result<Vec<UsernameId>, CredentialsStoreError> {
let usernames = user_credentials::table
.select(user_credentials::all_columns)
.load::<UserCredentialsModel>(self.conn)
.map(Some)
.or_else(Err)
.map_err(|err| CredentialsStoreError::QueryError {
context: "Failed to fetch usernames".to_string(),
source: Box::new(err),
})?
.ok_or_else(|| {
CredentialsStoreError::NotFoundError(
"Could not get all user credentials from storage".to_string(),
)
})?
.into_iter()
.map(UsernameId::from)
.collect();
Ok(usernames)
}
}