diff --git a/api-reference/openapi_spec.json b/api-reference/openapi_spec.json index c31a8bd11e..33dd5d87a4 100644 --- a/api-reference/openapi_spec.json +++ b/api-reference/openapi_spec.json @@ -3922,7 +3922,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" @@ -3996,6 +4080,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": [ @@ -9551,6 +9709,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.", @@ -10373,6 +10548,18 @@ } } }, + "DynamicRoutingConfigParams": { + "type": "string", + "enum": [ + "PaymentMethod", + "PaymentMethodType", + "AuthenticationType", + "Currency", + "Country", + "CardNetwork", + "CardBin" + ] + }, "DynamicRoutingFeatures": { "type": "string", "enum": [ @@ -24345,6 +24532,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/crates/openapi/src/openapi.rs b/crates/openapi/src/openapi.rs index db0db93109..65c76f8929 100644 --- a/crates/openapi/src/openapi.rs +++ b/crates/openapi/src/openapi.rs @@ -159,7 +159,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, @@ -590,6 +592,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 b0fcb75fa4..6b968f8017 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 19b96a9dc8..76852bf12e 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