Passed
Push — master ( f2ee69...1fe896 )
by Paul
14:29 queued 06:54
created

Application::storeDefaults()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 5
c 1
b 0
f 0
dl 0
loc 8
ccs 0
cts 6
cp 0
rs 10
cc 3
nc 4
nop 0
crap 12
1
<?php
2
3
namespace GeminiLabs\SiteReviews;
4
5
use GeminiLabs\SiteReviews\Database\DefaultsManager;
6
use GeminiLabs\SiteReviews\Database\OptionManager;
7
use GeminiLabs\SiteReviews\Defaults\PermissionDefaults;
8
use GeminiLabs\SiteReviews\Helpers\Arr;
9
use GeminiLabs\SiteReviews\Helpers\Str;
10
use GeminiLabs\SiteReviews\Install;
11
12
/**
13
 * @property array $addons
14
 * @property string $capability
15
 * @property string $cron_event
16
 * @property array $defaults
17
 * @property string $export_key
18
 * @property string $file
19
 * @property string $id
20
 * @property string $languages
21
 * @property string $name
22
 * @property string $paged_handle
23
 * @property string $paged_query_var
24
 * @property string $post_type
25
 * @property string $prefix
26
 * @property array $session
27
 * @property \GeminiLabs\SiteReviews\Arguments $storage
28
 * @property string $taxonomy
29
 * @property string $version
30
 * @property string $testedTo;
31
 */
32
final class Application extends Container
33
{
34
    use Plugin;
35
    use Session;
36
    use Storage;
37
38
    const EXPORT_KEY = '_glsr_export';
39
    const ID = 'site-reviews';
40
    const PAGED_HANDLE = 'pagination_request';
41
    const PAGED_QUERY_VAR = 'reviews-page'; // filtered
42
    const POST_TYPE = 'site-review';
43
    const PREFIX = 'glsr_';
44
    const TAXONOMY = 'site-review-category';
45
46
    /**
47
     * @var array
48
     */
49
    protected $addons = [];
50
51
    /**
52
     * @var array
53
     */
54
    protected $defaults;
55
56
    /**
57
     * @var string
58
     */
59
    protected $name;
60
61
    /**
62
     * @param string $addonId
63
     * @return false|\GeminiLabs\SiteReviews\Addons\Addon
64
     */
65
    public function addon($addonId)
66
    {
67
        if (isset($this->addons[$addonId])) {
68
            return $this->addons[$addonId];
69
        }
70
        return false;
71
    }
72
73
    /**
74
     * @param string $capability
75
     * @return bool
76
     */
77
    public function can($capability)
78
    {
79
        return $this->make(Role::class)->can($capability);
80
    }
81
82
    /**
83
     * @param bool $networkDeactivating
84
     * @return void
85
     * @callback register_deactivation_hook
86
     */
87
    public function deactivate($networkDeactivating)
88
    {
89
        $this->make(Install::class)->deactivate($networkDeactivating);
90
    }
91
92
    /**
93
     * @param string $page
94
     * @param string $tab
95
     * @return string
96
     */
97
    public function getPermission($page = '', $tab = 'index')
98
    {
99
        $fallback = 'edit_posts';
100
        $permissions = $this->make(PermissionDefaults::class)->defaults();
101
        $permission = Arr::get($permissions, $page, $fallback);
102
        if (is_array($permission)) {
103
            $permission = Arr::get($permission, $tab, $fallback);
104
        }
105
        return empty($permission) || !is_string($permission)
106
            ? $fallback
107
            : $permission;
108
    }
109
110
    /**
111
     * @param string $page
112
     * @param string $tab
113
     * @return bool
114
     */
115
    public function hasPermission($page = '', $tab = 'index')
116
    {
117
        $isAdmin = $this->isAdmin();
118
        return !$isAdmin || $this->can($this->getPermission($page, $tab));
119
    }
120
121
    /**
122
     * @return void
123
     */
124
    public function init()
125
    {
126
        // Ensure the custom database tables exist, this is needed in cases
127
        // where the plugin has been updated instead of activated.
128
        if (empty(get_option(static::PREFIX.'db_version'))) {
129
            $this->make(Install::class)->run();
130
        }
131
        $this->make(Hooks::class)->run();
132
    }
133
134
    /**
135
     * @return bool
136
     */
137 14
    public function isAdmin()
138
    {
139 14
        return (is_admin() || is_network_admin()) && !wp_doing_ajax();
140
    }
141
142
    /**
143
     * @param object $addon
144
     * @return void
145
     */
146
    public function register($addon)
147
    {
148
        try {
149
            $reflection = new \ReflectionClass($addon); // make sure that the class exists
150
            $addon = $reflection->getName();
151
            $this->addons[$addon::ID] = $addon;
152
            $this->singleton($addon); // this goes first!
153
            $this->alias($addon::ID, $this->make($addon)); // @todo for some reason we have to link an alias to an instantiated class
154
            $this->make($addon)->init();
155
        } catch (\ReflectionException $e) {
156
            glsr_log()->error('Attempted to register an invalid addon.');
157
        }
158
    }
159
160
    /**
161
     * @return void
162
     */
163
    public function storeDefaults()
164
    {
165
        if (empty($this->defaults)) {
166
            $defaults = $this->make(DefaultsManager::class)->get();
167
            $this->defaults = $this->filterArray('get/defaults', $defaults);
168
        }
169
        if (empty(get_option(OptionManager::databaseKey()))) {
170
            update_option(OptionManager::databaseKey(), $this->defaults);
171
        }
172
    }
173
}
174