retention_service = $retention_service instanceof EventRetentionService ? $retention_service : new EventRetentionService(); } /** * Add an event and apply retention bounds. * * @param SpamEvent $event Event. * @param int $retention_days Retention days. * @param int $max_records Max records. */ public function add_event( SpamEvent $event, int $retention_days, int $max_records ): bool { if ( ! function_exists( 'update_option' ) ) { return false; } $events = $this->get_events(); $events[] = $event; $events = $this->retention_service->filter_events( $events, $retention_days, $max_records ); return (bool) update_option( self::OPTION_NAME, $this->events_to_arrays( $events ), false ); } /** * Get stored events. * * @return array */ public function get_events(): array { if ( ! function_exists( 'get_option' ) ) { return array(); } $stored = get_option( self::OPTION_NAME, array() ); if ( ! is_array( $stored ) ) { return array(); } $events = array(); foreach ( $stored as $event_data ) { if ( is_array( $event_data ) ) { $events[] = SpamEvent::from_array( $event_data ); } } return $this->retention_service->filter_events( $events, 90, 1000 ); } /** * Count stored events. */ public function count_events(): int { return count( $this->get_events() ); } /** * Convert events to arrays. * * @param array $events Events. * * @return array>> */ private function events_to_arrays( array $events ): array { $event_arrays = array(); foreach ( $events as $event ) { if ( $event instanceof SpamEvent ) { $event_arrays[] = $event->to_array(); } } return $event_arrays; } }