'required|numeric|between:1,5', 'payload' => 'required', 'object_type' => 'required|alpha_dash|lowercase', 'object_id' => 'integer|default:0', 'author_id' => 'integer|default:0', 'slug' => 'required|alpha_dash', 'initiator' => 'required|in:system,manual', ); } /** * Get severity of the problem.. * * @since 2.0.0 * @return int */ public function get_severity() { return (int) $this->severity; } /** * Returns the Label for a given severity level. * * @since 2.0.0 * @return string */ public function get_severity_label() { $labels = array( self::SEVERITY_SUCCESS => __('Success', 'wp-ultimo'), self::SEVERITY_NEUTRAL => __('Neutral', 'wp-ultimo'), self::SEVERITY_INFO => __('Info', 'wp-ultimo'), self::SEVERITY_WARNING => __('Warning', 'wp-ultimo'), self::SEVERITY_FATAL => __('Fatal', 'wp-ultimo'), ); return isset($labels[ $this->get_severity() ]) ? $labels[ $this->get_severity() ] : __('Note', 'wp-ultimo'); } /** * Gets the classes for a given severity level. * * @since 2.0.0 * @return string */ public function get_severity_class() { $classes = array( self::SEVERITY_SUCCESS => 'wu-bg-green-200 wu-text-green-700', self::SEVERITY_NEUTRAL => 'wu-bg-gray-200 wu-text-gray-700', self::SEVERITY_INFO => 'wu-bg-blue-200 wu-text-blue-700', self::SEVERITY_WARNING => 'wu-bg-yellow-200 wu-text-yellow-700', self::SEVERITY_FATAL => 'wu-bg-red-200 wu-text-red-700', ); return isset($classes[ $this->get_severity() ]) ? $classes[ $this->get_severity() ] : ''; } /** * Set severity of the problem.. * * @since 2.0.0 * @param int $severity Severity of the problem. * @return void */ public function set_severity($severity) { $this->severity = $severity; } /** * Get date when the event was created.. * * @since 2.0.0 * @return string */ public function get_date_created() { return $this->date_created; } /** * Set date when the event was created.. * * @since 2.0.0 * @param string $date_created Date when the event was created. * @return void */ public function set_date_created($date_created) { $this->date_created = $date_created; } /** * Get payload of the event.. * * @since 2.0.0 * @return mixed */ public function get_payload() { $payload = (array) maybe_unserialize(wp_unslash($this->payload)); return $payload; } /** * Set payload of the event.. * * @since 2.0.0 * @param object $payload Payload of the event. * @return void */ public function set_payload($payload) { $this->payload = $payload; } /** * Get message for the event. * * @since 2.0.0 * @return string */ public function get_message() { $message = self::get_default_system_messages($this->slug); return $this->interpolate_message($message, $this->get_payload()); } /** * Interpolates the value of a message and its placeholders with the contents of the payload. * * @since 2.0.0 * * @param string $message The message with placeholders. * @param array $payload Key => value based array. */ public function interpolate_message($message, $payload): string { $payload = json_decode(json_encode($payload), true); $interpolation_keys = array(); foreach ($payload as $key => &$value) { $interpolation_keys[] = "{{{$key}}}"; if (is_array($value)) { $value = implode(' → ', wu_array_flatten($value)); } } $interpolation = array_combine($interpolation_keys, $payload); $interpolation['{{payload}}'] = implode(' - ', wu_array_flatten($payload, true)); $interpolation['{{model}}'] = wu_slug_to_name($this->object_type); $interpolation['{{object_id}}'] = $this->object_id; return strtr($message, $interpolation); } /** * Returns the default system messages for events. * * @since 2.0.0 * * @param string $slug The slug of the event. * @return string */ public static function get_default_system_messages($slug) { $default_messages = array(); $default_messages['changed'] = __('The {{model}} #{{object_id}} was changed: {{payload}}', 'wp-ultimo'); $default_messages['created'] = __('The {{model}} #{{object_id}} was created.', 'wp-ultimo'); $default_messages = apply_filters('wu_get_default_system_messages', $default_messages); return wu_get_isset($default_messages, $slug, __('No Message', 'wp-ultimo')); } /** * Get by people (admins, customers), saved as 'manual'. * * @since 2.0.0 * @return string */ public function get_initiator() { return $this->initiator; } /** * Set by people (admins, customers), saved as 'manual'. * * @since 2.0.0 * * @param string $initiator The type of user responsible for initiating the event. There are two options: Manual and System. By default, the event is saved as manual. * @return void */ public function set_initiator($initiator) { $this->initiator = $initiator; } /** * Get the author of the action, saved as the user_id. * * @since 2.0.0 * @return int */ public function get_author_id() { return $this->author_id; } /** * Returns the user associated with this author. * * @since 2.0.0 * @return WP_User */ public function get_author_user() { if ($this->author_id) { $user = get_user_by('id', $this->author_id); if ($user) { return $user; } } } /** * Returns the authors' display name. * * @since 2.0.0 * @return string */ public function get_author_display_name() { $user = $this->get_author_user(); if ($user) { return $user->display_name; } } /** * Returns the authors' email address. * * @since 2.0.0 * @return string */ public function get_author_email_address() { $user = $this->get_author_user(); if ($user) { return $user->user_email; } } /** * Set the author of the action, saved as the user_id. * * @since 2.0.0 * @param int $author_id The user responsible for creating the event. By default, the event is saved with the current user_id. * @return void */ public function set_author_id($author_id) { $this->author_id = $author_id; } /** * Get the object of this event. * * @since 2.0.0 * @return mixed */ public function get_object() { $object_type = $this->get_object_type(); $function_name = "wu_get_{$object_type}"; if (function_exists($function_name)) { return $function_name($this->get_object_id()); } return false; } /** * Polyfill for the get_object method. * * @since 2.0.0 * @return false|object */ public function get_membership() { $object_type = $this->get_object_type(); if ($object_type !== 'membership') { return false; } return $this->get_object(); } /** * Polyfill for the get_object method. * * @since 2.0.0 * @return false|object */ public function get_product() { $object_type = $this->get_object_type(); if ($object_type !== 'product') { return false; } return $this->get_object(); } /** * Polyfill for the get_object method. * * @since 2.0.0 * @return false|object */ public function get_site() { $object_type = $this->get_object_type(); if ($object_type !== 'site') { return false; } return $this->get_object(); } /** * Polyfill for the get_object method. * * @since 2.0.0 * @return false|object */ public function get_customer() { $object_type = $this->get_object_type(); if ($object_type !== 'customer') { return false; } return $this->get_object(); } /** * Polyfill for the get_object method. * * @since 2.0.0 * @return false|object */ public function get_payment() { $object_type = $this->get_object_type(); if ($object_type !== 'payment') { return false; } return $this->get_object(); } /** * Get the object type associated with this event. * * @since 2.0.0 * @return string */ public function get_object_type() { return $this->object_type; } /** * Set the object type associated with this event. * * @since 2.0.0 * @param string $object_type The type of object related to this event. It's usually the model name. * @return void */ public function set_object_type($object_type) { $this->object_type = $object_type; } /** * Get the object type associated with this event. * * @since 2.0.0 * @return string */ public function get_slug() { return $this->slug; } /** * Set the object type associated with this event. * * @since 2.0.0 * @param string $slug The event slug. It needs to be unique and preferably make it clear what it is about. Example: account_created is about creating an account. * @return void */ public function set_slug($slug) { $this->slug = $slug; } /** * Get iD of the related objects.. * * @since 2.0.0 * @return int */ public function get_object_id() { return $this->object_id; } /** * Set iD of the related objects. * * @since 2.0.0 * @param int $object_id The ID of the related objects. * @return void */ public function set_object_id($object_id) { $this->object_id = $object_id; } /** * Transform the object into an assoc array. * * @since 2.0.0 * @return array */ public function to_array() { $array = parent::to_array(); $array['payload'] = $this->get_payload(); $array['message'] = $this->get_message(); $array['severity_label'] = $this->get_severity_label(); $array['severity_classes'] = $this->get_severity_class(); $array['author'] = array(); if ($this->get_initiator() === 'manual') { $user = get_user_by('ID', $this->get_author_id()); if ($user) { $array['author'] = (array) $user->data; unset($array['author']['user_pass']); unset($array['author']['user_activation_key']); $array['author']['avatar'] = get_avatar_url( $this->get_author_id(), array( 'default' => 'identicon', ) ); } } return $array; } /** * Override to clear event count. * * @since 2.0.0 * @return int|false */ public function save() { if ( ! $this->exists() && function_exists('get_current_user_id')) { $user_id = get_current_user_id(); delete_site_transient("wu_{$user_id}_unseen_events_count"); } return parent::save(); } }