Skip to main content

sofie_identity/role/
factory.rs

1use sofie::prelude::*;
2
3use super::{NAME_TAKEN, Role};
4
5pub async fn create_role(read: &Read, name: &str) -> Result<Role> {
6    let name = name.trim();
7    if name.is_empty() {
8        return Err(Error::invalid("name", "is required"));
9    }
10    let taken = Role::query()
11        .where_(Role::NAME.eq(name.to_owned()))
12        .exists(read)
13        .await?;
14    if taken {
15        return Err(Error::invalid("name", NAME_TAKEN));
16    }
17    Ok(Role {
18        meta: Meta::new()?,
19        name: name.to_owned(),
20    })
21}
22
23#[cfg(feature = "permitted-screens")]
24#[derive(Input)]
25pub struct RoleName {
26    #[required]
27    #[unique]
28    name: String,
29}
30
31#[cfg(feature = "permitted-screens")]
32impl sofie::db::Create for Role {
33    type Input = RoleName;
34    type Owner = ();
35
36    fn create(input: RoleName, (): ()) -> Result<Self> {
37        Ok(Role {
38            meta: Meta::new()?,
39            name: input.name.trim().to_owned(),
40        })
41    }
42}
43
44#[cfg(feature = "permitted-screens")]
45impl sofie::db::Update for Role {
46    type Input = RoleName;
47
48    fn update(&mut self, input: RoleName) -> Result<()> {
49        input.name.trim().clone_into(&mut self.name);
50        Ok(())
51    }
52}
53
54/// The role of that name, for a task or a seed naming one created before.
55pub async fn role_named(read: &Read, name: &str) -> Result<super::RoleId> {
56    Role::query()
57        .where_(Role::NAME.eq(name.trim().to_owned()))
58        .first(read)
59        .await?
60        .map(|role| role.id())
61        .ok_or_else(|| Error::invalid("role", format!("`{name}` is not a role")))
62}