wowsql 1.1.0

Official Rust SDK for WOWSQL - MySQL Backend-as-a-Service with S3 Storage
Documentation
use crate::client::WOWSQLClient;
use crate::models::{CreateResponse, DeleteResponse, UpdateResponse};
use crate::query_builder::QueryBuilder;
use serde_json::Value;

/// Represents a database table with fluent API for operations
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(),
        }
    }

    /// Start a select query
    pub fn select(&self, columns: &[&str]) -> QueryBuilder<'a> {
        QueryBuilder::new(self.client, &self.table_name).select(columns)
    }

    /// Get all records
    pub fn get(&self) -> QueryBuilder<'a> {
        QueryBuilder::new(self.client, &self.table_name).select(&["*"])
    }

    /// Get a single record by ID
    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() {
            // Store in a variable to avoid temporary reference
            let num_str = n.to_string();
            // We need to return owned String, so we'll handle this differently
            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
    }

    /// Create a new record
    pub async fn create(&self, data: Value) -> Result<CreateResponse, crate::errors::WOWSQLError> {
        QueryBuilder::new(self.client, &self.table_name)
            .create(data)
            .await
    }

    /// Insert a new record (alias for create)
    pub async fn insert(&self, data: Value) -> Result<CreateResponse, crate::errors::WOWSQLError> {
        self.create(data).await
    }

    /// Update a record by ID
    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
    }

    /// Update a record by ID (alias)
    pub async fn update_by_id(
        &self,
        id: Value,
        data: Value,
    ) -> Result<UpdateResponse, crate::errors::WOWSQLError> {
        self.update(id, data).await
    }

    /// Delete a record by ID
    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
    }

    /// Delete a record by ID (alias)
    pub async fn delete_by_id(
        &self,
        id: Value,
    ) -> Result<DeleteResponse, crate::errors::WOWSQLError> {
        self.delete(id).await
    }

    /// Start a query with filters
    pub fn r#where(&self) -> QueryBuilder<'a> {
        QueryBuilder::new(self.client, &self.table_name)
    }
}