|
9 | 9 |
|
10 | 10 | namespace OCA\Libresign\Service\File; |
11 | 11 |
|
| 12 | +/** |
| 13 | + * @psalm-import-type LibresignValidateMetadata from \OCA\Libresign\ResponseDefinitions |
| 14 | + */ |
12 | 15 | final class ValidationMetadataNormalizer { |
13 | 16 | /** |
14 | 17 | * @param array<string, mixed> $metadata |
15 | | - * @return array<string, mixed> |
| 18 | + * @psalm-return array<string, mixed>&LibresignValidateMetadata |
16 | 19 | */ |
17 | 20 | public static function normalize(array $metadata, string $fileName, int $totalPages): array { |
18 | | - $metadata['p'] = $totalPages; |
| 21 | + $metadata['p'] = max(0, $totalPages); |
19 | 22 |
|
20 | 23 | $extension = pathinfo($fileName, PATHINFO_EXTENSION); |
21 | 24 | if (!isset($metadata['extension']) || !is_string($metadata['extension']) || trim($metadata['extension']) === '') { |
22 | 25 | $metadata['extension'] = is_string($extension) && $extension !== '' ? strtolower($extension) : 'pdf'; |
23 | 26 | } |
24 | 27 |
|
| 28 | + if (array_key_exists('original_file_deleted', $metadata) && !is_bool($metadata['original_file_deleted'])) { |
| 29 | + unset($metadata['original_file_deleted']); |
| 30 | + } |
| 31 | + |
| 32 | + if (array_key_exists('pdfVersion', $metadata) && !is_string($metadata['pdfVersion'])) { |
| 33 | + unset($metadata['pdfVersion']); |
| 34 | + } |
| 35 | + |
| 36 | + if (array_key_exists('status_changed_at', $metadata) && !is_string($metadata['status_changed_at'])) { |
| 37 | + unset($metadata['status_changed_at']); |
| 38 | + } |
| 39 | + |
| 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 | + } |
| 47 | + } |
| 48 | + |
25 | 49 | return $metadata; |
26 | 50 | } |
| 51 | + |
| 52 | + /** |
| 53 | + * @return list<array{w: float, h: float}>|null |
| 54 | + */ |
| 55 | + private static function normalizeDimensions(mixed $dimensions): ?array { |
| 56 | + if (!is_array($dimensions)) { |
| 57 | + return null; |
| 58 | + } |
| 59 | + |
| 60 | + $normalized = []; |
| 61 | + foreach ($dimensions as $dimension) { |
| 62 | + if (!is_array($dimension) |
| 63 | + || !array_key_exists('w', $dimension) |
| 64 | + || !array_key_exists('h', $dimension) |
| 65 | + || !is_numeric($dimension['w']) |
| 66 | + || !is_numeric($dimension['h'])) { |
| 67 | + continue; |
| 68 | + } |
| 69 | + |
| 70 | + $normalized[] = [ |
| 71 | + 'w' => (float)$dimension['w'], |
| 72 | + 'h' => (float)$dimension['h'], |
| 73 | + ]; |
| 74 | + } |
| 75 | + |
| 76 | + return $normalized === [] ? null : $normalized; |
| 77 | + } |
27 | 78 | } |
0 commit comments