sofie_identity/role/
factory.rs1use 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
54pub 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}