Passed
Push — master ( d4f6d8...7bf00b )
by Philippe
04:21
created

AssetUploader::isImage()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Thinktomorrow\AssetLibrary\Application;
4
5
use Illuminate\Http\UploadedFile;
6
use Illuminate\Support\Collection;
7
use Illuminate\Support\Str;
8
use InvalidArgumentException;
9
use Spatie\MediaLibrary\Exceptions\FileCannotBeAdded;
10
use Spatie\MediaLibrary\FileAdder\FileAdder;
11
use Thinktomorrow\AssetLibrary\Asset;
12
use Traversable;
13
14
class AssetUploader
15
{
16
    /**
17
     * Uploads the file/files or asset by creating the
18
     * asset that is needed to upload the files too.
19
     *
20
     * @param Asset|Traversable|array|Collection|UploadedFile $files
21
     * @param string|null $filename
22
     * @return Collection|null|Asset
23
     * @throws FileCannotBeAdded
24
     */
25 34
    public static function upload($files, ?string $filename = null)
26
    {
27 34
        if (! $files) {
28 2
            throw new InvalidArgumentException();
29
        }
30
31 32
        if ($files instanceof Asset) {
32 2
            return $files;
33
        }
34
35 31
        if (is_array($files) || $files instanceof Traversable) {
36 2
            return self::uploadMultiple($files);
37
        }
38
39 30
        if (! ($files instanceof UploadedFile)) {
0 ignored issues
show
introduced by
$files is always a sub-type of Illuminate\Http\UploadedFile.
Loading history...
40 1
            throw new InvalidArgumentException();
41
        }
42
43 29
        return self::uploadToAsset($files, Asset::create(), $filename);
44
    }
45
46
    /**
47
     * Uploads the multiple files or assets by creating the
48
     * asset that is needed to upload the files too.
49
     *
50
     * @param Asset|Traversable|array $files
51
     * @return Collection
52
     */
53 2
    private static function uploadMultiple($files)
54
    {
55 2
        $list = collect([]);
56
        collect($files)->each(function ($file) use ($list) {
57 2
            if ($file instanceof Asset) {
58 1
                $list->push($file);
59
            } else {
60 2
                $asset = new Asset();
61 2
                $asset->save();
62 2
                $list->push(self::uploadToAsset($file, $asset, null));
63
            }
64 2
        });
65
66 2
        return $list;
67
    }
68
69
    /**
70
     * Uploads the file/files or asset by creating the
71
     * asset that is needed to upload the files too.
72
     *
73
     * @param string $file
74
     * @param string|null $filename
75
     * @return Collection|null|Asset
76
     * @throws FileCannotBeAdded
77
     */
78 6
    public static function uploadFromBase64(string $file, string $filename)
79
    {
80 6
        return self::uploadBase64ToAsset($file, Asset::create(), $filename);
81
    }
82
83
    /**
84
     * Uploads the url by creating the
85
     * asset that is needed to upload the files too.
86
     *
87
     * @param string $url
88
     * @return Asset
89
     * @throws FileCannotBeAdded
90
     */
91 11
    public static function uploadFromUrl(string $url)
92
    {
93 11
        return self::uploadFromUrlToAsset($url, Asset::create());
94
    }
95
96
    /**
97
     * Uploads the given file to this instance of asset
98
     * and sets the dimensions as a custom property.
99
     *
100
     * @param UploadedFile $file
101
     * @param Asset $asset
102
     * @param string|null $filename
103
     * @return Asset
104
     * @throws FileCannotBeAdded
105
     */
106 31
    public static function uploadToAsset($file, $asset, $filename = null): Asset
107
    {
108 31
        if (! $file) {
0 ignored issues
show
introduced by
$file is of type Illuminate\Http\UploadedFile, thus it always evaluated to true.
Loading history...
109 1
            throw new InvalidArgumentException();
110
        }
111
112 30
        $fileAdd = $asset->addMedia($file);
113
114 30
        $fileAdd = self::prepareOptions($fileAdd, $filename);
115
116 30
        $fileAdd->withResponsiveImages()->toMediaCollection();
117
118 30
        return $asset->load('media');
119
    }
120
121
    /**
122
     * Uploads the given file to this instance of asset
123
     * and sets the dimensions as a custom property.
124
     *
125
     * @param string $file
126
     * @param Asset $asset
127
     * @param string|null $filename
128
     * @return Asset
129
     * @throws FileCannotBeAdded
130
     * @internal param $files
131
     */
132 6
    public static function uploadBase64ToAsset(string $file, $asset, string $filename): Asset
133
    {
134 6
        $fileAdd = $asset->addMediaFromBase64($file);
135
136 6
        $fileAdd = self::prepareOptions($fileAdd, $filename);
137
138 6
        $fileAdd->toMediaCollection();
139
140 6
        return $asset->load('media');
141
    }
142
143
    /**
144
     * Uploads the given file to this instance of asset
145
     * and sets the dimensions as a custom property.
146
     *
147
     * @param string $url
148
     * @param Asset $asset
149
     * @return Asset
150
     * @throws FileCannotBeAdded
151
     */
152 11
    public static function uploadFromUrlToAsset(string $url, $asset): Asset
153
    {
154 11
        $fileAdd = $asset->addMediaFromUrl($url);
155
156 11
        $filename = substr($url, strrpos($url, '/') + 1);
157 11
        $fileAdd->setName($filename);
158
159 11
        $fileAdd = self::prepareOptions($fileAdd, $filename);
160
161 11
        $fileAdd->toMediaCollection();
162
163 11
        return $asset->load('media');
164
    }
165
166
    /**
167
     * Set the possible options on the fileAdder. This includes preserveOriginal
168
     * and filename.
169
     *
170
     * @param FileAdder $fileAdd
171
     * @param string|null $filename
172
     * @return FileAdder
173
     * @throws FileCannotBeAdded
174
     */
175 46
    private static function prepareOptions($fileAdd, $filename): FileAdder
176
    {
177 46
        if ($filename) {
178 19
            $fileAdd->usingName(substr($filename, 0, strpos($filename, '.')));
179 19
            $fileAdd->usingFileName($filename);
180
        }
181
182 46
        $fileAdd->preservingOriginal();
183
184
        // Sanitize filename by sluggifying the filename without the extension
185
        $fileAdd->sanitizingFileName(function ($filename) {
186 46
            $extension = substr($filename, strrpos($filename, '.') + 1);
187 46
            $filename  = substr($filename, 0, strrpos($filename, '.'));
188 46
            $filename  = Str::slug($filename).'.'.$extension;
189
190 46
            return strtolower($filename);
191 46
        });
192
193 46
        return $fileAdd;
194
    }
195
}
196