megacommerce_shared/utils/
middleware.rs

1use std::{collections::HashMap, sync::Arc};
2
3use tonic::{Request, Status};
4
5use crate::models::{
6  context::{Context, Session},
7  network::Header,
8};
9
10pub fn middleware_context(mut req: Request<()>) -> Result<Request<()>, Status> {
11  let m = req.metadata_mut();
12
13  let get_string = |key: &str| m.get(key).and_then(|v| v.to_str().ok()).unwrap_or("").to_string();
14
15  let get_int = |key: &str| {
16    m.get(key).and_then(|v| v.to_str().ok()).and_then(|s| s.parse::<i64>().ok()).unwrap_or(0)
17  };
18
19  let get_bool =
20    |key: &str| m.get(key).and_then(|v| v.to_str().ok()).map(|s| s == "true").unwrap_or(false);
21
22  let get_props = |key: &str| {
23    m.get(key)
24      .and_then(|v| v.to_str().ok())
25      .map(|s| {
26        s.split(',')
27          .filter_map(|pair| {
28            let mut parts = pair.trim().splitn(2, ':');
29            if let (Some(k), Some(v)) = (parts.next(), parts.next()) {
30              Some((k.trim().to_string(), v.trim().to_string()))
31            } else {
32              None
33            }
34          })
35          .collect::<HashMap<_, _>>()
36      })
37      .unwrap_or_default()
38  };
39
40  let context = {
41    let session = Session {
42      id: get_string(&Header::SessionId.as_str()),
43      token: get_string(&Header::Token.as_str()),
44      created_at: get_int(&Header::CreatedAt.as_str()),
45      expires_at: get_int(&Header::ExpiresAt.as_str()),
46      last_activity_at: get_int(&Header::LastActivityAt.as_str()),
47      user_id: get_string(&Header::UserId.as_str()),
48      device_id: get_string(&Header::DeviceId.as_str()),
49      roles: get_string(&Header::Roles.as_str()),
50      is_oauth: get_bool(&Header::IsOauth.as_str()),
51      props: get_props(&Header::Props.as_str()),
52    };
53
54    Context::new(
55      session,
56      get_string(Header::XRequestId.as_str()),
57      get_string(Header::XIpAddress.as_str()),
58      get_string(Header::XForwardedFor.as_str()),
59      get_string(Header::Path.as_str()),
60      get_string(Header::UserAgent.as_str()),
61      get_string(Header::AcceptLanguage.as_str()),
62    )
63  };
64
65  req.extensions_mut().insert(Arc::new(context));
66
67  Ok(req)
68}