use serde::{Deserialize, Serialize};
use super::HRoles;
#[derive(Debug,Clone, Copy,PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize,Hash)]
#[serde(rename_all = "lowercase")]
pub enum PermissionType {
Manageable,
Editable,
Readable,
ChildCreatable,
Renamable,
IconEditable,
DescriptionEditable,
Movable,
Copyable,
Importable,
Exportable,
Removable,
Sharable,
AllowSaveConfigurable,
AllowEditConfigurable,
TemplateCreatable,
ViewCreatable,
ViewRenamable,
ViewRemovable,
ViewMovable,
ViewExportable,
ViewFilterable,
ColumnSortable,
ColumnHideable,
FieldSortable,
FieldGroupable,
RowHighEditable,
ColumnWidthEditable,
ColumnCountEditable,
RowSortable,
FieldCreatable,
FieldRenamable,
FieldPropertyEditable,
FieldRemovable,
RowCreatable,
RowRemovable,
RowArchivable,
RowUnarchivable,
CellEditable,
FieldPermissionManageable,
ViewPermissionManageable,
ViewLayoutEditable,
ViewStyleEditable,
ViewKeyFieldEditable,
ViewColorOptionEditable,
ViewLockManageable,
ViewManualSaveManageable,
ViewOptionSaveEditable,
IsDeleted,
}
#[derive(Deserialize, Debug, Serialize, Clone,Default)]
pub struct FieldPermission{
#[serde(default)]
#[serde(rename = "canEdit")]
pub can_edit: bool,
#[serde(default)]
#[serde(rename = "canRead")]
pub can_read: bool,
#[serde(default)]
#[serde(rename = "canRemove")]
pub can_remove: bool,
#[serde(default)]
#[serde(rename = "isAdmin")]
pub is_admin: bool,
#[serde(default)]
#[serde(rename = "isOwner")]
pub is_owner: bool,
#[serde(default)]
#[serde(rename = "memberCount")]
pub member_count: i32,
#[serde(default)]
#[serde(rename = "nodeManageable")]
pub node_manageable: bool,
#[serde(default)]
#[serde(rename = "permissionExtend")]
pub permission_extend: bool,
}
#[derive(Deserialize, Debug, Serialize, Clone,PartialEq)]
pub struct AppPermission {
#[serde(skip_serializing_if = "Option::is_none")]
pub node_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub datasheet_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manageable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub readable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub child_creatable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub renamable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub movable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub copyable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub importable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exportable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub removable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sharable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_save_configurable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_edit_configurable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub template_creatable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_creatable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_renamable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_removable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_movable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_exportable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_filterable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub column_sortable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub column_hideable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_sortable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_groupable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub row_high_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub column_width_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub column_count_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub row_sortable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_creatable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_renamable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_property_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_removable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub row_creatable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub row_removable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub row_archivable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub row_unarchivable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cell_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_permission_manageable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_permission_manageable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_layout_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_style_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_key_field_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_color_option_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_lock_manageable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_manual_save_manageable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub view_option_save_editable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_deleted: Option<bool>,
}
impl AppPermission {
pub fn has_permission(&self, permission: PermissionType) -> bool {
match permission {
PermissionType::Manageable => self.manageable.unwrap_or(false),
PermissionType::Editable => self.editable.unwrap_or(false),
PermissionType::Readable => self.readable.unwrap_or(false),
PermissionType::ChildCreatable => self.child_creatable.unwrap_or(false),
PermissionType::Renamable => self.renamable.unwrap_or(false),
PermissionType::IconEditable => self.icon_editable.unwrap_or(false),
PermissionType::DescriptionEditable => self.description_editable.unwrap_or(false),
PermissionType::Movable => self.movable.unwrap_or(false),
PermissionType::Copyable => self.copyable.unwrap_or(false),
PermissionType::Importable => self.importable.unwrap_or(false),
PermissionType::Exportable => self.exportable.unwrap_or(false),
PermissionType::Removable => self.removable.unwrap_or(false),
PermissionType::Sharable => self.sharable.unwrap_or(false),
PermissionType::AllowSaveConfigurable => self.allow_save_configurable.unwrap_or(false),
PermissionType::AllowEditConfigurable => self.allow_edit_configurable.unwrap_or(false),
PermissionType::TemplateCreatable => self.template_creatable.unwrap_or(false),
PermissionType::ViewCreatable => self.view_creatable.unwrap_or(false),
PermissionType::ViewRenamable => self.view_renamable.unwrap_or(false),
PermissionType::ViewRemovable => self.view_removable.unwrap_or(false),
PermissionType::ViewMovable => self.view_movable.unwrap_or(false),
PermissionType::ViewExportable => self.view_exportable.unwrap_or(false),
PermissionType::ViewFilterable => self.view_filterable.unwrap_or(false),
PermissionType::ColumnSortable => self.column_sortable.unwrap_or(false),
PermissionType::ColumnHideable => self.column_hideable.unwrap_or(false),
PermissionType::FieldSortable => self.field_sortable.unwrap_or(false),
PermissionType::FieldGroupable => self.field_groupable.unwrap_or(false),
PermissionType::RowHighEditable => self.row_high_editable.unwrap_or(false),
PermissionType::ColumnWidthEditable => self.column_width_editable.unwrap_or(false),
PermissionType::ColumnCountEditable => self.column_count_editable.unwrap_or(false),
PermissionType::RowSortable => self.row_sortable.unwrap_or(false),
PermissionType::FieldCreatable => self.field_creatable.unwrap_or(false),
PermissionType::FieldRenamable => self.field_renamable.unwrap_or(false),
PermissionType::FieldPropertyEditable => self.field_property_editable.unwrap_or(false),
PermissionType::FieldRemovable => self.field_removable.unwrap_or(false),
PermissionType::RowCreatable => self.row_creatable.unwrap_or(false),
PermissionType::RowRemovable => self.row_removable.unwrap_or(false),
PermissionType::RowArchivable => self.row_archivable.unwrap_or(false),
PermissionType::RowUnarchivable => self.row_unarchivable.unwrap_or(false),
PermissionType::CellEditable => self.cell_editable.unwrap_or(false),
PermissionType::FieldPermissionManageable => self.field_permission_manageable.unwrap_or(false),
PermissionType::ViewLayoutEditable => self.view_layout_editable.unwrap_or(false),
PermissionType::ViewStyleEditable => self.view_style_editable.unwrap_or(false),
PermissionType::ViewKeyFieldEditable => self.view_key_field_editable.unwrap_or(false),
PermissionType::ViewColorOptionEditable => self.view_color_option_editable.unwrap_or(false),
PermissionType::ViewLockManageable => self.view_lock_manageable.unwrap_or(false),
PermissionType::ViewManualSaveManageable => self.view_manual_save_manageable.unwrap_or(false),
PermissionType::ViewOptionSaveEditable => self.view_option_save_editable.unwrap_or(false),
PermissionType::IsDeleted => self.is_deleted.unwrap_or(false),
PermissionType::ViewPermissionManageable => self.view_permission_manageable.unwrap_or(false),
}
}
pub fn get_permission(id: Option<String>, role: HRoles) -> Self {
let mut base_permission = AppPermission::default_permissions(id.clone(), id);
match role {
HRoles::Owner => base_permission.set_admin_permissions(),
HRoles::Manager => base_permission.set_member_permissions(),
HRoles::UpdateOnly => base_permission.set_update_permissions(),
HRoles::ReadOnly => base_permission.set_viewer_permissions(),
HRoles::Editor => base_permission.set_editor_permissions(),
}
base_permission
}
fn default_permissions(node_id: Option<String>, datasheet_id: Option<String>) -> Self {
AppPermission {
node_id,
datasheet_id,
manageable: Some(false),
editable: Some(false),
readable: Some(true),
child_creatable: Some(false),
renamable: Some(false),
icon_editable: Some(false),
description_editable: Some(false),
movable: Some(false),
copyable: Some(false),
importable: Some(false),
exportable: Some(false),
removable: Some(false),
sharable: Some(false),
allow_save_configurable: Some(false),
allow_edit_configurable: Some(false),
template_creatable: Some(false),
view_creatable: Some(false),
view_renamable: Some(false),
view_removable: Some(false),
view_movable: Some(false),
view_exportable: Some(false),
view_filterable: Some(false),
column_sortable: Some(false),
column_hideable: Some(false),
field_sortable: Some(false),
field_groupable: Some(false),
row_high_editable: Some(false),
column_width_editable: Some(false),
column_count_editable: Some(false),
row_sortable: Some(false),
field_creatable: Some(false),
field_renamable: Some(false),
field_property_editable: Some(false),
field_removable: Some(false),
row_creatable: Some(false),
row_removable: Some(false),
row_archivable: Some(false),
row_unarchivable: Some(false),
cell_editable: Some(false),
field_permission_manageable: Some(false),
view_layout_editable: Some(false),
view_style_editable: Some(false),
view_key_field_editable: Some(false),
view_color_option_editable: Some(false),
view_lock_manageable: Some(false),
view_manual_save_manageable: Some(false),
view_option_save_editable: Some(false),
is_deleted: Some(false),
view_permission_manageable: Some(false),
}
}
fn set_admin_permissions(&mut self) {
self.readable = Some(true);
self.manageable = Some(true);
self.editable = Some(true);
self.child_creatable = Some(true);
self.renamable = Some(true);
self.icon_editable = Some(true);
self.description_editable = Some(true);
self.movable = Some(true);
self.copyable = Some(true);
self.importable = Some(true);
self.exportable = Some(true);
self.removable = Some(true);
self.sharable = Some(true);
self.allow_save_configurable = Some(true);
self.allow_edit_configurable = Some(true);
self.template_creatable = Some(true);
self.view_creatable = Some(true);
self.view_renamable = Some(true);
self.view_removable = Some(true);
self.view_movable = Some(true);
self.view_exportable = Some(true);
self.view_filterable = Some(true);
self.column_sortable = Some(true);
self.column_hideable = Some(true);
self.field_sortable = Some(true);
self.field_groupable = Some(true);
self.row_high_editable = Some(true);
self.column_width_editable = Some(true);
self.column_count_editable = Some(true);
self.row_sortable = Some(true);
self.field_creatable = Some(true);
self.field_renamable = Some(true);
self.field_property_editable = Some(true);
self.field_removable = Some(true);
self.row_creatable = Some(true);
self.row_removable = Some(true);
self.row_archivable = Some(true);
self.row_unarchivable = Some(true);
self.cell_editable = Some(true);
self.field_permission_manageable = Some(true);
self.view_layout_editable = Some(true);
self.view_style_editable = Some(true);
self.view_key_field_editable = Some(true);
self.view_color_option_editable = Some(true);
self.view_lock_manageable = Some(true);
self.view_manual_save_manageable = Some(true);
self.view_option_save_editable = Some(true);
self.view_permission_manageable = Some(true);
self.is_deleted = Some(true);
self.readable = Some(true);
self.view_permission_manageable = Some(true);
}
fn set_member_permissions(&mut self) {
self.readable = Some(true);
self.editable = Some(true);
self.field_creatable = Some(true);
self.row_creatable = Some(true);
self.manageable = Some(true);
self.editable = Some(true);
self.child_creatable = Some(true);
self.renamable = Some(true);
self.icon_editable = Some(true);
self.description_editable = Some(true);
self.movable = Some(true);
self.copyable = Some(true);
self.importable = Some(true);
self.exportable = Some(true);
self.removable = Some(true);
self.allow_save_configurable = Some(true);
self.allow_edit_configurable = Some(true);
self.template_creatable = Some(true);
self.view_creatable = Some(true);
self.view_renamable = Some(true);
self.view_removable = Some(true);
self.view_movable = Some(true);
self.view_exportable = Some(true);
self.view_filterable = Some(true);
self.column_sortable = Some(true);
self.column_hideable = Some(true);
self.field_sortable = Some(true);
self.field_groupable = Some(true);
self.row_high_editable = Some(true);
self.column_width_editable = Some(true);
self.column_count_editable = Some(true);
self.row_sortable = Some(true);
self.field_creatable = Some(true);
self.field_renamable = Some(true);
self.row_creatable = Some(true);
self.cell_editable = Some(true);
self.view_layout_editable = Some(true);
self.view_style_editable = Some(true);
self.view_key_field_editable = Some(true);
self.view_color_option_editable = Some(true);
self.view_lock_manageable = Some(true);
self.view_manual_save_manageable = Some(true);
self.view_option_save_editable = Some(true);
}
fn set_editor_permissions(&mut self) {
self.editable = Some(false);
self.readable = Some(true);
self.row_creatable = Some(true);
self.cell_editable = Some(true);
}
fn set_viewer_permissions(&mut self) {
self.readable = Some(true);
self.row_creatable = Some(false);
self.editable = Some(false);
self.removable = Some(false);
}
fn set_update_permissions(&mut self) {
self.cell_editable = Some(true);
self.readable=Some(true)
}
}