1use bon::Builder;
4use serde::{Deserialize, Serialize};
5
6use super::LettaId;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(rename_all = "lowercase")]
11pub enum IdentityType {
12 Org,
14 User,
16 Other,
18}
19
20impl std::fmt::Display for IdentityType {
21 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
22 match self {
23 Self::Org => write!(f, "org"),
24 Self::User => write!(f, "user"),
25 Self::Other => write!(f, "other"),
26 }
27 }
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct IdentityProperty {
33 pub key: String,
35 pub value: serde_json::Value,
37 #[serde(rename = "type")]
39 pub property_type: String,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct Identity {
45 pub id: LettaId,
47 pub identifier_key: String,
49 pub name: String,
51 pub identity_type: IdentityType,
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub agent_ids: Option<Vec<LettaId>>,
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub block_ids: Option<Vec<LettaId>>,
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub project_id: Option<LettaId>,
62 #[serde(skip_serializing_if = "Option::is_none")]
64 pub properties: Option<Vec<IdentityProperty>>,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
69pub struct CreateIdentityRequest {
70 pub identifier_key: String,
72 pub name: String,
74 pub identity_type: IdentityType,
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub project_id: Option<String>,
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub agent_ids: Option<Vec<String>>,
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub block_ids: Option<Vec<String>>,
85 #[serde(skip_serializing_if = "Option::is_none")]
87 pub properties: Option<Vec<IdentityProperty>>,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize, Default)]
92pub struct UpdateIdentityRequest {
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub identifier_key: Option<String>,
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub name: Option<String>,
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub identity_type: Option<IdentityType>,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub agent_ids: Option<Vec<String>>,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub block_ids: Option<Vec<String>>,
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub properties: Option<Vec<IdentityProperty>>,
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize, Default)]
115pub struct ListIdentitiesParams {
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub name: Option<String>,
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub project_id: Option<String>,
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub identifier_key: Option<String>,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub identity_type: Option<IdentityType>,
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub before: Option<String>,
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub after: Option<String>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub limit: Option<i32>,
137}
138
139#[cfg(test)]
140mod tests {
141 use super::*;
142
143 #[test]
144 fn test_identity_type_serialization() {
145 let user_json = serde_json::to_string(&IdentityType::User).unwrap();
147 assert_eq!(user_json, "\"user\"");
148
149 let org_json = serde_json::to_string(&IdentityType::Org).unwrap();
150 assert_eq!(org_json, "\"org\"");
151
152 let other_json = serde_json::to_string(&IdentityType::Other).unwrap();
153 assert_eq!(other_json, "\"other\"");
154
155 let user: IdentityType = serde_json::from_str("\"user\"").unwrap();
157 assert_eq!(user, IdentityType::User);
158
159 let org: IdentityType = serde_json::from_str("\"org\"").unwrap();
160 assert_eq!(org, IdentityType::Org);
161
162 let other: IdentityType = serde_json::from_str("\"other\"").unwrap();
163 assert_eq!(other, IdentityType::Other);
164 }
165}