xref: /webtrees/app/Http/RequestHandlers/PendingChanges.php (revision a091ac74647eab281b25090b737835eeea14ae10)
122e73debSGreg Roach<?php
222e73debSGreg Roach
322e73debSGreg Roach/**
422e73debSGreg Roach * webtrees: online genealogy
5*a091ac74SGreg Roach * Copyright (C) 2020 webtrees development team
622e73debSGreg Roach * This program is free software: you can redistribute it and/or modify
722e73debSGreg Roach * it under the terms of the GNU General Public License as published by
822e73debSGreg Roach * the Free Software Foundation, either version 3 of the License, or
922e73debSGreg Roach * (at your option) any later version.
1022e73debSGreg Roach * This program is distributed in the hope that it will be useful,
1122e73debSGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
1222e73debSGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1322e73debSGreg Roach * GNU General Public License for more details.
1422e73debSGreg Roach * You should have received a copy of the GNU General Public License
1522e73debSGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>.
1622e73debSGreg Roach */
1722e73debSGreg Roach
1822e73debSGreg Roachdeclare(strict_types=1);
1922e73debSGreg Roach
2022e73debSGreg Roachnamespace Fisharebest\Webtrees\Http\RequestHandlers;
2122e73debSGreg Roach
2222e73debSGreg Roachuse Fisharebest\Webtrees\Carbon;
23*a091ac74SGreg Roachuse Fisharebest\Webtrees\Factory;
2422e73debSGreg Roachuse Fisharebest\Webtrees\Family;
2522e73debSGreg Roachuse Fisharebest\Webtrees\Gedcom;
261635452cSGreg Roachuse Fisharebest\Webtrees\Header;
2722e73debSGreg Roachuse Fisharebest\Webtrees\Http\ViewResponseTrait;
2822e73debSGreg Roachuse Fisharebest\Webtrees\I18N;
2922e73debSGreg Roachuse Fisharebest\Webtrees\Individual;
3022e73debSGreg Roachuse Fisharebest\Webtrees\Media;
3122e73debSGreg Roachuse Fisharebest\Webtrees\Note;
3222e73debSGreg Roachuse Fisharebest\Webtrees\Repository;
3322e73debSGreg Roachuse Fisharebest\Webtrees\Services\TreeService;
3422e73debSGreg Roachuse Fisharebest\Webtrees\Source;
351635452cSGreg Roachuse Fisharebest\Webtrees\Submission;
36ffc0a61fSGreg Roachuse Fisharebest\Webtrees\Submitter;
3722e73debSGreg Roachuse Fisharebest\Webtrees\Tree;
3822e73debSGreg Roachuse Illuminate\Database\Capsule\Manager as DB;
3922e73debSGreg Roachuse Psr\Http\Message\ResponseInterface;
4022e73debSGreg Roachuse Psr\Http\Message\ServerRequestInterface;
4122e73debSGreg Roachuse Psr\Http\Server\RequestHandlerInterface;
4222e73debSGreg Roach
4322e73debSGreg Roachuse function assert;
4422e73debSGreg Roachuse function key;
4522e73debSGreg Roachuse function preg_match;
4622e73debSGreg Roachuse function reset;
4722e73debSGreg Roachuse function route;
4822e73debSGreg Roach
4922e73debSGreg Roach/**
5022e73debSGreg Roach * Show all pending changes.
5122e73debSGreg Roach */
5222e73debSGreg Roachclass PendingChanges implements RequestHandlerInterface
5322e73debSGreg Roach{
5422e73debSGreg Roach    use ViewResponseTrait;
5522e73debSGreg Roach
5657bfa969SGreg Roach    /** @var TreeService */
5757bfa969SGreg Roach    private $tree_service;
5822e73debSGreg Roach
5922e73debSGreg Roach    /**
6022e73debSGreg Roach     * @param TreeService $tree_service
6122e73debSGreg Roach     */
62dce3fc17SGreg Roach    public function __construct(TreeService $tree_service)
6322e73debSGreg Roach    {
6422e73debSGreg Roach        $this->tree_service = $tree_service;
6522e73debSGreg Roach    }
6622e73debSGreg Roach
6722e73debSGreg Roach    /**
6822e73debSGreg Roach     * @param ServerRequestInterface $request
6922e73debSGreg Roach     *
7022e73debSGreg Roach     * @return ResponseInterface
7122e73debSGreg Roach     */
7222e73debSGreg Roach    public function handle(ServerRequestInterface $request): ResponseInterface
7322e73debSGreg Roach    {
7422e73debSGreg Roach        $tree = $request->getAttribute('tree');
7575964c75SGreg Roach        assert($tree instanceof Tree);
7622e73debSGreg Roach
778e0e1b25SGreg Roach        $url = $request->getQueryParams()['url'] ?? route(TreePage::class, ['tree' => $tree->name()]);
7822e73debSGreg Roach
7922e73debSGreg Roach        $rows = DB::table('change')
8022e73debSGreg Roach            ->join('user', 'user.user_id', '=', 'change.user_id')
8122e73debSGreg Roach            ->join('gedcom', 'gedcom.gedcom_id', '=', 'change.gedcom_id')
8222e73debSGreg Roach            ->where('status', '=', 'pending')
8322e73debSGreg Roach            ->orderBy('change.gedcom_id')
8422e73debSGreg Roach            ->orderBy('change.xref')
8522e73debSGreg Roach            ->orderBy('change.change_id')
8622e73debSGreg Roach            ->select(['change.*', 'user.user_name', 'user.real_name', 'gedcom_name'])
8722e73debSGreg Roach            ->get();
8822e73debSGreg Roach
8922e73debSGreg Roach        $changes = [];
9022e73debSGreg Roach        foreach ($rows as $row) {
9122e73debSGreg Roach            $row->change_time = Carbon::make($row->change_time);
9222e73debSGreg Roach
9322e73debSGreg Roach            $change_tree = $this->tree_service->all()->get($row->gedcom_name);
9422e73debSGreg Roach
9522e73debSGreg Roach            preg_match('/^0 (?:@' . Gedcom::REGEX_XREF . '@ )?(' . Gedcom::REGEX_TAG . ')/', $row->old_gedcom . $row->new_gedcom, $match);
9622e73debSGreg Roach
9722e73debSGreg Roach            switch ($match[1]) {
981635452cSGreg Roach                case Individual::RECORD_TYPE:
99*a091ac74SGreg Roach                    $row->record = Factory::individual()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
10022e73debSGreg Roach                    break;
1011635452cSGreg Roach                case Family::RECORD_TYPE:
102*a091ac74SGreg Roach                    $row->record = Factory::family()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
10322e73debSGreg Roach                    break;
1041635452cSGreg Roach                case Source::RECORD_TYPE:
105*a091ac74SGreg Roach                    $row->record = Factory::source()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
10622e73debSGreg Roach                    break;
1071635452cSGreg Roach                case Repository::RECORD_TYPE:
108*a091ac74SGreg Roach                    $row->record = Factory::repository()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
10922e73debSGreg Roach                    break;
1101635452cSGreg Roach                case Media::RECORD_TYPE:
111*a091ac74SGreg Roach                    $row->record = Factory::media()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
11222e73debSGreg Roach                    break;
1131635452cSGreg Roach                case Note::RECORD_TYPE:
114*a091ac74SGreg Roach                    $row->record = Factory::note()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
11522e73debSGreg Roach                    break;
1161635452cSGreg Roach                case Submitter::RECORD_TYPE:
117*a091ac74SGreg Roach                    $row->record = Factory::submitter()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
118ffc0a61fSGreg Roach                    break;
1191635452cSGreg Roach                case Submission::RECORD_TYPE:
120*a091ac74SGreg Roach                    $row->record = Factory::submission()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
1211635452cSGreg Roach                    break;
1221635452cSGreg Roach                case Header::RECORD_TYPE:
123*a091ac74SGreg Roach                    $row->record = Factory::header()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
1241635452cSGreg Roach                    break;
12522e73debSGreg Roach                default:
126*a091ac74SGreg Roach                    $row->record = Factory::gedcomRecord()->new($row->xref, $row->old_gedcom, $row->new_gedcom, $change_tree);
12722e73debSGreg Roach                    break;
12822e73debSGreg Roach            }
12922e73debSGreg Roach
13012b72f5fSGreg Roach            $changes[$row->gedcom_name][$row->xref][] = $row;
13122e73debSGreg Roach        }
13222e73debSGreg Roach
13322e73debSGreg Roach        $title = I18N::translate('Pending changes');
13422e73debSGreg Roach
13522e73debSGreg Roach        // If the current tree has changes, activate that tab.  Otherwise activate the first tab.
13622e73debSGreg Roach        if (($changes[$tree->id()] ?? []) === []) {
13722e73debSGreg Roach            reset($changes);
13812b72f5fSGreg Roach            $active_tree_name = key($changes);
13922e73debSGreg Roach        } else {
14012b72f5fSGreg Roach            $active_tree_name = $tree->name();
14122e73debSGreg Roach        }
14222e73debSGreg Roach
14322e73debSGreg Roach        return $this->viewResponse('pending-changes-page', [
14412b72f5fSGreg Roach            'active_tree_name' => $active_tree_name,
14522e73debSGreg Roach            'changes'          => $changes,
14622e73debSGreg Roach            'title'            => $title,
14722e73debSGreg Roach            'tree'             => $tree,
14812b72f5fSGreg Roach            'trees'            => $this->tree_service->all(),
14922e73debSGreg Roach            'url'              => $url,
15022e73debSGreg Roach        ]);
15122e73debSGreg Roach    }
15222e73debSGreg Roach}
153