|
13 | 13 | * @psalm-import-type LibresignValidateMetadata from \OCA\Libresign\ResponseDefinitions |
14 | 14 | */ |
15 | 15 | final class ValidationMetadataNormalizer { |
| 16 | + private const OPTIONAL_SCALAR_TYPE_GUARDS = [ |
| 17 | + 'original_file_deleted' => 'is_bool', |
| 18 | + 'pdfVersion' => 'is_string', |
| 19 | + 'status_changed_at' => 'is_string', |
| 20 | + ]; |
| 21 | + |
16 | 22 | /** |
17 | 23 | * @param array<string, mixed> $metadata |
18 | 24 | * @psalm-return array<string, mixed>&LibresignValidateMetadata |
19 | 25 | */ |
20 | 26 | public static function normalize(array $metadata, string $fileName, int $totalPages): array { |
21 | | - $metadata['p'] = max(0, $totalPages); |
| 27 | + $normalized = $metadata; |
| 28 | + $normalized['p'] = self::normalizePageCount($totalPages); |
| 29 | + $normalized['extension'] = self::normalizeExtension($normalized, $fileName); |
22 | 30 |
|
23 | | - $extension = pathinfo($fileName, PATHINFO_EXTENSION); |
24 | | - if (!isset($metadata['extension']) || !is_string($metadata['extension']) || trim($metadata['extension']) === '') { |
25 | | - $metadata['extension'] = is_string($extension) && $extension !== '' ? strtolower($extension) : 'pdf'; |
26 | | - } |
| 31 | + self::normalizeOptionalScalarFields($normalized); |
| 32 | + self::normalizeDimensionsField($normalized); |
| 33 | + |
| 34 | + return $normalized; |
| 35 | + } |
| 36 | + |
| 37 | + private static function normalizePageCount(int $totalPages): int { |
| 38 | + return max(0, $totalPages); |
| 39 | + } |
27 | 40 |
|
28 | | - if (array_key_exists('original_file_deleted', $metadata) && !is_bool($metadata['original_file_deleted'])) { |
29 | | - unset($metadata['original_file_deleted']); |
| 41 | + /** |
| 42 | + * @param array<string, mixed> $metadata |
| 43 | + */ |
| 44 | + private static function normalizeExtension(array $metadata, string $fileName): string { |
| 45 | + if (isset($metadata['extension']) && is_string($metadata['extension']) && trim($metadata['extension']) !== '') { |
| 46 | + return $metadata['extension']; |
30 | 47 | } |
31 | 48 |
|
32 | | - if (array_key_exists('pdfVersion', $metadata) && !is_string($metadata['pdfVersion'])) { |
33 | | - unset($metadata['pdfVersion']); |
| 49 | + $extension = pathinfo($fileName, PATHINFO_EXTENSION); |
| 50 | + return is_string($extension) && $extension !== '' ? strtolower($extension) : 'pdf'; |
| 51 | + } |
| 52 | + |
| 53 | + /** |
| 54 | + * @param array<string, mixed> $metadata |
| 55 | + */ |
| 56 | + private static function normalizeOptionalScalarFields(array &$metadata): void { |
| 57 | + foreach (self::OPTIONAL_SCALAR_TYPE_GUARDS as $key => $guard) { |
| 58 | + if (!array_key_exists($key, $metadata)) { |
| 59 | + continue; |
| 60 | + } |
| 61 | + |
| 62 | + if (!is_callable($guard) || !$guard($metadata[$key])) { |
| 63 | + unset($metadata[$key]); |
| 64 | + } |
34 | 65 | } |
| 66 | + } |
35 | 67 |
|
36 | | - if (array_key_exists('status_changed_at', $metadata) && !is_string($metadata['status_changed_at'])) { |
37 | | - unset($metadata['status_changed_at']); |
| 68 | + /** |
| 69 | + * @param array<string, mixed> $metadata |
| 70 | + */ |
| 71 | + private static function normalizeDimensionsField(array &$metadata): void { |
| 72 | + if (!array_key_exists('d', $metadata)) { |
| 73 | + return; |
38 | 74 | } |
39 | 75 |
|
40 | | - if (array_key_exists('d', $metadata)) { |
41 | | - $normalizedDimensions = self::normalizeDimensions($metadata['d']); |
42 | | - if ($normalizedDimensions === null) { |
43 | | - unset($metadata['d']); |
44 | | - } else { |
45 | | - $metadata['d'] = $normalizedDimensions; |
46 | | - } |
| 76 | + $normalizedDimensions = self::normalizeDimensions($metadata['d']); |
| 77 | + if ($normalizedDimensions === null) { |
| 78 | + unset($metadata['d']); |
| 79 | + return; |
47 | 80 | } |
48 | 81 |
|
49 | | - return $metadata; |
| 82 | + $metadata['d'] = $normalizedDimensions; |
50 | 83 | } |
51 | 84 |
|
52 | 85 | /** |
|
0 commit comments