burncloud_database_core/
traits.rs

1use crate::error::DatabaseResult;
2use crate::{QueryContext, QueryOptions};
3use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7#[async_trait]
8pub trait DatabaseConnection: Send + Sync {
9    async fn connect(&mut self) -> DatabaseResult<()>;
10    async fn disconnect(&mut self) -> DatabaseResult<()>;
11    async fn is_connected(&self) -> bool;
12    async fn ping(&self) -> DatabaseResult<()>;
13}
14
15#[async_trait]
16pub trait QueryExecutor: Send + Sync {
17    async fn execute_query(
18        &self,
19        query: &str,
20        params: &[&dyn QueryParam],
21        context: &QueryContext,
22    ) -> DatabaseResult<QueryResult>;
23
24    async fn execute_query_with_options(
25        &self,
26        query: &str,
27        params: &[&dyn QueryParam],
28        options: &QueryOptions,
29        context: &QueryContext,
30    ) -> DatabaseResult<QueryResult>;
31}
32
33#[async_trait]
34pub trait TransactionManager: Send + Sync {
35    type Transaction: Transaction;
36
37    async fn begin_transaction(&self, context: &QueryContext) -> DatabaseResult<Self::Transaction>;
38}
39
40#[async_trait]
41pub trait Transaction: Send + Sync {
42    async fn commit(self) -> DatabaseResult<()>;
43    async fn rollback(self) -> DatabaseResult<()>;
44    async fn execute_query(
45        &self,
46        query: &str,
47        params: &[&dyn QueryParam],
48    ) -> DatabaseResult<QueryResult>;
49}
50
51#[async_trait]
52pub trait Repository<T>: Send + Sync
53where
54    T: Send + Sync,
55{
56    async fn find_by_id(&self, id: &str, context: &QueryContext) -> DatabaseResult<Option<T>>;
57    async fn find_all(&self, options: &QueryOptions, context: &QueryContext) -> DatabaseResult<Vec<T>>;
58    async fn create(&self, entity: &T, context: &QueryContext) -> DatabaseResult<String>;
59    async fn update(&self, id: &str, entity: &T, context: &QueryContext) -> DatabaseResult<()>;
60    async fn delete(&self, id: &str, context: &QueryContext) -> DatabaseResult<()>;
61    async fn exists(&self, id: &str, context: &QueryContext) -> DatabaseResult<bool>;
62}
63
64#[async_trait]
65pub trait MigrationManager: Send + Sync {
66    async fn run_migrations(&self) -> DatabaseResult<()>;
67    async fn rollback_migration(&self, version: &str) -> DatabaseResult<()>;
68    async fn get_migration_status(&self) -> DatabaseResult<Vec<MigrationInfo>>;
69}
70
71pub trait QueryParam: Send + Sync {
72    fn as_string(&self) -> String;
73    fn as_i64(&self) -> Option<i64>;
74    fn as_f64(&self) -> Option<f64>;
75    fn as_bool(&self) -> Option<bool>;
76    fn as_bytes(&self) -> Option<&[u8]>;
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct QueryResult {
81    pub rows: Vec<HashMap<String, serde_json::Value>>,
82    pub rows_affected: u64,
83    pub last_insert_id: Option<String>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct MigrationInfo {
88    pub version: String,
89    pub name: String,
90    pub applied_at: chrono::DateTime<chrono::Utc>,
91    pub checksum: String,
92}