Skip to main content

ltfi_wsap/
types.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5/// Information disclosure level
6#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
7#[serde(rename_all = "UPPERCASE")]
8pub enum DisclosureLevel {
9    Basic,
10    Standard,
11    Detailed,
12    Complete,
13}
14
15/// Entity type
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[serde(rename_all = "lowercase")]
18pub enum EntityType {
19    Company,
20    Nonprofit,
21    Government,
22    Education,
23    Personal,
24    Other,
25}
26
27/// LTFI-WSAP Entity
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct Entity {
30    pub id: String,
31    pub slug: String,
32    pub display_name: String,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub legal_name: Option<String>,
35    pub entity_type: EntityType,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub description: Option<String>,
38    #[serde(default)]
39    pub domains: Vec<String>,
40    pub is_verified: bool,
41    pub is_active: bool,
42    #[serde(default)]
43    pub profile: HashMap<String, serde_json::Value>,
44    pub created_at: DateTime<Utc>,
45    pub updated_at: DateTime<Utc>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub verification_date: Option<DateTime<Utc>>,
48}
49
50/// Request to create a new entity
51#[derive(Debug, Serialize)]
52pub struct CreateEntityRequest {
53    pub display_name: String,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub legal_name: Option<String>,
56    pub entity_type: EntityType,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub description: Option<String>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub domains: Option<Vec<String>>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub profile: Option<HashMap<String, serde_json::Value>>,
63}
64
65/// Request to update an entity
66#[derive(Debug, Default, Serialize)]
67pub struct UpdateEntityRequest {
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub display_name: Option<String>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub legal_name: Option<String>,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub description: Option<String>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub domains: Option<Vec<String>>,
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub profile: Option<HashMap<String, serde_json::Value>>,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub is_active: Option<bool>,
80}
81
82/// Domain verification record
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct Verification {
85    pub id: String,
86    pub domain: String,
87    pub method: String,
88    pub txt_record_name: String,
89    pub txt_record_value: String,
90    pub status: String,
91    pub created_at: DateTime<Utc>,
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub verified_at: Option<DateTime<Utc>>,
94}
95
96/// WSAP protocol data
97#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct WSAPData {
99    pub version: String,
100    pub entity_id: String,
101    pub domain: String,
102    pub disclosure_level: DisclosureLevel,
103    pub generated_at: DateTime<Utc>,
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub expires_at: Option<DateTime<Utc>>,
106    pub data: HashMap<String, serde_json::Value>,
107}
108
109/// Authenticated user
110#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct User {
112    pub id: String,
113    pub username: String,
114    pub email: String,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub first_name: Option<String>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub last_name: Option<String>,
119    pub is_active: bool,
120    pub role: String,
121    pub created_at: DateTime<Utc>,
122}
123
124/// Paginated API response
125#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct PaginatedResponse<T> {
127    pub count: usize,
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub next: Option<String>,
130    #[serde(skip_serializing_if = "Option::is_none")]
131    pub previous: Option<String>,
132    pub results: Vec<T>,
133}
134
135/// List query parameters
136#[derive(Debug, Default, Serialize)]
137pub struct ListParams {
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub page: Option<u32>,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub page_size: Option<u32>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub entity_type: Option<EntityType>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub is_verified: Option<bool>,
146    #[serde(skip_serializing_if = "Option::is_none")]
147    pub is_active: Option<bool>,
148    #[serde(skip_serializing_if = "Option::is_none")]
149    pub search: Option<String>,
150}
151
152/// API health status
153#[derive(Debug, Clone, Serialize, Deserialize)]
154pub struct HealthResponse {
155    pub status: String,
156    pub timestamp: DateTime<Utc>,
157    pub version: String,
158    #[serde(default)]
159    pub services: HashMap<String, bool>,
160}