affine_core 0.0.5

AFFiNE primitive core.
Documentation
use super::{AclFacts, DocAclFacts};

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum DocPreviewExposure {
  Denied,
  MetadataNoIndex,
  PublicIndexable,
}

impl DocPreviewExposure {
  pub const fn as_str(self) -> &'static str {
    match self {
      Self::Denied => "denied",
      Self::MetadataNoIndex => "metadata_no_index",
      Self::PublicIndexable => "public_indexable",
    }
  }

  pub const fn is_allowed(self) -> bool {
    !matches!(self, Self::Denied)
  }
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum DocPreviewBasis {
  Missing,
  SharingDisabled,
  Public,
  Document,
  Workspace,
  Disabled,
}

impl DocPreviewBasis {
  pub const fn as_str(self) -> &'static str {
    match self {
      Self::Missing => "missing",
      Self::SharingDisabled => "sharing_disabled",
      Self::Public => "public",
      Self::Document => "document",
      Self::Workspace => "workspace",
      Self::Disabled => "disabled",
    }
  }
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct DocPreviewDecision {
  pub exposure: DocPreviewExposure,
  pub basis: DocPreviewBasis,
}

pub fn evaluate_workspace_preview(facts: &AclFacts) -> DocPreviewDecision {
  if !facts.sharing_enabled {
    return DocPreviewDecision {
      exposure: DocPreviewExposure::Denied,
      basis: DocPreviewBasis::SharingDisabled,
    };
  }
  if facts.workspace_public {
    return DocPreviewDecision {
      exposure: DocPreviewExposure::PublicIndexable,
      basis: DocPreviewBasis::Public,
    };
  }
  if facts.url_preview_enabled {
    return DocPreviewDecision {
      exposure: DocPreviewExposure::MetadataNoIndex,
      basis: DocPreviewBasis::Workspace,
    };
  }
  DocPreviewDecision {
    exposure: DocPreviewExposure::Denied,
    basis: DocPreviewBasis::Disabled,
  }
}

pub fn evaluate_doc_preview(doc: Option<&DocAclFacts>, workspace_preview_enabled: bool) -> DocPreviewDecision {
  let Some(doc) = doc else {
    return DocPreviewDecision {
      exposure: DocPreviewExposure::Denied,
      basis: DocPreviewBasis::Missing,
    };
  };
  if !doc.sharing_enabled {
    return DocPreviewDecision {
      exposure: DocPreviewExposure::Denied,
      basis: DocPreviewBasis::SharingDisabled,
    };
  }
  if doc.visibility_public && matches!(doc.public_role, Some(super::DocRole::External)) {
    return DocPreviewDecision {
      exposure: DocPreviewExposure::PublicIndexable,
      basis: DocPreviewBasis::Public,
    };
  }
  if doc.preview_enabled {
    return DocPreviewDecision {
      exposure: DocPreviewExposure::MetadataNoIndex,
      basis: DocPreviewBasis::Document,
    };
  }
  if workspace_preview_enabled {
    return DocPreviewDecision {
      exposure: DocPreviewExposure::MetadataNoIndex,
      basis: DocPreviewBasis::Workspace,
    };
  }
  DocPreviewDecision {
    exposure: DocPreviewExposure::Denied,
    basis: DocPreviewBasis::Disabled,
  }
}

#[cfg(test)]
#[path = "../tests/access_control/preview/tests.rs"]
mod tests;