# noqa: D100 from datetime import datetime from datetime import timedelta from datetime import timezone from src.common import logger from src.common.ack_processor.utils.acks_splitter import split_on_successful_errors_and_awaited import config import json def process( # noqa: D103 ack_storage, unacked_deliveries, awaited_as_success_resolver, awaited_as_error_resolver, awaited_as_missing_resolver, show_data=False, ): acks = ack_storage.acks(unacked_deliveries[:config.LIMIT]) cutoff = datetime.now(tz=timezone.utc) - timedelta(hours=config.MISSING_HOURS_THRESHOLD) auto_retry_patterns = getattr(config, 'AUTO_RETRY_PATTERNS', []) split = split_on_successful_errors_and_awaited(acks, auto_retry_patterns=auto_retry_patterns, cutoff=cutoff) if split['successful']: awaited_as_success_resolver(split['successful']) if split['errors']: awaited_as_error_resolver(split['errors']) missing = [ ack for ack in split['awaited'] if datetime.fromisoformat(str(ack['datetime'])).replace(tzinfo=timezone.utc) < cutoff ] if missing: awaited_as_missing_resolver(missing) result = { 'processed': len(acks), 'awaited': len(split['awaited']) - len(missing), 'successful': len(split['successful']), 'errors': len(split['errors']), 'missing': len(missing), } if show_data: result['data'] = split logger.info(json.dumps(result)) return result