Skip to main content

lbc/models/
user.rs

1use serde::Deserialize;
2
3#[derive(Debug, Clone, Deserialize)]
4pub struct User {
5    pub user_id: Option<String>,
6    pub name: Option<String>,
7    pub registered_at: Option<String>,
8    pub location: Option<String>,
9    pub feedback: Option<Feedback>,
10    pub profile_picture: Option<ProfilePicture>,
11    pub reply: Option<Reply>,
12    pub presence: Option<Presence>,
13    pub badges: Option<Vec<Badge>>,
14    pub total_ads: Option<u64>,
15    pub store_id: Option<u64>,
16    pub account_type: Option<String>,
17    pub description: Option<String>,
18
19    #[serde(skip)]
20    pub pro: Option<Pro>,
21}
22
23#[derive(Debug, Clone, Deserialize)]
24pub struct Feedback {
25    pub overall_score: Option<f64>,
26    pub category_scores: Option<CategoryScores>,
27    pub received_count: Option<u64>,
28}
29
30#[derive(Debug, Clone, Deserialize)]
31pub struct CategoryScores {
32    #[serde(rename = "CLEANNESS")]
33    pub cleanness: Option<f64>,
34    #[serde(rename = "COMMUNICATION")]
35    pub communication: Option<f64>,
36    #[serde(rename = "CONFORMITY")]
37    pub conformity: Option<f64>,
38    #[serde(rename = "PACKAGE")]
39    pub package: Option<f64>,
40    #[serde(rename = "PRODUCT")]
41    pub product: Option<f64>,
42    #[serde(rename = "RECOMMENDATION")]
43    pub recommendation: Option<f64>,
44    #[serde(rename = "RESPECT")]
45    pub respect: Option<f64>,
46    #[serde(rename = "TRANSACTION")]
47    pub transaction: Option<f64>,
48    #[serde(rename = "USER_ATTENTION")]
49    pub user_attention: Option<f64>,
50}
51
52#[derive(Debug, Clone, Deserialize)]
53pub struct ProfilePicture {
54    pub extra_large_url: Option<String>,
55    pub large_url: Option<String>,
56    pub medium_url: Option<String>,
57    pub small_url: Option<String>,
58}
59
60#[derive(Debug, Clone, Deserialize)]
61pub struct Reply {
62    pub in_minutes: Option<u32>,
63    pub text: Option<String>,
64    pub rate_text: Option<String>,
65    pub rate: Option<u32>,
66    pub reply_time_text: Option<String>,
67}
68
69#[derive(Debug, Clone, Deserialize)]
70pub struct Presence {
71    pub status: Option<String>,
72    pub presence_text: Option<String>,
73    pub last_activity: Option<String>,
74    pub enabled: Option<bool>,
75}
76
77#[derive(Debug, Clone, Deserialize)]
78pub struct Badge {
79    #[serde(rename = "type")]
80    pub badge_type: Option<String>,
81    pub name: Option<String>,
82}
83
84#[derive(Debug, Clone, Deserialize)]
85pub struct Pro {
86    pub online_store_id: Option<u64>,
87    pub online_store_name: Option<String>,
88    pub owner: Option<ProOwner>,
89    pub location: Option<ProLocation>,
90    pub brand: Option<ProBrand>,
91    pub information: Option<ProInformation>,
92    pub rating: Option<ProRating>,
93}
94
95#[derive(Debug, Clone, Deserialize)]
96pub struct ProOwner {
97    #[serde(rename = "activitySectorID")]
98    pub activity_sector_id: Option<u32>,
99    #[serde(rename = "activitySector")]
100    pub activity_sector: Option<String>,
101    #[serde(rename = "categoryId")]
102    pub category_id: Option<u32>,
103    pub siren: Option<String>,
104    pub siret: Option<String>,
105    #[serde(rename = "storeId")]
106    pub store_id: Option<u64>,
107    #[serde(rename = "activeSince")]
108    pub active_since: Option<String>,
109}
110
111#[derive(Debug, Clone, Deserialize)]
112pub struct ProLocation {
113    pub address: Option<String>,
114    pub district: Option<String>,
115    pub city: Option<String>,
116    pub label: Option<String>,
117    pub lat: Option<f64>,
118    pub lng: Option<f64>,
119    pub zipcode: Option<String>,
120    pub geo_source: Option<String>,
121    pub geo_provider: Option<String>,
122    pub region: Option<String>,
123    pub region_label: Option<String>,
124    pub department: Option<String>,
125    pub dpt_label: Option<String>,
126    pub country: Option<String>,
127}
128
129#[derive(Debug, Clone, Deserialize)]
130pub struct ProBrand {
131    pub logo: Option<ProImage>,
132    pub cover: Option<ProImage>,
133    pub slogan: Option<String>,
134}
135
136#[derive(Debug, Clone, Deserialize)]
137pub struct ProImage {
138    pub large: Option<String>,
139    pub medium: Option<String>,
140    pub small: Option<String>,
141}
142
143#[derive(Debug, Clone, Deserialize)]
144pub struct ProInformation {
145    pub description: Option<String>,
146    pub opening_hours: Option<String>,
147    pub website_url: Option<String>,
148}
149
150#[derive(Debug, Clone, Deserialize)]
151pub struct ProRating {
152    pub rating_value: Option<f64>,
153    pub user_ratings_total: Option<u64>,
154    pub source: Option<String>,
155    pub source_display: Option<String>,
156    pub retrieval_time: Option<String>,
157    pub url: Option<String>,
158    pub reviews: Option<Vec<Review>>,
159}
160
161#[derive(Debug, Clone, Deserialize)]
162pub struct Review {
163    pub author_name: Option<String>,
164    pub rating_value: Option<u32>,
165    pub text: Option<String>,
166    pub review_time: Option<String>,
167}
168
169impl User {
170    pub fn is_pro(&self) -> bool {
171        self.account_type.as_deref() == Some("pro")
172    }
173
174    pub fn feedback_score(&self) -> Option<f64> {
175        self.feedback
176            .as_ref()
177            .and_then(|f| f.overall_score)
178            .map(|score| score * 5.0)
179    }
180
181    pub fn profile_picture_url(&self) -> Option<&str> {
182        self.profile_picture
183            .as_ref()
184            .and_then(|p| p.extra_large_url.as_deref())
185    }
186
187    pub(crate) fn with_pro_data(mut self, pro: Option<Pro>) -> Self {
188        self.pro = pro;
189        self
190    }
191}