Skip to main content

systemprompt_users/repository/user/
find.rs

1use systemprompt_identifiers::UserId;
2
3use crate::error::Result;
4use crate::models::{User, UserRole, UserStatus};
5use crate::repository::UserRepository;
6
7impl UserRepository {
8    pub async fn find_by_id(&self, id: &UserId) -> Result<Option<User>> {
9        let deleted_status = UserStatus::Deleted.as_str();
10        let row = sqlx::query_as!(
11            User,
12            r#"
13            SELECT id, name, email, full_name, display_name, status, email_verified,
14                   roles, avatar_url, is_bot, is_scanner, created_at, updated_at
15            FROM users
16            WHERE id = $1 AND status != $2
17            "#,
18            id.as_str(),
19            deleted_status
20        )
21        .fetch_optional(&*self.pool)
22        .await?;
23
24        Ok(row)
25    }
26
27    pub async fn find_by_email(&self, email: &str) -> Result<Option<User>> {
28        let deleted_status = UserStatus::Deleted.as_str();
29        let row = sqlx::query_as!(
30            User,
31            r#"
32            SELECT id, name, email, full_name, display_name, status, email_verified,
33                   roles, avatar_url, is_bot, is_scanner, created_at, updated_at
34            FROM users
35            WHERE email = $1 AND status != $2
36            "#,
37            email,
38            deleted_status
39        )
40        .fetch_optional(&*self.pool)
41        .await?;
42
43        Ok(row)
44    }
45
46    pub async fn find_by_name(&self, name: &str) -> Result<Option<User>> {
47        let deleted_status = UserStatus::Deleted.as_str();
48        let row = sqlx::query_as!(
49            User,
50            r#"
51            SELECT id, name, email, full_name, display_name, status, email_verified,
52                   roles, avatar_url, is_bot, is_scanner, created_at, updated_at
53            FROM users
54            WHERE name = $1 AND status != $2
55            "#,
56            name,
57            deleted_status
58        )
59        .fetch_optional(&*self.pool)
60        .await?;
61
62        Ok(row)
63    }
64
65    pub async fn find_by_role(&self, role: UserRole) -> Result<Vec<User>> {
66        let deleted_status = UserStatus::Deleted.as_str();
67        let rows = sqlx::query_as!(
68            User,
69            r#"
70            SELECT id, name, email, full_name, display_name, status, email_verified,
71                   roles, avatar_url, is_bot, is_scanner, created_at, updated_at
72            FROM users
73            WHERE $1 = ANY(roles) AND status != $2
74            ORDER BY created_at DESC
75            "#,
76            role.as_str(),
77            deleted_status
78        )
79        .fetch_all(&*self.pool)
80        .await?;
81
82        Ok(rows)
83    }
84
85    pub async fn find_first_user(&self) -> Result<Option<User>> {
86        let deleted_status = UserStatus::Deleted.as_str();
87        let row = sqlx::query_as!(
88            User,
89            r#"
90            SELECT id, name, email, full_name, display_name, status, email_verified,
91                   roles, avatar_url, is_bot, is_scanner, created_at, updated_at
92            FROM users
93            WHERE status != $1
94            ORDER BY created_at ASC
95            LIMIT 1
96            "#,
97            deleted_status
98        )
99        .fetch_optional(&*self.pool)
100        .await?;
101
102        Ok(row)
103    }
104
105    pub async fn find_admin_owner(&self) -> Result<Option<User>> {
106        if let Some(user) = self.find_by_name("admin").await? {
107            return Ok(Some(user));
108        }
109        self.find_first_admin().await
110    }
111
112    pub async fn find_first_admin(&self) -> Result<Option<User>> {
113        let deleted_status = UserStatus::Deleted.as_str();
114        let admin_role = UserRole::Admin.as_str();
115        let row = sqlx::query_as!(
116            User,
117            r#"
118            SELECT id, name, email, full_name, display_name, status, email_verified,
119                   roles, avatar_url, is_bot, is_scanner, created_at, updated_at
120            FROM users
121            WHERE $1 = ANY(roles) AND status != $2
122            ORDER BY created_at ASC
123            LIMIT 1
124            "#,
125            admin_role,
126            deleted_status
127        )
128        .fetch_optional(&*self.pool)
129        .await?;
130
131        Ok(row)
132    }
133
134    pub async fn find_authenticated_user(&self, user_id: &UserId) -> Result<Option<User>> {
135        let active_status = UserStatus::Active.as_str();
136        let row = sqlx::query_as!(
137            User,
138            r#"
139            SELECT id, name, email, full_name, display_name, status, email_verified,
140                   roles, avatar_url, is_bot, is_scanner, created_at, updated_at
141            FROM users
142            WHERE id = $1 AND status = $2
143            "#,
144            user_id.as_str(),
145            active_status
146        )
147        .fetch_optional(&*self.pool)
148        .await?;
149
150        Ok(row)
151    }
152}