Passed
Branch feature/2.0 (ef99fd)
by Jonathan
11:25
created

TaskEditAction::updateGeneralSettings()   A

Complexity

Conditions 5
Paths 12

Size

Total Lines 44
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 5
eloc 29
c 2
b 0
f 0
nc 12
nop 2
dl 0
loc 44
rs 9.1448
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) 2020, 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\Http\RequestHandlers;
16
17
use Carbon\CarbonInterval;
18
use Fisharebest\Webtrees\FlashMessages;
19
use Fisharebest\Webtrees\I18N;
20
use Fisharebest\Webtrees\Log;
21
use Fisharebest\Webtrees\Services\ModuleService;
22
use MyArtJaub\Webtrees\Module\AdminTasks\AdminTasksModule;
23
use MyArtJaub\Webtrees\Module\AdminTasks\Model\ConfigurableTaskInterface;
24
use MyArtJaub\Webtrees\Module\AdminTasks\Model\TaskInterface;
25
use MyArtJaub\Webtrees\Module\AdminTasks\Model\TaskSchedule;
26
use MyArtJaub\Webtrees\Module\AdminTasks\Services\TaskScheduleService;
27
use Psr\Http\Message\ResponseInterface;
28
use Psr\Http\Message\ServerRequestInterface;
29
use Psr\Http\Server\RequestHandlerInterface;
30
use Exception;
31
32
/**
33
 * Request handler for updating task schedules
34
 */
35
class TaskEditAction implements RequestHandlerInterface
36
{
37
    /**
38
     * @var AdminTasksModule $module
39
     */
40
    private $module;
41
    
42
    /**
43
     * @var TaskScheduleService $taskschedules_service
44
     */
45
    private $taskschedules_service;
46
    
47
    /**
48
     * Constructor for TaskEditAction Request Handler
49
     *
50
     * @param ModuleService $module_service
51
     * @param TaskScheduleService $taskschedules_service
52
     */
53
    public function __construct(ModuleService $module_service, TaskScheduleService $taskschedules_service)
54
    {
55
            $this->module = $module_service->findByInterface(AdminTasksModule::class)->first();
56
        $this->taskschedules_service = $taskschedules_service;
57
    }
58
    
59
    /**
60
     * {@inheritDoc}
61
     * @see \Psr\Http\Server\RequestHandlerInterface::handle()
62
     */
63
    public function handle(ServerRequestInterface $request): ResponseInterface
64
    {
65
        $task_sched_id = (int) $request->getAttribute('task');
66
        $task_schedule = $this->taskschedules_service->find($task_sched_id);
67
        
68
        $admin_config_route = route(AdminConfigPage::class);
69
        
70
        if ($task_schedule === null) {
71
            FlashMessages::addMessage(
72
                I18N::translate('The task shedule with ID “%d” does not exist.', I18N::number($task_sched_id)),
73
                'danger'
74
            );
75
            return redirect($admin_config_route);
76
        }
77
        
78
        $success = $this->updateGeneralSettings($task_schedule, $request);
79
        $success = $success && $this->updateSpecificSettings($task_schedule, $request);
80
        
81
        if ($success) {
82
            FlashMessages::addMessage(
83
                I18N::translate('The scheduled task has been successfully updated'),
84
                'success'
85
            );
86
            //phpcs:ignore Generic.Files.LineLength.TooLong
87
            Log::addConfigurationLog('Module ' . $this->module->title() . ' : Task Schedule “' . $task_schedule->id() . '” has been updated.');
88
        }
89
        
90
        return redirect($admin_config_route);
91
    }
92
    
93
    /**
94
     * Update general settings for the task, based on the request parameters
95
     *
96
     * @param TaskSchedule $task_schedule
97
     * @param ServerRequestInterface $request
98
     * @return bool
99
     */
100
    private function updateGeneralSettings(TaskSchedule $task_schedule, ServerRequestInterface $request): bool
101
    {
102
        $params = (array) $request->getParsedBody();
103
        
104
        $frequency = (int) $params['frequency'];
105
        if ($frequency > 0) {
106
            $task_schedule->setFrequency(CarbonInterval::minutes($frequency));
107
        } else {
108
            FlashMessages::addMessage(I18N::translate('The frequency is not in a valid format'), 'danger');
109
        }
110
        
111
        $is_limited = (bool) $params['is_limited'];
112
        $nb_occur = (int) $params['nb_occur'];
113
        
114
        if ($is_limited) {
115
            if ($nb_occur > 0) {
116
                $task_schedule->setRemainingOccurences($nb_occur);
117
            } else {
118
                FlashMessages::addMessage(
119
                    I18N::translate('The number of remaining occurences is not in a valid format'),
120
                    'danger'
121
                );
122
            }
123
        } else {
124
            $task_schedule->setRemainingOccurences(0);
125
        }
126
        
127
        try {
128
            $this->taskschedules_service->update($task_schedule);
129
            return true;
130
        } catch (Exception $ex) {
131
            Log::addErrorLog(
132
                sprintf(
133
                    'Error while updating the Task Schedule "%s". Exception: %s',
134
                    $task_schedule->id(),
135
                    $ex->getMessage()
136
                )
137
            );
138
        }
139
        
140
        FlashMessages::addMessage(I18N::translate('An error occured while updating the scheduled task'), 'danger');
141
        //@phpcs:ignore Generic.Files.LineLength.TooLong
142
        Log::addConfigurationLog('Module ' . $this->module->title() . ' : Task Schedule “' . $task_schedule->id() . '” could not be updated. See error log.');
143
        return false;
144
    }
145
    
146
    /**
147
     * Update general settings for the task, based on the request parameters
148
     *
149
     * @param TaskSchedule $task_schedule
150
     * @param ServerRequestInterface $request
151
     * @return bool
152
     */
153
    private function updateSpecificSettings(TaskSchedule $task_schedule, ServerRequestInterface $request): bool
154
    {
155
        $task = $this->taskschedules_service->findTask($task_schedule->taskId());
156
        if ($task === null || !($task instanceof ConfigurableTaskInterface)) {
157
            return true;
158
        }
159
        
160
        /** @var TaskInterface|ConfigurableTaskInterface $task */
161
        if (!$task->updateConfig($request, $task_schedule)) {
0 ignored issues
show
Bug introduced by
The method updateConfig() does not exist on MyArtJaub\Webtrees\Modul...sks\Model\TaskInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to MyArtJaub\Webtrees\Modul...sks\Model\TaskInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

161
        if (!$task->/** @scrutinizer ignore-call */ updateConfig($request, $task_schedule)) {
Loading history...
162
            FlashMessages::addMessage(
163
                I18N::translate(
164
                    'An error occured while updating the specific settings of administrative task “%s”',
165
                    $task->name()
0 ignored issues
show
Bug introduced by
The method name() does not exist on MyArtJaub\Webtrees\Modul...nfigurableTaskInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to MyArtJaub\Webtrees\Modul...nfigurableTaskInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

165
                    $task->/** @scrutinizer ignore-call */ 
166
                           name()
Loading history...
166
                ),
167
                'danger'
168
            );
169
            //phpcs:ignore Generic.Files.LineLength.TooLong
170
            Log::addConfigurationLog('Module ' . $this->module->title() . ' : AdminTask “' . $task->name() . '” specific settings could not be updated. See error log.');
171
        }
172
        
173
        return true;
174
    }
175
}
176