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