StandardResourceProvider

Struct StandardResourceProvider 

Source
pub struct StandardResourceProvider<S: StorageProvider> { /* private fields */ }
Expand description

Standard resource provider with pluggable storage backend.

This provider separates SCIM protocol logic from storage concerns by delegating data persistence to a StorageProvider implementation while handling all SCIM-specific business logic, validation, and metadata management.

Implementations§

Source§

impl<S: StorageProvider> StandardResourceProvider<S>

Source

pub fn new(storage: S) -> Self

Create a new standard provider with the given storage backend.

Source

pub async fn clear(&self)

Clear all data from storage.

Removes all resources from all tenants by delegating to the storage backend’s clear operation. This method provides a consistent interface for clearing data regardless of the underlying storage implementation.

§Behavior
  • Delegates to StorageProvider::clear for actual data removal
  • Logs warnings if the clear operation fails
  • Primarily intended for testing scenarios
  • After successful clearing, get_stats should report zero resources
§Examples
use scim_server::providers::StandardResourceProvider;
use scim_server::storage::InMemoryStorage;

let storage = InMemoryStorage::new();
let provider = StandardResourceProvider::new(storage);

// ... create some resources ...
provider.clear().await;

let stats = provider.get_stats().await;
assert_eq!(stats.total_resources, 0);
Source

pub async fn get_stats(&self) -> InMemoryStats

Get comprehensive statistics about stored data across all tenants.

Dynamically discovers all tenants and resource types from storage to provide accurate statistics without relying on hardcoded patterns. This method uses the storage provider’s discovery capabilities to enumerate actual data.

§Returns

InMemoryStats containing:

  • tenant_count: Number of tenants with at least one resource
  • total_resources: Sum of all resources across all tenants and types
  • resource_type_count: Number of distinct resource types found
  • resource_types: List of all resource type names
§Errors

This method handles storage errors gracefully by using default values (empty collections) when discovery operations fail.

§Examples
use scim_server::providers::StandardResourceProvider;
use scim_server::storage::InMemoryStorage;
use scim_server::resource::{RequestContext, TenantContext};

let storage = InMemoryStorage::new();
let provider = StandardResourceProvider::new(storage);

// ... create resources in multiple tenants ...

let stats = provider.get_stats().await;
println!("Total resources: {}", stats.total_resources);
println!("Active tenants: {}", stats.tenant_count);
println!("Resource types: {:?}", stats.resource_types);
Source

pub async fn list_resources_in_tenant( &self, tenant_id: &str, resource_type: &str, ) -> Vec<Resource>

List all resources of a specific type in a tenant.

Source§

impl<S: StorageProvider> StandardResourceProvider<S>

Source

pub async fn conditional_update( &self, resource_type: &str, id: &str, data: Value, expected_version: &ScimVersion, context: &RequestContext, ) -> Result<ConditionalResult<VersionedResource>, InMemoryError>

Source

pub async fn conditional_delete( &self, resource_type: &str, id: &str, expected_version: &ScimVersion, context: &RequestContext, ) -> Result<ConditionalResult<()>, InMemoryError>

Source

pub async fn conditional_patch_resource( &self, resource_type: &str, id: &str, patch_request: &Value, expected_version: &ScimVersion, context: &RequestContext, ) -> Result<ConditionalResult<VersionedResource>, InMemoryError>

Source

pub async fn get_versioned_resource( &self, resource_type: &str, id: &str, context: &RequestContext, ) -> Result<Option<VersionedResource>, InMemoryError>

Source

pub async fn create_versioned_resource( &self, resource_type: &str, data: Value, context: &RequestContext, ) -> Result<VersionedResource, InMemoryError>

Trait Implementations§

Source§

impl<S: Clone + StorageProvider> Clone for StandardResourceProvider<S>

Source§

fn clone(&self) -> StandardResourceProvider<S>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<S: Debug + StorageProvider> Debug for StandardResourceProvider<S>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<S: StorageProvider> ResourceProvider for StandardResourceProvider<S>

Source§

fn apply_patch_operation( &self, resource_data: &mut Value, operation: &Value, ) -> Result<(), Self::Error>

Override the default patch operation implementation

Source§

type Error = InMemoryError

Error type returned by all provider operations
Source§

async fn create_resource( &self, resource_type: &str, data: Value, context: &RequestContext, ) -> Result<Resource, Self::Error>

Create a resource for the tenant specified in the request context. Read more
Source§

async fn get_resource( &self, resource_type: &str, id: &str, context: &RequestContext, ) -> Result<Option<Resource>, Self::Error>

Get a resource by ID from the tenant specified in the request context. Read more
Source§

async fn update_resource( &self, resource_type: &str, id: &str, data: Value, context: &RequestContext, ) -> Result<Resource, Self::Error>

Update a resource in the tenant specified in the request context. Read more
Source§

async fn delete_resource( &self, resource_type: &str, id: &str, context: &RequestContext, ) -> Result<(), Self::Error>

Delete a resource from the tenant specified in the request context. Read more
Source§

async fn list_resources( &self, resource_type: &str, query: Option<&ListQuery>, context: &RequestContext, ) -> Result<Vec<Resource>, Self::Error>

List resources from the tenant specified in the request context. Read more
Source§

async fn find_resource_by_attribute( &self, resource_type: &str, attribute: &str, value: &Value, context: &RequestContext, ) -> Result<Option<Resource>, Self::Error>

Find a resource by attribute value within the tenant specified in the request context. Read more
Source§

async fn resource_exists( &self, resource_type: &str, id: &str, context: &RequestContext, ) -> Result<bool, Self::Error>

Check if a resource exists within the tenant specified in the request context. Read more
Source§

async fn patch_resource( &self, resource_type: &str, id: &str, patch_request: &Value, context: &RequestContext, ) -> Result<Resource, Self::Error>

Apply PATCH operations to a resource within the tenant specified in the request context. Read more
Source§

fn conditional_update( &self, resource_type: &str, id: &str, data: Value, expected_version: &ScimVersion, context: &RequestContext, ) -> impl Future<Output = Result<ConditionalResult<VersionedResource>, Self::Error>> + Send
where Self: Sync,

Conditionally update a resource if the version matches. Read more
Source§

fn conditional_delete( &self, resource_type: &str, id: &str, expected_version: &ScimVersion, context: &RequestContext, ) -> impl Future<Output = Result<ConditionalResult<()>, Self::Error>> + Send
where Self: Sync,

Conditionally delete a resource if the version matches. Read more
Source§

fn get_versioned_resource( &self, resource_type: &str, id: &str, context: &RequestContext, ) -> impl Future<Output = Result<Option<VersionedResource>, Self::Error>> + Send
where Self: Sync,

Get a resource with its version information. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ResourceProviderExt for T

Source§

fn create_single_tenant( &self, resource_type: &str, data: Value, request_id: Option<String>, ) -> impl Future<Output = Result<Resource, Self::Error>> + Send
where Self: Sync,

Convenience method for single-tenant resource creation. Read more
Source§

fn create_multi_tenant( &self, tenant_id: &str, resource_type: &str, data: Value, request_id: Option<String>, ) -> impl Future<Output = Result<Resource, Self::Error>> + Send
where Self: Sync,

Convenience method for multi-tenant resource creation. Read more
Source§

fn get_single_tenant( &self, resource_type: &str, id: &str, request_id: Option<String>, ) -> impl Future<Output = Result<Option<Resource>, Self::Error>> + Send
where Self: Sync,

Convenience method for single-tenant resource retrieval.
Source§

fn get_multi_tenant( &self, tenant_id: &str, resource_type: &str, id: &str, request_id: Option<String>, ) -> impl Future<Output = Result<Option<Resource>, Self::Error>> + Send
where Self: Sync,

Convenience method for multi-tenant resource retrieval.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> TenantValidator for T

Source§

fn validate_tenant_context( &self, expected_tenant_id: &str, context: &RequestContext, ) -> Result<(), String>

Validate that the context has the expected tenant.
Source§

fn validate_single_tenant_context( &self, context: &RequestContext, ) -> Result<(), String>

Validate that the context is for single-tenant operation.
Source§

fn require_tenant_context(&self, context: &RequestContext) -> Result<(), String>

Extract tenant context or return error for multi-tenant operations.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<P> ToSingleTenant<P> for P

Source§

fn to_single_tenant(self) -> TenantValidatingProvider<P>

Convert to a provider that validates single-tenant contexts.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.