crcnt_rbac 0.1.8

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

#[doc(hidden)]
#[derive(Domain)]
#[domain_commands(entity, store)]
#[domain_store(table_name = "t_rbac_role", params_extractor = "crate::params_extractor")]
struct __Role__ {
  id:          EntityId,
  code:        String,
  name:        String,
  #[domain_value(optional = true)]
  description: String,
  level:       u8,
  #[domain_value(enums = "Active|Inactive")]
  status:      String,
  #[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_feature")]
struct __RoleFeature__ {
  id:         EntityId,
  #[domain_value(skip_new_type = true)]
  role_id:    RoleId,
  #[domain_value(skip_new_type = true)]
  feature_id: FeatureId,
  #[domain_value(skip_new_type = true)]
  owner:      Owner,
  #[domain_value(skip_new_type = true)]
  create_at:  CreateAt,
}

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

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

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