Passed
Branch feature/2.0 (9789a8)
by Jonathan
14:17
created

PedigreeCollapseData::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php
2
3
/**
4
 * webtrees-lib: MyArtJaub library for webtrees
5
 *
6
 * @package MyArtJaub\Webtrees
7
 * @subpackage Sosa
8
 * @author Jonathan Jaubart <[email protected]>
9
 * @copyright Copyright (c) 2009-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\Sosa\Http\RequestHandlers;
16
17
use Fig\Http\Message\StatusCodeInterface;
18
use Fisharebest\Webtrees\Auth;
19
use Fisharebest\Webtrees\DefaultUser;
20
use Fisharebest\Webtrees\I18N;
21
use Fisharebest\Webtrees\Tree;
22
use Fisharebest\Webtrees\Exceptions\HttpNotFoundException;
23
use Fisharebest\Webtrees\Services\ModuleService;
24
use MyArtJaub\Webtrees\Module\Sosa\SosaModule;
25
use MyArtJaub\Webtrees\Module\Sosa\Services\SosaStatisticsService;
26
use Psr\Http\Message\ResponseInterface;
27
use Psr\Http\Message\ServerRequestInterface;
28
use Psr\Http\Server\RequestHandlerInterface;
29
30
/**
31
 * Request handler for pedigree collapse data. Provide a JSON response.
32
 *
33
 */
34
class PedigreeCollapseData implements RequestHandlerInterface
35
{
36
    /**
37
     * @var SosaModule $module
38
     */
39
    private $module;
40
41
    /**
42
     * Constructor for PedigreeCollapseData Request Handler
43
     *
44
     * @param ModuleService $module_service
45
     */
46
    public function __construct(ModuleService $module_service)
47
    {
48
        $this->module = $module_service->findByInterface(SosaModule::class)->first();
49
    }
50
51
    /**
52
     * {@inheritDoc}
53
     * @see \Psr\Http\Server\RequestHandlerInterface::handle()
54
     */
55
    public function handle(ServerRequestInterface $request): ResponseInterface
56
    {
57
        if ($this->module === null) {
58
            throw new HttpNotFoundException(I18N::translate('The attached module could not be found.'));
59
        }
60
61
        $tree = $request->getAttribute('tree');
62
        assert($tree instanceof Tree);
63
64
        $user = Auth::check() ? $request->getAttribute('user') : new DefaultUser();
65
66
        /** @var SosaStatisticsService $sosa_stats_service */
67
        $sosa_stats_service = app()->makeWith(SosaStatisticsService::class, ['tree' => $tree, 'user' => $user]);
68
        $pedi_collapse_data = $sosa_stats_service->pedigreeCollapseByGenerationData();
69
70
        $response = [ 'cells' => [] ];
71
        $last_pedi_collapse = 0;
72
        foreach ($pedi_collapse_data as $gen => $rec) {
73
            $response['cells'][$gen] = view($this->module->name() . '::components/pedigree-collapse-cell', [
74
                'pedi_collapse_roots'   =>  $rec['pedi_collapse_roots'],
75
                'pedi_collapse_xgen'    =>  $rec['pedi_collapse_xgen']
76
            ]);
77
            $last_pedi_collapse = $rec['pedi_collapse_roots'];
78
        }
79
        $response['pedi_collapse'] = I18N::percentage($last_pedi_collapse, 2);
80
81
        return response($response, StatusCodeInterface::STATUS_OK);
82
    }
83
}
84