/ backend / src / db / activation_code_repository.rs
activation_code_repository.rs
 1  use crate::db::DB;
 2  use crate::models::activation_code::ActivationCode;
 3  use crate::util::accounts_error::AccountsResult;
 4  use sqlx::types::uuid::Uuid;
 5  use sqlx::Transaction;
 6  
 7  pub async fn insert(
 8      transaction: &mut Transaction<'_, DB>,
 9      login_details: Uuid,
10  ) -> AccountsResult<ActivationCode> {
11      Ok(sqlx::query_as!(
12          ActivationCode,
13          "
14  INSERT INTO activation_code (login_details)
15  VALUES                      ($1           )
16  RETURNING id, login_details, code, created_at, modified_at
17          ",
18          login_details
19      )
20      .fetch_one(&mut **transaction)
21      .await?)
22  }
23  
24  pub async fn delete_outdated(
25      transaction: &mut Transaction<'_, DB>,
26      lifetime_minutes: u64,
27  ) -> AccountsResult<Vec<ActivationCode>> {
28      Ok(sqlx::query_as!(
29          ActivationCode,
30          "
31  DELETE
32  FROM activation_code
33  WHERE created_at + ($1 * interval '1 minute') < NOW()
34  RETURNING id, login_details, code, created_at, modified_at
35          ",
36          lifetime_minutes as f64
37      )
38      .fetch_all(&mut **transaction)
39      .await?)
40  }
41  
42  pub async fn get_by_login_details_and_code(
43      transaction: &mut Transaction<'_, DB>,
44      login_details: Uuid,
45      code: Uuid,
46  ) -> AccountsResult<Option<ActivationCode>> {
47      Ok(sqlx::query_as!(
48          ActivationCode,
49          "
50  SELECT id, login_details, code, created_at, modified_at
51  FROM activation_code
52  WHERE
53      login_details = $1 AND
54      code = $2
55          ",
56          login_details,
57          code
58      )
59      .fetch_optional(&mut **transaction)
60      .await?)
61  }
62  
63  pub async fn delete(
64      transaction: &mut Transaction<'_, DB>,
65      login_details: Uuid,
66  ) -> AccountsResult<()> {
67      sqlx::query_as!(
68          ActivationCode,
69          "
70  DELETE
71  FROM activation_code
72  WHERE login_details = $1
73      ",
74          login_details
75      )
76      .execute(&mut **transaction)
77      .await?;
78      Ok(())
79  }