xref: /webtrees/app/Source.php (revision 3fa66c660869af2f4c92ef37e06997aa8a0f55e1)
1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2019 webtrees development team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16declare(strict_types=1);
17
18namespace Fisharebest\Webtrees;
19
20use Illuminate\Database\Capsule\Manager as DB;
21
22/**
23 * A GEDCOM source (SOUR) object.
24 */
25class Source extends GedcomRecord
26{
27    const RECORD_TYPE = 'SOUR';
28    const ROUTE_NAME  = 'source';
29
30    /**
31     * Get an instance of a source object. For single records,
32     * we just receive the XREF. For bulk records (such as lists
33     * and search results) we can receive the GEDCOM data as well.
34     *
35     * @param string      $xref
36     * @param Tree        $tree
37     * @param string|null $gedcom
38     *
39     * @throws \Exception
40     *
41     * @return Source|null
42     */
43    public static function getInstance(string $xref, Tree $tree, string $gedcom = null)
44    {
45        $record = parent::getInstance($xref, $tree, $gedcom);
46
47        if ($record instanceof Source) {
48            return $record;
49        }
50
51        return null;
52    }
53
54    /**
55     * Each object type may have its own special rules, and re-implement this function.
56     *
57     * @param int $access_level
58     *
59     * @return bool
60     */
61    protected function canShowByType(int $access_level): bool
62    {
63        // Hide sources if they are attached to private repositories ...
64        preg_match_all('/\n1 REPO @(.+)@/', $this->gedcom, $matches);
65        foreach ($matches[1] as $match) {
66            $repo = Repository::getInstance($match, $this->tree);
67            if ($repo && !$repo->canShow($access_level)) {
68                return false;
69            }
70        }
71
72        // ... otherwise apply default behaviour
73        return parent::canShowByType($access_level);
74    }
75
76    /**
77     * Generate a private version of this record
78     *
79     * @param int $access_level
80     *
81     * @return string
82     */
83    protected function createPrivateGedcomRecord(int $access_level): string
84    {
85        return '0 @' . $this->xref . "@ SOUR\n1 TITL " . I18N::translate('Private');
86    }
87
88    /**
89     * Fetch data from the database
90     *
91     * @param string $xref
92     * @param int    $tree_id
93     *
94     * @return null|string
95     */
96    protected static function fetchGedcomRecord(string $xref, int $tree_id)
97    {
98        return DB::table('sources')
99            ->where('s_id', '=', $xref)
100            ->where('s_file', '=', $tree_id)
101            ->value('s_gedcom');
102    }
103
104    /**
105     * Extract names from the GEDCOM record.
106     *
107     * @return void
108     */
109    public function extractNames()
110    {
111        parent::extractNamesFromFacts(1, 'TITL', $this->facts(['TITL']));
112    }
113}
114