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}