Completed
Push — master ( 567d89...872ed1 )
by Stephanie
02:59
created

FrmPersonalData::get_user_entries()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 22
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 13
nc 2
nop 1
dl 0
loc 22
rs 9.2
c 0
b 0
f 0
1
<?php
2
3
class FrmPersonalData {
4
5
	private $limit = 200;
6
7
	private $page  = 1;
8
9
	public function __construct() {
10
		add_filter( 'wp_privacy_personal_data_erasers', array( $this, 'register_data_eraser' ) );
11
		add_filter( 'wp_privacy_personal_data_exporters', array( $this, 'register_exporter' ) );
12
	}
13
14
	/**
15
	 * Add options to the WordPress personal data exporter
16
	 *
17
	 * @since 3.01.04
18
	 * @param array $exporters
19
	 * @return array
20
	 */
21
	public function register_exporter( $exporters ) {
22
		$exporters['formidable-exporter'] = array(
23
			'exporter_friendly_name' => __( 'Formidable Forms Exporter', 'formidable' ),
24
			'callback'               => array( $this, 'export_data' ),
25
		);
26
		return $exporters;
27
	}
28
29
	/**
30
	 * Add options to the WordPress personal data eraser
31
	 *
32
	 * @since 3.01.04
33
	 * @param array $erasers
34
	 * @return array
35
	 */
36
	public function register_data_eraser( $erasers ) {
37
		$erasers['formidable-eraser'] = array(
38
			'eraser_friendly_name' => __( 'Formidable Forms entries' ),
39
			'callback'             => array( $this, 'erase_data' ),
40
		);
41
42
		return $erasers;
43
	}
44
45
	public function export_data( $email, $page = 1 ) {
46
		$this->page = absint( $page );
47
48
		$data_to_export = array(
49
			'data' => array(),
50
			'done' => true,
51
		);
52
53
		$entries = $this->get_user_entries( $email );
54
		if ( empty( $entries ) ) {
55
			return $data_to_export;
56
		}
57
58
		foreach ( (array) $entries as $entry ) {
59
			$data_to_export['data'][] = array(
60
				'group_id'    => 'formidable',
61
				'group_label' => __( 'Form Submissions', 'formidable' ),
62
				'item_id'     => 'entry-' . $entry,
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$entry'
Loading history...
63
				'data'        => $this->prepare_entry_data( $entry ),
64
			);
65
		}
66
67
		$data_to_export['done'] = count( $entries ) < $this->limit;
68
		return $data_to_export;
69
	}
70
71
	/**
72
	 * @return array
73
	 */
74
	public function erase_data( $email, $page = 1 ) {
75
		$data_removed = array(
76
			'items_removed'  => false,
77
			'items_retained' => false,
78
			'messages'       => array(),
79
			'done'           => true,
80
		);
81
82
		if ( empty( $email ) ) {
83
			return $data_removed;
84
		}
85
86
		$this->page = absint( $page );
87
		$entries = $this->get_user_entries( $email );
88
		if ( empty( $entries ) ) {
89
			return $data_removed;
90
		}
91
92
		// TODO: Add an option to anonymize the entries with wp_privacy_anonymize_data( 'email', '[email protected]' );
93
94
		foreach ( (array) $entries as $entry ) {
95
			$removed = FrmEntry::destroy( $entry );
96
97
			if ( $removed ) {
98
				$data_removed['items_removed'] = true;
99
			} else {
100
				$data_removed['items_retained'] = true;
101
			}
102
		}
103
104
		$data_removed['done'] = count( $entries ) < $this->limit;
105
106
		return $data_removed;
107
	}
108
109
	/**
110
	 * Get all entries that were submitted by this user while logged in,
111
	 * or with a field value that matches the email address
112
	 *
113
	 * @param string $email
114
	 * @return array of entry ids
115
	 */
116
	private function get_user_entries( $email ) {
117
		$query_args = array(
118
			'order_by' => 'item_id ASC',
119
			'limit'    => $this->get_current_page(),
120
		);
121
122
		$user = get_user_by( 'email', $email );
123
		$entries_by_email = FrmDb::get_col( 'frm_item_metas', array( 'meta_value' => $email ), 'item_id', $query_args );
0 ignored issues
show
introduced by
Detected usage of meta_value, possible slow query.
Loading history...
124
125
		if ( empty( $user ) ) {
126
			// no matching user, so return the entry ids we have
127
			return $entries_by_email;
128
		}
129
130
		$query_args['order_by'] = 'id ASC';
131
132
		$entries_by_user = FrmDb::get_col( 'frm_items', array( 'user_id' => $user->ID ), 'id', $query_args );
133
134
		$entry_ids = array_merge( (array) $entries_by_user, (array) $entries_by_email );
135
		$entry_ids = array_unique( array_filter( $entry_ids ) );
136
		return $entry_ids;
137
	}
138
139
	private function get_current_page() {
140
		$start = ( $this->page - 1 ) * $this->limit;
141
		return FrmDb::esc_limit( $start . ',' . $this->limit );
142
	}
143
144
	/**
145
	 * @param int $entry
146
	 * @return array
147
	 */
148
	private function prepare_entry_data( $entry ) {
149
		$entry = FrmEntry::getOne( $entry, true );
150
151
		$entry_data = array();
152
		foreach ( $entry->metas as $field_id => $meta ) {
153
			$field = FrmField::getOne( $field_id );
154
155
			$entry_data[] = array(
156
				'name'  => $field->name,
157
				'value' => FrmFieldsHelper::get_unfiltered_display_value( array(
158
					'field' => $field,
159
					'value' => $meta,
160
				) ),
161
			);
162
		}
163
164
		return $entry_data;
165
	}
166
}
167