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