Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
CreateNewsEndpoint
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 1
90
0.00% covered (danger)
0.00%
0 / 1
 handle
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 1
90
1<?php
2
3namespace Olz\News\Endpoints;
4
5use Olz\Api\OlzCreateEntityTypedEndpoint;
6use Olz\Entity\News\NewsEntry;
7use Olz\Entity\Users\User;
8use Symfony\Component\Mime\Email;
9
10/**
11 * @phpstan-import-type OlzNewsId from NewsEndpointTrait
12 * @phpstan-import-type OlzNewsData from NewsEndpointTrait
13 *
14 * TODO: Those should not be necessary!
15 * @phpstan-import-type OlzNewsFormat from NewsEndpointTrait
16 *
17 * @extends OlzCreateEntityTypedEndpoint<OlzNewsId, OlzNewsData, array{
18 *   captchaToken?: ?non-empty-string,
19 * }, array{
20 *   status: 'OK'|'DENIED'|'ERROR',
21 * }>
22 */
23class CreateNewsEndpoint extends OlzCreateEntityTypedEndpoint {
24    use NewsEndpointTrait;
25
26    protected function handle(mixed $input): mixed {
27        $input_data = $input['data'];
28        $format = $input_data['format'];
29
30        if ($format !== 'anonymous') {
31            $this->checkPermission('any');
32        }
33        if ($format === 'kaderblog') {
34            $this->checkPermission('kaderblog');
35        }
36        if ($format === 'aktuell') {
37            $this->checkIsStaff();
38        }
39
40        $token = $input['custom']['captchaToken'] ?? null;
41        $is_valid_token = $token ? $this->captchaUtils()->validateToken($token) : false;
42        if ($format === 'anonymous' && !$is_valid_token) {
43            return ['custom' => ['status' => 'DENIED'], 'id' => null];
44        }
45
46        $news_entry = new NewsEntry();
47        $this->entityUtils()->createOlzEntity($news_entry, $input['meta']);
48        $this->updateEntityWithData($news_entry, $input['data']);
49
50        $this->entityManager()->persist($news_entry);
51        $this->entityManager()->flush();
52        $this->persistUploads($news_entry, $input['data']);
53
54        if ($format === 'anonymous') {
55            $anonymous_user = new User();
56            $anonymous_user->setEmail($input_data['authorEmail'] ?? null);
57            $anonymous_user->setFirstName($input_data['authorName'] ?? '-');
58            $anonymous_user->setLastName('');
59
60            $delete_news_token = urlencode($this->emailUtils()->encryptEmailReactionToken([
61                'action' => 'delete_news',
62                'news_id' => $news_entry->getId(),
63            ]));
64            $base_url = $this->envUtils()->getBaseHref();
65            $code_href = $this->envUtils()->getCodeHref();
66            $news_url = "{$base_url}{$code_href}news/{$news_entry->getId()}";
67            $delete_news_url = "{$base_url}{$code_href}email_reaktion?token={$delete_news_token}";
68            $text = <<<ZZZZZZZZZZ
69                Hallo {$anonymous_user->getFirstName()},
70
71                Du hast soeben auf [{$base_url}]({$base_url}) einen [anonymen Forumseintrag]({$news_url}) erstellt.
72
73                Falls du deinen Eintrag wieder *löschen* willst, klicke [hier]({$delete_news_url}) oder auf folgenden Link:
74
75                {$delete_news_url}
76
77                ZZZZZZZZZZ;
78            $config = [
79                'no_unsubscribe' => true,
80            ];
81
82            try {
83                $email = (new Email())->subject("[OLZ] Dein Forumseintrag");
84                $email = $this->emailUtils()->buildOlzEmail($email, $anonymous_user, $text, $config);
85                $this->emailUtils()->send($email);
86                $this->log()->info("Forumseintrag email sent to {$anonymous_user->getEmail()}.");
87            } catch (\Exception $exc) {
88                $message = $exc->getMessage();
89                $this->log()->critical("Error sending Forumseintrag email to {$anonymous_user->getEmail()}.: {$message}");
90            }
91        }
92
93        return [
94            'custom' => ['status' => 'OK'],
95            'id' => $news_entry->getId(),
96        ];
97    }
98}