stateset_core/models/
integration_mapping.rs1use chrono::{DateTime, Utc};
10use serde::{Deserialize, Serialize};
11use stateset_primitives::IntegrationMappingId;
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct IntegrationMapping {
16 pub id: IntegrationMappingId,
18 pub integration: String,
20 pub mapping_group: String,
22 pub field_name: String,
24 pub external_value: String,
26 pub internal_value: String,
28 pub is_active: bool,
30 pub created_at: DateTime<Utc>,
32 pub updated_at: DateTime<Utc>,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct CreateIntegrationMapping {
39 pub integration: String,
41 pub mapping_group: String,
43 pub field_name: String,
45 pub external_value: String,
47 pub internal_value: String,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, Default)]
53pub struct UpdateIntegrationMapping {
54 pub internal_value: Option<String>,
56 pub is_active: Option<bool>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, Default)]
62pub struct IntegrationMappingFilter {
63 pub integration: Option<String>,
65 pub mapping_group: Option<String>,
67 pub field_name: Option<String>,
69 pub is_active: Option<bool>,
71 pub limit: Option<u32>,
73 pub offset: Option<u32>,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct MappingLookup {
80 pub integration: String,
82 pub mapping_group: String,
84 pub field_name: String,
86 pub external_value: String,
88}
89
90#[cfg(test)]
91mod tests {
92 use super::*;
93
94 #[test]
95 fn create_input_round_trips_via_serde() {
96 let input = CreateIntegrationMapping {
97 integration: "shopify".into(),
98 mapping_group: "carrier".into(),
99 field_name: "carrier_code".into(),
100 external_value: "USPS Ground".into(),
101 internal_value: "usps".into(),
102 };
103 let json = serde_json::to_string(&input).unwrap();
104 let back: CreateIntegrationMapping = serde_json::from_str(&json).unwrap();
105 assert_eq!(back.external_value, "USPS Ground");
106 assert_eq!(back.internal_value, "usps");
107 }
108
109 #[test]
110 fn update_defaults_are_none() {
111 let u = UpdateIntegrationMapping::default();
112 assert!(u.internal_value.is_none());
113 assert!(u.is_active.is_none());
114 }
115
116 #[test]
117 fn filter_defaults_are_none() {
118 let f = IntegrationMappingFilter::default();
119 assert!(f.integration.is_none());
120 assert!(f.mapping_group.is_none());
121 assert!(f.limit.is_none());
122 }
123}