my_libs\db/
connect.rs

1// src/db/connect.rs
2
3use crate::api::model::Kot;
4use crate::consts::{DB_NAME, DB_NAMESPACE};
5use surrealdb::Result;
6use surrealdb::Surreal;
7use surrealdb::engine::local::{Db, SurrealKv}; // ✅ Importujemy model Kota, żeby funkcja wiedziała co zwracać // 👈 Używamy stałych!
8
9// 📚 EDU (Visibility):
10// Domyślnie pola w struct są PRYWATNE (nawet jeśli struct jest publiczny).
11// Musimy dodać `pub` przed `client`, żeby `read.rs` mógł zrobić `db.client.query()`.
12#[derive(Clone)]
13pub struct DatabaseConnection {
14    pub client: Surreal<Db>, // ⚠️ ZMIANA: dodano `pub`
15}
16
17impl DatabaseConnection {
18    /// Inicjalizacja bazy w trybie Embedded (zapis do folderu na dysku).
19    pub async fn init(path: &str) -> Result<Self> {
20        // Fail Fast: Sprawdźmy czy ścieżka nie jest pusta
21        if path.trim().is_empty() {
22            panic!("⛔ Fail Fast: Próba inicjalizacji bazy z pustą ścieżką!");
23        }
24
25        // Tworzymy silnik bazy danych w podanej ścieżce
26        let db = Surreal::new::<SurrealKv>(path).await?;
27
28        // Namespace i Database są wymagane logicznie przez SurrealDB
29        db.use_ns(DB_NAMESPACE).use_db(DB_NAME).await?;
30
31        // println!("💽 [DB] Połączono z SurrealKv w folderze: {}", path);
32        Ok(DatabaseConnection { client: db })
33    }
34
35    /// Wykonuje surowe zapytanie SQL
36    pub async fn execute_surrealql(&self, query: &str) -> Result<()> {
37        self.client.query(query).await?;
38        Ok(())
39    }
40
41    /// Pobiera wszystkie koty
42    /// 📚 EDU (Typy): -> Result<Vec<Kot>> oznacza:
43    /// "Obiecuję zwrócić Listę Kotów (Vec<Kot>) ALBO Błąd (Result)".
44    pub async fn get_all_cats(&self) -> Result<Vec<Kot>> {
45        // `query` wykonuje SQL
46        let mut response = self.client.query("SELECT * FROM kot").await?;
47
48        // `take(0)` bierze wynik pierwszego zapytania SQL (można wysłać kilka po średniku).
49        // Rust spróbuje automatycznie zmapować JSON z bazy na struct Kot.
50        let cats: Vec<Kot> = response.take(0)?;
51
52        Ok(cats)
53    }
54}