rain_sdk/models/
applications.rs

1//! Models for application endpoints
2
3use crate::models::common::*;
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7// ============================================================================
8// Company Application Models
9// ============================================================================
10
11/// Request to create a company application
12#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct CreateCompanyApplicationRequest {
14    pub initial_user: InitialUser,
15    pub name: String,
16    pub address: Address,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub chain_id: Option<String>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub contract_address: Option<String>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub source_key: Option<String>,
23    pub entity: EntityInfo,
24    pub representatives: Vec<Representative>,
25    pub ultimate_beneficial_owners: Vec<UltimateBeneficialOwner>,
26}
27
28/// Initial user information
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct InitialUser {
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub id: Option<Uuid>,
33    pub first_name: String,
34    pub last_name: String,
35    pub birth_date: String,
36    pub national_id: String,
37    pub country_of_issue: String,
38    pub email: String,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub phone_country_code: Option<String>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub phone_number: Option<String>,
43    pub address: Address,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub role: Option<String>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub wallet_address: Option<String>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub solana_address: Option<String>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub tron_address: Option<String>,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub stellar_address: Option<String>,
54    pub ip_address: String,
55    pub is_terms_of_service_accepted: bool,
56}
57
58/// Entity information
59#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct EntityInfo {
61    pub name: String,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub r#type: Option<String>,
64    pub description: String,
65    pub industry: String,
66    pub registration_number: String,
67    pub tax_id: String,
68    pub website: String,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub expected_spend: Option<String>,
71}
72
73/// Entity update information (all fields optional for updates)
74#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct EntityUpdateInfo {
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub r#type: Option<String>,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub description: Option<String>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub industry: Option<String>,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub registration_number: Option<String>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub tax_id: Option<String>,
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub website: Option<String>,
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub expected_spend: Option<String>,
90}
91
92/// Representative information
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct Representative {
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub id: Option<Uuid>,
97    pub first_name: String,
98    pub last_name: String,
99    pub birth_date: String,
100    pub national_id: String,
101    pub country_of_issue: String,
102    pub email: String,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub phone_country_code: Option<String>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub phone_number: Option<String>,
107    pub address: Address,
108}
109
110/// Ultimate beneficial owner information
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct UltimateBeneficialOwner {
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub id: Option<Uuid>,
115    pub first_name: String,
116    pub last_name: String,
117    pub birth_date: String,
118    pub national_id: String,
119    pub country_of_issue: String,
120    pub email: String,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub phone_country_code: Option<String>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub phone_number: Option<String>,
125    pub address: Address,
126}
127
128/// Response for company application
129#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct CompanyApplicationResponse {
131    pub id: Uuid,
132    pub name: String,
133    pub address: Address,
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub ultimate_beneficial_owners: Option<Vec<UltimateBeneficialOwnerResponse>>,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub application_status: Option<ApplicationStatus>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub application_external_verification_link: Option<ApplicationLink>,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub application_completion_link: Option<ApplicationLink>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub application_reason: Option<String>,
144}
145
146/// Ultimate beneficial owner response
147#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct UltimateBeneficialOwnerResponse {
149    pub id: Uuid,
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub first_name: Option<String>,
152    #[serde(skip_serializing_if = "Option::is_none")]
153    pub last_name: Option<String>,
154    #[serde(skip_serializing_if = "Option::is_none")]
155    pub email: Option<String>,
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub application_status: Option<ApplicationStatus>,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub application_external_verification_link: Option<ApplicationLink>,
160    #[serde(skip_serializing_if = "Option::is_none")]
161    pub application_completion_link: Option<ApplicationLink>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub application_reason: Option<String>,
164}
165
166/// Request to update a company application
167#[derive(Debug, Clone, Serialize, Deserialize)]
168pub struct UpdateCompanyApplicationRequest {
169    #[serde(skip_serializing_if = "Option::is_none")]
170    pub name: Option<String>,
171    #[serde(skip_serializing_if = "Option::is_none")]
172    pub address: Option<Address>,
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub entity: Option<EntityUpdateInfo>,
175}
176
177/// Request to update an ultimate beneficial owner
178#[derive(Debug, Clone, Serialize, Deserialize)]
179pub struct UpdateUltimateBeneficialOwnerRequest {
180    #[serde(skip_serializing_if = "Option::is_none")]
181    pub first_name: Option<String>,
182    #[serde(skip_serializing_if = "Option::is_none")]
183    pub last_name: Option<String>,
184    #[serde(skip_serializing_if = "Option::is_none")]
185    pub birth_date: Option<String>,
186    #[serde(skip_serializing_if = "Option::is_none")]
187    pub national_id: Option<String>,
188    #[serde(skip_serializing_if = "Option::is_none")]
189    pub country_of_issue: Option<String>,
190    #[serde(skip_serializing_if = "Option::is_none")]
191    pub email: Option<String>,
192    #[serde(skip_serializing_if = "Option::is_none")]
193    pub address: Option<Address>,
194}
195
196// ============================================================================
197// User Application Models
198// ============================================================================
199
200/// Request to create a user application
201#[derive(Debug, Clone, Serialize, Deserialize)]
202pub struct CreateUserApplicationRequest {
203    pub ip_address: String,
204    pub occupation: String,
205    pub annual_salary: String,
206    pub account_purpose: String,
207    pub expected_monthly_volume: String,
208    pub is_terms_of_service_accepted: bool,
209    pub sumsub_share_token: String,
210    #[serde(skip_serializing_if = "Option::is_none")]
211    pub wallet_address: Option<String>,
212    #[serde(skip_serializing_if = "Option::is_none")]
213    pub solana_address: Option<String>,
214    #[serde(skip_serializing_if = "Option::is_none")]
215    pub tron_address: Option<String>,
216    #[serde(skip_serializing_if = "Option::is_none")]
217    pub stellar_address: Option<String>,
218    #[serde(skip_serializing_if = "Option::is_none")]
219    pub chain_id: Option<String>,
220    #[serde(skip_serializing_if = "Option::is_none")]
221    pub contract_address: Option<String>,
222    #[serde(skip_serializing_if = "Option::is_none")]
223    pub source_key: Option<String>,
224    #[serde(skip_serializing_if = "Option::is_none")]
225    pub has_existing_documents: Option<bool>,
226}
227
228/// Request to initiate a user application
229#[derive(Debug, Clone, Serialize, Deserialize)]
230pub struct InitiateUserApplicationRequest {
231    #[serde(skip_serializing_if = "Option::is_none")]
232    pub first_name: Option<String>,
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub last_name: Option<String>,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub email: Option<String>,
237    #[serde(skip_serializing_if = "Option::is_none")]
238    pub wallet_address: Option<String>,
239}
240
241/// Response for user application
242#[derive(Debug, Clone, Serialize, Deserialize)]
243pub struct UserApplicationResponse {
244    pub id: Uuid,
245    #[serde(skip_serializing_if = "Option::is_none")]
246    pub company_id: Option<Uuid>,
247    #[serde(skip_serializing_if = "Option::is_none")]
248    pub first_name: Option<String>,
249    #[serde(skip_serializing_if = "Option::is_none")]
250    pub last_name: Option<String>,
251    #[serde(skip_serializing_if = "Option::is_none")]
252    pub email: Option<String>,
253    #[serde(skip_serializing_if = "Option::is_none")]
254    pub is_active: Option<bool>,
255    #[serde(skip_serializing_if = "Option::is_none")]
256    pub is_terms_of_service_accepted: Option<bool>,
257    #[serde(skip_serializing_if = "Option::is_none")]
258    pub address: Option<Address>,
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub phone_country_code: Option<String>,
261    #[serde(skip_serializing_if = "Option::is_none")]
262    pub phone_number: Option<String>,
263    #[serde(skip_serializing_if = "Option::is_none")]
264    pub wallet_address: Option<String>,
265    #[serde(skip_serializing_if = "Option::is_none")]
266    pub solana_address: Option<String>,
267    #[serde(skip_serializing_if = "Option::is_none")]
268    pub application_status: Option<ApplicationStatus>,
269    #[serde(skip_serializing_if = "Option::is_none")]
270    pub application_external_verification_link: Option<ApplicationLink>,
271    #[serde(skip_serializing_if = "Option::is_none")]
272    pub application_completion_link: Option<ApplicationLink>,
273    #[serde(skip_serializing_if = "Option::is_none")]
274    pub application_reason: Option<String>,
275}
276
277/// Request to update a user application
278#[derive(Debug, Clone, Serialize, Deserialize)]
279pub struct UpdateUserApplicationRequest {
280    #[serde(skip_serializing_if = "Option::is_none")]
281    pub first_name: Option<String>,
282    #[serde(skip_serializing_if = "Option::is_none")]
283    pub last_name: Option<String>,
284    #[serde(skip_serializing_if = "Option::is_none")]
285    pub birth_date: Option<String>,
286    #[serde(skip_serializing_if = "Option::is_none")]
287    pub national_id: Option<String>,
288    #[serde(skip_serializing_if = "Option::is_none")]
289    pub country_of_issue: Option<String>,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub address: Option<Address>,
292    #[serde(skip_serializing_if = "Option::is_none")]
293    pub ip_address: Option<String>,
294    #[serde(skip_serializing_if = "Option::is_none")]
295    pub occupation: Option<String>,
296    #[serde(skip_serializing_if = "Option::is_none")]
297    pub annual_salary: Option<String>,
298    #[serde(skip_serializing_if = "Option::is_none")]
299    pub account_purpose: Option<String>,
300    #[serde(skip_serializing_if = "Option::is_none")]
301    pub expected_monthly_volume: Option<String>,
302    #[serde(skip_serializing_if = "Option::is_none")]
303    pub is_terms_of_service_accepted: Option<bool>,
304    #[serde(skip_serializing_if = "Option::is_none")]
305    pub has_existing_documents: Option<bool>,
306}
307
308// ============================================================================
309// Document Upload Models
310// ============================================================================
311
312/// Parameters for document upload
313#[derive(Debug, Clone)]
314pub struct DocumentUploadParams {
315    pub document_type: String,
316    pub side: String,
317    pub country: Option<String>,
318    pub country_code: Option<String>,
319    pub name: Option<String>, // Only for company documents
320    pub file_path: String,
321}