Skip to content

Commit 3c1d6b8

Browse files
committed
Adding assert() to forms, required a bit of refactoring here and there
1 parent d5de482 commit 3c1d6b8

14 files changed

+309
-117
lines changed

app/psalm-baseline.xml

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,6 @@
1111
<code><![CDATA[$values->password]]></code>
1212
</MixedArgument>
1313
</file>
14-
<file src="src/Form/InterviewFormFactory.php">
15-
<MixedArgument>
16-
<code><![CDATA[$values->action]]></code>
17-
<code><![CDATA[$values->action]]></code>
18-
<code><![CDATA[$values->audioEmbed]]></code>
19-
<code><![CDATA[$values->audioEmbed]]></code>
20-
<code><![CDATA[$values->audioHref]]></code>
21-
<code><![CDATA[$values->audioHref]]></code>
22-
<code><![CDATA[$values->date]]></code>
23-
<code><![CDATA[$values->date]]></code>
24-
<code><![CDATA[$values->description]]></code>
25-
<code><![CDATA[$values->description]]></code>
26-
<code><![CDATA[$values->href]]></code>
27-
<code><![CDATA[$values->href]]></code>
28-
<code><![CDATA[$values->sourceHref]]></code>
29-
<code><![CDATA[$values->sourceHref]]></code>
30-
<code><![CDATA[$values->sourceName]]></code>
31-
<code><![CDATA[$values->sourceName]]></code>
32-
<code><![CDATA[$values->title]]></code>
33-
<code><![CDATA[$values->title]]></code>
34-
<code><![CDATA[$values->videoEmbed]]></code>
35-
<code><![CDATA[$values->videoEmbed]]></code>
36-
<code><![CDATA[$values->videoHref]]></code>
37-
<code><![CDATA[$values->videoHref]]></code>
38-
</MixedArgument>
39-
</file>
4014
<file src="src/Form/PostFormFactory.php">
4115
<MixedArgument>
4216
<code><![CDATA[$values->lead === '' ? null : $values->lead]]></code>
@@ -61,52 +35,6 @@
6135
<code><![CDATA[$values->site->new->url]]></code>
6236
</MixedArgument>
6337
</file>
64-
<file src="src/Form/TalkFormFactory.php">
65-
<MixedArgument>
66-
<code><![CDATA[$values->action]]></code>
67-
<code><![CDATA[$values->action]]></code>
68-
<code><![CDATA[$values->date]]></code>
69-
<code><![CDATA[$values->date]]></code>
70-
<code><![CDATA[$values->description]]></code>
71-
<code><![CDATA[$values->description]]></code>
72-
<code><![CDATA[$values->event]]></code>
73-
<code><![CDATA[$values->event]]></code>
74-
<code><![CDATA[$values->eventHref]]></code>
75-
<code><![CDATA[$values->eventHref]]></code>
76-
<code><![CDATA[$values->favorite]]></code>
77-
<code><![CDATA[$values->favorite]]></code>
78-
<code><![CDATA[$values->filenamesTalk]]></code>
79-
<code><![CDATA[$values->filenamesTalk]]></code>
80-
<code><![CDATA[$values->href]]></code>
81-
<code><![CDATA[$values->href]]></code>
82-
<code><![CDATA[$values->locale]]></code>
83-
<code><![CDATA[$values->locale]]></code>
84-
<code><![CDATA[$values->ogImage]]></code>
85-
<code><![CDATA[$values->ogImage]]></code>
86-
<code><![CDATA[$values->publishSlides]]></code>
87-
<code><![CDATA[$values->publishSlides]]></code>
88-
<code><![CDATA[$values->slidesEmbed]]></code>
89-
<code><![CDATA[$values->slidesEmbed]]></code>
90-
<code><![CDATA[$values->slidesHref]]></code>
91-
<code><![CDATA[$values->slidesHref]]></code>
92-
<code><![CDATA[$values->slidesNote]]></code>
93-
<code><![CDATA[$values->slidesNote]]></code>
94-
<code><![CDATA[$values->slidesTalk]]></code>
95-
<code><![CDATA[$values->slidesTalk]]></code>
96-
<code><![CDATA[$values->supersededBy]]></code>
97-
<code><![CDATA[$values->supersededBy]]></code>
98-
<code><![CDATA[$values->title]]></code>
99-
<code><![CDATA[$values->title]]></code>
100-
<code><![CDATA[$values->transcript]]></code>
101-
<code><![CDATA[$values->transcript]]></code>
102-
<code><![CDATA[$values->translationGroup]]></code>
103-
<code><![CDATA[$values->translationGroup]]></code>
104-
<code><![CDATA[$values->videoEmbed]]></code>
105-
<code><![CDATA[$values->videoEmbed]]></code>
106-
<code><![CDATA[$values->videoHref]]></code>
107-
<code><![CDATA[$values->videoHref]]></code>
108-
</MixedArgument>
109-
</file>
11038
<file src="src/Form/TrainingApplicationAdminFormFactory.php">
11139
<MixedArgument>
11240
<code><![CDATA[$dateId]]></code>
@@ -210,12 +138,6 @@
210138
<code><![CDATA[$matches[2]]]></code>
211139
</MixedArgument>
212140
</file>
213-
<file src="src/Media/VideoThumbnails.php">
214-
<MixedArgument>
215-
<code><![CDATA[$values->videoThumbnail]]></code>
216-
<code><![CDATA[$values->videoThumbnailAlternative]]></code>
217-
</MixedArgument>
218-
</file>
219141
<file src="src/Pulse/Passwords/PasswordsSorting.php">
220142
<MixedArgument>
221143
<code><![CDATA[$sorter]]></code>

app/src/Form/InterviewFormFactory.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use MichalSpacekCz\Media\VideoThumbnails;
1010
use Nette\Forms\Controls\SubmitButton;
1111
use Nette\Forms\Form;
12+
use Nette\Http\FileUpload;
1213

1314
readonly class InterviewFormFactory
1415
{
@@ -71,8 +72,21 @@ public function create(callable $onSuccess, ?Interview $interview = null): UiFor
7172

7273
$form->onSuccess[] = function (UiForm $form) use ($interview, $onSuccess, $videoThumbnailFormFields): void {
7374
$values = $form->getFormValues();
74-
$videoThumbnailBasename = $this->videoThumbnails->getUploadedMainFileBasename($values);
75-
$videoThumbnailBasenameAlternative = $this->videoThumbnails->getUploadedAlternativeFileBasename($values);
75+
assert($values->videoThumbnail instanceof FileUpload);
76+
assert($values->videoThumbnailAlternative instanceof FileUpload);
77+
assert(is_string($values->action));
78+
assert(is_string($values->title));
79+
assert(is_string($values->description));
80+
assert(is_string($values->date));
81+
assert(is_string($values->href));
82+
assert(is_string($values->audioHref));
83+
assert(is_string($values->audioEmbed));
84+
assert(is_string($values->videoHref));
85+
assert(is_string($values->videoEmbed));
86+
assert(is_string($values->sourceName));
87+
assert(is_string($values->sourceHref));
88+
$videoThumbnailBasename = $this->videoThumbnails->getUploadedMainFileBasename($values->videoThumbnail);
89+
$videoThumbnailBasenameAlternative = $this->videoThumbnails->getUploadedAlternativeFileBasename($values->videoThumbnailAlternative);
7690
if ($interview) {
7791
$removeVideoThumbnail = $videoThumbnailFormFields->hasVideoThumbnail() && $values->removeVideoThumbnail;
7892
$removeVideoThumbnailAlternative = $videoThumbnailFormFields->hasAlternativeVideoThumbnail() && $values->removeVideoThumbnailAlternative;
@@ -94,7 +108,7 @@ public function create(callable $onSuccess, ?Interview $interview = null): UiFor
94108
$values->sourceName,
95109
$values->sourceHref,
96110
);
97-
$this->videoThumbnails->saveVideoThumbnailFiles($interview->getId(), $values);
111+
$this->videoThumbnails->saveVideoThumbnailFiles($interview->getId(), $values->videoThumbnail, $values->videoThumbnailAlternative);
98112
if ($removeVideoThumbnail && $thumbnailFilename !== null) {
99113
$this->videoThumbnails->deleteFile($interview->getId(), $thumbnailFilename);
100114
}
@@ -117,7 +131,7 @@ public function create(callable $onSuccess, ?Interview $interview = null): UiFor
117131
$values->sourceName,
118132
$values->sourceHref,
119133
);
120-
$this->videoThumbnails->saveVideoThumbnailFiles($interviewId, $values);
134+
$this->videoThumbnails->saveVideoThumbnailFiles($interviewId, $values->videoThumbnail, $values->videoThumbnailAlternative);
121135
}
122136
$onSuccess();
123137
};

app/src/Form/SignInHoneypotFormFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public function create(): UiForm
2626
$this->controlsFactory->addSignIn($form);
2727
$form->onSuccess[] = function (UiForm $form): void {
2828
$values = $form->getFormValues();
29+
assert(is_string($values->username));
30+
assert(is_string($values->password));
2931
Debugger::log("Sign-in attempt: {$values->username}, {$values->password}, {$this->httpRequest->getRemoteAddress()}", 'honeypot');
3032
$creds = $values->username . ':' . $values->password;
3133
if (Regex::isMatch('~\slimit\s~i', $creds)) {

app/src/Form/TalkFormFactory.php

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use MichalSpacekCz\Talks\Talks;
1212
use Nette\Forms\Controls\SubmitButton;
1313
use Nette\Forms\Form;
14+
use Nette\Http\FileUpload;
1415
use Nette\Utils\Html;
1516
use Nette\Utils\Strings;
1617

@@ -107,8 +108,32 @@ public function create(callable $onSuccess, ?Talk $talk = null): UiForm
107108

108109
$form->onSuccess[] = function (UiForm $form) use ($talk, $onSuccess, $videoThumbnailFormFields): void {
109110
$values = $form->getFormValues();
110-
$videoThumbnailBasename = $this->videoThumbnails->getUploadedMainFileBasename($values);
111-
$videoThumbnailBasenameAlternative = $this->videoThumbnails->getUploadedAlternativeFileBasename($values);
111+
assert($values->videoThumbnail instanceof FileUpload);
112+
assert($values->videoThumbnailAlternative instanceof FileUpload);
113+
assert(is_int($values->locale));
114+
assert(is_int($values->translationGroup) || $values->translationGroup === null);
115+
assert(is_string($values->action));
116+
assert(is_string($values->title));
117+
assert(is_string($values->description));
118+
assert(is_string($values->date));
119+
assert(is_string($values->duration));
120+
assert(is_string($values->href));
121+
assert(is_int($values->slidesTalk) || $values->slidesTalk === null);
122+
assert(is_int($values->filenamesTalk) || $values->filenamesTalk === null);
123+
assert(is_string($values->slidesHref));
124+
assert(is_string($values->slidesEmbed));
125+
assert(is_string($values->slidesNote));
126+
assert(is_string($values->videoHref));
127+
assert(is_string($values->videoEmbed));
128+
assert(is_string($values->event));
129+
assert(is_string($values->eventHref));
130+
assert(is_string($values->ogImage));
131+
assert(is_string($values->transcript));
132+
assert(is_string($values->favorite));
133+
assert(is_int($values->supersededBy) || $values->supersededBy === null);
134+
assert(is_bool($values->publishSlides));
135+
$videoThumbnailBasename = $this->videoThumbnails->getUploadedMainFileBasename($values->videoThumbnail);
136+
$videoThumbnailBasenameAlternative = $this->videoThumbnails->getUploadedAlternativeFileBasename($values->videoThumbnailAlternative);
112137
if ($talk) {
113138
$removeVideoThumbnail = $videoThumbnailFormFields->hasVideoThumbnail() && $values->removeVideoThumbnail;
114139
$removeVideoThumbnailAlternative = $videoThumbnailFormFields->hasAlternativeVideoThumbnail() && $values->removeVideoThumbnailAlternative;
@@ -141,7 +166,7 @@ public function create(callable $onSuccess, ?Talk $talk = null): UiForm
141166
$values->supersededBy,
142167
$values->publishSlides,
143168
);
144-
$this->videoThumbnails->saveVideoThumbnailFiles($talk->getId(), $values);
169+
$this->videoThumbnails->saveVideoThumbnailFiles($talk->getId(), $values->videoThumbnail, $values->videoThumbnailAlternative);
145170
if ($removeVideoThumbnail && $thumbnailFilename !== null) {
146171
$this->videoThumbnails->deleteFile($talk->getId(), $thumbnailFilename);
147172
}
@@ -176,7 +201,7 @@ public function create(callable $onSuccess, ?Talk $talk = null): UiForm
176201
$values->supersededBy,
177202
$values->publishSlides,
178203
);
179-
$this->videoThumbnails->saveVideoThumbnailFiles($talkId, $values);
204+
$this->videoThumbnails->saveVideoThumbnailFiles($talkId, $values->videoThumbnail, $values->videoThumbnailAlternative);
180205
$message = Html::el()->setText('Přednáška přidána ');
181206
}
182207
$message->addHtml(Html::el('a')->href($this->linkGenerator->link('Www:Talks:talk', [$values->action]))->setText('Zobrazit'));

app/src/Form/TalkSlidesFormFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function create(callable $onSuccess, int $talkId, TalkSlideCollection $sl
6565
assert($values->slides instanceof ArrayHash);
6666
assert($values->new instanceof ArrayHash);
6767
assert(is_bool($values->deleteReplaced));
68-
$this->talkSlides->saveSlides($talkId, $slides, (array)$values->slides, array_values((array)$values->new), $values->deleteReplaced);
68+
$this->talkSlides->saveSlides($talkId, $slides, $values->slides, $values->new, $values->deleteReplaced);
6969
$message = $this->texyFormatter->translate('messages.talks.admin.slideadded');
7070
$type = 'info';
7171
} catch (DuplicatedSlideException $e) {

app/src/Media/VideoThumbnails.php

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
use Nette\Http\FileUpload;
1414
use Nette\Utils\Callback;
1515
use Nette\Utils\ImageException;
16-
use stdClass;
1716

1817
readonly class VideoThumbnails
1918
{
@@ -114,18 +113,18 @@ public function deleteFile(int $id, string $basename): void
114113
/**
115114
* @throws ContentTypeException
116115
*/
117-
public function getUploadedMainFileBasename(stdClass $values): ?string
116+
public function getUploadedMainFileBasename(FileUpload $thumbnail): ?string
118117
{
119-
return $this->getUploadedFileBasename($values->videoThumbnail, $this->supportedImageFileFormats->getMainExtensionByContentType(...));
118+
return $this->getUploadedFileBasename($thumbnail, $this->supportedImageFileFormats->getMainExtensionByContentType(...));
120119
}
121120

122121

123122
/**
124123
* @throws ContentTypeException
125124
*/
126-
public function getUploadedAlternativeFileBasename(stdClass $values): ?string
125+
public function getUploadedAlternativeFileBasename(FileUpload $thumbnail): ?string
127126
{
128-
return $this->getUploadedFileBasename($values->videoThumbnailAlternative, $this->supportedImageFileFormats->getAlternativeExtensionByContentType(...));
127+
return $this->getUploadedFileBasename($thumbnail, $this->supportedImageFileFormats->getAlternativeExtensionByContentType(...));
129128
}
130129

131130

@@ -149,15 +148,15 @@ private function getUploadedFileBasename(FileUpload $thumbnail, callable $getExt
149148
/**
150149
* @throws ContentTypeException
151150
*/
152-
public function saveVideoThumbnailFiles(int $id, stdClass $values): void
151+
public function saveVideoThumbnailFiles(int $id, FileUpload $videoThumbnail, FileUpload $videoThumbnailAlternative): void
153152
{
154-
$basename = $this->getUploadedMainFileBasename($values);
153+
$basename = $this->getUploadedMainFileBasename($videoThumbnail);
155154
if ($basename !== null) {
156-
$values->videoThumbnail->move($this->mediaResources->getImageFilename($id, $basename));
155+
$videoThumbnail->move($this->mediaResources->getImageFilename($id, $basename));
157156
}
158-
$basename = $this->getUploadedAlternativeFileBasename($values);
157+
$basename = $this->getUploadedAlternativeFileBasename($videoThumbnailAlternative);
159158
if ($basename !== null) {
160-
$values->videoThumbnailAlternative->move($this->mediaResources->getImageFilename($id, $basename));
159+
$videoThumbnailAlternative->move($this->mediaResources->getImageFilename($id, $basename));
161160
}
162161
}
163162

app/src/Talks/Slides/TalkSlides.php

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -204,19 +204,16 @@ private function replaceSlideImage(int $talkId, FileUpload $replace, callable $g
204204

205205

206206
/**
207-
* Insert slides.
208-
*
209-
* @param int $talkId
210-
* @param list<ArrayHash<int|string|FileUpload|null>> $slides
211207
* @throws DuplicatedSlideException
212208
* @throws ContentTypeException
213209
* @throws SlideImageUploadFailedException
214210
*/
215-
private function addSlides(int $talkId, array $slides): void
211+
private function addSlides(int $talkId, ArrayHash $slides): void
216212
{
217213
$lastNumber = 0;
218214
try {
219215
foreach ($slides as $slide) {
216+
assert($slide instanceof ArrayHash);
220217
assert($slide->replace instanceof FileUpload);
221218
assert($slide->replaceAlternative instanceof FileUpload);
222219
assert(is_int($slide->number));
@@ -245,23 +242,21 @@ private function addSlides(int $talkId, array $slides): void
245242

246243

247244
/**
248-
* Update slides.
249-
*
250-
* @param array<int, ArrayHash<int|string|FileUpload|null>> $slides
251245
* @param bool $removeFiles Remove old files?
252246
* @throws DuplicatedSlideException
253247
* @throws ContentTypeException
254248
* @throws SlideImageUploadFailedException
255249
* @throws TalkSlideDoesNotExistException
256250
*/
257-
private function updateSlides(int $talkId, TalkSlideCollection $originalSlides, array $slides, bool $removeFiles): void
251+
private function updateSlides(int $talkId, TalkSlideCollection $originalSlides, ArrayHash $slides, bool $removeFiles): void
258252
{
259253
foreach ($originalSlides as $slide) {
260254
foreach ($slide->getAllFilenames() as $filename) {
261255
$this->incrementOtherSlides($filename);
262256
}
263257
}
264258
foreach ($slides as $id => $slide) {
259+
assert($slide instanceof ArrayHash);
265260
assert($slide->replace instanceof FileUpload || $slide->replace === null);
266261
assert($slide->replaceAlternative instanceof FileUpload || $slide->replaceAlternative === null);
267262
assert(is_string($slide->alias));
@@ -318,14 +313,12 @@ private function updateSlidesRow(int $talkId, string $alias, int $slideNumber, s
318313

319314

320315
/**
321-
* @param array<int, ArrayHash<int|string|FileUpload|null>> $updateSlides
322-
* @param list<ArrayHash<int|string|FileUpload|null>> $newSlides
323316
* @throws ContentTypeException
324317
* @throws DuplicatedSlideException
325318
* @throws SlideImageUploadFailedException
326319
* @throws TalkSlideDoesNotExistException
327320
*/
328-
public function saveSlides(int $talkId, TalkSlideCollection $originalSlides, array $updateSlides, array $newSlides, bool $deleteReplaced): void
321+
public function saveSlides(int $talkId, TalkSlideCollection $originalSlides, ArrayHash $updateSlides, ArrayHash $newSlides, bool $deleteReplaced): void
329322
{
330323
$this->otherSlides = [];
331324
$this->database->beginTransaction();

0 commit comments

Comments
 (0)