Skip to main content

potree_auth/user/domain/
mod.rs

1//! Details about a user of the application.
2
3use serde::Deserialize;
4use serde::Serialize;
5
6use crate::common::domain::Group;
7use crate::common::domain::utils::new_type::new_type;
8
9/// Represents an authenticated user of the application.
10#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
11#[cfg_attr(any(test, feature = "fake"), derive(fake::Dummy))]
12pub struct User {
13    pub id: UserId,
14    pub name: UserName,
15    pub email: EmailAddress,
16
17    /// The groups that a user is member of, thus has access to their respective
18    /// projects.
19    pub groups: Vec<Group>,
20}
21
22impl User {
23    /// Determines if the user is an admin.
24    pub fn is_admin(&self) -> bool {
25        self.groups.contains(&Group::new("admin"))
26    }
27}
28
29#[cfg(any(test, feature = "fake"))]
30impl User {
31    pub fn dummy_admin() -> Self {
32        use fake::Fake;
33        use fake::Faker;
34
35        use crate::common::domain::Group;
36
37        Self {
38            groups: [Group::new("admin"), Faker.fake()].into(),
39            ..Faker.fake()
40        }
41    }
42}
43
44new_type![
45    /// The name of a [`crate::domain::User`].
46    #[derive(Deserialize, Serialize)]
47    UserName(
48        #[cfg_attr(any(test, feature = "fake"), dummy(faker = "fake::faker::name::en::Name()"))]
49        String
50    )
51];
52
53new_type![
54    /// Represents an email address.
55    ///
56    /// > **Note:** This is not validated.
57    #[derive(Deserialize, Serialize)]
58    EmailAddress(
59        #[cfg_attr(any(test, feature = "fake"), dummy(faker = "fake::faker::internet::en::FreeEmail()"))]
60        String
61    )
62];
63
64new_type![
65    /// The unique id of a [`crate::domain::User`].
66    #[derive(Deserialize, Serialize)]
67    UserId(String)
68];
69
70#[cfg(test)]
71mod user_tests {
72    use fake::Fake;
73    use fake::Faker;
74
75    use super::*;
76
77    mod is_admin {
78        use super::*;
79
80        #[test]
81        fn should_return_true_if_user_is_part_of_admin_group() {
82            // Arrange
83            let user = User::dummy_admin();
84
85            // Act
86            let res = user.is_admin();
87
88            // Assert
89            assert!(res);
90        }
91
92        #[test]
93        fn should_return_false_if_user_is_not_part_of_admin_group() {
94            // Arrange
95            let user = User { ..Faker.fake() };
96
97            // Act
98            let res = user.is_admin();
99
100            // Assert
101            assert!(!res);
102        }
103    }
104}