HealthCheckEmailTask::updateConfig()   A
last analyzed

Complexity

Conditions 5
Paths 12

Size

Total Lines 22
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 14
nc 12
nop 2
dl 0
loc 22
rs 9.4888
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * webtrees-lib: MyArtJaub library for webtrees
5
 *
6
 * @package MyArtJaub\Webtrees
7
 * @subpackage AdminTasks
8
 * @author Jonathan Jaubart <[email protected]>
9
 * @copyright Copyright (c) 2012-2022, Jonathan Jaubart
10
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3
11
 */
12
13
declare(strict_types=1);
14
15
namespace MyArtJaub\Webtrees\Module\AdminTasks\Tasks;
16
17
use Carbon\CarbonImmutable;
18
use Carbon\CarbonInterval;
19
use Fisharebest\Webtrees\Auth;
20
use Fisharebest\Webtrees\I18N;
21
use Fisharebest\Webtrees\Log;
22
use Fisharebest\Webtrees\NoReplyUser;
23
use Fisharebest\Webtrees\Tree;
24
use Fisharebest\Webtrees\TreeUser;
25
use Fisharebest\Webtrees\Validator;
26
use Fisharebest\Webtrees\Services\EmailService;
27
use Fisharebest\Webtrees\Services\ModuleService;
28
use Fisharebest\Webtrees\Services\TreeService;
29
use Fisharebest\Webtrees\Services\UpgradeService;
30
use Fisharebest\Webtrees\Services\UserService;
31
use MyArtJaub\Webtrees\Common\Tasks\TaskSchedule;
32
use MyArtJaub\Webtrees\Contracts\Tasks\ConfigurableTaskInterface;
33
use MyArtJaub\Webtrees\Contracts\Tasks\TaskInterface;
34
use MyArtJaub\Webtrees\Module\AdminTasks\AdminTasksModule;
35
use MyArtJaub\Webtrees\Module\AdminTasks\Services\HealthCheckService;
36
use Psr\Http\Message\ServerRequestInterface;
37
use Throwable;
38
39
/**
40
 * Task to send an email summarising the healthcheck of the site
41
 */
42
class HealthCheckEmailTask implements TaskInterface, ConfigurableTaskInterface
43
{
44
    /**
45
     * Name of the Tree preference to check if the task is enabled for that tree
46
     * @var string
47
     */
48
    public const TREE_PREFERENCE_NAME = 'MAJ_AT_HEALTHCHECK_ENABLED';
49
50
    private ?AdminTasksModule $module;
51
    private HealthCheckService $healthcheck_service;
52
    private EmailService $email_service;
53
    private UserService $user_service;
54
    private TreeService $tree_service;
55
    private UpgradeService $upgrade_service;
56
57
    /**
58
     * Constructor for HealthCheckTask
59
     *
60
     * @param ModuleService $module_service
61
     * @param HealthCheckService $healthcheck_service
62
     * @param EmailService $email_service
63
     * @param UserService $user_service
64
     * @param TreeService $tree_service
65
     * @param UpgradeService $upgrade_service
66
     */
67
    public function __construct(
68
        ModuleService $module_service,
69
        HealthCheckService $healthcheck_service,
70
        EmailService $email_service,
71
        UserService $user_service,
72
        TreeService $tree_service,
73
        UpgradeService $upgrade_service
74
    ) {
75
        $this->module = $module_service->findByInterface(AdminTasksModule::class)->first();
76
        $this->healthcheck_service = $healthcheck_service;
77
        $this->email_service = $email_service;
78
        $this->user_service = $user_service;
79
        $this->tree_service = $tree_service;
80
        $this->upgrade_service = $upgrade_service;
81
    }
82
83
84
    /**
85
     * {@inheritDoc}
86
     * @see \MyArtJaub\Webtrees\Contracts\Tasks\TaskInterface::name()
87
     */
88
    public function name(): string
89
    {
90
        return I18N::translate('Healthcheck Email');
91
    }
92
93
    /**
94
     * {@inheritDoc}
95
     * @see \MyArtJaub\Webtrees\Contracts\Tasks\TaskInterface::defaultFrequency()
96
     */
97
    public function defaultFrequency(): int
98
    {
99
        return 10080; // = 1 week = 7 * 24 * 60 min
100
    }
101
102
    /**
103
     * {@inheritDoc}
104
     * @see \MyArtJaub\Webtrees\Contracts\Tasks\TaskInterface::run()
105
     */
106
    public function run(TaskSchedule $task_schedule): bool
107
    {
108
        if ($this->module === null) {
109
            return false;
110
        }
111
112
        $res = true;
113
114
        // Compute the number of days to compute
115
        $interval_lastrun = $task_schedule->lastRunTime()->diffAsCarbonInterval(CarbonImmutable::now());
116
        $interval_frequency = CarbonInterval::minutes($task_schedule->frequency());
117
        $interval = $interval_lastrun->greaterThan($interval_frequency) ? $interval_lastrun : $interval_frequency;
118
        $nb_days = (int) $interval->ceilDay()->totalDays;
119
120
        $view_params_site = [
121
            'nb_days'               =>  $nb_days,
122
            'upgrade_available'     =>  $this->upgrade_service->isUpgradeAvailable(),
123
            'latest_version'        =>  $this->upgrade_service->latestVersion(),
124
            'download_url'          =>  $this->upgrade_service->downloadUrl(),
125
            'all_users'             =>  $this->user_service->all(),
126
            'unapproved'            =>  $this->user_service->unapproved(),
127
            'unverified'            =>  $this->user_service->unverified(),
128
        ];
129
130
        foreach ($this->tree_service->all() as $tree) {
131
        /** @var Tree $tree */
132
133
            if ($tree->getPreference(self::TREE_PREFERENCE_NAME) !== '1') {
134
                continue;
135
            }
136
137
            $webmaster = $this->user_service->find((int) $tree->getPreference('WEBMASTER_USER_ID'));
138
            if ($webmaster === null) {
139
                continue;
140
            }
141
            I18N::init($webmaster->getPreference('language'));
142
143
            $error_logs = $this->healthcheck_service->errorLogs($tree, $nb_days);
144
            $nb_errors = $error_logs->sum('nblogs');
145
146
            $view_params = $view_params_site + [
147
                'tree'              =>  $tree,
148
                'total_by_type'     =>  $this->healthcheck_service->countByRecordType($tree),
149
                'change_by_type'    =>  $this->healthcheck_service->changesByRecordType($tree, $nb_days),
150
                'error_logs'        =>  $error_logs,
151
                'nb_errors'         =>  $nb_errors
152
            ];
153
154
            $res = $res && $this->email_service->send(
155
                new TreeUser($tree),
156
                $webmaster,
157
                new NoReplyUser(),
158
                I18N::translate('Health Check Report') . ' - ' . I18N::translate('Tree %s', $tree->name()),
159
                view($this->module->name() . '::tasks/healthcheck/email-healthcheck-text', $view_params),
160
                view($this->module->name() . '::tasks/healthcheck/email-healthcheck-html', $view_params)
161
            );
162
        }
163
164
        return $res;
165
    }
166
167
    /**
168
     * {@inheritDoc}
169
     * @see \MyArtJaub\Webtrees\Contracts\Tasks\ConfigurableTaskInterface::configView()
170
     */
171
    public function configView(ServerRequestInterface $request): string
172
    {
173
        return $this->module === null ? '' : view($this->module->name() . '::tasks/healthcheck/config', [
174
            'all_trees'     =>  $this->tree_service->all()
175
        ]);
176
    }
177
178
    /**
179
     * {@inheritDoc}
180
     * @see \MyArtJaub\Webtrees\Contracts\Tasks\ConfigurableTaskInterface::updateConfig()
181
     */
182
    public function updateConfig(ServerRequestInterface $request, TaskSchedule $task_schedule): bool
183
    {
184
        try {
185
            $validator = Validator::parsedBody($request);
186
187
            foreach ($this->tree_service->all() as $tree) {
188
                if (Auth::isManager($tree)) {
189
                    $tree_enabled = $validator->boolean('HEALTHCHECK_ENABLED_' . $tree->id(), false);
190
                    $tree->setPreference(self::TREE_PREFERENCE_NAME, $tree_enabled ? '1' : '0');
191
                }
192
            }
193
            return true;
194
        } catch (Throwable $ex) {
195
            Log::addErrorLog(
196
                sprintf(
197
                    'Error while updating the Task schedule "%s". Exception: %s',
198
                    $task_schedule->id(),
199
                    $ex->getMessage()
200
                )
201
            );
202
        }
203
        return false;
204
    }
205
}
206