From 55dd7863622cc51e23699a8894982b6809d8ad72 Mon Sep 17 00:00:00 2001 From: Samuel Gomez Date: Tue, 28 May 2024 21:36:11 +0100 Subject: [PATCH] feature: making the unified api a separate component --- Cargo.lock | 25 ++ Cargo.toml | 1 + integrationos-api/Cargo.toml | 3 +- integrationos-api/src/server.rs | 2 +- .../connection_model_definition_cache.rs | 1 + integrationos-domain/Cargo.toml | 7 +- .../src/service/client/mod.rs | 2 - integrationos-event/Cargo.toml | 3 +- .../src/mongo_control_data_store.rs | 2 +- integrationos-unified/Cargo.toml | 30 +++ integrationos-unified/src/lib.rs | 3 + integrationos-unified/src/request.rs | 51 ++++ .../src/unified.rs | 236 +++--------------- integrationos-unified/src/utility.rs | 148 +++++++++++ 14 files changed, 297 insertions(+), 217 deletions(-) create mode 100644 integrationos-unified/Cargo.toml create mode 100644 integrationos-unified/src/lib.rs create mode 100644 integrationos-unified/src/request.rs rename integrationos-domain/src/service/client/unified_destination_client.rs => integrationos-unified/src/unified.rs (86%) create mode 100644 integrationos-unified/src/utility.rs diff --git a/Cargo.lock b/Cargo.lock index d7c31cd3..d1639e25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1705,6 +1705,7 @@ dependencies = [ "integrationos-domain", "integrationos-event", "integrationos-gateway", + "integrationos-unified", "jsonwebtoken", "mockito", "mongodb", @@ -1816,6 +1817,7 @@ dependencies = [ "http 1.1.0", "integrationos-cache", "integrationos-domain", + "integrationos-unified", "js-sandbox-ios", "metrics 0.21.1", "metrics-exporter-prometheus 0.12.2", @@ -1859,6 +1861,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "integrationos-unified" +version = "0.1.0" +dependencies = [ + "bson", + "chrono", + "futures", + "handlebars", + "http 1.1.0", + "http-serde-ext", + "integrationos-domain", + "js-sandbox-ios", + "jsonpath_lib", + "moka", + "mongodb", + "reqwest", + "serde", + "serde_json", + "tokio", + "tracing", + "uuid", +] + [[package]] name = "integrationos-watchdog" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index a4dc56d7..736f9b66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "integrationos-event", "integrationos-gateway", "integrationos-watchdog", + "integrationos-unified", ] [workspace.dependencies] diff --git a/integrationos-api/Cargo.toml b/integrationos-api/Cargo.toml index 06143a63..ef66f0fa 100644 --- a/integrationos-api/Cargo.toml +++ b/integrationos-api/Cargo.toml @@ -21,8 +21,9 @@ http-serde-ext.workspace = true http.workspace = true hyper = "0.14.27" indexmap = "2.1.0" +integrationos-unified = { path = "../integrationos-unified" } integrationos-cache = { path = "../integrationos-cache" } -integrationos-domain = { path = "../integrationos-domain", features = [ "unified", "metrics", "axum-error", ] } +integrationos-domain = { path = "../integrationos-domain", features = [ "metrics", "axum-error", ] } jsonwebtoken.workspace = true mongodb.workspace = true num_cpus = "1" diff --git a/integrationos-api/src/server.rs b/integrationos-api/src/server.rs index 3a3cf548..c5bae233 100644 --- a/integrationos-api/src/server.rs +++ b/integrationos-api/src/server.rs @@ -15,7 +15,6 @@ use integrationos_cache::local::{ }; use integrationos_domain::{ algebra::{CryptoExt, DefaultTemplate, MongoStore}, - client::unified_destination_client::UnifiedDestination, common_model::{CommonEnum, CommonModel}, connection_definition::{ConnectionDefinition, PublicConnectionDetails}, connection_model_definition::ConnectionModelDefinition, @@ -27,6 +26,7 @@ use integrationos_domain::{ stage::Stage, Connection, Event, Pipeline, PlatformData, Store, Transaction, }; +use integrationos_unified::unified::UnifiedDestination; use mongodb::{options::UpdateOptions, Client, Database}; use segment::{AutoBatcher, Batcher, HttpClient}; use std::{sync::Arc, time::Duration}; diff --git a/integrationos-cache/src/local/connection_model_definition_cache.rs b/integrationos-cache/src/local/connection_model_definition_cache.rs index 06748652..89e759fd 100644 --- a/integrationos-cache/src/local/connection_model_definition_cache.rs +++ b/integrationos-cache/src/local/connection_model_definition_cache.rs @@ -7,6 +7,7 @@ use moka::future::Cache; use mongodb::bson::Document; use std::{sync::Arc, time::Duration}; +#[derive(Clone)] pub struct ConnectionModelDefinitionCache { inner: Arc>, } diff --git a/integrationos-domain/Cargo.toml b/integrationos-domain/Cargo.toml index 87bc9444..ddbdaa85 100644 --- a/integrationos-domain/Cargo.toml +++ b/integrationos-domain/Cargo.toml @@ -7,14 +7,9 @@ edition = "2021" repository = "https://github.com/integration-os/integrationos-domain" [features] -default = ["unified"] - # This feature can be used for tests to provide dummy implementations dummy = ["dep:fake"] -# This feature provides access to unified-destination functionality. -unified = ["metrics", "dep:handlebars", "dep:moka"] - # This feature is for using napi to export structs to an npm package napi = ["dep:napi", "dep:napi-derive"] @@ -52,7 +47,7 @@ fake = { version = "2.9.2", features = [ "semver", ], optional = true } futures = "0.3.30" -handlebars = { version = "4.4.0", optional = true } +handlebars = { version = "4.4.0" } http = "1.1.0" http-serde-ext = "1.0.2" indexmap = "2.1.0" diff --git a/integrationos-domain/src/service/client/mod.rs b/integrationos-domain/src/service/client/mod.rs index ae675683..70024cb6 100644 --- a/integrationos-domain/src/service/client/mod.rs +++ b/integrationos-domain/src/service/client/mod.rs @@ -1,4 +1,2 @@ pub mod caller_client; pub mod secrets_client; -#[cfg(feature = "unified")] -pub mod unified_destination_client; diff --git a/integrationos-event/Cargo.toml b/integrationos-event/Cargo.toml index 8ec5fab2..2fb13e5d 100644 --- a/integrationos-event/Cargo.toml +++ b/integrationos-event/Cargo.toml @@ -15,7 +15,8 @@ futures.workspace = true handlebars.workspace = true http.workspace = true integrationos-cache = { path = "../integrationos-cache" } -integrationos-domain = { path = "../integrationos-domain", features = ["unified"] } +integrationos-domain = { path = "../integrationos-domain" } +integrationos-unified = { path = "../integrationos-unified" } js-sandbox-ios.workspace = true metrics = "0.21.1" metrics-exporter-prometheus = "0.12.1" diff --git a/integrationos-event/src/mongo_control_data_store.rs b/integrationos-event/src/mongo_control_data_store.rs index d295efb5..43aa59cc 100644 --- a/integrationos-event/src/mongo_control_data_store.rs +++ b/integrationos-event/src/mongo_control_data_store.rs @@ -10,7 +10,6 @@ use handlebars::Handlebars; use http::header::AUTHORIZATION; use integrationos_domain::{ algebra::{CryptoExt, FecherExt, GoogleTokenFetcher, MongoStore}, - client::unified_destination_client::UnifiedDestination, duplicates::Duplicates, encrypted_access_key::EncryptedAccessKey, event_access::EventAccess, @@ -19,6 +18,7 @@ use integrationos_domain::{ middleware::Middleware, Connection, Event, Pipeline, Store, }; +use integrationos_unified::unified::UnifiedDestination; use moka::future::Cache; use mongodb::{options::ClientOptions, Client}; use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; diff --git a/integrationos-unified/Cargo.toml b/integrationos-unified/Cargo.toml new file mode 100644 index 00000000..2a867c1a --- /dev/null +++ b/integrationos-unified/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "integrationos-unified" +description = "Unified service library for IntegrationOS" +version = "0.1.0" +edition = "2021" + +[dependencies] +jsonpath_lib = "0.3.0" +bson = "2.9.0" +chrono = { version = "0.4.32", features = ["serde"] } +integrationos-domain = { path = "../integrationos-domain" } +futures = "0.3.30" +handlebars = { version = "4.4.0" } +http = "1.1.0" +http-serde-ext = "1.0.2" +js-sandbox-ios = "0.1.0" +moka.workspace = true +mongodb = "2.8.0" +reqwest = { version = "0.12.3", features = [ + "json", + "rustls-tls", +], default-features = false } +serde = { version = "1.0.195", features = ["derive", "rc"] } +serde_json = "1.0.111" +tokio = { version = "1.35.1", features = ["macros", "rt-multi-thread"] } +tracing = "0.1.40" +uuid = { version = "1.7.0", features = ["v4"] } + +[lib] +path = "src/lib.rs" diff --git a/integrationos-unified/src/lib.rs b/integrationos-unified/src/lib.rs new file mode 100644 index 00000000..57d150f0 --- /dev/null +++ b/integrationos-unified/src/lib.rs @@ -0,0 +1,3 @@ +pub mod request; +pub mod unified; +pub mod utility; diff --git a/integrationos-unified/src/request.rs b/integrationos-unified/src/request.rs new file mode 100644 index 00000000..ffd97690 --- /dev/null +++ b/integrationos-unified/src/request.rs @@ -0,0 +1,51 @@ +use bson::doc; +use http::HeaderMap; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::collections::HashMap; + +#[derive(Debug, Clone, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct RequestCrudBorrowed<'a> { + pub query_params: &'a HashMap, + #[serde(with = "http_serde_ext::header_map", default)] + pub headers: &'a HeaderMap, + pub path_params: Option>, +} + +#[derive(Debug, Clone, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct PathParams<'a> { + pub id: &'a str, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RequestCrud { + pub query_params: Option>, + #[serde(with = "http_serde_ext::header_map", default)] + pub headers: HeaderMap, + pub path_params: Option>, + pub body: Option, +} + +#[derive(Debug, Clone, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ResponseCrudToMap<'a> { + #[serde(with = "http_serde_ext::header_map")] + pub headers: &'a HeaderMap, + pub pagination: Option, + pub request: ResponseCrudToMapRequest<'a>, +} + +#[derive(Debug, Clone, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ResponseCrudToMapRequest<'a> { + pub query_params: &'a HashMap, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ResponseCrud { + pub pagination: Option, +} diff --git a/integrationos-domain/src/service/client/unified_destination_client.rs b/integrationos-unified/src/unified.rs similarity index 86% rename from integrationos-domain/src/service/client/unified_destination_client.rs rename to integrationos-unified/src/unified.rs index c9b0aba8..873b8783 100644 --- a/integrationos-domain/src/service/client/unified_destination_client.rs +++ b/integrationos-unified/src/unified.rs @@ -1,6 +1,18 @@ -use super::caller_client::CallerClient; use crate::{ + request::{ + PathParams, RequestCrud, RequestCrudBorrowed, ResponseCrud, ResponseCrudToMap, + ResponseCrudToMapRequest, + }, + utility::{match_route, remove_nulls, template_route}, +}; +use bson::doc; +use chrono::Utc; +use futures::{future::join_all, join, FutureExt}; +use handlebars::Handlebars; +use http::{HeaderMap, HeaderName, HeaderValue, Response, StatusCode}; +use integrationos_domain::{ api_model_config::{ModelPaths, RequestModelPaths, ResponseModelPaths}, + client::caller_client::CallerClient, connection_model_definition::{ ConnectionModelDefinition, CrudAction, CrudMapping, PlatformInfo, }, @@ -14,18 +26,12 @@ use crate::{ prelude::{CryptoExt, MongoStore, TimedExt}, Connection, ErrorMeta, IntegrationOSError, Store, }; -use bson::doc; -use chrono::Utc; -use futures::{future::join_all, join, FutureExt}; -use handlebars::Handlebars; -use http::{HeaderMap, HeaderName, HeaderValue, Response, StatusCode}; use js_sandbox_ios::Script; use moka::future::Cache; use mongodb::{ options::{Collation, CollationStrength, FindOneOptions}, Client, }; -use serde::{Deserialize, Serialize}; use serde_json::{json, Number, Value}; use std::{ cell::RefCell, @@ -35,152 +41,24 @@ use std::{ }; use tracing::{debug, error}; -std::thread_local! { +thread_local! { static JS_RUNTIME: RefCell