Passed
Push — master ( 04d195...416185 )
by Paul
07:31
created

PrivacyController::erasePersonalData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 7
c 0
b 0
f 0
dl 0
loc 9
ccs 0
cts 7
cp 0
rs 10
cc 1
nc 1
nop 2
crap 2
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Controllers;
4
5
use GeminiLabs\SiteReviews\Database\Query;
6
use GeminiLabs\SiteReviews\Database\ReviewManager;
7
use GeminiLabs\SiteReviews\Review;
8
9
class PrivacyController extends Controller
10
{
11
    protected $itemsRemoved;
12
    protected $itemsRetained;
13
    protected $messages;
14
    protected $perPage;
15
16
    public function __construct()
17
    {
18
        $this->itemsRemoved = false;
19
        $this->itemsRetained = false;
20
        $this->messages = [];
21
        $this->perPage = 100;
22
        if (!glsr()->filterBool('personal-data/erase-all', true)) {
23
            $this->itemsRetained = true;
24
            $this->messages[] = _x('The email and associated name and IP address has been removed from all reviews, but the reviews themselves were not removed.', 'admin-text', 'site-reviews');
25
        }
26
    }
27
28
    /**
29
     * @param string $email
30
     * @param int $page
31
     * @return array
32
     * @callback $this->filterPersonalDataErasers
33
     */
34
    public function erasePersonalData($email, $page = 1)
35
    {
36
        $reviews = $this->reviews($email, $page);
37
        array_walk($reviews, [$this, 'erase']);
38
        return [
39
            'done' => count($reviews) < $this->perPage,
40
            'items_removed' => $this->itemsRemoved,
41
            'items_retained' => $this->itemsRetained,
42
            'messages' => $this->messages,
43
        ];
44
    }
45
46
    /**
47
     * @param string $email
48
     * @param int $page
49
     * @return array
50
     * @callback $this->filterPersonalDataExporters
51
     */
52
    public function exportPersonalData($email, $page = 1)
53
    {
54
        $reviews = $this->reviews($email, $page);
55
        $data = array_map([$this, 'export'], $reviews);
56
        return [
57
            'data' => $data,
58
            'done' => count($reviews) < $this->perPage,
59
        ];
60
    }
61
62
    /**
63
     * @param array $erasers
64
     * @return array
65
     * @filter wp_privacy_personal_data_erasers
66
     */
67
    public function filterPersonalDataErasers($erasers)
68
    {
69
        $erasers[glsr()->id] = [
70
            'callback' => [$this, 'erasePersonalData'],
71
            'eraser_friendly_name' => glsr()->name,
72
        ];
73
        return $erasers;
74
    }
75
76
    /**
77
     * @param array $exporters
78
     * @return array
79
     * @filter wp_privacy_personal_data_exporters
80
     */
81
    public function filterPersonalDataExporters($exporters)
82
    {
83
        $exporters[glsr()->id] = [
84
            'callback' => [$this, 'exportPersonalData'],
85
            'exporter_friendly_name' => glsr()->name,
86
        ];
87
        return $exporters;
88
    }
89
90
    /**
91
     * @return void
92
     * @action admin_init
93
     */
94 7
    public function privacyPolicyContent()
95
    {
96 7
        $content = glsr()->build('partials/privacy-policy');
97 7
        wp_add_privacy_policy_content(glsr()->name, wp_kses_post(wpautop($content, false)));
98 7
    }
99
100
    /**
101
     * @return void
102
     */
103
    protected function erase(Review $review)
104
    {
105
        glsr()->action('personal-data/erase', $review, $this->itemsRetained);
106
        if (!$this->itemsRetained) {
107
            wp_delete_post($review->ID, true);
108
        } else {
109
            glsr(ReviewManager::class)->deleteRevisions($review->ID);
110
            glsr(ReviewManager::class)->update($review->ID, [
111
                'email' => '',
112
                'ip_address' => '',
113
                'name' => '',
114
            ]);
115
            delete_post_meta($review->ID,  '_submitted'); // delete the original stored request
116
        }
117
        $this->itemsRemoved = true;
118
    }
119
120
    /**
121
     * @return array
122
     */
123
    protected function export(Review $review)
124
    {
125
        $data = [];
126
        $fields = [ // order is intentional
127
            'title' => _x('Review Title', 'admin-text', 'site-reviews'),
128
            'content' => _x('Review Content', 'admin-text', 'site-reviews'),
129
            'name' => _x('Name', 'admin-text', 'site-reviews'),
130
            'email' => _x('Email', 'admin-text', 'site-reviews'),
131
            'ip_address' => _x('IP Address', 'admin-text', 'site-reviews'),
132
        ];
133
        foreach ($fields as $field => $name) {
134
            if ($value = $review->$field) {
135
                $data[] = ['name' => $name, 'value' => $value];
136
            }
137
        }
138
        return [
139
            'data' => glsr()->filterArray('personal-data/export', $data, $review),
140
            'group_id' => glsr()->id,
141
            'group_label' => _x('Reviews', 'admin-text', 'site-reviews'),
142
            'item_id' => glsr()->post_type.'-'.$review->ID,
143
        ];
144
    }
145
146
    /**
147
     * @param string $email
148
     * @param int $page
149
     * @return array
150
     */
151
    protected function reviews($email, $page)
152
    {
153
        return glsr(Query::class)->reviews([
154
            'email' => $email,
155
            'page' => $page,
156
            'per_page' => $this->perPage,
157
        ]);
158
    }
159
}
160