', $row['description'] ); } return $row; } /* -------------------------- GDPR -------------------------- */ public static function register_exporter( $exporters ) { $exporters['apwpm-activity-timeline'] = array( 'exporter_friendly_name' => __( 'ActivityPilot for WP', 'activitypilot' ), 'callback' => array( __CLASS__, 'exporter' ), ); return $exporters; } public static function register_eraser( $erasers ) { $erasers['apwpm-activity-timeline'] = array( 'eraser_friendly_name' => __( 'ActivityPilot for WP', 'activitypilot' ), 'callback' => array( __CLASS__, 'eraser' ), ); return $erasers; } public static function exporter( $email_address, $page = 1 ) { $user = get_user_by( 'email', $email_address ); if ( ! $user ) { return array( 'data' => array(), 'done' => true ); } $per = 50; $offset = ( max( 1, (int) $page ) - 1 ) * $per; $rows = APWPM_DB::get_user_log_export_batch( $user->ID, $per, $offset ); $data = array(); foreach ( (array) $rows as $row ) { $item = array( 'group_id' => 'apwpm-activity-timeline', 'group_label' => __( 'ActivityPilot for WP', 'activitypilot' ), 'item_id' => 'apwpm-' . (int) $row['id'], 'data' => array( array( 'name' => __( 'Action', 'activitypilot' ), 'value' => $row['action_type'] ), array( 'name' => __( 'Object', 'activitypilot' ), 'value' => $row['object_type'] . ' ' . $row['object_title'] ), array( 'name' => __( 'Description', 'activitypilot' ), 'value' => $row['description'] ), array( 'name' => __( 'Severity', 'activitypilot' ), 'value' => $row['severity'] ), array( 'name' => __( 'Date', 'activitypilot' ), 'value' => $row['created_at'] ), ), ); $data[] = $item; } return array( 'data' => $data, 'done' => count( (array) $rows ) < $per, ); } public static function eraser( $email_address, $page = 1 ) { $user = get_user_by( 'email', $email_address ); if ( ! $user ) { return array( 'items_removed' => false, 'items_retained' => false, 'messages' => array(), 'done' => true ); } // We don't delete rows (audit integrity!). Instead we redact PII fields. $rows_affected = APWPM_DB::redact_user_logs( $user->ID, $user->user_login ); return array( 'items_removed' => false, 'items_retained' => $rows_affected > 0, 'messages' => array( __( 'Personally identifiable fields in activity log were redacted; audit rows retained for integrity.', 'activitypilot' ) ), 'done' => true, ); } }