Passed
Branch main (f9aaf7)
by Jonathan
14:43
created

MapAdapterEditAction   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 44
dl 0
loc 84
rs 10
c 0
b 0
f 0
wmc 9

2 Methods

Rating   Name   Duplication   Size   Complexity  
B handle() 0 57 8
A __construct() 0 8 1
1
<?php
2
3
/**
4
 * webtrees-lib: MyArtJaub library for webtrees
5
 *
6
 * @package MyArtJaub\Webtrees
7
 * @subpackage GeoDispersion
8
 * @author Jonathan Jaubart <[email protected]>
9
 * @copyright Copyright (c) 2009-2021, 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\GeoDispersion\Http\RequestHandlers;
16
17
use Fisharebest\Webtrees\FlashMessages;
18
use Fisharebest\Webtrees\I18N;
19
use Fisharebest\Webtrees\Log;
20
use Fisharebest\Webtrees\Tree;
21
use Fisharebest\Webtrees\Services\ModuleService;
22
use Illuminate\Contracts\Container\BindingResolutionException;
23
use MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperInterface;
24
use MyArtJaub\Webtrees\Module\GeoDispersion\GeoDispersionModule;
25
use MyArtJaub\Webtrees\Module\GeoDispersion\Services\MapAdapterDataService;
26
use MyArtJaub\Webtrees\Module\GeoDispersion\Services\MapDefinitionsService;
27
use Psr\Http\Message\ResponseInterface;
28
use Psr\Http\Message\ServerRequestInterface;
29
use Psr\Http\Server\RequestHandlerInterface;
30
use Throwable;
31
32
/**
33
 * Request handler for editing a a geographical analysis map adapter.
34
 */
35
class MapAdapterEditAction implements RequestHandlerInterface
36
{
37
    private ?GeoDispersionModule $module;
38
    private MapAdapterDataService $mapadapter_data_service;
39
    private MapDefinitionsService $map_definition_service;
40
41
    /**
42
     * Constructor for MapAdapterEditAction Request Handler
43
     *
44
     * @param ModuleService $module_service
45
     * @param MapAdapterDataService $mapadapter_data_service
46
     * @param MapDefinitionsService $map_definition_service
47
     */
48
    public function __construct(
49
        ModuleService $module_service,
50
        MapAdapterDataService $mapadapter_data_service,
51
        MapDefinitionsService $map_definition_service
52
    ) {
53
        $this->module = $module_service->findByInterface(GeoDispersionModule::class)->first();
54
        $this->mapadapter_data_service = $mapadapter_data_service;
55
        $this->map_definition_service = $map_definition_service;
56
    }
57
58
    /**
59
     * {@inheritDoc}
60
     * @see \Psr\Http\Server\RequestHandlerInterface::handle()
61
     */
62
    public function handle(ServerRequestInterface $request): ResponseInterface
63
    {
64
        $tree = $request->getAttribute('tree');
65
        assert($tree instanceof Tree);
66
67
        if ($this->module === null) {
68
            FlashMessages::addMessage(
69
                I18N::translate('The attached module could not be found.'),
70
                'danger'
71
            );
72
            return redirect(route(AdminConfigPage::class, ['tree' => $tree]));
73
        }
74
75
        $adapter_id = (int) $request->getAttribute('adapter_id');
76
        $map_adapter = $this->mapadapter_data_service->find($adapter_id);
77
78
        $params = (array) $request->getParsedBody();
79
80
        $map = $this->map_definition_service->find($params['map_adapter_map'] ?? '');
81
        $mapping_property   = $params['map_adapter_property_selected'] ?? '';
82
83
        $mapper = null;
0 ignored issues
show
Unused Code introduced by
The assignment to $mapper is dead and can be removed.
Loading history...
84
        try {
85
            $mapper = app($params['map_adapter_mapper'] ?? '');
86
        } catch (BindingResolutionException $ex) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
87
        }
88
89
        if ($map_adapter === null || $map === null || $mapper === null || !($mapper instanceof PlaceMapperInterface)) {
90
            FlashMessages::addMessage(
91
                I18N::translate('The parameters for the map configuration are not valid.'),
92
                'danger'
93
            );
94
            return redirect(route(AdminConfigPage::class, ['tree' => $tree]));
95
        }
96
97
        $mapper->setConfig($mapper->config()->withConfigUpdate($request));
98
        $new_map_adapter = $map_adapter->with($map, $mapper, $mapping_property);
99
        try {
100
            $this->mapadapter_data_service->update($new_map_adapter);
101
            FlashMessages::addMessage(
102
                I18N::translate('The map configuration has been successfully updated.'),
103
                'success'
104
            );
105
            //phpcs:ignore Generic.Files.LineLength.TooLong
106
            Log::addConfigurationLog('Module ' . $this->module->title() . ' : Map Adapter “' . $map_adapter->id() . '” has been updated.');
107
        } catch (Throwable $ex) {
108
            FlashMessages::addMessage(
109
                I18N::translate('An error occured while updating the map configuration.'),
110
                'danger'
111
            );
112
            //phpcs:ignore Generic.Files.LineLength.TooLong
113
            Log::addErrorLog('Module ' . $this->module->title() . ' : Error when updating Map Adapter “' . $map_adapter->id() . '”: ' . $ex->getMessage());
114
        }
115
116
        return redirect(route(GeoAnalysisViewEditPage::class, [
117
            'tree' => $tree->name(),
118
            'view_id' => $map_adapter->geoAnalysisViewId()
119
        ]));
120
    }
121
}
122