Passed
Push — feature/code-analysis ( e964aa...4fe35d )
by Jonathan
14:33
created

MapAdapterAddAction::handle()   B

Complexity

Conditions 8
Paths 7

Size

Total Lines 60
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 38
nc 7
nop 1
dl 0
loc 60
rs 8.0675
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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-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\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\Validator;
22
use Fisharebest\Webtrees\Services\ModuleService;
23
use Illuminate\Contracts\Container\BindingResolutionException;
24
use MyArtJaub\Webtrees\Common\GeoDispersion\Config\MapViewConfig;
25
use MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperInterface;
26
use MyArtJaub\Webtrees\Module\GeoDispersion\GeoDispersionModule;
27
use MyArtJaub\Webtrees\Module\GeoDispersion\Model\GeoAnalysisMapAdapter;
28
use MyArtJaub\Webtrees\Module\GeoDispersion\Services\GeoAnalysisViewDataService;
29
use MyArtJaub\Webtrees\Module\GeoDispersion\Services\MapAdapterDataService;
30
use MyArtJaub\Webtrees\Module\GeoDispersion\Services\MapDefinitionsService;
31
use Psr\Http\Message\ResponseInterface;
32
use Psr\Http\Message\ServerRequestInterface;
33
use Psr\Http\Server\RequestHandlerInterface;
34
35
/**
36
 * Request handler for adding a new geographical analysis map adapter.
37
 */
38
class MapAdapterAddAction implements RequestHandlerInterface
39
{
40
    private ?GeoDispersionModule $module;
41
    private GeoAnalysisViewDataService $geoview_data_service;
42
    private MapAdapterDataService $mapadapter_data_service;
43
    private MapDefinitionsService $map_definition_service;
44
45
    /**
46
     * Constructor for MapAdapterAddAction Request Handler
47
     *
48
     * @param ModuleService $module_service
49
     * @param GeoAnalysisViewDataService $geoview_data_service
50
     * @param MapAdapterDataService $mapadapter_data_service
51
     * @param MapDefinitionsService $map_definition_service
52
     */
53
    public function __construct(
54
        ModuleService $module_service,
55
        GeoAnalysisViewDataService $geoview_data_service,
56
        MapAdapterDataService $mapadapter_data_service,
57
        MapDefinitionsService $map_definition_service
58
    ) {
59
        $this->module = $module_service->findByInterface(GeoDispersionModule::class)->first();
60
        $this->geoview_data_service = $geoview_data_service;
61
        $this->mapadapter_data_service = $mapadapter_data_service;
62
        $this->map_definition_service = $map_definition_service;
63
    }
64
65
    /**
66
     * {@inheritDoc}
67
     * @see \Psr\Http\Server\RequestHandlerInterface::handle()
68
     */
69
    public function handle(ServerRequestInterface $request): ResponseInterface
70
    {
71
        $tree = Validator::attributes($request)->tree();
72
73
        if ($this->module === null) {
74
            FlashMessages::addMessage(
75
                I18N::translate('The attached module could not be found.'),
76
                'danger'
77
            );
78
            return redirect(route(AdminConfigPage::class, ['tree' => $tree->name()]));
79
        }
80
81
        $view_id = Validator::attributes($request)->integer('view_id', -1);
82
        $view = $this->geoview_data_service->find($tree, $view_id);
83
84
        $map = $this->map_definition_service->find(Validator::parsedBody($request)->string('map_adapter_map', ''));
85
        $mapping_property   = Validator::parsedBody($request)->string('map_adapter_property_selected', '');
86
87
        $mapper = null;
0 ignored issues
show
Unused Code introduced by
The assignment to $mapper is dead and can be removed.
Loading history...
88
        try {
89
            $mapper = app(Validator::parsedBody($request)->string('map_adapter_mapper', ''));
90
        } catch (BindingResolutionException $ex) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
91
        }
92
93
        if ($view === null || $map === null || $mapper === null || !($mapper instanceof PlaceMapperInterface)) {
94
            FlashMessages::addMessage(
95
                I18N::translate('The parameters for the map configuration are not valid.'),
96
                'danger'
97
            );
98
            return redirect(route(AdminConfigPage::class, ['tree' => $tree->name()]));
99
        }
100
101
        $new_adapter_id = $this->mapadapter_data_service->insertGetId(
102
            new GeoAnalysisMapAdapter(
103
                0,
104
                $view_id,
105
                $map,
106
                $mapper,
107
                new MapViewConfig($mapping_property, $mapper->config()->withConfigUpdate($request))
108
            )
109
        );
110
        if ($new_adapter_id > 0) {
111
            FlashMessages::addMessage(
112
                I18N::translate('The map configuration has been successfully added.'),
113
                'success'
114
            );
115
            //phpcs:ignore Generic.Files.LineLength.TooLong
116
            Log::addConfigurationLog('Module ' . $this->module->title() . ' : Map Adapter “' . $new_adapter_id . '” has been added.');
117
        } else {
118
            FlashMessages::addMessage(
119
                I18N::translate('An error occured while adding a new map configuration.'),
120
                'danger'
121
            );
122
            //phpcs:ignore Generic.Files.LineLength.TooLong
123
            Log::addConfigurationLog('Module ' . $this->module->title() . ' : Map Adapter could not be added. See error log.');
124
        }
125
126
        return redirect(route(GeoAnalysisViewEditPage::class, [
127
            'tree' => $tree->name(),
128
            'view_id' => $view_id
129
        ]));
130
    }
131
}
132