xref: /webtrees/app/Http/RequestHandlers/SourcePage.php (revision 870b663fa3f7d3552f29fec0a1f1dcf1002a2547)
154186344SGreg Roach<?php
254186344SGreg Roach
354186344SGreg Roach/**
454186344SGreg Roach * webtrees: online genealogy
5a091ac74SGreg Roach * Copyright (C) 2020 webtrees development team
654186344SGreg Roach * This program is free software: you can redistribute it and/or modify
754186344SGreg Roach * it under the terms of the GNU General Public License as published by
854186344SGreg Roach * the Free Software Foundation, either version 3 of the License, or
954186344SGreg Roach * (at your option) any later version.
1054186344SGreg Roach * This program is distributed in the hope that it will be useful,
1154186344SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
1254186344SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1354186344SGreg Roach * GNU General Public License for more details.
1454186344SGreg Roach * You should have received a copy of the GNU General Public License
1554186344SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>.
1654186344SGreg Roach */
1754186344SGreg Roach
1854186344SGreg Roachdeclare(strict_types=1);
1954186344SGreg Roach
2054186344SGreg Roachnamespace Fisharebest\Webtrees\Http\RequestHandlers;
2154186344SGreg Roach
22e5d858f5SGreg Roachuse Fig\Http\Message\StatusCodeInterface;
2354186344SGreg Roachuse Fisharebest\Webtrees\Auth;
2454186344SGreg Roachuse Fisharebest\Webtrees\Fact;
25a091ac74SGreg Roachuse Fisharebest\Webtrees\Factory;
2654186344SGreg Roachuse Fisharebest\Webtrees\Http\ViewResponseTrait;
2754186344SGreg Roachuse Fisharebest\Webtrees\Services\ClipboardService;
2854186344SGreg Roachuse Fisharebest\Webtrees\Source;
2954186344SGreg Roachuse Fisharebest\Webtrees\Tree;
3054186344SGreg Roachuse Illuminate\Support\Collection;
3154186344SGreg Roachuse Psr\Http\Message\ResponseInterface;
3254186344SGreg Roachuse Psr\Http\Message\ServerRequestInterface;
3354186344SGreg Roachuse Psr\Http\Server\RequestHandlerInterface;
3454186344SGreg Roach
3554186344SGreg Roachuse function array_search;
3654186344SGreg Roachuse function assert;
3754186344SGreg Roachuse function is_string;
3854186344SGreg Roachuse function redirect;
3954186344SGreg Roach
4054186344SGreg Roachuse const PHP_INT_MAX;
4154186344SGreg Roach
4254186344SGreg Roach/**
4354186344SGreg Roach * Show a source's page.
4454186344SGreg Roach */
4554186344SGreg Roachclass SourcePage implements RequestHandlerInterface
4654186344SGreg Roach{
4754186344SGreg Roach    use ViewResponseTrait;
4854186344SGreg Roach
4954186344SGreg Roach    // Show the source's facts in this order:
5054186344SGreg Roach    private const FACT_ORDER = [
51*870b663fSGreg Roach        1 => 'SOUR:TITL',
52*870b663fSGreg Roach        'SOUR:ABBR',
53*870b663fSGreg Roach        'SOUR:AUTH',
54*870b663fSGreg Roach        'SOUR:DATA',
55*870b663fSGreg Roach        'SOUR:PUBL',
56*870b663fSGreg Roach        'SOUR:TEXT',
57*870b663fSGreg Roach        'SOUR:REPO',
58*870b663fSGreg Roach        'SOUR:NOTE',
59*870b663fSGreg Roach        'SOUR:OBJE',
60*870b663fSGreg Roach        'SOUR:REFN',
61*870b663fSGreg Roach        'SOUR:RIN',
62*870b663fSGreg Roach        'SOUR:_UID',
63*870b663fSGreg Roach        'SOUR:CHAN',
64*870b663fSGreg Roach        'SOUR:RESN',
6554186344SGreg Roach    ];
6654186344SGreg Roach
6754186344SGreg Roach    /** @var ClipboardService */
6854186344SGreg Roach    private $clipboard_service;
6954186344SGreg Roach
7054186344SGreg Roach    /**
7154186344SGreg Roach     * SourcePage constructor.
7254186344SGreg Roach     *
7354186344SGreg Roach     * @param ClipboardService $clipboard_service
7454186344SGreg Roach     */
7554186344SGreg Roach    public function __construct(ClipboardService $clipboard_service)
7654186344SGreg Roach    {
7754186344SGreg Roach        $this->clipboard_service = $clipboard_service;
7854186344SGreg Roach    }
7954186344SGreg Roach
8054186344SGreg Roach    /**
8154186344SGreg Roach     * @param ServerRequestInterface $request
8254186344SGreg Roach     *
8354186344SGreg Roach     * @return ResponseInterface
8454186344SGreg Roach     */
8554186344SGreg Roach    public function handle(ServerRequestInterface $request): ResponseInterface
8654186344SGreg Roach    {
8754186344SGreg Roach        $tree = $request->getAttribute('tree');
8854186344SGreg Roach        assert($tree instanceof Tree);
8954186344SGreg Roach
9054186344SGreg Roach        $xref = $request->getAttribute('xref');
9154186344SGreg Roach        assert(is_string($xref));
9254186344SGreg Roach
93a091ac74SGreg Roach        $source = Factory::source()->make($xref, $tree);
9454186344SGreg Roach        $source = Auth::checkSourceAccess($source, false);
9554186344SGreg Roach
9654186344SGreg Roach        // Redirect to correct xref/slug
9754186344SGreg Roach        if ($source->xref() !== $xref || $request->getAttribute('slug') !== $source->slug()) {
98e5d858f5SGreg Roach            return redirect($source->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
9954186344SGreg Roach        }
10054186344SGreg Roach
10154186344SGreg Roach        return $this->viewResponse('source-page', [
10254186344SGreg Roach            'clipboard_facts'  => $this->clipboard_service->pastableFacts($source, new Collection()),
10354186344SGreg Roach            'facts'            => $this->facts($source),
10454186344SGreg Roach            'families'         => $source->linkedFamilies('SOUR'),
10554186344SGreg Roach            'individuals'      => $source->linkedIndividuals('SOUR'),
1062406e0e0SGreg Roach            'meta_description' => '',
10754186344SGreg Roach            'meta_robots'      => 'index,follow',
10854186344SGreg Roach            'notes'            => $source->linkedNotes('SOUR'),
10954186344SGreg Roach            'media_objects'    => $source->linkedMedia('SOUR'),
11054186344SGreg Roach            'source'           => $source,
11154186344SGreg Roach            'title'            => $source->fullName(),
11254186344SGreg Roach            'tree'             => $tree,
11354186344SGreg Roach        ]);
11454186344SGreg Roach    }
11554186344SGreg Roach
11654186344SGreg Roach    /**
11754186344SGreg Roach     * @param Source $record
11854186344SGreg Roach     *
119b5c8fd7eSGreg Roach     * @return Collection<Fact>
12054186344SGreg Roach     */
12154186344SGreg Roach    private function facts(Source $record): Collection
12254186344SGreg Roach    {
12354186344SGreg Roach        return $record->facts()
12454186344SGreg Roach            ->sort(static function (Fact $x, Fact $y): int {
125*870b663fSGreg Roach                $sort_x = array_search($x->tag(), self::FACT_ORDER, true) ?: PHP_INT_MAX;
126*870b663fSGreg Roach                $sort_y = array_search($y->tag(), self::FACT_ORDER, true) ?: PHP_INT_MAX;
12754186344SGreg Roach
12854186344SGreg Roach                return $sort_x <=> $sort_y;
12954186344SGreg Roach            });
13054186344SGreg Roach    }
13154186344SGreg Roach}
132