crcnt_rbac 0.1.8

CRCNT RBAC Component
Documentation
use {crate::role::RoleId,
     crcnt_ddd::value::{CreateAt,
                        Creator,
                        Deleted,
                        EntityId,
                        Owner,
                        StrIr,
                        UpdateAt,
                        Updater,
                        UtcDateTime},
     crcnt_ddd_macros::Domain,
     mysql_common::value::{convert::{ConvIr,
                                     FromValue,
                                     FromValueError},
                           Value}};

#[doc(hidden)]
#[derive(Domain)]
#[domain_commands(entity, store)]
#[domain_store(params_extractor = "crate::params_extractor", table_name = "t_rbac_operator")]
struct __Operator__ {
  id:            EntityId,
  #[domain_value(optional = true)]
  profile_id:    String,
  name:          String,
  #[domain_value(enums = "LoginName|Email|Mobile")]
  name_type:     String,
  password:      String,
  #[domain_value(enums = "Active|Inactive|NeedChangePwd")]
  status:        String,
  #[domain_value(optional = true)]
  last_login_at: UtcDateTime,
  failed_times:  u8,
  #[domain_value(skip_new_type = true)]
  owner:         Owner,
  #[domain_value(skip_new_type = true)]
  creator:       Creator,
  #[domain_value(skip_new_type = true)]
  updater:       Updater,
  #[domain_value(skip_new_type = true)]
  create_at:     CreateAt,
  #[domain_value(skip_new_type = true)]
  update_at:     UpdateAt,
  #[domain_value(skip_new_type = true)]
  deleted:       Deleted,
}

#[doc(hidden)]
#[derive(Domain)]
#[domain_commands(entity, store)]
#[domain_store(params_extractor = "crate::params_extractor", table_name = "t_rbac_role_operator")]
struct __RoleOperator__ {
  id:          EntityId,
  #[domain_value(skip_new_type = true)]
  operator_id: OperatorId,
  #[domain_value(skip_new_type = true)]
  role_id:     RoleId,
  #[domain_value(skip_new_type = true)]
  owner:       Owner,
  #[domain_value(skip_new_type = true)]
  create_at:   CreateAt,
}

impl FromValue for OperatorId {
  type Intermediate = StrIr;
}
impl ConvIr<OperatorId> for StrIr {
  fn new(v: Value) -> Result<Self, FromValueError> {
    let bytes = Vec::<u8>::from_value_opt(v)?;
    Ok(StrIr { bytes })
  }

  fn commit(self) -> OperatorId {
    let creator = String::from_utf8_lossy(&self.bytes).to_string();
    OperatorId(EntityId::new(creator))
  }

  fn rollback(self) -> Value { Value::from(self.bytes) }
}

impl OperatorPassword {
  pub fn change_me() -> Self { OperatorPassword::new("ChangeMe!") }
}

#[cfg(test)]
mod test {
  use {super::*,
       ulid::Ulid};

  struct Store;

  impl OperatorEntityCRUDStmt for Store {}

  impl OperatorEntityCRUDExec for Store {}
  #[test]
  fn test() {
    let operator = OperatorEntity::builder().id(EntityId::new(Ulid::new()).into())
                                            .profile_id("M01".into())
                                            .name("admin".into())
                                            .name_type(OperatorNameType::LoginName)
                                            .password("12345".into())
                                            .status(OperatorStatus::Active)
                                            .last_login_at(UtcDateTime::now().into())
                                            .failed_times(0u8.into())
                                            .owner("CNT".into())
                                            .creator("--".into())
                                            .updater("--".into())
                                            .create_at(CreateAt::now())
                                            .update_at(UpdateAt::now())
                                            .deleted(true.into())
                                            .build();
    println!("test: {:?}", operator);
    println!("select sql: {}", Store.stmt_select_operator_entity());
  }
}