bindizr_db/repository/sqlite/
api_token_repository_impl.rs1use async_trait::async_trait;
2use sqlx::{Pool, Sqlite};
3
4use crate::{error::DatabaseError, model::api_token::ApiToken, repository::ApiTokenRepository};
5
6pub struct SqliteApiTokenRepository {
7 pool: Pool<Sqlite>,
8}
9
10impl SqliteApiTokenRepository {
11 pub fn new(pool: Pool<Sqlite>) -> Self {
12 Self { pool }
13 }
14}
15
16#[async_trait]
17impl ApiTokenRepository for SqliteApiTokenRepository {
18 async fn create(&self, mut token: ApiToken) -> Result<ApiToken, DatabaseError> {
19 let mut conn = self.pool.acquire().await?;
20
21 let result = sqlx::query(
22 r#"
23 INSERT INTO api_tokens (token, description, expires_at)
24 VALUES (?, ?, ?)
25 "#,
26 )
27 .bind(&token.token)
28 .bind(&token.description)
29 .bind(token.expires_at)
30 .execute(&mut *conn)
31 .await?;
32
33 token.id = result.last_insert_rowid() as i32;
34 Ok(token)
35 }
36
37 async fn get_by_id(&self, id: i32) -> Result<Option<ApiToken>, DatabaseError> {
38 let mut conn = self.pool.acquire().await?;
39
40 let token = sqlx::query_as::<_, ApiToken>(
41 "SELECT id, token, description, expires_at, created_at, last_used_at FROM api_tokens WHERE id = ?"
42 )
43 .bind(id)
44 .fetch_optional(&mut *conn)
45 .await
46 ?;
47
48 Ok(token)
49 }
50
51 async fn get_by_token(&self, token: &str) -> Result<Option<ApiToken>, DatabaseError> {
52 let mut conn = self.pool.acquire().await?;
53
54 let api_token = sqlx::query_as::<_, ApiToken>(
55 "SELECT id, token, description, expires_at, created_at, last_used_at FROM api_tokens WHERE token = ?"
56 )
57 .bind(token)
58 .fetch_optional(&mut *conn)
59 .await
60 ?;
61
62 Ok(api_token)
63 }
64
65 async fn get_all(&self) -> Result<Vec<ApiToken>, DatabaseError> {
66 let mut conn = self.pool.acquire().await?;
67
68 let tokens = sqlx::query_as::<_, ApiToken>(
69 "SELECT id, token, description, expires_at, created_at, last_used_at FROM api_tokens ORDER BY created_at DESC"
70 )
71 .fetch_all(&mut *conn)
72 .await
73 ?;
74
75 Ok(tokens)
76 }
77
78 async fn update(&self, token: ApiToken) -> Result<ApiToken, DatabaseError> {
79 let mut conn = self.pool.acquire().await?;
80
81 sqlx::query(
82 r#"
83 UPDATE api_tokens
84 SET description = ?, expires_at = ?, last_used_at = ?
85 WHERE id = ?
86 "#,
87 )
88 .bind(&token.description)
89 .bind(token.expires_at)
90 .bind(token.last_used_at)
91 .bind(token.id)
92 .execute(&mut *conn)
93 .await?;
94
95 Ok(token)
96 }
97
98 async fn delete(&self, id: i32) -> Result<(), DatabaseError> {
99 let mut conn = self.pool.acquire().await?;
100
101 sqlx::query("DELETE FROM api_tokens WHERE id = ?")
102 .bind(id)
103 .execute(&mut *conn)
104 .await?;
105
106 Ok(())
107 }
108}