use crate::client::WOWSQLClient;
use crate::models::{CreateResponse, DeleteResponse, UpdateResponse};
use crate::query_builder::QueryBuilder;
use serde_json::Value;
pub struct Table<'a> {
client: &'a WOWSQLClient,
table_name: String,
}
impl<'a> Table<'a> {
pub(crate) fn new(client: &'a WOWSQLClient, table_name: &str) -> Self {
Self {
client,
table_name: table_name.to_string(),
}
}
pub fn select(&self, columns: &[&str]) -> QueryBuilder<'a> {
QueryBuilder::new(self.client, &self.table_name).select(columns)
}
pub fn get(&self) -> QueryBuilder<'a> {
QueryBuilder::new(self.client, &self.table_name).select(&["*"])
}
pub async fn get_by_id(&self, id: Value) -> Result<Value, crate::errors::WOWSQLError> {
let id_str = if let Some(s) = id.as_str() {
s
} else if let Some(n) = id.as_u64() {
let num_str = n.to_string();
let url = format!(
"{}/api/v2/{}/{}",
self.client.base_url, self.table_name, num_str
);
return self.client.execute_request(&url, "GET", None).await;
} else {
""
};
let url = format!(
"{}/api/v2/{}/{}",
self.client.base_url, self.table_name, id_str
);
self.client.execute_request(&url, "GET", None).await
}
pub async fn create(&self, data: Value) -> Result<CreateResponse, crate::errors::WOWSQLError> {
QueryBuilder::new(self.client, &self.table_name)
.create(data)
.await
}
pub async fn insert(&self, data: Value) -> Result<CreateResponse, crate::errors::WOWSQLError> {
self.create(data).await
}
pub async fn update(
&self,
id: Value,
data: Value,
) -> Result<UpdateResponse, crate::errors::WOWSQLError> {
let id_str = if let Some(s) = id.as_str() {
s
} else if let Some(n) = id.as_u64() {
let num_str = n.to_string();
let url = format!(
"{}/api/v2/{}/{}",
self.client.base_url, self.table_name, num_str
);
return self.client.execute_request(&url, "PATCH", Some(data)).await;
} else {
""
};
let url = format!(
"{}/api/v2/{}/{}",
self.client.base_url, self.table_name, id_str
);
self.client.execute_request(&url, "PATCH", Some(data)).await
}
pub async fn update_by_id(
&self,
id: Value,
data: Value,
) -> Result<UpdateResponse, crate::errors::WOWSQLError> {
self.update(id, data).await
}
pub async fn delete(&self, id: Value) -> Result<DeleteResponse, crate::errors::WOWSQLError> {
let id_str = if let Some(s) = id.as_str() {
s
} else if let Some(n) = id.as_u64() {
let num_str = n.to_string();
let url = format!(
"{}/api/v2/{}/{}",
self.client.base_url, self.table_name, num_str
);
return self.client.execute_request(&url, "DELETE", None).await;
} else {
""
};
let url = format!(
"{}/api/v2/{}/{}",
self.client.base_url, self.table_name, id_str
);
self.client.execute_request(&url, "DELETE", None).await
}
pub async fn delete_by_id(
&self,
id: Value,
) -> Result<DeleteResponse, crate::errors::WOWSQLError> {
self.delete(id).await
}
pub fn r#where(&self) -> QueryBuilder<'a> {
QueryBuilder::new(self.client, &self.table_name)
}
}