access_tokens.rs

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