Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
34 / 34
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
JsonFileUpload
100.00% covered (success)
100.00%
34 / 34
100.00% covered (success)
100.00%
4 / 4
8
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 validateState
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
3
 toUploadedFile
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
3
 createSchema
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Apie\Core\ValueObjects;
3
4use Apie\Core\Attributes\Description;
5use Apie\Core\Attributes\Optional;
6use Apie\Core\Attributes\SchemaMethod;
7use Apie\Core\FileStorage\StoredFile;
8use Apie\SchemaGenerator\Builders\ComponentsBuilder;
9use Apie\SchemaGenerator\Enums\SchemaUsages;
10
11#[SchemaMethod('createSchema')]
12#[Description('Uploads a file with JSON.')]
13final class JsonFileUpload implements CompositeWithOwnValidation
14{
15    use CompositeValueObject;
16
17    public function __construct(
18        private Filename $originalFilename,
19        #[Optional]
20        private BinaryStream $contents,
21        #[Optional]
22        private Base64Stream $base64,
23        #[Optional]
24        private ?StrictMimeType $mime = null
25    ) {
26    }
27
28    protected function validateState(): void
29    {
30        if (isset($this->contents) xor isset($this->base64)) {
31            return;
32        }
33        throw new \LogicException(
34            isset($this->contents)
35            ? 'You should only provide contents or base64'
36            : 'I need either a "contents" or a "base64" property'
37        );
38    }
39
40    /**
41     * @template T of StoredFile
42     * @param class-string<T> $className
43     * @return T
44     */
45    public function toUploadedFile(string $className = StoredFile::class): StoredFile
46    {
47        $contents = isset($this->contents) ? $this->contents->toNative() : $this->base64->decode()->toNative();
48        return $className::createFromString(
49            $contents,
50            isset($this->mime) ? $this->mime->toNative() : null,
51            $this->originalFilename->toNative(),
52        );
53    }
54
55    /**
56     * @return array<string, mixed>
57     */
58    public static function createSchema(SchemaUsages $schemaUsage, ComponentsBuilder $componentsBuilder): array
59    {
60        return [
61            'required' => [
62                'originalFilename',
63            ],
64            'oneOf' => [
65                [
66                    'required' => ['contents', 'originalFilename'],
67                ],
68                [
69                    'required' => ['base64', 'originalFilename'],
70                ],
71            ],
72            'type' => 'object',
73            'properties' => [
74                'contents' => $schemaUsage->toSchema($componentsBuilder, BinaryStream::class),
75                'originalFilename' => $schemaUsage->toSchema($componentsBuilder, Filename::class),
76                'base64' => $schemaUsage->toSchema($componentsBuilder, Base64Stream::class),
77                'mime' => $schemaUsage->toSchema($componentsBuilder, StrictMimeType::class, nullable: true),
78            ]
79        ];
80    }
81}