76 lines · 2.5 KB · Rust
RawDownload
use super::*;use sea_orm::sea_query::Query; impl Database {    /// Creates a new access token for the given user.    pub async fn create_access_token(        &self,        user_id: UserId,        impersonated_user_id: Option<UserId>,        access_token_hash: &str,        max_access_token_count: usize,    ) -> Result<AccessTokenId> {        self.transaction(|tx| async {            let tx = tx;             let token = access_token::ActiveModel {                user_id: ActiveValue::set(user_id),                impersonated_user_id: ActiveValue::set(impersonated_user_id),                hash: ActiveValue::set(access_token_hash.into()),                ..Default::default()            }            .insert(&*tx)            .await?;             access_token::Entity::delete_many()                .filter(                    access_token::Column::Id.in_subquery(                        Query::select()                            .column(access_token::Column::Id)                            .from(access_token::Entity)                            .and_where(access_token::Column::UserId.eq(user_id))                            .order_by(access_token::Column::Id, sea_orm::Order::Desc)                            .limit(10000)                            .offset(max_access_token_count as u64)                            .to_owned(),                    ),                )                .exec(&*tx)                .await?;            Ok(token.id)        })        .await    }     /// Retrieves the access token with the given ID.    pub async fn get_access_token(        &self,        access_token_id: AccessTokenId,    ) -> Result<access_token::Model> {        self.transaction(|tx| async move {            Ok(access_token::Entity::find_by_id(access_token_id)                .one(&*tx)                .await?                .ok_or_else(|| anyhow!("no such access token"))?)        })        .await    }     /// Retrieves the access token with the given ID.    pub async fn update_access_token_hash(        &self,        id: AccessTokenId,        new_hash: &str,    ) -> Result<access_token::Model> {        self.transaction(|tx| async move {            Ok(access_token::Entity::update(access_token::ActiveModel {                id: ActiveValue::unchanged(id),                hash: ActiveValue::set(new_hash.into()),                ..Default::default()            })            .exec(&*tx)            .await?)        })        .await    }}