Skip to main content

bindizr_db/repository/sqlite/
api_token_repository_impl.rs

1use 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}