1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use surrealdb::Surreal;
use surrealdb::opt::auth::Root;
use surrealdb::engine::remote::ws::{Ws, Client};
use std::env;
use tracing::{error, instrument};
#[derive(Debug,Clone)]
pub struct DbConnection {
pub username: String,
pub password: String,
pub host: String,
pub port: u16,
pub namespace: String,
pub database: String
}
impl Default for DbConnection {
/// ## Database Default Values
///
/// The following environment variables are used for configuring the database:
///
/// | Key | Description | Default Value |
/// |----------------------|------------------------------------------------------------------------------------------|--------------------|
/// | `KAFRU_DB_USERNAME` | The database username. | `kafru_admin` |
/// | `KAFRU_DB_PASSWORD` | The database password. | `kafru_password` |
/// | `KAFRU_DB_PORT` | The port number of the database. | `4030` |
/// | `KAFRU_DB_HOST` | The database host or IP address. | `127.0.0.1` |
/// | `KAFRU_DB_NAMESPACE` | The database namespace, useful for separating production and testing databases. | `kafru_dev` |
/// | `KAFRU_DB_NAME` | The name of the database. | `kafru_db` |
fn default() -> Self {
Self {
username: env::var("KAFRU_DB_USERNAME").unwrap_or(String::from("kafru_admin")),
password: env::var("KAFRU_DB_PASSWORD").unwrap_or(String::from("kafru_password")),
port: env::var("KAFRU_DB_PORT").unwrap_or("4030".to_string()).parse::<u16>().unwrap(),
host: env::var("KAFRU_DB_HOST").unwrap_or(String::from("127.0.0.1")),
namespace: env::var("KAFRU_DB_NAMESPACE").unwrap_or(String::from("kafru_dev")),
database: env::var("KAFRU_DB_NAME").unwrap_or(String::from("kafru_db")),
}
}
}
#[derive(Debug,Clone)]
pub struct Db {
pub client: Surreal<Client>
}
impl Db {
/// Initializes and creates a new database client instance.
///
/// # Parameters
/// - `config`: *(Optional)* Database connection configuration. If not provided, the configuration can be automatically loaded from environment variables.
#[instrument(skip_all)]
pub async fn new(config: Option<DbConnection>) -> Result<Self,String> {
let config: DbConnection = config.unwrap_or_default();
let address: String = format!("{}:{}", config.host,config.port);
match Surreal::new::<Ws>(address).await {
Ok(client) => {
if let Err(error) = client.signin(Root {
username: config.username.as_str(),
password: config.password.as_str(),
}).await {
error!("{}",error);
return Err(error.to_string());
}
if let Err(error) = client.use_ns(config.namespace).use_db(config.database).await {
error!("{}",error);
return Err(error.to_string());
}
Ok(Self {
client
})
}
Err(error) => {
error!("{}",error);
Err(error.to_string())
}
}
}
}