1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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}