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}