| [a4ca79c] | 1 | use sqlx::PgPool;
|
|---|
| 2 | use tauri::State;
|
|---|
| 3 | use sqlx::Row;
|
|---|
| 4 | use std::collections::HashMap;
|
|---|
| 5 | use std::sync::Mutex;
|
|---|
| 6 | use uuid::Uuid;
|
|---|
| 7 |
|
|---|
| 8 | #[derive(Clone)]
|
|---|
| 9 | pub struct UserSession {
|
|---|
| 10 | pub user_id: i32,
|
|---|
| 11 | pub role_name: String,
|
|---|
| 12 | pub first_name: String,
|
|---|
| 13 | pub last_name: String,
|
|---|
| 14 | }
|
|---|
| 15 |
|
|---|
| 16 | pub struct ActiveSessions(pub Mutex<HashMap<String, UserSession>>);
|
|---|
| 17 |
|
|---|
| 18 | #[tauri::command]
|
|---|
| 19 | pub 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 |
|
|---|
| 83 | pub 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 |
|
|---|
| 100 | pub 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 | } |
|---|