shuttle_common/models/
team.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use strum::{Display, EnumString};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
7#[typeshare::typeshare]
8pub struct TeamListResponse {
9    pub teams: Vec<TeamResponse>,
10}
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
13#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
14#[typeshare::typeshare]
15pub struct TeamResponse {
16    pub id: String,
17    /// Display name
18    pub name: String,
19    /// Membership info of the calling user
20    pub membership: TeamMembership,
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
24#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
25#[typeshare::typeshare]
26pub struct TeamMembersResponse {
27    pub members: Vec<TeamMembership>,
28    pub invites: Vec<TeamInvite>,
29}
30
31#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
32#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
33#[typeshare::typeshare]
34pub struct TeamMembership {
35    pub user_id: String,
36    /// Role of the user in the team
37    pub role: TeamRole,
38    /// Auth0 display name
39    pub nickname: Option<String>,
40    /// URL to profile picture
41    pub picture: Option<String>,
42    /// Auth0 primary email
43    pub email: Option<String>,
44}
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
47#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
48#[typeshare::typeshare]
49pub struct TeamInvite {
50    pub id: String,
51    pub email: String,
52    /// Role of the user in the team
53    pub role: TeamRole,
54    pub expires_at: DateTime<Utc>,
55}
56
57#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Display, EnumString)]
58#[serde(rename_all = "lowercase")]
59#[strum(serialize_all = "lowercase")]
60#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
61#[typeshare::typeshare]
62pub enum TeamRole {
63    Owner,
64    Admin,
65    Member,
66
67    /// Forward compatibility
68    #[cfg(feature = "unknown-variants")]
69    #[doc(hidden)]
70    #[typeshare(skip)]
71    #[serde(untagged, skip_serializing)]
72    #[strum(default, to_string = "Unknown: {0}")]
73    Unknown(String),
74}
75
76/// Provide user id to add user.
77/// Provide email address to invite user via email.
78#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
79#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
80#[typeshare::typeshare]
81pub struct AddTeamMemberRequest {
82    pub user_id: Option<String>,
83    pub email: Option<String>,
84    /// Role of the user in the team
85    pub role: Option<TeamRole>,
86}