Passed
Push — master ( 9b5c95...5229ea )
by Greg
06:55
created

ReorderChildrenAction   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 47
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 22
c 1
b 0
f 1
dl 0
loc 47
rs 10
wmc 3

1 Method

Rating   Name   Duplication   Size   Complexity  
A handle() 0 40 3
1
<?php
2
3
/**
4
 * webtrees: online genealogy
5
 * Copyright (C) 2019 webtrees development team
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
 */
17
declare(strict_types=1);
18
19
namespace Fisharebest\Webtrees\Http\RequestHandlers;
20
21
use Fisharebest\Webtrees\Auth;
22
use Fisharebest\Webtrees\Family;
23
use Fisharebest\Webtrees\Tree;
24
use InvalidArgumentException;
25
use Psr\Http\Message\ResponseInterface;
26
use Psr\Http\Message\ServerRequestInterface;
27
use Psr\Http\Server\RequestHandlerInterface;
28
29
use function array_merge;
30
use function array_search;
31
use function assert;
32
use function implode;
33
use function is_array;
34
use function redirect;
35
use function uksort;
36
37
/**
38
 * Reorder the children in a family.
39
 */
40
class ReorderChildrenAction implements RequestHandlerInterface
41
{
42
    /**
43
     * @param ServerRequestInterface $request
44
     *
45
     * @return ResponseInterface
46
     */
47
    public function handle(ServerRequestInterface $request): ResponseInterface
48
    {
49
        $tree = $request->getAttribute('tree');
50
        assert($tree instanceof Tree, new InvalidArgumentException());
51
52
        $xref = $request->getAttribute('xref');
53
        assert(is_string($xref), new InvalidArgumentException());
54
55
        $family = Family::getInstance($xref, $tree);
56
        assert($family instanceof Family, new InvalidArgumentException());
57
58
        $order = $request->getParsedBody()['order'];
59
        assert(is_array($order), new InvalidArgumentException());
60
61
        Auth::checkFamilyAccess($family, true);
62
63
        $dummy_facts = ['0 @' . $family->xref() . '@ FAM'];
64
        $sort_facts  = [];
65
        $keep_facts  = [];
66
67
        // Split facts into FAMS and other
68
        foreach ($family->facts() as $fact) {
69
            if ($fact->getTag() === 'CHIL') {
70
                $sort_facts[$fact->id()] = $fact->gedcom();
71
            } else {
72
                $keep_facts[] = $fact->gedcom();
73
            }
74
        }
75
76
        // Sort the facts
77
        uksort($sort_facts, static function ($x, $y) use ($order) {
78
            return array_search($x, $order, true) - array_search($y, $order, true);
79
        });
80
81
        // Merge the facts
82
        $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts));
83
84
        $family->updateRecord($gedcom, false);
85
86
        return redirect($family->url());
87
    }
88
}
89