systemprompt_users/repository/user/
find.rs1use 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}