fix(all): Organizing APIs and docs.

This commit is contained in:
Rodrigo Rodriguez 2025-02-25 09:00:35 -03:00
parent 2ce7d2e340
commit 0b4a23da0d
10 changed files with 453 additions and 292 deletions

397
Cargo.lock generated
View file

@ -376,6 +376,7 @@ dependencies = [
"blocking",
"futures-lite 2.5.0",
"once_cell",
"tokio",
]
[[package]]
@ -479,17 +480,6 @@ dependencies = [
"reactor-trait",
]
[[package]]
name = "async-recursion"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "async-recursion"
version = "1.1.1"
@ -1088,7 +1078,7 @@ dependencies = [
"futures",
"futures-timer",
"pin-project-lite",
"reqwest 0.11.27",
"reqwest",
"serde",
"serde_json",
"thiserror",
@ -1766,17 +1756,6 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "derive-new"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "derive_builder"
version = "0.20.2"
@ -2052,17 +2031,6 @@ dependencies = [
"zune-inflate",
]
[[package]]
name = "fail"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3be3c61c59fdc91f5dbc3ea31ee8623122ce80057058be560654c5d410d181a6"
dependencies = [
"lazy_static",
"log",
"rand 0.7.3",
]
[[package]]
name = "fake"
version = "2.10.0"
@ -2086,7 +2054,7 @@ dependencies = [
"futures-util",
"http 0.2.12",
"hyper 0.14.32",
"hyper-tls 0.5.0",
"hyper-tls",
"mime",
"serde",
"serde_json",
@ -2352,6 +2320,7 @@ dependencies = [
"chrono",
"futures-util",
"gb-core",
"gb-file",
"gb-messaging",
"gb-monitoring",
"hyper 1.5.2",
@ -2408,7 +2377,7 @@ dependencies = [
name = "gb-automation"
version = "0.1.0"
dependencies = [
"async-recursion 1.1.1",
"async-recursion",
"async-trait",
"chromiumoxide",
"fantoccini",
@ -2449,6 +2418,23 @@ dependencies = [
"uuid",
]
[[package]]
name = "gb-file"
version = "0.1.0"
dependencies = [
"async-trait",
"gb-core",
"minio",
"rstest",
"serde",
"serde_json",
"tempfile",
"thiserror",
"tokio",
"tokio-test",
"tracing",
]
[[package]]
name = "gb-image"
version = "0.1.0"
@ -2457,7 +2443,7 @@ dependencies = [
"gb-core",
"image",
"imageproc",
"reqwest 0.11.27",
"reqwest",
"rstest",
"rusttype",
"serde",
@ -2557,7 +2543,6 @@ dependencies = [
"serde",
"serde_json",
"sqlx",
"tikv-client",
"tokio",
"tokio-test",
"tracing",
@ -2587,7 +2572,7 @@ dependencies = [
"prometheus",
"rand 0.8.5",
"redis 0.24.0",
"reqwest 0.11.27",
"reqwest",
"rstest",
"serde",
"serde_json",
@ -2771,7 +2756,7 @@ dependencies = [
"num-format",
"rand 0.8.5",
"regex",
"reqwest 0.11.27",
"reqwest",
"serde",
"serde_json",
"simplelog",
@ -3206,24 +3191,7 @@ dependencies = [
"hyper 0.14.32",
"rustls 0.21.12",
"tokio",
"tokio-rustls 0.24.1",
]
[[package]]
name = "hyper-rustls"
version = "0.27.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
dependencies = [
"futures-util",
"http 1.2.0",
"hyper 1.5.2",
"hyper-util",
"rustls 0.23.20",
"rustls-pki-types",
"tokio",
"tokio-rustls 0.26.1",
"tower-service",
"tokio-rustls",
]
[[package]]
@ -3251,22 +3219,6 @@ dependencies = [
"tokio-native-tls",
]
[[package]]
name = "hyper-tls"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
dependencies = [
"bytes",
"http-body-util",
"hyper 1.5.2",
"hyper-util",
"native-tls",
"tokio",
"tokio-native-tls",
"tower-service",
]
[[package]]
name = "hyper-util"
version = "0.1.10"
@ -3274,16 +3226,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
dependencies = [
"bytes",
"futures-channel",
"futures-util",
"http 1.2.0",
"http-body 1.0.1",
"hyper 1.5.2",
"pin-project-lite",
"socket2 0.5.8",
"tokio",
"tower-service",
"tracing",
]
[[package]]
@ -4034,6 +3983,12 @@ dependencies = [
"digest",
]
[[package]]
name = "md5"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
[[package]]
name = "memchr"
version = "2.7.4"
@ -4061,6 +4016,42 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "minio"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77a322ca30e1a0b771b1158a950a71e2edcc31cd99ed593fa707493cdff8f2dd"
dependencies = [
"async-recursion",
"async-std",
"base64 0.21.7",
"byteorder",
"bytes",
"chrono",
"crc",
"dashmap",
"derivative",
"futures-core",
"futures-util",
"hex",
"hmac",
"http 0.2.12",
"hyper 0.14.32",
"lazy_static",
"md5",
"multimap",
"os_info",
"rand 0.8.5",
"regex",
"reqwest",
"serde",
"serde_json",
"sha2",
"tokio",
"urlencoding",
"xmltree",
]
[[package]]
name = "miniz_oxide"
version = "0.8.2"
@ -4138,6 +4129,15 @@ dependencies = [
"version_check",
]
[[package]]
name = "multimap"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1a5d38b9b352dbd913288736af36af41c48d61b1a8cd34bcecd727561b7d511"
dependencies = [
"serde",
]
[[package]]
name = "nalgebra"
version = "0.30.1"
@ -4388,7 +4388,7 @@ dependencies = [
"getrandom 0.2.15",
"http 0.2.12",
"rand 0.8.5",
"reqwest 0.11.27",
"reqwest",
"serde",
"serde_json",
"serde_path_to_error",
@ -4453,7 +4453,7 @@ dependencies = [
"chrono",
"lazy_static",
"mime",
"reqwest 0.11.27",
"reqwest",
"serde",
"serde_json",
"thiserror",
@ -4537,10 +4537,10 @@ dependencies = [
"http 0.2.12",
"opentelemetry 0.19.0",
"opentelemetry-proto",
"prost 0.11.9",
"prost",
"thiserror",
"tokio",
"tonic 0.8.3",
"tonic",
]
[[package]]
@ -4552,8 +4552,8 @@ dependencies = [
"futures",
"futures-util",
"opentelemetry 0.19.0",
"prost 0.11.9",
"tonic 0.8.3",
"prost",
"tonic",
]
[[package]]
@ -4668,6 +4668,17 @@ dependencies = [
"num-traits",
]
[[package]]
name = "os_info"
version = "3.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a604e53c24761286860eba4e2c8b23a0161526476b1de520139d69cdb85a6b5"
dependencies = [
"log",
"serde",
"windows-sys 0.52.0",
]
[[package]]
name = "overload"
version = "0.1.1"
@ -5161,7 +5172,6 @@ dependencies = [
"parking_lot",
"procfs",
"protobuf",
"reqwest 0.12.9",
"thiserror",
]
@ -5172,17 +5182,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd"
dependencies = [
"bytes",
"prost-derive 0.11.9",
]
[[package]]
name = "prost"
version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
dependencies = [
"bytes",
"prost-derive 0.12.6",
"prost-derive",
]
[[package]]
@ -5198,19 +5198,6 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "prost-derive"
version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
dependencies = [
"anyhow",
"itertools 0.12.1",
"proc-macro2",
"quote",
"syn 2.0.91",
]
[[package]]
name = "protobuf"
version = "2.28.0"
@ -5557,8 +5544,8 @@ dependencies = [
"http 0.2.12",
"http-body 0.4.6",
"hyper 0.14.32",
"hyper-rustls 0.24.2",
"hyper-tls 0.5.0",
"hyper-rustls",
"hyper-tls",
"ipnet",
"js-sys",
"log",
@ -5573,10 +5560,10 @@ dependencies = [
"serde_json",
"serde_urlencoded",
"sync_wrapper 0.1.2",
"system-configuration 0.5.1",
"system-configuration",
"tokio",
"tokio-native-tls",
"tokio-rustls 0.24.1",
"tokio-rustls",
"tokio-util",
"tower-service",
"url",
@ -5588,50 +5575,6 @@ dependencies = [
"winreg 0.50.0",
]
[[package]]
name = "reqwest"
version = "0.12.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f"
dependencies = [
"base64 0.22.1",
"bytes",
"encoding_rs",
"futures-channel",
"futures-core",
"futures-util",
"h2 0.4.7",
"http 1.2.0",
"http-body 1.0.1",
"http-body-util",
"hyper 1.5.2",
"hyper-rustls 0.27.5",
"hyper-tls 0.6.0",
"hyper-util",
"ipnet",
"js-sys",
"log",
"mime",
"native-tls",
"once_cell",
"percent-encoding",
"pin-project-lite",
"rustls-pemfile 2.2.0",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper 1.0.2",
"system-configuration 0.6.1",
"tokio",
"tokio-native-tls",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"windows-registry",
]
[[package]]
name = "retain_mut"
version = "0.1.9"
@ -6743,9 +6686,6 @@ name = "sync_wrapper"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
dependencies = [
"futures-core",
]
[[package]]
name = "synstructure"
@ -6778,18 +6718,7 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
dependencies = [
"bitflags 1.3.2",
"core-foundation",
"system-configuration-sys 0.5.0",
]
[[package]]
name = "system-configuration"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
"bitflags 2.6.0",
"core-foundation",
"system-configuration-sys 0.6.0",
"system-configuration-sys",
]
[[package]]
@ -6802,16 +6731,6 @@ dependencies = [
"libc",
]
[[package]]
name = "system-configuration-sys"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
dependencies = [
"core-foundation-sys",
"libc",
]
[[package]]
name = "system-deps"
version = "6.2.2"
@ -6963,33 +6882,6 @@ dependencies = [
"weezl",
]
[[package]]
name = "tikv-client"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "048968e4e3d04db472346770cc19914c6b5ae206fa44677f6a0874d54cd05940"
dependencies = [
"async-recursion 0.3.2",
"async-trait",
"derive-new",
"either",
"fail",
"futures",
"lazy_static",
"log",
"pin-project",
"prometheus",
"prost 0.12.6",
"rand 0.8.5",
"regex",
"semver",
"serde",
"serde_derive",
"thiserror",
"tokio",
"tonic 0.10.2",
]
[[package]]
name = "time"
version = "0.3.37"
@ -7139,16 +7031,6 @@ dependencies = [
"tokio",
]
[[package]]
name = "tokio-rustls"
version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37"
dependencies = [
"rustls 0.23.20",
"tokio",
]
[[package]]
name = "tokio-stream"
version = "0.1.17"
@ -7279,8 +7161,8 @@ dependencies = [
"hyper-timeout",
"percent-encoding",
"pin-project",
"prost 0.11.9",
"prost-derive 0.11.9",
"prost",
"prost-derive",
"tokio",
"tokio-stream",
"tokio-util",
@ -7291,36 +7173,6 @@ dependencies = [
"tracing-futures",
]
[[package]]
name = "tonic"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e"
dependencies = [
"async-stream",
"async-trait",
"axum 0.6.20",
"base64 0.21.7",
"bytes",
"h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
"hyper 0.14.32",
"hyper-timeout",
"percent-encoding",
"pin-project",
"prost 0.12.6",
"rustls 0.21.12",
"rustls-pemfile 1.0.4",
"tokio",
"tokio-rustls 0.24.1",
"tokio-stream",
"tower 0.4.13",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "tower"
version = "0.4.13"
@ -8262,36 +8114,6 @@ dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-registry"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
dependencies = [
"windows-result",
"windows-strings",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-result"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-strings"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
dependencies = [
"windows-result",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-sys"
version = "0.48.0"
@ -8577,6 +8399,21 @@ dependencies = [
"time",
]
[[package]]
name = "xml-rs"
version = "0.8.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4"
[[package]]
name = "xmltree"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb"
dependencies = [
"xml-rs",
]
[[package]]
name = "yasna"
version = "0.5.2"

View file

@ -4,6 +4,7 @@ members = [
"gb-core", # Core domain models and traits
"gb-api", # API layer and server implementation
"gb-media", # Media processing and WebRTC handling
"gb-messaging", # Message queue and real-time communication
"gb-storage", # Database and storage implementations
"gb-monitoring", # Metrics, logging and monitoring

View file

@ -265,6 +265,23 @@ Licensed under terms specified in workspace configuration.
- Annual penetration testing
- Bi-annual disaster recovery testing
---
### **Key Open Source Tools in Rust/Go**:
1. **Zitadel (Go)**: Identity and access management for secure authentication.
2. **Stalwart (Rust)**: Secure email server for threat detection.
3. **MinIO (Go)**: High-performance object storage for unstructured data.
4. **Ubuntu Advantage (Go/Rust tools)**: Compliance and security tools for Ubuntu.
5. **Tantivy (Rust)**: Full-text search engine for data discovery.
6. **Drone (Go)**: CI/CD platform for DevOps automation.
7. **Temporal (Go)**: Workflow orchestration engine.
8. **Caddy (Go)**: Web server for seamless customer experiences.
9. **SeaweedFS (Go)**: Distributed file system for secure file sharing.
10. **Vector (Rust)**: Observability pipeline for monitoring.
11. **Tyk (Go)**: API gateway for secure API management.
12. **Vault (Go)**: Secrets management and encryption.
13. **Hugging Face Transformers (Rust/Go bindings)**: LLM integration and fine-tuning.
14. **Kubernetes (Go)**: Container orchestration for scalable deployments.
15. **Matrix (Rust)**: Real-time communication and collaboration.
Built with ❤️ from Brazil, using Rust for maximum performance and reliability.

View file

@ -3,6 +3,17 @@ use tracing::{info, error};
use std::net::SocketAddr;
use gb_messaging::MessageProcessor;
#[allow(dead_code)]
#[derive(Clone)]
struct AppState {
db: sqlx::PgPool,
redis: redis::Client,
message_processor: MessageProcessor,
customer: PostgresCustomerRepository,
}
#[tokio::main]
async fn main() -> Result<()> {
// Initialize logging first
@ -20,9 +31,12 @@ async fn initialize_bot_server() -> Result<axum::Router> {
// Initialize the MessageProcessor
let message_processor = MessageProcessor::new();
let state = AppState::new();
state.repo = PostgresCustomerRepository::new(Arc::new(pool));
// Build the Axum router using our router module
let app = gb_api::create_router(message_processor)
let app = gb_api::create_router(state)
.layer(tower_http::trace::TraceLayer::new_for_http());
Ok(app)
@ -61,12 +75,6 @@ async fn initialize_redis() -> Result<redis::Client> {
.map_err(|e| Error::internal(e.to_string()))
}
#[allow(dead_code)]
#[derive(Clone)]
struct AppState {
db: sqlx::PgPool,
redis: redis::Client,
}
async fn start_server(app: axum::Router) -> Result<()> {

20
gb-calendar/Cargo.toml Normal file
View file

@ -0,0 +1,20 @@
[package]
name = "gb-calendar"
version = { workspace = true }
edition = { workspace = true }
authors = { workspace = true }
license = { workspace = true }
[dependencies]
gb-core = { path = "../gb-core" }
async-trait= { workspace = true }
tokio= { workspace = true }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"thiserror= { workspace = true }
tracing= { workspace = true }
minio-rs = "0.1"
[dev-dependencies]
rstest= { workspace = true }
tokio-test = "0.4"
tempfile = "3.8"

View file

@ -1,5 +1,5 @@
[package]
name = "gb-document"
name = "gb-file"
version = { workspace = true }
edition = { workspace = true }
authors = { workspace = true }
@ -10,9 +10,10 @@ gb-core = { path = "../gb-core" }
async-trait= { workspace = true }
tokio= { workspace = true }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"thiserror= { workspace = true }
serde_json = "1.0"
thiserror= { workspace = true }
tracing= { workspace = true }
minio-rs = "0.1"
minio = "0.1.0"
[dev-dependencies]
rstest= { workspace = true }

144
gb-file/src/lib.rs Normal file
View file

@ -0,0 +1,144 @@
use minio::s3::client::Client;
use minio::s3::args::{BucketExistsArgs, MakeBucketArgs, RemoveObjectArgs, GetObjectArgs, PutObjectArgs, ListObjectsArgs};
use minio::s3::creds::StaticProvider;
use minio::s3::error::Error as MinioError;
use minio::s3::types::{BaseUrl, Item};
use std::io::Cursor;
use std::path::Path;
pub struct FileManager {
client: Client,
bucket_name: String,
}
impl FileManager {
pub async fn new(endpoint: &str, access_key: &str, secret_key: &str, bucket_name: &str, use_ssl: bool) -> Result<Self, MinioError> {
// Create BaseUrl from endpoint
let base_url = BaseUrl::from_string(endpoint)?;
let static_provider = StaticProvider::new(
access_key,
secret_key,
None,
);
let client = Client::new(base_url.clone(), Some(Box::new(static_provider)), None, None).unwrap();
Ok(Self {
client,
bucket_name: bucket_name.to_string(),
})
}
pub async fn ensure_bucket_exists(&self) -> Result<(), MinioError> {
let exists = self.client
.bucket_exists(&BucketExistsArgs::new(&self.bucket_name)?)
.await?;
if !exists {
self.client
.make_bucket(&MakeBucketArgs::new(&self.bucket_name)?)
.await?;
}
Ok(())
}
pub async fn upload_file(&self, path: &str, file_data: Vec<u8>) -> Result<(), MinioError> {
let reader = Cursor::new(&file_data);
let file_size = file_data.len() as u64;
let args = PutObjectArgs::new(
&self.bucket_name,
path,
reader,
Some(file_size),
None
)?;
self.client.put_object(&args).await?;
Ok(())
}
pub async fn download_file(&self, path: &str) -> Result<Vec<u8>, MinioError> {
let args = GetObjectArgs::new(&self.bucket_name, path)?;
let object = self.client.get_object(&args).await?;
let data = object.bytes().await?;
Ok(data.to_vec())
}
pub async fn copy_file(&self, source_path: &str, destination_path: &str) -> Result<(), MinioError> {
// Download the source file
let data = self.download_file(source_path).await?;
// Upload it to the destination
let reader = Cursor::new(&data);
let file_size = data.len() as u64;
let args = PutObjectArgs::new(
&self.bucket_name,
destination_path,
reader,
Some(file_size),
None
)?;
self.client.put_object(&args).await?;
Ok(())
}
pub async fn move_file(&self, source_path: &str, destination_path: &str) -> Result<(), MinioError> {
self.copy_file(source_path, destination_path).await?;
self.delete_file(source_path).await?;
Ok(())
}
pub async fn delete_file(&self, path: &str) -> Result<(), MinioError> {
let args = RemoveObjectArgs::new(&self.bucket_name, path)?;
self.client.remove_object(&args).await?;
Ok(())
}
pub async fn list_files(&self, prefix: &str) -> Result<Vec<String>, MinioError> {
// Create a predicate function that always returns true
let predicate = |_: Vec<Item>| -> bool { true };
let args = ListObjectsArgs::new(&self.bucket_name, &predicate)?;
let objects = self.client.list_objects(&args).await?;
// Filter objects based on prefix manually
let file_names: Vec<String> = objects
.into_iter()
.filter(|obj| obj.name().starts_with(prefix))
.map(|obj| obj.name().to_string())
.collect();
Ok(file_names)
}
pub async fn get_file_contents(&self, path: &str) -> Result<String, MinioError> {
let data = self.download_file(path).await?;
let contents = String::from_utf8(data)
.map_err(|_| MinioError::InvalidResponse(400, "Invalid UTF-8 sequence".to_string()))?;
Ok(contents)
}
pub async fn create_folder(&self, path: &str) -> Result<(), MinioError> {
let folder_path = if path.ends_with('/') {
path.to_string()
} else {
format!("{}/", path)
};
// Create empty file with folder path
self.upload_file(&folder_path, vec![]).await
}
pub async fn share_folder(&self, path: &str) -> Result<String, MinioError> {
// This is just a placeholder implementation
Ok(format!("Folder shared: {}", path))
}
pub async fn search_files(&self, prefix: &str, query: &str) -> Result<Vec<String>, MinioError> {
let files = self.list_files(prefix).await?;
let results = files.into_iter().filter(|f| f.contains(query)).collect();
Ok(results)
}
}

20
gb-llm/Cargo.toml Normal file
View file

@ -0,0 +1,20 @@
[package]
name = "gb-llm"
version = { workspace = true }
edition = { workspace = true }
authors = { workspace = true }
license = { workspace = true }
[dependencies]
gb-core = { path = "../gb-core" }
async-trait= { workspace = true }
tokio= { workspace = true }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"thiserror= { workspace = true }
tracing= { workspace = true }
minio-rs = "0.1"
[dev-dependencies]
rstest= { workspace = true }
tokio-test = "0.4"
tempfile = "3.8"

113
gb-llm/src/facade.rs Normal file
View file

@ -0,0 +1,113 @@
use minio_rs::minio::client::Client;
use minio_rs::minio::s3::args::{BucketExistsArgs, MakeBucketArgs, RemoveObjectArgs, GetObjectArgs, PutObjectArgs, ListObjectsArgs};
use minio_rs::minio::s3::response::Object;
use minio_rs::minio::s3::error::Error as MinioError;
use std::path::Path;
use std::io::Cursor;
/// Represents a file manager for handling MinIO file operations.
pub struct FileManager {
client: Client,
bucket_name: String,
}
impl FileManager {
/// Creates a new `FileManager` instance.
pub async fn new(endpoint: &str, access_key: &str, secret_key: &str, bucket_name: &str, use_ssl: bool) -> Result<Self, MinioError> {
let client = Client::new(endpoint, access_key, secret_key, use_ssl).await?;
Ok(Self {
client,
bucket_name: bucket_name.to_string(),
})
}
/// Checks if the bucket exists, and creates it if it doesn't.
pub async fn ensure_bucket_exists(&self) -> Result<(), MinioError> {
let exists = self.client
.bucket_exists(&BucketExistsArgs::new(&self.bucket_name))
.await?;
if !exists {
self.client
.make_bucket(&MakeBucketArgs::new(&self.bucket_name))
.await?;
}
Ok(())
}
/// Uploads a file to the specified path.
pub async fn upload_file(&self, path: &str, file_data: Vec<u8>) -> Result<(), MinioError> {
let args = PutObjectArgs::new(&self.bucket_name, path, Cursor::new(file_data), file_data.len() as u64);
self.client.put_object(&args).await?;
Ok(())
}
/// Downloads a file from the specified path.
pub async fn download_file(&self, path: &str) -> Result<Vec<u8>, MinioError> {
let args = GetObjectArgs::new(&self.bucket_name, path);
let object = self.client.get_object(&args).await?;
let data = object.bytes().await?;
Ok(data.to_vec())
}
/// Copies a file from the source path to the destination path.
pub async fn copy_file(&self, source_path: &str, destination_path: &str) -> Result<(), MinioError> {
let source_args = GetObjectArgs::new(&self.bucket_name, source_path);
let object = self.client.get_object(&source_args).await?;
let data = object.bytes().await?;
let destination_args = PutObjectArgs::new(&self.bucket_name, destination_path, Cursor::new(data.clone()), data.len() as u64);
self.client.put_object(&destination_args).await?;
Ok(())
}
/// Moves a file from the source path to the destination path.
pub async fn move_file(&self, source_path: &str, destination_path: &str) -> Result<(), MinioError> {
self.copy_file(source_path, destination_path).await?;
self.delete_file(source_path).await?;
Ok(())
}
/// Deletes a file at the specified path.
pub async fn delete_file(&self, path: &str) -> Result<(), MinioError> {
let args = RemoveObjectArgs::new(&self.bucket_name, path);
self.client.remove_object(&args).await?;
Ok(())
}
/// Lists all files in the specified path.
pub async fn list_files(&self, prefix: &str) -> Result<Vec<String>, MinioError> {
let args = ListObjectsArgs::new(&self.bucket_name).with_prefix(prefix);
let objects = self.client.list_objects(&args).await?;
let file_names = objects.into_iter().map(|obj| obj.name().to_string()).collect();
Ok(file_names)
}
/// Retrieves the contents of a file at the specified path.
pub async fn get_file_contents(&self, path: &str) -> Result<String, MinioError> {
let data = self.download_file(path).await?;
let contents = String::from_utf8(data).map_err(|_| MinioError::InvalidResponse)?;
Ok(contents)
}
/// Creates a folder at the specified path.
pub async fn create_folder(&self, path: &str) -> Result<(), MinioError> {
let folder_path = if path.ends_with('/') {
path.to_string()
} else {
format!("{}/", path)
};
self.upload_file(&folder_path, vec![]).await
}
/// Shares a folder at the specified path (placeholder implementation).
pub async fn share_folder(&self, path: &str) -> Result<String, MinioError> {
Ok(format!("Folder shared: {}", path))
}
/// Searches for files matching the query in the specified path.
pub async fn search_files(&self, prefix: &str, query: &str) -> Result<Vec<String>, MinioError> {
let files = self.list_files(prefix).await?;
let results = files.into_iter().filter(|f| f.contains(query)).collect();
Ok(results)
}
}