Skip to content

Commit

Permalink
Merge pull request #55 from itsparser/v3
Browse files Browse the repository at this point in the history
Reorganising the code with proper crate structure
  • Loading branch information
itsparser authored Feb 15, 2024
2 parents 60a3cb3 + 55d5350 commit 7e8cdcf
Show file tree
Hide file tree
Showing 63 changed files with 711 additions and 1,946 deletions.
3 changes: 3 additions & 0 deletions .cargo/config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ RUST_LOG="cerium=debug,entity=debug,migration=info,api=debug"
DATABASE_URI=""
SELENIUM_URI=""

MINIO_ACCESS_KEY = ""
MINIO_ACCESS_SECRET = ""

# -- Encryption salt used for JWT token and other secret keys
ENCRYPTION_SALT=""

Expand Down
3 changes: 3 additions & 0 deletions .cargo/config.local.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ RUST_LOG="cerium=debug,entity=debug,migration=info,api=debug"
DATABASE_URI="postgres://root:root@localhost:5432/orca"
SELENIUM_URI="http://localhost:4444/wd/hub/session"

MINIO_ACCESS_KEY = "minioadmin"
MINIO_ACCESS_SECRET = "minioadmin"

# -- Encryption salt used for JWT token and other secret keys
ENCRYPTION_SALT="strongencryption"

Expand Down
14 changes: 9 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ members=[
"crates/libs/entity",
"crates/libs/migration",
"crates/services/engine",
"crates/services/api",
"crates/services/api", "crates/workshop/webdriver",
]

[workspace.package]
Expand All @@ -29,14 +29,14 @@ engine = { path = "crates/services/engine", default-features = true }
api = { path = "crates/services/api", default-features = true }

thiserror = "1.0.31"
jsonwebtoken = "8"
jsonwebtoken = "9.2.0"
serde = { version = "1.0.147"}
serde_json = "1.0.87"
chrono = { version = "0.4.31"}
tracing = "0.1.37"
tracing-subscriber = "0.3.16"
uuid = { version = "1.6.1", features = ["serde", "v4"] }
config = "0.13.3"
config = "0.14.0"
dotenv = "0.15.0"
futures = "0.3.29"
futures-util = "0.3.29"
Expand All @@ -52,14 +52,18 @@ sea-orm = { version = "0.12.3", features = [
] }
sea-orm-migration = {version = "0.12.3", features = ["sqlx-postgres"]}
axum = "0.7.1"
axum-extra = "0.8.0"
axum-extra = "0.9.1"
tokio = { version = "1.34.0", features = ["full"] }
tower = "0.4.13"
tower-http = { version = "0.5.0", default-features = true, features = ["uuid", "cors", "trace", "compression-br", "catch-panic", "request-id"] }


rust-s3 = "0.33.0"

thirtyfour = "0.31.0"

geckodriver="0.34.0"


[patch.crates-io]
sea-orm = { git="https://github.com/itsparser/sea-orm", branch = "master" }
sea-orm = { git="https://github.com/itsparser/sea-orm", branch = "master" }
2 changes: 2 additions & 0 deletions crates/libs/cerium/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,11 @@ jsonwebtoken.workspace=true
thiserror.workspace=true
serde.workspace=true
serde_json.workspace=true
rust-s3.workspace=true

lazy_static = "1.4.0"
async_once = "0.2.6"
rand = { version = "0.8.5", default-features = false, features = ["std"] }
log = "0.4.20"


10 changes: 8 additions & 2 deletions crates/libs/cerium/src/client/driver/web.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use thirtyfour::WebDriver as TFWebDriver;
use thirtyfour::{CapabilitiesHelper, WebDriver as TFWebDriver};

use crate::error::CeriumResult;
use thirtyfour::{By, DesiredCapabilities, WebElement};
Expand Down Expand Up @@ -31,7 +31,8 @@ impl WebDriver {
}

pub async fn default() -> CeriumResult<Self> {
let caps = DesiredCapabilities::firefox();
let mut caps = DesiredCapabilities::firefox();
caps.add("se:recordVideo", true)?;
let driver = TFWebDriver::new("http://localhost:4444/wd/hub/session", caps).await?;
Self::new(driver)
}
Expand All @@ -40,6 +41,11 @@ impl WebDriver {
Ok(self.driver.goto(url).await?)
}

pub async fn quit(self) -> CeriumResult<()> {
Ok(self.driver.quit().await?)
}


pub async fn create_window(&self, name: &str) -> CeriumResult<()> {
let win_handler = self.driver.new_window().await?;
self.driver.switch_to_window(win_handler).await?;
Expand Down
12 changes: 12 additions & 0 deletions crates/libs/cerium/src/client/mod.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
use std::time::Duration;

use crate::client::storage::s3::S3Client;
use sea_orm::{ConnectOptions, Database, DatabaseConnection};

pub mod cache;
pub mod db;
pub mod driver;
pub mod storage;

#[derive(Debug, Clone)]
pub struct Client {
pub db: DatabaseConnection,
pub storage_cli: S3Client,
}

impl Client {
pub async fn new(db_uri: Option<String>, _redis_uri: Option<String>) -> Self {
Client {
db: Self::db_client(db_uri).await,
storage_cli: Self::storage_client().await,
}
}
async fn storage_client() -> S3Client {
return S3Client::new(
&std::env::var("STORAGE_ACCESS_KEY").expect("STORAGE_ACCESS_KEY must be set."),
&std::env::var("STORAGE_ACCESS_SECRET").expect("STORAGE_ACCESS_SECRET must be set."),
&std::env::var("STORAGE_BASE_URL").expect("STORAGE_BASE_URL must be set."),
)
.expect("Error While create Storage Client");
}

pub fn db(&self) -> &DatabaseConnection {
&self.db
Expand Down
12 changes: 12 additions & 0 deletions crates/libs/cerium/src/client/storage/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
pub mod s3;

pub trait StorageTrait {
fn create_bucket();
fn upload();
fn delete(self, key: String);
}


pub struct StorageClient {

}
158 changes: 158 additions & 0 deletions crates/libs/cerium/src/client/storage/s3.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
use s3::bucket::Bucket;
use s3::creds::Credentials;
use s3::Region;
use tracing::info;

use crate::error::CeriumResult;

#[derive(Debug, Clone)]
pub struct S3Client {
credentials: Credentials,
region: Region
}


impl S3Client {
pub fn new(access_key: &str, secret_key: &str, base_url: &str) -> CeriumResult<Self> {
let region = Region::Custom { region: "orca".to_string(), endpoint: base_url.to_string() };

let credentials = Credentials::new(Some(access_key), Some(secret_key), None, None, None)?;

Ok(Self {
credentials,
region
})


// let response_data = bucket.put_object(format!("{id}.png").as_str(), content.as_slice()).await.expect("Got error");
//
// let base_url = base_url.parse::<BaseUrl>()?;
// let static_provider = StaticProvider::new(access_key, secret_key, None);
// let client = Client::new(base_url.clone(), Some(Box::new(static_provider)), None, None)?;
// Ok(Self {
// client,
// })
}

/// Get Bucket will return the Bucket object for the Any bucket based action
pub fn get_bucket(&self, bucket_name: &str) -> CeriumResult<Bucket> {
let mut bucket = Bucket::new(bucket_name, self.region.clone(), self.credentials.clone())?;
bucket.set_path_style();
Ok(bucket)
}

pub async fn list_bucket(&self) -> CeriumResult<()> {
// let _bucket_obj = self.get_bucket(bucket)?
// let buckets =self.client.list_buckets(&args).await?;
Ok(())
}

pub async fn create(&self, bucket: &str, key: &str, data: &[u8]) -> CeriumResult<()> {
let _bucket_obj = self.get_bucket(bucket)?;
let result = _bucket_obj.put_object(key, data).await?;
Ok(())
}

pub async fn delete(&self, bucket: &String, key: &String) -> CeriumResult<()> {
let _bucket_obj = self.get_bucket(bucket)?;
let response = _bucket_obj.delete_object(key).await?;
info!("Deleted Object for {key} - Response {:?}", response);
Ok(())
}

}
//
// #[cfg(test)]
// mod tests {
// use crate::client::storage::s3::S3Client;
//
// // S3Client can be created with valid access_key, secret_key, and base_url
// #[tokio::test]
// async fn test_s3client_creation_with_valid_credentials() {
// let access_key = "minioadmin";
// let secret_key = "minioadmin";
// let base_url = "http://localhost:9000";
//
// let result = S3Client::new(access_key, secret_key, base_url);
//
//
// assert!(result.is_ok());
// // let r = result.unwrap().list_bucket().await;
// let r = result.unwrap().create("orca", "id.png", "jj").await;
// assert!(r.is_ok());
// }
//
// // S3Client can delete an object from a bucket with a valid key
// #[tokio::test]
// async fn test_s3client_delete_object_with_valid_key() {
// let access_key = "valid_access_key";
// let secret_key = "valid_secret_key";
// let base_url = "valid_base_url";
// let bucket = String::from("valid_bucket");
// let key = String::from("valid_key");
//
// let s3_client = S3Client::new(access_key, secret_key, base_url).unwrap();
// let result = s3_client.delete(&bucket, &key).await;
//
// assert!(result.is_ok());
// }
//
// // S3Client cannot be created with invalid access_key, secret_key, or base_url
// #[test]
// fn test_s3client_creation_with_invalid_credentials() {
// let access_key = "invalid_access_key";
// let secret_key = "invalid_secret_key";
// let base_url = "invalid_base_url";
//
// let result = S3Client::new(access_key, secret_key, base_url);
//
// assert!(result.is_err());
// }
//
// // S3Client cannot delete an object from a non-existent bucket
// #[tokio::test]
// async fn test_s3client_delete_object_from_nonexistent_bucket() {
// let access_key = "valid_access_key";
// let secret_key = "valid_secret_key";
// let base_url = "valid_base_url";
// let bucket = String::from("nonexistent_bucket");
// let key = String::from("valid_key");
//
// let s3_client = S3Client::new(access_key, secret_key, base_url).unwrap();
// let result = s3_client.delete(&bucket, &key).await;
//
// assert!(result.is_err());
// }
//
// // S3Client cannot delete a non-existent object from a bucket
// #[tokio::test]
// async fn test_s3client_delete_nonexistent_object_from_bucket() {
// let access_key = "valid_access_key";
// let secret_key = "valid_secret_key";
// let base_url = "valid_base_url";
// let bucket = String::from("valid_bucket");
// let key = String::from("nonexistent_key");
//
// let s3_client = S3Client::new(access_key, secret_key, base_url).unwrap();
// let result = s3_client.delete(&bucket, &key).await;
//
// assert!(result.is_err());
// }
//
// // S3Client can handle errors returned by the S3 service
// #[tokio::test]
// async fn test_s3client_handle_s3_service_errors() {
// let access_key = "valid_access_key";
// let secret_key = "valid_secret_key";
// let base_url = "valid_base_url";
// let bucket = String::from("valid_bucket");
// let key = String::from("valid_key");
//
// let s3_client = S3Client::new(access_key, secret_key, base_url).unwrap();
// let result = s3_client.delete(&bucket, &key).await;
//
// assert!(result.is_err());
// }
//
//
// }
14 changes: 9 additions & 5 deletions crates/libs/cerium/src/env.rs
Original file line number Diff line number Diff line change
@@ -1,27 +1,31 @@
use std::env;

use config::{Config as CConfig, File};
use serde::Deserialize;

#[derive(Debug, Deserialize, Clone)]
#[allow(unused)]
pub struct Environment {
pub debug: bool,
pub database_uri: String,
pub redis_uri: String,
pub selenium_uri: String,
pub encryption_salt: String
pub encryption_salt: String,
pub minio_access_key: String,
pub minio_access_secret: String,
}


impl Environment {
pub fn default() -> Self {
Environment {
debug: env::var("DEBUG").unwrap_or("false".to_string()).parse().unwrap(),
debug: env::var("DEBUG")
.unwrap_or("false".to_string())
.parse()
.unwrap(),
database_uri: env::var("DATABASE_URI").unwrap_or("".to_string()),
redis_uri: env::var("REDIS_URI").unwrap_or("".to_string()),
selenium_uri: env::var("SELENIUM_URI").unwrap_or("".to_string()),
encryption_salt: env::var("ENCRYPTION_SALT").unwrap_or("".to_string()),
minio_access_key: env::var("MINIO_ACCESS_KEY").unwrap_or("".to_string()),
minio_access_secret: env::var("MINIO_ACCESS_SECRET").unwrap_or("".to_string()),
}
}
}
8 changes: 8 additions & 0 deletions crates/libs/cerium/src/error/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};
use axum::Json;
use s3::creds::error::CredentialsError;
use s3::error::S3Error;
use sea_orm::DbErr;
use serde_json::{json, Error as SerdeJsonError};
use thirtyfour::error::WebDriverError;
Expand All @@ -22,6 +24,12 @@ pub enum CeriumError {
SerializerError(#[from] SerdeJsonError),
#[error("Webdriver error: {0}")]
WebdriverError(#[from] WebDriverError),
#[error("CredentialsError error: {0}")]
CredentialsError(#[from] CredentialsError),
#[error("CredentialsError error: {0}")]
S3Error(#[from] S3Error),


}

impl IntoResponse for CeriumError {
Expand Down
Loading

0 comments on commit 7e8cdcf

Please sign in to comment.