slack_morphism/models/common/
user.rs1use crate::*;
2use std::collections::HashMap;
3
4use crate::SlackUserId;
5use rsb_derive::Builder;
6use rvstruct::*;
7use serde::{Deserialize, Serialize};
8use serde_with::{serde_as, skip_serializing_none, DisplayFromStr, NoneAsEmptyString};
9
10#[skip_serializing_none]
11#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
12pub struct SlackUser {
13    pub id: SlackUserId,
14    pub team_id: Option<SlackTeamId>,
15    pub name: Option<String>,
16    pub locale: Option<SlackLocale>,
17    pub profile: Option<SlackUserProfile>,
18    #[serde(flatten)]
19    pub flags: SlackUserFlags,
20    pub tz: Option<String>,
21    pub tz_label: Option<String>,
22    pub tz_offset: Option<i32>,
23    pub updated: Option<SlackDateTime>,
24    pub deleted: Option<bool>,
25    pub color: Option<SlackColor>,
26    pub real_name: Option<String>,
27    pub enterprise_user: Option<SlackEnterpriseUser>,
28}
29
30#[serde_as]
31#[skip_serializing_none]
32#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
33pub struct SlackUserProfile {
34    pub id: Option<SlackUserId>,
35    pub display_name: Option<String>,
36    pub real_name: Option<String>,
37    pub real_name_normalized: Option<String>,
38    pub avatar_hash: Option<SlackAvatarHash>,
39    pub status_text: Option<String>,
40    pub status_expiration: Option<SlackDateTime>,
41    pub status_emoji: Option<SlackEmoji>,
42    pub display_name_normalized: Option<String>,
43    pub email: Option<EmailAddress>,
44    #[serde(flatten)]
45    pub icon: Option<SlackIcon>,
46    pub team: Option<SlackTeamId>,
47    pub start_date: Option<SlackDate>,
48    pub first_name: Option<String>,
49    pub last_name: Option<String>,
50    #[serde(default)]
51    #[serde_as(as = "NoneAsEmptyString")]
52    pub phone: Option<PhoneNumber>,
53    pub pronouns: Option<String>,
54    pub title: Option<String>,
55
56    pub fields: Option<HashMap<SlackUserProfileFieldId, SlackUserProfileFieldValue>>,
57}
58
59#[skip_serializing_none]
60#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
61pub struct SlackUserFlags {
62    pub is_admin: Option<bool>,
63    pub is_app_user: Option<bool>,
64    pub is_bot: Option<bool>,
65    pub is_invited_user: Option<bool>,
66    pub is_owner: Option<bool>,
67    pub is_primary_owner: Option<bool>,
68    pub is_restricted: Option<bool>,
69    pub is_stranger: Option<bool>,
70    pub is_ultra_restricted: Option<bool>,
71    pub has_2fa: Option<bool>,
72}
73
74#[skip_serializing_none]
75#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
76pub struct SlackBasicUserInfo {
77    pub id: SlackUserId,
78    pub team_id: Option<SlackTeamId>,
79    pub username: Option<String>,
80    pub name: Option<String>,
81}
82
83#[serde_as]
84#[skip_serializing_none]
85#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
86pub struct SlackUserGroup {
87    pub id: SlackUserGroupId,
88    pub team_id: SlackTeamId,
89    pub enterprise_subteam_id: Option<SlackEnterpriseSubteamId>,
90    pub is_usergroup: Option<bool>,
91    pub is_subteam: Option<bool>,
92    pub name: String,
93    pub description: Option<String>,
94    pub handle: String,
95    pub is_external: bool,
96    pub auto_provision: Option<bool>,
97    pub date_create: SlackDateTime,
98    pub date_update: Option<SlackDateTime>,
99    pub date_delete: Option<SlackDateTime>,
100    pub auto_type: Option<SlackAutoType>,
101    pub created_by: SlackUserId,
102    pub updated_by: Option<SlackUserId>,
103    pub deleted_by: Option<SlackUserId>,
104    pub prefs: SlackUserGroupPrefs,
105    pub users: Option<Vec<SlackUserId>>,
106    pub user_count: usize,
107    pub channel_count: Option<u64>,
108}
109
110#[skip_serializing_none]
111#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
112#[serde(rename_all = "snake_case")]
113pub enum SlackAutoType {
114    Admin,
115    Owner,
116}
117
118#[skip_serializing_none]
119#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
120pub struct SlackUserGroupPrefs {
121    pub channels: Vec<SlackChannelId>,
122    pub groups: Vec<SlackUserGroupId>,
123}
124
125#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
126pub struct SlackAvatarHash(pub String);
127
128#[skip_serializing_none]
129#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
130pub struct SlackEnterpriseUser {
131    pub id: SlackUserId,
132    pub enterprise_id: SlackEnterpriseId,
133    pub enterprise_name: Option<String>,
134    #[serde(flatten)]
135    pub flags: SlackUserFlags,
136    pub teams: Option<Vec<SlackTeamId>>,
137}
138
139#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
140pub struct SlackUserProfileFieldId(pub String);
141
142#[serde_as]
143#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
144pub struct SlackUserProfileFieldValue {
145    pub value: String,
146    #[serde(default)]
147    #[serde_as(as = "NoneAsEmptyString")]
148    pub alt: Option<String>,
149}