Factory   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Test Coverage

Coverage 15.79%

Importance

Changes 0
Metric Value
eloc 33
dl 0
loc 102
ccs 3
cts 19
cp 0.1579
rs 10
c 0
b 0
f 0
wmc 5

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A build() 0 25 4
1
<?php
2
declare(strict_types=1);
3
4
namespace tkanstantsin\fileupload\formatter;
5
6
use League\Flysystem\FilesystemInterface;
7
use tkanstantsin\fileupload\config\Alias;
8
use tkanstantsin\fileupload\model\IFile;
9
10
/**
11
 * Class Factory
12
 */
13
class Factory
14
{
15
    // File formatter constants
16
    public const FILE_ORIGINAL = 'original';
17
    public const IMAGE_HD = 'hd';
18
    public const IMAGE_FULL_HD = 'full_hd';
19
20
    // Default file formatters
21
    public const FILE_DEFAULT_FORMAT = self::FILE_ORIGINAL;
22
    public const IMAGE_DEFAULT_FORMAT = self::IMAGE_HD;
23
24
    /**
25
     * Default set of configs for files and images. It can be supplemented in
26
     * config file. For new formatter add element if following format:
27
     * - key - unique constant;
28
     * - value - fields for one of `formatter\config\*.
29
     *
30
     * @var array
31
     */
32
    public const DEFAULT_FORMATTER_ARRAY = [
33
        self::FILE_ORIGINAL => File::class,
34
35
        self::IMAGE_HD => [
36
            'class' => Image::class,
37
            'width' => 1280,
38
            'height' => 720,
39
        ],
40
        self::IMAGE_FULL_HD => [
41
            'class' => Image::class,
42
            'width' => 1920,
43
            'height' => 1080,
44
        ],
45
    ];
46
47
    /**
48
     * Configs for available formatters.
49
     * May contain: class name or array with class name and parameters.
50
     * @example: \tkanstantsin\fileupload\formatter\File
51
     * ```php
52
     * [
53
     *     \tkanstantsin\fileupload\formatter\File::class,
54
     *     'full_hd' => [
55
     *         'class' => \tkanstantsin\fileupload\formatter\Image::class,,
56
     *         'width' => 1920,
57
     *         'height' => 1080,
58
     *         'mode' =>
59
     *     \tkanstantsin\fileupload\formatter\Image::RESIZE_OUTBOUND,
60
     *         'formatAdapterArray' => [
61
     *             SomeAdapter::class,
62
     *             SecondAdapter::class,
63
     *         ],
64
     *     ],
65
     * ]
66
     * ```
67
     *
68
     * @var array
69
     */
70
    protected $formatterConfigArray;
71
72
    /**
73
     * Factory constructor.
74
     * @param array $formatterConfigArray
75
     */
76 1
    public function __construct(array $formatterConfigArray)
77
    {
78 1
        $this->formatterConfigArray = $formatterConfigArray + static::DEFAULT_FORMATTER_ARRAY;
79 1
    }
80
81
    /**
82
     * @param IFile $file
83
     * @param Alias $alias
84
     * @param FilesystemInterface $contentFS
85
     * @param string $key
86
     * @param array $formatterConfig
87
     * @return File
88
     * @throws \RuntimeException
89
     */
90
    public function build(IFile $file, Alias $alias, FilesystemInterface $contentFS, string $key, array $formatterConfig = []): File
91
    {
92
        $defaultFormatterConfig = $this->formatterConfigArray[$key] ?? null;
93
        if ($defaultFormatterConfig === null) {
94
            throw new \RuntimeException(sprintf('Formatter for key `%s` not found', $key));
95
        }
96
97
        $class = null;
98
        $params = [];
99
100
        if (\is_array($defaultFormatterConfig)) {
101
            $class = $defaultFormatterConfig['class'];
102
            unset($defaultFormatterConfig['class']);
103
            $params = $defaultFormatterConfig;
104
        } elseif (\is_string($defaultFormatterConfig)) {
105
            $class = $defaultFormatterConfig;
106
        }
107
108
        $params = $formatterConfig + $params;
109
110
        $params['name'] = $key;
111
        $params['path'] = $alias->getFilePath($file);
112
113
        /* @see File::__construct() */
114
        return new $class($file, $contentFS, $params);
115
    }
116
}