reinhardt-views 0.2.2

View layer aggregator for viewsets and views-core
Documentation
use reinhardt_db::orm::{
	CustomManager, FieldSelector, Filter, FilterOperator, FilterValue, Manager, Model, QuerySet,
};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub(crate) struct ManagedArticle {
	pub(crate) id: Option<i64>,
	pub(crate) title: String,
	pub(crate) is_archived: bool,
	pub(crate) tenant_id: i64,
}

#[derive(Clone)]
pub(crate) struct ManagedArticleFields;

impl FieldSelector for ManagedArticleFields {
	fn with_alias(self, _alias: &str) -> Self {
		self
	}
}

impl Model for ManagedArticle {
	type PrimaryKey = i64;
	type Fields = ManagedArticleFields;
	type Objects = VisibleArticleManager;

	fn table_name() -> &'static str {
		"managed_articles"
	}

	fn primary_key(&self) -> Option<Self::PrimaryKey> {
		self.id
	}

	fn set_primary_key(&mut self, value: Self::PrimaryKey) {
		self.id = Some(value);
	}

	fn new_fields() -> Self::Fields {
		ManagedArticleFields
	}
}

#[derive(Default)]
pub(crate) struct VisibleArticleManager;

impl CustomManager for VisibleArticleManager {
	type Model = ManagedArticle;

	fn new() -> Self {
		Self
	}

	fn all(&self) -> QuerySet<ManagedArticle> {
		Manager::<ManagedArticle>::new().all().filter(Filter::new(
			"is_archived",
			FilterOperator::Eq,
			FilterValue::Boolean(false),
		))
	}
}

pub(crate) fn explicit_queryset() -> QuerySet<ManagedArticle> {
	QuerySet::<ManagedArticle>::new().filter(Filter::new(
		"tenant_id",
		FilterOperator::Eq,
		FilterValue::Integer(42),
	))
}

pub(crate) fn assert_default_manager_queryset(queryset: QuerySet<ManagedArticle>) {
	let filters = queryset.filters();
	assert_eq!(filters.len(), 1);
	assert_eq!(filters[0].field, "is_archived");

	assert!(
		matches!(filters[0].operator, FilterOperator::Eq),
		"expected Eq operator, got: {:?}",
		filters[0].operator
	);
	assert!(
		matches!(filters[0].value, FilterValue::Boolean(false)),
		"expected Boolean(false) value, got: {:?}",
		filters[0].value
	);
}

pub(crate) fn assert_explicit_queryset(queryset: QuerySet<ManagedArticle>) {
	let filters = queryset.filters();
	assert_eq!(filters.len(), 1);
	assert_eq!(filters[0].field, "tenant_id");

	assert!(
		matches!(filters[0].operator, FilterOperator::Eq),
		"expected Eq operator, got: {:?}",
		filters[0].operator
	);
	assert!(
		matches!(filters[0].value, FilterValue::Integer(42)),
		"expected Integer(42) value, got: {:?}",
		filters[0].value
	);
}

pub(crate) fn assert_manager_and_request_filters(queryset: QuerySet<ManagedArticle>) {
	let filters = queryset.filters();
	assert_eq!(filters.len(), 2);
	assert_eq!(filters[0].field, "is_archived");
	assert_eq!(filters[1].field, "tenant_id");

	let manager_debug = format!("{:?}", filters[0]);
	assert!(
		manager_debug.contains("Boolean(false)"),
		"expected manager filter value Boolean(false), got: {manager_debug}"
	);

	let request_debug = format!("{:?}", filters[1]);
	assert!(
		request_debug.contains("String(\"7\")"),
		"expected request filter value String(\"7\"), got: {request_debug}"
	);
}