Merge pull request #38 from IMPHNEN/feat/client-dynamic-wss-or-ws

refactor: update surrealdb client usage to support 'any' engine type
This commit is contained in:
Maulana Sodiqin
2025-06-30 09:27:16 +07:00
committed by GitHub
7 changed files with 31 additions and 22 deletions
+3 -2
View File
@@ -1,6 +1,7 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use surrealdb::{ use surrealdb::{
engine::{local::Db, remote::ws::Client}, engine::local::Db,
engine::any::Any,
Surreal, Surreal,
}; };
use utoipa::{IntoParams, ToSchema}; use utoipa::{IntoParams, ToSchema};
@@ -54,7 +55,7 @@ pub struct ResponseListSuccessDto<T: Serialize> {
pub meta: Option<MetaResponseDto>, pub meta: Option<MetaResponseDto>,
} }
pub type SurrealWsClient = Surreal<Client>; pub type SurrealWsClient = Surreal<Any>;
pub type SurrealMemClient = Surreal<Db>; pub type SurrealMemClient = Surreal<Db>;
#[derive(Clone)] #[derive(Clone)]
+3 -1
View File
@@ -1,15 +1,17 @@
use crate::{Env, surrealdb_init_mem, surrealdb_init_ws}; use crate::{load_env, surrealdb_init_mem, surrealdb_init_ws, Env};
use axum::{Router, serve}; use axum::{Router, serve};
use imphnen_entities::{SurrealMemClient, SurrealWsClient}; use imphnen_entities::{SurrealMemClient, SurrealWsClient};
use log::{debug, error, info}; use log::{debug, error, info};
use std::{future::Future, net::SocketAddr}; use std::{future::Future, net::SocketAddr};
use tokio::net::TcpListener; use tokio::net::TcpListener;
pub async fn axum_init<F, Fut>(router_fn: F) pub async fn axum_init<F, Fut>(router_fn: F)
where where
F: FnOnce(SurrealWsClient, SurrealMemClient) -> Fut, F: FnOnce(SurrealWsClient, SurrealMemClient) -> Fut,
Fut: Future<Output = Router>, Fut: Future<Output = Router>,
{ {
load_env();
let env = Env::new(); let env = Env::new();
info!("Environment loaded with port: {}", env.port); info!("Environment loaded with port: {}", env.port);
+8 -5
View File
@@ -1,17 +1,20 @@
use super::Env; use super::Env;
use crate::{SurrealMemClient, SurrealWsClient}; use crate::SurrealMemClient;
use surrealdb::engine::local::Mem; use surrealdb::engine::local::Mem;
use surrealdb::engine::remote::ws::{Client, Ws}; use surrealdb::engine::any;
use surrealdb::opt::auth::Root; use surrealdb::opt::auth::Root;
use surrealdb::{Result, Surreal}; use surrealdb::{Result, Surreal};
use crate::enviroment::load_env;
pub mod resource; pub mod resource;
pub use resource::*; pub use resource::*;
pub async fn surrealdb_init_ws() -> Result<SurrealWsClient> { pub async fn surrealdb_init_ws() -> Result<Surreal<any::Any>> {
load_env();
let env = Env::new(); let env = Env::new();
let db = Surreal::<Client>::init(); let db = any::connect(&env.surrealdb_url).await?;
db.connect::<Ws>(env.surrealdb_url.clone()).await?;
db.signin(Root { db.signin(Root {
username: &env.surrealdb_username, username: &env.surrealdb_username,
password: &env.surrealdb_password, password: &env.surrealdb_password,
+4 -3
View File
@@ -1,8 +1,9 @@
use surrealdb::{engine::remote::ws::Client, method::Query}; use surrealdb::method::Query;
use surrealdb::engine::any;
pub fn bind_filter_value( pub fn bind_filter_value(
query: Query<'_, Client>, query: Query<'_, any::Any>,
val: String, val: String,
) -> Query<'_, Client> { ) -> Query<'_, any::Any> {
query.bind(("filter", val)) // langsung string aja, udah cukup query.bind(("filter", val)) // langsung string aja, udah cukup
} }
+7 -6
View File
@@ -1,13 +1,14 @@
use crate::AppState; use crate::AppState;
use surrealdb::{ use imphnen_libs::enviroment::load_env;
Surreal, use surrealdb::engine::any;
engine::{local::Mem, remote::ws::Ws}, use surrealdb::{Surreal, engine::local::Mem, opt::auth::Root};
opt::auth::Root, use super::Env;
};
pub async fn create_mock_app_state() -> AppState { pub async fn create_mock_app_state() -> AppState {
load_env();
let env = Env::new();
let db_mem = Surreal::new::<Mem>(()).await.unwrap(); let db_mem = Surreal::new::<Mem>(()).await.unwrap();
let db_ws = Surreal::new::<Ws>("localhost:8000").await.unwrap(); let db_ws = any::connect(&env.surrealdb_url).await.unwrap();
db_mem.use_ns("test").use_db("test").await.unwrap(); db_mem.use_ns("test").use_db("test").await.unwrap();
db_ws db_ws
.signin(Root { .signin(Root {
+2 -2
View File
@@ -1,7 +1,7 @@
use imphnen_libs::MetaRequestDto; use imphnen_libs::MetaRequestDto;
use surrealdb::engine::remote::ws::Client;
use surrealdb::method::Query; use surrealdb::method::Query;
use surrealdb::sql::Thing; use surrealdb::sql::Thing;
use surrealdb::engine::any;
pub struct ListQueryBuilder { pub struct ListQueryBuilder {
resource: String, resource: String,
@@ -241,7 +241,7 @@ impl DetailQueryBuilder {
) )
} }
pub fn apply_bindings<'q>(&self, query: Query<'q, Client>) -> Query<'q, Client> { pub fn apply_bindings<'q>(&self, query: Query<'q, any::Any>) -> Query<'q, any::Any> {
if let (Some(_), Some(value)) = (&self.where_field, &self.where_value) { if let (Some(_), Some(value)) = (&self.where_field, &self.where_value) {
query.bind(("value", value.clone())) query.bind(("value", value.clone()))
} else { } else {
+4 -3
View File
@@ -1,10 +1,11 @@
use crate::{CountResult, MetaRequestDto, MetaResponseDto, ResponseListSuccessDto}; use crate::{CountResult, MetaRequestDto, MetaResponseDto, ResponseListSuccessDto};
use anyhow::Result; use anyhow::Result;
use serde::{Serialize, de::DeserializeOwned}; use serde::{Serialize, de::DeserializeOwned};
use surrealdb::{Surreal, engine::remote::ws::Client}; use surrealdb::Surreal;
use surrealdb::engine::any;
pub struct QueryListBuilder<'a> { pub struct QueryListBuilder<'a> {
db: &'a Surreal<Client>, db: &'a Surreal<any::Any>,
table: &'a str, table: &'a str,
meta: &'a MetaRequestDto, meta: &'a MetaRequestDto,
conditions: Vec<String>, conditions: Vec<String>,
@@ -15,7 +16,7 @@ pub struct QueryListBuilder<'a> {
impl<'a> QueryListBuilder<'a> { impl<'a> QueryListBuilder<'a> {
pub fn new( pub fn new(
db: &'a Surreal<Client>, db: &'a Surreal<any::Any>,
table: &'a str, table: &'a str,
meta: &'a MetaRequestDto, meta: &'a MetaRequestDto,
) -> Self { ) -> Self {