xref: /webtrees/app/Statistics/Repository/MediaRepository.php (revision 3de8afc6331d090c7363ff8f96b99add3bd78518)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2022 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\Statistics\Repository;
21
22use Fisharebest\Webtrees\I18N;
23use Fisharebest\Webtrees\Statistics\Google\ChartMedia;
24use Fisharebest\Webtrees\Statistics\Repository\Interfaces\MediaRepositoryInterface;
25use Fisharebest\Webtrees\Statistics\Service\ColorService;
26use Fisharebest\Webtrees\Tree;
27use Illuminate\Database\Capsule\Manager as DB;
28use Illuminate\Database\Query\Builder;
29use Illuminate\Database\Query\Expression;
30
31use function array_slice;
32use function arsort;
33use function asort;
34use function count;
35use function in_array;
36use function var_dump;
37
38/**
39 * A repository providing methods for media type related statistics.
40 */
41class MediaRepository implements MediaRepositoryInterface
42{
43    private ColorService $color_service;
44
45    private Tree $tree;
46
47    /**
48     * Available media types.
49     */
50    private const MEDIA_TYPE_ALL         = 'all';
51    private const MEDIA_TYPE_AUDIO       = 'audio';
52    private const MEDIA_TYPE_BOOK        = 'book';
53    private const MEDIA_TYPE_CARD        = 'card';
54    private const MEDIA_TYPE_CERTIFICATE = 'certificate';
55    private const MEDIA_TYPE_COAT        = 'coat';
56    private const MEDIA_TYPE_DOCUMENT    = 'document';
57    private const MEDIA_TYPE_ELECTRONIC  = 'electronic';
58    private const MEDIA_TYPE_FICHE       = 'fiche';
59    private const MEDIA_TYPE_FILM        = 'film';
60    private const MEDIA_TYPE_MAGAZINE    = 'magazine';
61    private const MEDIA_TYPE_MANUSCRIPT  = 'manuscript';
62    private const MEDIA_TYPE_MAP         = 'map';
63    private const MEDIA_TYPE_NEWSPAPER   = 'newspaper';
64    private const MEDIA_TYPE_PAINTING    = 'painting';
65    private const MEDIA_TYPE_PHOTO       = 'photo';
66    private const MEDIA_TYPE_TOMBSTONE   = 'tombstone';
67    private const MEDIA_TYPE_VIDEO       = 'video';
68    private const MEDIA_TYPE_OTHER       = 'other';
69    private const MEDIA_TYPE_UNKNOWN     = '';
70
71    /**
72     * @param ColorService $color_service
73     * @param Tree         $tree
74     */
75    public function __construct(ColorService $color_service, Tree $tree)
76    {
77        $this->color_service = $color_service;
78        $this->tree          = $tree;
79    }
80
81    /**
82     * @param string $type
83     *
84     * @return string
85     */
86    public function totalMedia(string $type = self::MEDIA_TYPE_ALL): string
87    {
88        $query = DB::table('media_file')->where('m_file', '=', $this->tree->id());
89
90        if ($type !== self::MEDIA_TYPE_ALL) {
91            $query->where('source_media_type', '=', $type);
92        }
93
94        return I18N::number($query->count());
95    }
96
97    /**
98     * @return string
99     */
100    public function totalMediaAudio(): string
101    {
102        return $this->totalMedia(self::MEDIA_TYPE_AUDIO);
103    }
104
105    /**
106     * @return string
107     */
108    public function totalMediaBook(): string
109    {
110        return $this->totalMedia(self::MEDIA_TYPE_BOOK);
111    }
112
113    /**
114     * @return string
115     */
116    public function totalMediaCard(): string
117    {
118        return $this->totalMedia(self::MEDIA_TYPE_CARD);
119    }
120
121    /**
122     * @return string
123     */
124    public function totalMediaCertificate(): string
125    {
126        return $this->totalMedia(self::MEDIA_TYPE_CERTIFICATE);
127    }
128
129    /**
130     * @return string
131     */
132    public function totalMediaCoatOfArms(): string
133    {
134        return $this->totalMedia(self::MEDIA_TYPE_COAT);
135    }
136
137    /**
138     * @return string
139     */
140    public function totalMediaDocument(): string
141    {
142        return $this->totalMedia(self::MEDIA_TYPE_DOCUMENT);
143    }
144
145    /**
146     * @return string
147     */
148    public function totalMediaElectronic(): string
149    {
150        return $this->totalMedia(self::MEDIA_TYPE_ELECTRONIC);
151    }
152
153    /**
154     * @return string
155     */
156    public function totalMediaFiche(): string
157    {
158        return $this->totalMedia(self::MEDIA_TYPE_FICHE);
159    }
160
161    /**
162     * @return string
163     */
164    public function totalMediaFilm(): string
165    {
166        return $this->totalMedia(self::MEDIA_TYPE_FILM);
167    }
168
169    /**
170     * @return string
171     */
172    public function totalMediaMagazine(): string
173    {
174        return $this->totalMedia(self::MEDIA_TYPE_MAGAZINE);
175    }
176
177    /**
178     * @return string
179     */
180    public function totalMediaManuscript(): string
181    {
182        return $this->totalMedia(self::MEDIA_TYPE_MANUSCRIPT);
183    }
184
185    /**
186     * @return string
187     */
188    public function totalMediaMap(): string
189    {
190        return $this->totalMedia(self::MEDIA_TYPE_MAP);
191    }
192
193    /**
194     * @return string
195     */
196    public function totalMediaNewspaper(): string
197    {
198        return $this->totalMedia(self::MEDIA_TYPE_NEWSPAPER);
199    }
200
201    /**
202     * @return string
203     */
204    public function totalMediaPainting(): string
205    {
206        return $this->totalMedia(self::MEDIA_TYPE_PAINTING);
207    }
208
209    /**
210     * @return string
211     */
212    public function totalMediaPhoto(): string
213    {
214        return $this->totalMedia(self::MEDIA_TYPE_PHOTO);
215    }
216
217    /**
218     * @return string
219     */
220    public function totalMediaTombstone(): string
221    {
222        return $this->totalMedia(self::MEDIA_TYPE_TOMBSTONE);
223    }
224
225    /**
226     * @return string
227     */
228    public function totalMediaVideo(): string
229    {
230        return $this->totalMedia(self::MEDIA_TYPE_VIDEO);
231    }
232
233    /**
234     * @return string
235     */
236    public function totalMediaOther(): string
237    {
238        return $this->totalMedia(self::MEDIA_TYPE_OTHER);
239    }
240
241    /**
242     * @return string
243     */
244    public function totalMediaUnknown(): string
245    {
246        return $this->totalMedia(self::MEDIA_TYPE_UNKNOWN);
247    }
248
249    /**
250     * @param string|null $color_from
251     * @param string|null $color_to
252     *
253     * @return string
254     */
255    public function chartMedia(string $color_from = null, string $color_to = null): string
256    {
257        $media = DB::table('media_file')
258            ->where('m_file', '=', $this->tree->id())
259            ->groupBy('source_media_type')
260            ->pluck(new Expression('COUNT(*)'), 'source_media_type')
261            ->map(static fn (string $n): int => (int) $n)
262            ->all();
263
264        return (new ChartMedia($this->color_service))
265            ->chartMedia($media, $color_from, $color_to);
266    }
267}
268