source: src-tauri/src/commands/auth.rs@ a4ca79c

main
Last change on this file since a4ca79c was a4ca79c, checked in by Georgi Paunkov <paunkovgeorgi@…>, 4 days ago

Initial commit

  • Property mode set to 100644
File size: 3.8 KB
Line 
1use sqlx::PgPool;
2use tauri::State;
3use sqlx::Row;
4use std::collections::HashMap;
5use std::sync::Mutex;
6use uuid::Uuid;
7
8#[derive(Clone)]
9pub struct UserSession {
10 pub user_id: i32,
11 pub role_name: String,
12 pub first_name: String,
13 pub last_name: String,
14}
15
16pub struct ActiveSessions(pub Mutex<HashMap<String, UserSession>>);
17
18#[tauri::command]
19pub async fn login(
20 pin: String,
21 pool: State<'_, PgPool>,
22 sessions: State<'_, ActiveSessions>,
23) -> Result<serde_json::Value, String> {
24
25 let user = sqlx::query(
26 "
27 SELECT
28 u.user_id,
29 u.role_id,
30 u.first_name,
31 u.last_name,
32 r.role_name
33 FROM app_user u
34 JOIN role r ON u.role_id = r.role_id
35 WHERE u.password_hash = crypt($1, u.password_hash)
36 AND u.active = true
37 "
38 )
39 .bind(pin)
40 .fetch_optional(pool.inner())
41 .await
42 .map_err(|e| e.to_string())?;
43
44 match user {
45 Some(row) => {
46 let first_name: String = row.get::<Option<String>, _>("first_name").unwrap_or_default();
47 let last_name: String = row.get::<Option<String>, _>("last_name").unwrap_or_default();
48 let role_name: String = row.get("role_name");
49 let user_id: i32 = row.get("user_id");
50 let role_id: i32 = row.get("role_id");
51
52 let token = Uuid::new_v4().to_string();
53
54 let mut lock = sessions.0.lock().map_err(|_| "Грешка со меморијата на сесиите".to_string())?;
55 lock.insert(
56 token.clone(),
57 UserSession {
58 user_id,
59 role_name: role_name.clone(),
60 first_name: first_name.clone(),
61 last_name: last_name.clone(),
62 },
63 );
64
65 let full_name = format!("{} {}", first_name, last_name).trim().to_string();
66 let display_name = if full_name.is_empty() { "Корисник".to_string() } else { full_name };
67
68 Ok(serde_json::json!({
69 "token": token,
70 "user_id": user_id,
71 "role_id": role_id,
72 "role_name": role_name,
73 "first_name": first_name,
74 "last_name": last_name,
75 "name": display_name
76 }))
77 }
78
79 None => Err("Погрешен PIN".to_string())
80 }
81}
82
83pub async fn require_admin_session(
84 token: &str,
85 sessions: &ActiveSessions,
86) -> Result<UserSession, String> {
87 let lock = sessions.0.lock().map_err(|_| "Грешка со сесиите".to_string())?;
88
89 if let Some(session) = lock.get(token) {
90 let up = session.role_name.to_uppercase();
91 if up.contains("АДМИН") || up.contains("ADMIN") {
92 return Ok(session.clone());
93 }
94 return Err("Немате дозвола за оваа акција (Потребен е Админ)".to_string());
95 }
96
97 Err("Невалидна или истечена сесија. Најавете се повторно.".to_string())
98}
99
100pub async fn require_manager_session(
101 token: &str,
102 sessions: &ActiveSessions,
103) -> Result<UserSession, String> {
104 let lock = sessions.0.lock().map_err(|_| "Грешка со сесиите".to_string())?;
105
106 if let Some(session) = lock.get(token) {
107 let up = session.role_name.to_uppercase();
108 if up.contains("АДМИН") || up.contains("ADMIN")
109 || up.contains("МЕНАЏЕР") || up.contains("MANAGER") {
110 return Ok(session.clone());
111 }
112 return Err("Немате дозвола за оваа акција (Потребен е Менаџер или Админ)".to_string());
113 }
114
115 Err("Невалидна или истечена сесија. Најавете се повторно.".to_string())
116}
Note: See TracBrowser for help on using the repository browser.