Bug: [FIX]: Take merchant ID from headers in API Key Revoke (v2)



For `API Key - Revoke` in v2, the merchant ID is currently being passed in the path. We need to instead read the `X-Merchant-ID` header to get the merchant ID.
diff --git a/crates/router/src/core/api_keys.rs b/crates/router/src/core/api_keys.rs
index d76b338dc36..34b421d9e14 100644
--- a/crates/router/src/core/api_keys.rs
+++ b/crates/router/src/core/api_keys.rs
@@ -425,18 +425,18 @@ pub async fn update_api_key_expiry_task(
 #[instrument(skip_all)]
 pub async fn revoke_api_key(
     state: SessionState,
-    merchant_id: &common_utils::id_type::MerchantId,
+    merchant_id: common_utils::id_type::MerchantId,
     key_id: &common_utils::id_type::ApiKeyId,
 ) -> RouterResponse<api::RevokeApiKeyResponse> {
     let store = state.store.as_ref();
 
     let api_key = store
-        .find_api_key_by_merchant_id_key_id_optional(merchant_id, key_id)
+        .find_api_key_by_merchant_id_key_id_optional(&merchant_id, key_id)
         .await
         .to_not_found_response(errors::ApiErrorResponse::ApiKeyNotFound)?;
 
     let revoked = store
-        .revoke_api_key(merchant_id, key_id)
+        .revoke_api_key(&merchant_id, key_id)
         .await
         .to_not_found_response(errors::ApiErrorResponse::ApiKeyNotFound)?;
 
diff --git a/crates/router/src/routes/api_keys.rs b/crates/router/src/routes/api_keys.rs
index 3acb1c07064..e6ad485e2a2 100644
--- a/crates/router/src/routes/api_keys.rs
+++ b/crates/router/src/routes/api_keys.rs
@@ -243,7 +243,9 @@ pub async fn api_key_revoke(
         state,
         &req,
         (&merchant_id, &key_id),
-        |state, _, (merchant_id, key_id), _| api_keys::revoke_api_key(state, merchant_id, key_id),
+        |state, _, (merchant_id, key_id), _| {
+            api_keys::revoke_api_key(state, merchant_id.clone(), key_id)
+        },
         auth::auth_type(
             &auth::PlatformOrgAdminAuthWithMerchantIdFromRoute {
                 merchant_id_from_route: merchant_id.clone(),
@@ -265,24 +267,25 @@ pub async fn api_key_revoke(
 pub async fn api_key_revoke(
     state: web::Data<AppState>,
     req: HttpRequest,
-    path: web::Path<(
-        common_utils::id_type::MerchantId,
-        common_utils::id_type::ApiKeyId,
-    )>,
+    path: web::Path<common_utils::id_type::ApiKeyId>,
 ) -> impl Responder {
     let flow = Flow::ApiKeyRevoke;
-    let (merchant_id, key_id) = path.into_inner();
+    let key_id = path.into_inner();
 
     Box::pin(api::server_wrap(
         flow,
         state,
         &req,
-        (&merchant_id, &key_id),
-        |state, _, (merchant_id, key_id), _| api_keys::revoke_api_key(state, merchant_id, key_id),
+        &key_id,
+        |state,
+         auth::AuthenticationDataWithoutProfile {
+             merchant_account, ..
+         },
+         key_id,
+         _| api_keys::revoke_api_key(state, merchant_account.get_id().to_owned(), key_id),
         auth::auth_type(
-            &auth::V2AdminApiAuth,
-            &auth::JWTAuthMerchantFromRoute {
-                merchant_id: merchant_id.clone(),
+            &auth::AdminApiAuthWithMerchantIdFromHeader,
+            &auth::JWTAuthMerchantFromHeader {
                 required_permission: Permission::MerchantApiKeyWrite,
             },
             req.headers(),

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [x] Bugfix
- [ ] New feature
- [ ] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
<!-- Describe your changes in detail -->
- Removed merchant ID from path in `API Keys - Revoke`
- Changed auth to read merchant ID from headers

### Additional Changes

- [x] This PR modifies the API contract
- [ ] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!--
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
2. `crates/router/src/configs`
3. `loadtest/config`
-->


## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to the issue here.

If you don't have an issue, we'd recommend starting with one first so the PR
can focus on the implementation (unless it is an obvious bug or documentation fix
that will have little conversation).
-->
Closes #8807 

## How did you test it?
<!--
Did you write an integration/unit/API test to verify the code changes?
Or did you test this change manually (provide relevant screenshots)?
-->

- V1:
Request:
```
curl --location --request DELETE 'http://localhost:8080/api_keys/merchant_1753949938/dev_8Xwp8SIyp0R4ItROu0tR' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: test_admin'
```

Response:

```json
{
    "merchant_id": "merchant_1753949938",
    "key_id": "dev_8Xwp8SIyp0R4ItROu0tR",
    "revoked": true
}
```

- V2:
Request:
```
curl --location --request DELETE 'http://localhost:8080/v2/api-keys/dev_DULXUEOAUgYKxuxE7PQN' \
--header 'x-merchant-id: cloth_seller_v2_hFIzh6a4wFsbtEkKYLxD' \
--header 'Authorization: admin-api-key=test_admin' \
--header 'api-key: test_admin'
```

Response:

```json
{
    "merchant_id": "cloth_seller_v2_hFIzh6a4wFsbtEkKYLxD",
    "key_id": "dev_DULXUEOAUgYKxuxE7PQN",
    "revoked": true
}
```
## Checklist
<!-- Put an `x` in the boxes that apply -->

- [x] I formatted the code `cargo +nightly fmt --all`
- [x] I addressed lints thrown by `cargo clippy`
- [x] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible
