diff --git a/api-reference/openapi_spec.json b/api-reference/openapi_spec.json index 509437fc8746..a549dc9475fd 100644 --- a/api-reference/openapi_spec.json +++ b/api-reference/openapi_spec.json @@ -4020,7 +4020,91 @@ ] } }, - "/account/:account_id/business_profile/:profile_id/dynamic_routing/success_based/toggle": { + "/account/{account_id}/business_profile/{profile_id}/dynamic_routing/success_based/config/{algorithm_id}": { + "patch": { + "tags": [ + "Routing" + ], + "summary": "Routing - Update success based dynamic routing config for profile", + "description": "Update success based dynamic routing algorithm", + "operationId": "Update success based dynamic routing configs", + "parameters": [ + { + "name": "account_id", + "in": "path", + "description": "Merchant id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "profile_id", + "in": "path", + "description": "Profile id under which Dynamic routing needs to be toggled", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "algorithm_id", + "in": "path", + "description": "Success based routing algorithm id which was last activated to update the config", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DynamicRoutingFeatures" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Routing Algorithm updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoutingDictionaryRecord" + } + } + } + }, + "400": { + "description": "Update body is malformed" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Resource missing" + }, + "422": { + "description": "Unprocessable request" + }, + "500": { + "description": "Internal server error" + } + }, + "security": [ + { + "api_key": [] + }, + { + "jwt_key": [] + } + ] + } + }, + "/account/{account_id}/business_profile/{profile_id}/dynamic_routing/success_based/toggle": { "post": { "tags": [ "Routing" @@ -4094,6 +4178,80 @@ ] } }, + "/account/{account_id}/business_profile/{profile_id}/dynamic_routing/elimination/toggle": { + "post": { + "tags": [ + "Routing" + ], + "summary": "Routing - Toggle elimination routing for profile", + "description": "Create a elimination based dynamic routing algorithm", + "operationId": "Toggle elimination routing algorithm", + "parameters": [ + { + "name": "account_id", + "in": "path", + "description": "Merchant id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "profile_id", + "in": "path", + "description": "Profile id under which Dynamic routing needs to be toggled", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "enable", + "in": "query", + "description": "Feature to enable for success based routing", + "required": true, + "schema": { + "$ref": "#/components/schemas/DynamicRoutingFeatures" + } + } + ], + "responses": { + "200": { + "description": "Routing Algorithm created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoutingDictionaryRecord" + } + } + } + }, + "400": { + "description": "Request body is malformed" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Resource missing" + }, + "422": { + "description": "Unprocessable request" + }, + "500": { + "description": "Internal server error" + } + }, + "security": [ + { + "api_key": [] + }, + { + "jwt_key": [] + } + ] + } + }, "/blocklist": { "delete": { "tags": [ @@ -9649,6 +9807,23 @@ "ZWL" ] }, + "CurrentBlockThreshold": { + "type": "object", + "properties": { + "duration_in_mins": { + "type": "integer", + "format": "int64", + "nullable": true, + "minimum": 0 + }, + "max_total_count": { + "type": "integer", + "format": "int64", + "nullable": true, + "minimum": 0 + } + } + }, "CustomerAcceptance": { "type": "object", "description": "This \"CustomerAcceptance\" object is passed during Payments-Confirm request, it enlists the type, time, and mode of acceptance properties related to an acceptance done by the customer. The customer_acceptance sub object is usually passed by the SDK or client.", @@ -10471,6 +10646,18 @@ } } }, + "DynamicRoutingConfigParams": { + "type": "string", + "enum": [ + "PaymentMethod", + "PaymentMethodType", + "AuthenticationType", + "Currency", + "Country", + "CardNetwork", + "CardBin" + ] + }, "DynamicRoutingFeatures": { "type": "string", "enum": [ @@ -24584,6 +24771,56 @@ }, "additionalProperties": false }, + "SuccessBasedRoutingConfig": { + "type": "object", + "properties": { + "params": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DynamicRoutingConfigParams" + }, + "nullable": true + }, + "config": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessBasedRoutingConfigBody" + } + ], + "nullable": true + } + } + }, + "SuccessBasedRoutingConfigBody": { + "type": "object", + "properties": { + "min_aggregates_size": { + "type": "integer", + "format": "int32", + "nullable": true, + "minimum": 0 + }, + "default_success_rate": { + "type": "number", + "format": "double", + "nullable": true + }, + "max_aggregates_size": { + "type": "integer", + "format": "int32", + "nullable": true, + "minimum": 0 + }, + "current_block_threshold": { + "allOf": [ + { + "$ref": "#/components/schemas/CurrentBlockThreshold" + } + ], + "nullable": true + } + } + }, "SurchargeDetailsResponse": { "type": "object", "required": [ diff --git a/config/deployments/env_specific.toml b/config/deployments/env_specific.toml index 02d3fe66c09e..c470f364fe74 100644 --- a/config/deployments/env_specific.toml +++ b/config/deployments/env_specific.toml @@ -342,3 +342,6 @@ entity_logo_url = "https://example.com/logo.svg" # Logo URL of the entity to be foreground_color = "#000000" # Foreground color of email text primary_color = "#006DF9" # Primary color of email body background_color = "#FFFFFF" # Background color of email body + +[connectors.unified_authentication_service] #Unified Authentication Service Configuration +base_url = "http://localhost:8000" #base url to call unified authentication service diff --git a/config/deployments/integration_test.toml b/config/deployments/integration_test.toml index de8063b10294..fbf80ced5f17 100644 --- a/config/deployments/integration_test.toml +++ b/config/deployments/integration_test.toml @@ -107,7 +107,6 @@ thunes.base_url = "https://api.limonetikqualif.com/" trustpay.base_url = "https://test-tpgw.trustpay.eu/" trustpay.base_url_bank_redirects = "https://aapi.trustpay.eu/" tsys.base_url = "https://stagegw.transnox.com/" -unified_authentication_service.base_url = "http://localhost:8000" volt.base_url = "https://api.sandbox.volt.io/" wellsfargo.base_url = "https://apitest.cybersource.com/" wellsfargopayout.base_url = "https://api-sandbox.wellsfargo.com/" diff --git a/config/deployments/production.toml b/config/deployments/production.toml index d4432b7021b9..a22b618bfa21 100644 --- a/config/deployments/production.toml +++ b/config/deployments/production.toml @@ -111,7 +111,6 @@ thunes.base_url = "https://api.limonetik.com/" trustpay.base_url = "https://tpgw.trustpay.eu/" trustpay.base_url_bank_redirects = "https://aapi.trustpay.eu/" tsys.base_url = "https://gateway.transit-pass.com/" -unified_authentication_service.base_url = "http://localhost:8000" volt.base_url = "https://api.volt.io/" wellsfargo.base_url = "https://api.cybersource.com/" wellsfargopayout.base_url = "https://api.wellsfargo.com/" diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml index accf2f586afe..2defc5729cf2 100644 --- a/config/deployments/sandbox.toml +++ b/config/deployments/sandbox.toml @@ -111,7 +111,6 @@ thunes.base_url = "https://api.limonetikqualif.com/" trustpay.base_url = "https://test-tpgw.trustpay.eu/" trustpay.base_url_bank_redirects = "https://aapi.trustpay.eu/" tsys.base_url = "https://stagegw.transnox.com/" -unified_authentication_service.base_url = "http://localhost:8000" volt.base_url = "https://api.sandbox.volt.io/" wellsfargo.base_url = "https://apitest.cybersource.com/" wellsfargopayout.base_url = "https://api-sandbox.wellsfargo.com/" diff --git a/crates/openapi/src/openapi.rs b/crates/openapi/src/openapi.rs index a481aa6b907e..94bc84814bca 100644 --- a/crates/openapi/src/openapi.rs +++ b/crates/openapi/src/openapi.rs @@ -163,7 +163,9 @@ Never share your secret api keys. Keep them guarded and secure. routes::routing::routing_retrieve_linked_config, routes::routing::routing_retrieve_default_config_for_profiles, routes::routing::routing_update_default_config_for_profile, + routes::routing::success_based_routing_update_configs, routes::routing::toggle_success_based_routing, + routes::routing::toggle_elimination_routing, // Routes for blocklist routes::blocklist::remove_entry_from_blocklist, @@ -601,6 +603,10 @@ Never share your secret api keys. Keep them guarded and secure. api_models::routing::RoutingKind, api_models::routing::RoutableConnectorChoice, api_models::routing::DynamicRoutingFeatures, + api_models::routing::SuccessBasedRoutingConfig, + api_models::routing::DynamicRoutingConfigParams, + api_models::routing::CurrentBlockThreshold, + api_models::routing::SuccessBasedRoutingConfigBody, api_models::routing::LinkedRoutingConfigRetrieveResponse, api_models::routing::RoutingRetrieveResponse, api_models::routing::ProfileDefaultRoutingConfig, diff --git a/crates/openapi/src/routes/routing.rs b/crates/openapi/src/routes/routing.rs index b0fcb75fa49b..6b968f80172e 100644 --- a/crates/openapi/src/routes/routing.rs +++ b/crates/openapi/src/routes/routing.rs @@ -260,7 +260,7 @@ pub async fn routing_update_default_config_for_profile() {} /// Create a success based dynamic routing algorithm #[utoipa::path( post, - path = "/account/:account_id/business_profile/:profile_id/dynamic_routing/success_based/toggle", + path = "/account/{account_id}/business_profile/{profile_id}/dynamic_routing/success_based/toggle", params( ("account_id" = String, Path, description = "Merchant id"), ("profile_id" = String, Path, description = "Profile id under which Dynamic routing needs to be toggled"), @@ -280,13 +280,40 @@ pub async fn routing_update_default_config_for_profile() {} )] pub async fn toggle_success_based_routing() {} +#[cfg(feature = "v1")] +/// Routing - Update success based dynamic routing config for profile +/// +/// Update success based dynamic routing algorithm +#[utoipa::path( + patch, + path = "/account/{account_id}/business_profile/{profile_id}/dynamic_routing/success_based/config/{algorithm_id}", + params( + ("account_id" = String, Path, description = "Merchant id"), + ("profile_id" = String, Path, description = "Profile id under which Dynamic routing needs to be toggled"), + ("algorithm_id" = String, Path, description = "Success based routing algorithm id which was last activated to update the config"), + ), + request_body = DynamicRoutingFeatures, + responses( + (status = 200, description = "Routing Algorithm updated", body = RoutingDictionaryRecord), + (status = 400, description = "Update body is malformed"), + (status = 500, description = "Internal server error"), + (status = 404, description = "Resource missing"), + (status = 422, description = "Unprocessable request"), + (status = 403, description = "Forbidden"), + ), + tag = "Routing", + operation_id = "Update success based dynamic routing configs", + security(("api_key" = []), ("jwt_key" = [])) +)] +pub async fn success_based_routing_update_configs() {} + #[cfg(feature = "v1")] /// Routing - Toggle elimination routing for profile /// /// Create a elimination based dynamic routing algorithm #[utoipa::path( post, - path = "/account/:account_id/business_profile/:profile_id/dynamic_routing/elimination/toggle", + path = "/account/{account_id}/business_profile/{profile_id}/dynamic_routing/elimination/toggle", params( ("account_id" = String, Path, description = "Merchant id"), ("profile_id" = String, Path, description = "Profile id under which Dynamic routing needs to be toggled"), diff --git a/crates/router/src/routes/routing.rs b/crates/router/src/routes/routing.rs index 19b96a9dc843..76852bf12efe 100644 --- a/crates/router/src/routes/routing.rs +++ b/crates/router/src/routes/routing.rs @@ -1071,7 +1071,7 @@ pub async fn success_based_routing_update_configs( flow, state, &req, - routing_payload_wrapper, + routing_payload_wrapper.clone(), |state, _, wrapper: routing_types::SuccessBasedRoutingPayloadWrapper, _| async { Box::pin(routing::success_based_routing_update_configs( state, @@ -1081,7 +1081,14 @@ pub async fn success_based_routing_update_configs( )) .await }, - &auth::AdminApiAuth, + auth::auth_type( + &auth::HeaderAuth(auth::ApiKeyAuth), + &auth::JWTAuthProfileFromRoute { + profile_id: routing_payload_wrapper.profile_id, + required_permission: Permission::ProfileRoutingWrite, + }, + req.headers(), + ), api_locking::LockAction::NotApplicable, )) .await