access_tokens.rs

 1use super::*;
 2use sea_orm::sea_query::Query;
 3
 4impl Database {
 5    /// Creates a new access token for the given user.
 6    pub async fn create_access_token(
 7        &self,
 8        user_id: UserId,
 9        access_token_hash: &str,
10        max_access_token_count: usize,
11    ) -> Result<AccessTokenId> {
12        self.transaction(|tx| async {
13            let tx = tx;
14
15            let token = access_token::ActiveModel {
16                user_id: ActiveValue::set(user_id),
17                hash: ActiveValue::set(access_token_hash.into()),
18                ..Default::default()
19            }
20            .insert(&*tx)
21            .await?;
22
23            access_token::Entity::delete_many()
24                .filter(
25                    access_token::Column::Id.in_subquery(
26                        Query::select()
27                            .column(access_token::Column::Id)
28                            .from(access_token::Entity)
29                            .and_where(access_token::Column::UserId.eq(user_id))
30                            .order_by(access_token::Column::Id, sea_orm::Order::Desc)
31                            .limit(10000)
32                            .offset(max_access_token_count as u64)
33                            .to_owned(),
34                    ),
35                )
36                .exec(&*tx)
37                .await?;
38            Ok(token.id)
39        })
40        .await
41    }
42
43    /// Retrieves the access token with the given ID.
44    pub async fn get_access_token(
45        &self,
46        access_token_id: AccessTokenId,
47    ) -> Result<access_token::Model> {
48        self.transaction(|tx| async move {
49            Ok(access_token::Entity::find_by_id(access_token_id)
50                .one(&*tx)
51                .await?
52                .ok_or_else(|| anyhow!("no such access token"))?)
53        })
54        .await
55    }
56}