Passed
Push — master ( ab680b...34ba2b )
by Paul
05:51
created

Upgrade_3_0_0::run()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 3
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Modules\Upgrader;
4
5
use GeminiLabs\SiteReviews\Database\DefaultsManager;
6
use GeminiLabs\SiteReviews\Database\OptionManager;
7
use GeminiLabs\SiteReviews\Helpers\Arr;
8
9
class Upgrade_3_0_0
10
{
11
    const MAPPED_SETTINGS = [
12
        'settings.general.notification' => 'settings.general.notifications', // array
13
        'settings.general.notification_email' => 'settings.general.notification_email',
14
        'settings.general.notification_message' => 'settings.general.notification_message',
15
        'settings.general.require.approval' => 'settings.general.require.approval',
16
        'settings.general.require.login' => 'settings.general.require.login',
17
        'settings.general.require.login_register' => 'settings.general.require.login_register',
18
        'settings.general.webhook_url' => 'settings.general.notification_slack',
19
        'settings.reviews-form.akismet' => 'settings.submissions.akismet',
20
        'settings.reviews-form.blacklist.action' => 'settings.submissions.blacklist.action',
21
        'settings.reviews-form.blacklist.entries' => 'settings.submissions.blacklist.entries',
22
        'settings.reviews-form.recaptcha.integration' => 'settings.submissions.recaptcha.integration',
23
        'settings.reviews-form.recaptcha.key' => 'settings.submissions.recaptcha.key',
24
        'settings.reviews-form.recaptcha.position' => 'settings.submissions.recaptcha.position',
25
        'settings.reviews-form.recaptcha.secret' => 'settings.submissions.recaptcha.secret',
26
        'settings.reviews-form.required' => 'settings.submissions.required', // array
27
        'settings.reviews.assigned_links.enabled' => 'settings.reviews.assigned_links',
28
        'settings.reviews.avatars.enabled' => 'settings.reviews.avatars',
29
        'settings.reviews.date.custom' => 'settings.reviews.date.custom',
30
        'settings.reviews.date.format' => 'settings.reviews.date.format',
31
        'settings.reviews.excerpt.enabled' => 'settings.reviews.excerpts',
32
        'settings.reviews.excerpt.length' => 'settings.reviews.excerpts_length',
33
        'settings.reviews.schema.address' => 'settings.schema.address',
34
        'settings.reviews.schema.description.custom' => 'settings.schema.description.custom',
35
        'settings.reviews.schema.description.default' => 'settings.schema.description.default',
36
        'settings.reviews.schema.highprice' => 'settings.schema.highprice',
37
        'settings.reviews.schema.image.custom' => 'settings.schema.image.custom',
38
        'settings.reviews.schema.image.default' => 'settings.schema.image.default',
39
        'settings.reviews.schema.lowprice' => 'settings.schema.lowprice',
40
        'settings.reviews.schema.name.custom' => 'settings.schema.name.custom',
41
        'settings.reviews.schema.name.default' => 'settings.schema.name.default',
42
        'settings.reviews.schema.pricecurrency' => 'settings.schema.pricecurrency',
43
        'settings.reviews.schema.pricerange' => 'settings.schema.pricerange',
44
        'settings.reviews.schema.telephone' => 'settings.schema.telephone',
45
        'settings.reviews.schema.type.custom' => 'settings.schema.type.custom',
46
        'settings.reviews.schema.type.default' => 'settings.schema.type.default',
47
        'settings.reviews.schema.url.custom' => 'settings.schema.url.custom',
48
        'settings.reviews.schema.url.default' => 'settings.schema.url.default',
49
        'version' => 'version_upgraded_from',
50
    ];
51
52
    /**
53
     * @var array
54
     */
55
    protected $newSettings;
56
57
    /**
58
     * @var array
59
     */
60
    protected $oldSettings;
61
62
    /**
63
     * @return void
64
     */
65
    public function migrateSettings()
66
    {
67
        $this->newSettings = $this->getNewSettings();
68
        $this->oldSettings = $this->getOldSettings();
69
        if (empty($this->oldSettings)) {
70
            return;
71
        }
72
        foreach (static::MAPPED_SETTINGS as $old => $new) {
73
            if (empty($this->oldSettings[$old])) {
74
                continue;
75
            }
76
            $this->newSettings[$new] = $this->oldSettings[$old];
77
        }
78
        $this->migrateNotificationSettings();
79
        $this->migrateRecaptchaSettings();
80
        $this->migrateRequiredSettings();
81
        $oldSettings = Arr::convertDotNotationArray($this->oldSettings);
82
        $newSettings = Arr::convertDotNotationArray($this->newSettings);
83
        if (isset($oldSettings['settings']['strings']) && is_array($oldSettings['settings']['strings'])) {
84
            $newSettings['settings']['strings'] = $oldSettings['settings']['strings'];
85
        }
86
        glsr(OptionManager::class)->set($newSettings);
87
    }
88
89
    /**
90
     * @return void
91
     */
92
    public function run()
93
    {
94
        $this->migrateSettings();
95
    }
96
97
    /**
98
     * @return array
99
     */
100
    protected function getNewSettings()
101
    {
102
        return wp_parse_args(
103
            Arr::flattenArray(glsr(OptionManager::class)->all()),
104
            glsr(DefaultsManager::class)->defaults()
105
        );
106
    }
107
108
    /**
109
     * @return array
110
     */
111
    protected function getOldSettings()
112
    {
113
        $defaults = array_fill_keys(array_keys(static::MAPPED_SETTINGS), '');
114
        $settings = Arr::flattenArray((array) get_option('geminilabs_site_reviews-v2', []));
115
        if (!empty($settings)) {
116
            $settings = wp_parse_args($settings, $defaults);
117
        }
118
        return $settings;
119
    }
120
121
    /**
122
     * @return void
123
     */
124
    protected function migrateNotificationSettings()
125
    {
126
        $notifications = [
127
            'custom' => 'custom',
128
            'default' => 'admin',
129
            'webhook' => 'slack',
130
        ];
131
        $this->newSettings['settings.general.notifications'] = [];
132
        foreach ($notifications as $old => $new) {
133
            if ($this->oldSettings['settings.general.notification'] != $old) {
134
                continue;
135
            }
136
            $this->newSettings['settings.general.notifications'][] = $new;
137
        }
138
    }
139
140
    /**
141
     * @return void
142
     */
143
    protected function migrateRecaptchaSettings()
144
    {
145
        $recaptcha = [
146
            'BadgePosition' => $this->oldSettings['settings.reviews-form.recaptcha.position'],
147
            'SecretKey' => $this->oldSettings['settings.reviews-form.recaptcha.secret'],
148
            'SiteKey' => $this->oldSettings['settings.reviews-form.recaptcha.key'],
149
        ];
150
        if (in_array($this->oldSettings['settings.reviews-form.recaptcha.integration'], ['custom', 'invisible-recaptcha'])) {
151
            $this->newSettings['settings.submissions.recaptcha.integration'] = 'all';
152
        }
153
        if ('invisible-recaptcha' == $this->oldSettings['settings.reviews-form.recaptcha.integration']) {
154
            $recaptcha = wp_parse_args((array) get_site_option('ic-settings', [], false), $recaptcha);
155
        }
156
        $this->newSettings['settings.submissions.recaptcha.key'] = $recaptcha['SiteKey'];
157
        $this->newSettings['settings.submissions.recaptcha.secret'] = $recaptcha['SecretKey'];
158
        $this->newSettings['settings.submissions.recaptcha.position'] = $recaptcha['BadgePosition'];
159
    }
160
161
    /**
162
     * @return void
163
     */
164
    protected function migrateRequiredSettings()
165
    {
166
        $this->newSettings['settings.submissions.required'] = array_filter((array) $this->oldSettings['settings.reviews-form.required']);
167
        $this->newSettings['settings.submissions.required'][] = 'rating';
168
        $this->newSettings['settings.submissions.required'][] = 'terms';
169
    }
170
}
171