Skip to main content

mocra_core/common/model/
login_info.rs

1use crate::cacheable::CacheAble;
2use crate::common::model::cookies::CookieItem;
3use crate::common::model::headers::HeaderItem;
4use crate::common::model::{Cookies, Headers};
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct LoginInfo {
9    pub cookies: Vec<CookieItem>,
10    pub useragent: String,
11    pub extra: serde_json::Value,
12}
13
14impl Default for LoginInfo {
15    fn default() -> Self {
16        LoginInfo{
17            cookies: vec![],
18            useragent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36".to_string(),
19            extra: Default::default(),
20        }
21    }
22}
23
24impl From<&LoginInfo> for Cookies {
25    fn from(value: &LoginInfo) -> Self {
26        Cookies {
27            cookies: value.cookies.clone(),
28        }
29    }
30}
31
32impl From<&LoginInfo> for Headers {
33    fn from(value: &LoginInfo) -> Self {
34        Headers {
35            headers: vec![HeaderItem {
36                key: "User-Agent".to_string(),
37                value: value.useragent.clone(),
38            }],
39        }
40    }
41}
42impl LoginInfo {
43    pub fn get_extra<T>(&self, key: &str) -> Option<T>
44    where
45        T: Serialize + for<'de> Deserialize<'de>,
46    {
47        self.extra
48            .get(key)
49            .and_then(|v| serde_json::from_value::<T>(v.clone()).ok())
50    }
51    pub fn get_shop_id(&self) -> Option<i64> {
52        self.get_extra("shopid")
53    }
54}
55
56impl CacheAble for LoginInfo {
57    fn field() -> impl AsRef<str> {
58        "login_info"
59    }
60}