xref: /webtrees/app/Http/RequestHandlers/MergeRecordsAction.php (revision b11cdcd45131b1585d66693fab363cfeb18c51a4)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * 'Copyright (C) 2023 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 <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Http\RequestHandlers;
21
22use Fisharebest\Webtrees\Registry;
23use Fisharebest\Webtrees\Validator;
24use Psr\Http\Message\ResponseInterface;
25use Psr\Http\Message\ServerRequestInterface;
26use Psr\Http\Server\RequestHandlerInterface;
27
28use function redirect;
29use function route;
30
31/**
32 * Merge records
33 */
34class MergeRecordsAction implements RequestHandlerInterface
35{
36    /**
37     * @param ServerRequestInterface $request
38     *
39     * @return ResponseInterface
40     */
41    public function handle(ServerRequestInterface $request): ResponseInterface
42    {
43        $tree = Validator::attributes($request)->tree();
44        $xref1 = Validator::parsedBody($request)->isXref()->string('xref1');
45        $xref2 = Validator::parsedBody($request)->isXref()->string('xref2');
46
47        // Merge record2 into record1
48        $record1 = Registry::gedcomRecordFactory()->make($xref1, $tree);
49        $record2 = Registry::gedcomRecordFactory()->make($xref2, $tree);
50
51        if (
52            $record1 === null ||
53            $record2 === null ||
54            $record1 === $record2 ||
55            $record1->tag() !== $record2->tag() ||
56            $record1->isPendingDeletion() ||
57            $record2->isPendingDeletion()
58        ) {
59            return redirect(route(MergeRecordsPage::class, [
60                'tree'  => $tree->name(),
61                'xref1' => $xref1,
62                'xref2' => $xref2,
63            ]));
64        }
65
66        return redirect(route(MergeFactsPage::class, [
67            'tree'  => $tree->name(),
68            'xref1' => $xref1,
69            'xref2' => $xref2,
70        ]));
71    }
72}
73