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}