Source code for julee.repositories.minio.document_policy_validation
"""
Minio implementation of DocumentPolicyValidationRepository.
This module provides a Minio-based implementation of the
DocumentPolicyValidationRepository protocol that follows the Clean
Architecture patterns defined in the Fun-Police Framework. It handles
document policy validation storage as JSON objects in Minio, ensuring
idempotency and proper error handling.
The implementation stores document policy validations as JSON objects in
Minio, following the large payload handling pattern from the architectural
guidelines. Each validation is stored as a complete JSON document with its
status, scores, transformation results, and metadata.
"""
import logging
from julee.domain.models.policy import DocumentPolicyValidation
from julee.domain.repositories.document_policy_validation import (
DocumentPolicyValidationRepository,
)
from .client import MinioClient, MinioRepositoryMixin
[docs]
class MinioDocumentPolicyValidationRepository(
DocumentPolicyValidationRepository, MinioRepositoryMixin
):
"""
Minio implementation of DocumentPolicyValidationRepository using Minio for
persistence.
This implementation stores document policy validations as JSON objects in
the "document-policy-validations" bucket. Each validation includes its
complete status tracking, validation scores, transformation results, and
metadata.
"""
def __init__(self, client: MinioClient) -> None:
"""Initialize repository with Minio client.
Args:
client: MinioClient protocol implementation (real or fake)
"""
[docs]
self.logger = logging.getLogger("MinioDocumentPolicyValidationRepository")
[docs]
self.validations_bucket = "document-policy-validations"
self.ensure_buckets_exist(self.validations_bucket)
[docs]
async def get(self, validation_id: str) -> DocumentPolicyValidation | None:
"""Retrieve a document policy validation by ID."""
return self.get_json_object(
bucket_name=self.validations_bucket,
object_name=validation_id,
model_class=DocumentPolicyValidation,
not_found_log_message="Document policy validation not found",
error_log_message="Error retrieving document policy validation",
extra_log_data={"validation_id": validation_id},
)
[docs]
async def save(self, validation: DocumentPolicyValidation) -> None:
"""Save a document policy validation to Minio."""
# Update timestamps
self.update_timestamps(validation)
self.put_json_object(
bucket_name=self.validations_bucket,
object_name=validation.validation_id,
model=validation,
success_log_message="Document policy validation saved " "successfully",
error_log_message="Error saving document policy validation",
extra_log_data={
"validation_id": validation.validation_id,
"input_document_id": validation.input_document_id,
"policy_id": validation.policy_id,
"status": validation.status.value,
"validation_scores_count": len(validation.validation_scores),
"has_transformations": (
validation.transformed_document_id is not None
or validation.post_transform_validation_scores is not None
),
"passed": validation.passed,
},
)
[docs]
async def generate_id(self) -> str:
"""Generate a unique validation identifier."""
return self.generate_id_with_prefix("validation")
[docs]
async def get_many(
self, validation_ids: list[str]
) -> dict[str, DocumentPolicyValidation | None]:
"""Retrieve multiple document policy validations by ID.
Args:
validation_ids: List of unique validation identifiers
Returns:
Dict mapping validation_id to DocumentPolicyValidation (or None if
not found)
"""
# Convert validation IDs to object names (direct mapping)
object_names = validation_ids
# Get objects from Minio using batch method
object_results = self.get_many_json_objects(
bucket_name=self.validations_bucket,
object_names=object_names,
model_class=DocumentPolicyValidation,
not_found_log_message="Document policy validation not found",
error_log_message="Error retrieving document policy validation",
extra_log_data={"validation_ids": validation_ids},
)
# Convert object names back to validation IDs for the result
result: dict[str, DocumentPolicyValidation | None] = {}
for validation_id in validation_ids:
result[validation_id] = object_results[validation_id]
return result