Skip to main content

slack_morphism/models/common/
user.rs

1use 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 huddle_state: Option<SlackHuddleState>,
43    pub huddle_state_expiration_ts: Option<SlackDateTime>,
44    pub display_name_normalized: Option<String>,
45    pub email: Option<EmailAddress>,
46    #[serde(flatten)]
47    pub icon: Option<SlackIcon>,
48    pub team: Option<SlackTeamId>,
49    pub start_date: Option<SlackDate>,
50    pub first_name: Option<String>,
51    pub last_name: Option<String>,
52    #[serde(default)]
53    #[serde_as(as = "NoneAsEmptyString")]
54    pub phone: Option<PhoneNumber>,
55    pub pronouns: Option<String>,
56    pub title: Option<String>,
57
58    pub fields: Option<HashMap<SlackUserProfileFieldId, SlackUserProfileFieldValue>>,
59}
60
61#[skip_serializing_none]
62#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
63pub struct SlackUserFlags {
64    pub is_admin: Option<bool>,
65    pub is_app_user: Option<bool>,
66    pub is_bot: Option<bool>,
67    pub is_invited_user: Option<bool>,
68    pub is_owner: Option<bool>,
69    pub is_primary_owner: Option<bool>,
70    pub is_restricted: Option<bool>,
71    pub is_stranger: Option<bool>,
72    pub is_ultra_restricted: Option<bool>,
73    pub has_2fa: Option<bool>,
74}
75
76#[skip_serializing_none]
77#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
78pub struct SlackBasicUserInfo {
79    pub id: SlackUserId,
80    pub team_id: Option<SlackTeamId>,
81    pub username: Option<String>,
82    pub name: Option<String>,
83}
84
85#[serde_as]
86#[skip_serializing_none]
87#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
88pub struct SlackUserGroup {
89    pub id: SlackUserGroupId,
90    pub team_id: SlackTeamId,
91    pub enterprise_subteam_id: Option<SlackEnterpriseSubteamId>,
92    pub is_usergroup: Option<bool>,
93    pub is_subteam: Option<bool>,
94    pub name: String,
95    pub description: Option<String>,
96    pub handle: String,
97    pub is_external: bool,
98    pub auto_provision: Option<bool>,
99    pub date_create: SlackDateTime,
100    pub date_update: Option<SlackDateTime>,
101    pub date_delete: Option<SlackDateTime>,
102    pub auto_type: Option<SlackAutoType>,
103    pub created_by: SlackUserId,
104    pub updated_by: Option<SlackUserId>,
105    pub deleted_by: Option<SlackUserId>,
106    pub prefs: SlackUserGroupPrefs,
107    pub users: Option<Vec<SlackUserId>>,
108    pub user_count: usize,
109    pub channel_count: Option<u64>,
110}
111
112#[skip_serializing_none]
113#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
114#[serde(rename_all = "snake_case")]
115pub enum SlackAutoType {
116    Admin,
117    Owner,
118}
119
120#[skip_serializing_none]
121#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
122pub struct SlackUserGroupPrefs {
123    pub channels: Vec<SlackChannelId>,
124    pub groups: Vec<SlackUserGroupId>,
125}
126
127#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize)]
128#[serde(rename_all = "snake_case")]
129pub enum SlackHuddleState {
130    InAHuddle,
131    DefaultUnset,
132    #[serde(untagged)]
133    Other(String),
134}
135
136#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
137pub struct SlackAvatarHash(pub String);
138
139#[skip_serializing_none]
140#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
141pub struct SlackEnterpriseUser {
142    pub id: SlackUserId,
143    pub enterprise_id: SlackEnterpriseId,
144    pub enterprise_name: Option<String>,
145    #[serde(flatten)]
146    pub flags: SlackUserFlags,
147    pub teams: Option<Vec<SlackTeamId>>,
148}
149
150#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
151pub struct SlackUserProfileFieldId(pub String);
152
153#[serde_as]
154#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
155pub struct SlackUserProfileFieldValue {
156    pub value: String,
157    #[serde(default)]
158    #[serde_as(as = "NoneAsEmptyString")]
159    pub alt: Option<String>,
160}