Passed
Branch feature/2.1-geodispersion-dev (1d61a8)
by Jonathan
61:21
created

CertificateImage::watermarkText()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 12
c 1
b 0
f 0
nc 8
nop 2
dl 0
loc 18
rs 8.4444
1
<?php
2
3
/**
4
 * webtrees-lib: MyArtJaub library for webtrees
5
 *
6
 * @package MyArtJaub\Webtrees
7
 * @subpackage Certificates
8
 * @author Jonathan Jaubart <[email protected]>
9
 * @copyright Copyright (c) 2009-2021, Jonathan Jaubart
10
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3
11
 */
12
13
declare(strict_types=1);
14
15
namespace MyArtJaub\Webtrees\Module\Certificates\Http\RequestHandlers;
16
17
use Fig\Http\Message\StatusCodeInterface;
18
use Fisharebest\Webtrees\I18N;
19
use Fisharebest\Webtrees\Registry;
20
use Fisharebest\Webtrees\Tree;
21
use Fisharebest\Webtrees\Contracts\UserInterface;
22
use Fisharebest\Webtrees\Exceptions\HttpNotFoundException;
23
use Fisharebest\Webtrees\Services\ModuleService;
24
use MyArtJaub\Webtrees\Module\Certificates\CertificatesModule;
25
use MyArtJaub\Webtrees\Module\Certificates\Factories\CertificateImageFactory;
26
use MyArtJaub\Webtrees\Module\Certificates\Model\Certificate;
27
use MyArtJaub\Webtrees\Module\Certificates\Model\Watermark;
28
use MyArtJaub\Webtrees\Module\Certificates\Services\CertificateDataService;
29
use MyArtJaub\Webtrees\Module\Certificates\Services\CertificateFilesystemService;
30
use MyArtJaub\Webtrees\Module\Certificates\Services\UrlObfuscatorService;
31
use Psr\Http\Message\ResponseInterface;
32
use Psr\Http\Message\ServerRequestInterface;
33
use Psr\Http\Server\RequestHandlerInterface;
34
35
/**
36
 * Request handler for providing an image of a certificate.
37
 */
38
class CertificateImage implements RequestHandlerInterface
39
{
40
    /**
41
     * @var CertificatesModule|null $module
42
     */
43
    private $module;
44
45
    /**
46
     * @var CertificateFilesystemService $certif_filesystem
47
     */
48
    private $certif_filesystem;
49
50
    /**
51
     * @var CertificateImageFactory $certif_image_factory
52
     */
53
    private $certif_image_factory;
54
55
    /**
56
     * @var CertificateDataService $certif_data_service
57
     */
58
    private $certif_data_service;
59
60
    /**
61
     * @var UrlObfuscatorService $url_obfuscator_service
62
     */
63
    private $url_obfuscator_service;
64
65
    /**
66
     * Constructor for Certificate Image Request Handler
67
     *
68
     * @param ModuleService $module_service
69
     */
70
    public function __construct(
71
        ModuleService $module_service,
72
        CertificateFilesystemService $certif_filesystem,
73
        CertificateDataService $certif_data_service,
74
        UrlObfuscatorService $url_obfuscator_service
75
    ) {
76
        $this->module = $module_service->findByInterface(CertificatesModule::class)->first();
77
        $this->certif_filesystem = $certif_filesystem;
78
        $this->certif_image_factory = new CertificateImageFactory($this->certif_filesystem);
79
        $this->certif_data_service = $certif_data_service;
80
        $this->url_obfuscator_service = $url_obfuscator_service;
81
    }
82
83
    /**
84
     * {@inheritDoc}
85
     * @see \Psr\Http\Server\RequestHandlerInterface::handle()
86
     */
87
    public function handle(ServerRequestInterface $request): ResponseInterface
88
    {
89
        if ($this->module === null) {
90
            throw new HttpNotFoundException(I18N::translate('The attached module could not be found.'));
91
        }
92
93
        $tree = $request->getAttribute('tree');
94
        assert($tree instanceof Tree);
95
96
        $user = $request->getAttribute('user');
97
        assert($user instanceof UserInterface);
98
99
        $certif_path = $request->getAttribute('cid');
100
        $certificate = null;
101
        if ($certif_path !== '' && $this->url_obfuscator_service->tryDeobfuscate($certif_path)) {
102
            $certificate = $this->certif_filesystem->certificate($tree, $certif_path);
103
        }
104
105
        if ($certificate === null) {
106
            return $this->certif_image_factory
107
            ->replacementImageResponse((string) StatusCodeInterface::STATUS_NOT_FOUND)
108
            ->withHeader('X-Image-Exception', I18N::translate('The certificate was not found in this family tree.'))
109
            ;
110
        }
111
112
        $use_watermark = $this->certif_image_factory->certificateNeedsWatermark($certificate, $user);
113
        $watermark = $use_watermark ? $this->watermark($request, $certificate) : null;
114
115
        return $this->certif_image_factory->certificateFileResponse(
116
            $certificate,
117
            $use_watermark,
118
            $watermark
119
        );
120
    }
121
122
    /**
123
     * Get watermark data for a certificate.
124
     *
125
     * @param ServerRequestInterface $request
126
     * @param Certificate $certificate
127
     * @return Watermark
128
     */
129
    private function watermark(ServerRequestInterface $request, Certificate $certificate): Watermark
130
    {
131
        $color = $certificate->tree()->getPreference('MAJ_CERTIF_WM_FONT_COLOR', Watermark::DEFAULT_COLOR);
132
        $size = $certificate->tree()->getPreference('MAJ_CERTIF_WM_FONT_MAXSIZE');
133
        $text = $this->watermarkText($request, $certificate);
134
135
        return new Watermark($text, $color, is_numeric($size) ? (int) $size : Watermark::DEFAULT_SIZE);
136
    }
137
138
    /**
139
     * Get the text to be watermarked for a certificate.
140
     *
141
     * @param ServerRequestInterface $request
142
     * @param Certificate $certificate
143
     * @return string
144
     */
145
    private function watermarkText(ServerRequestInterface $request, Certificate $certificate): string
146
    {
147
        $sid = $request->getQueryParams()['sid'] ?? '';
148
        if ($sid !== '') {
149
            $source = Registry::sourceFactory()->make($sid, $certificate->tree());
150
        } else {
151
            $source = $this->certif_data_service->oneLinkedSource($certificate);
152
        }
153
154
        if ($source !== null && $source->canShowName()) {
155
            $repo = $source->facts(['REPO'])->first();
156
            if ($repo !== null && ($repo = $repo->target()) !== null && $repo->canShowName()) {
157
                return I18N::translate('© %s - %s', strip_tags($repo->fullName()), strip_tags($source->fullName()));
158
            }
159
            return $source->fullName();
160
        }
161
        $default_text = $certificate->tree()->getPreference('MAJ_CERTIF_WM_DEFAULT');
162
        return $default_text !== '' ? $default_text : I18N::translate('This image is protected under copyright law.');
163
    }
164
}
165