Passed
Branch feature/cropping (2bd0b6)
by Philippe
05:59
created

AssetUploader::uploadToAsset()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 16
ccs 9
cts 9
cp 1
rs 9.4285
cc 3
eloc 9
nc 4
nop 3
crap 3
1
<?php
2
3
namespace Thinktomorrow\AssetLibrary\Models;
4
5
use Illuminate\Database\Eloquent\Model;
6
use Illuminate\Http\File;
7
use Illuminate\Http\UploadedFile;
8
9
class AssetUploader extends Model
10
{
11
    /**
12
     * Uploads the file/files or asset by creating the
13
     * asset that is needed to upload the files too.
14
     *
15
     * @param $files
16
     * @param bool $keepOriginal
17
     * @return \Illuminate\Support\Collection|null|Asset
18
     */
19 39
    public static function upload($files, $keepOriginal = false)
20
    {
21 39
        $list = collect([]);
22
23 39
        if ($files instanceof Asset) {
24 4
            return $files;
25 39
        } elseif (is_array($files)) {
26 6
            collect($files)->each(function ($file) use ($list) {
27 6
                if ($file instanceof Asset) {
28 2
                    $list->push($file);
29
                } else {
30 5
                    $asset = new Asset();
31 5
                    $asset->save();
32 5
                    $list->push(self::uploadToAsset($file, $asset));
33
                }
34 6
            });
35
36 6
            return $list;
37
        }
38
39 35
        $asset = new Asset();
40 35
        $asset->save();
41
42 35
        if (! ($files instanceof File) && ! ($files instanceof UploadedFile)) {
43 1
            return;
44
        }
45
46 34
        return self::uploadToAsset($files, $asset, $keepOriginal);
47
    }
48
49
    /**
50
     * Uploads the given file to this instance of asset
51
     * and sets the dimensions as a custom property.
52
     *
53
     * @param $files
54
     * @param bool $keepOriginal
55
     * @param Asset $asset
56
     * @return null|Asset
57
     */
58 38
    public static function uploadToAsset($files, $asset, $keepOriginal = false): ?Asset
59
    {
60 38
        $customProps = [];
61 38
        if (self::isImage($files)) {
62 35
            $customProps['dimensions'] = getimagesize($files)[0].' x '.getimagesize($files)[1];
63
        }
64
65 38
        $fileAdd    = $asset->addMedia($files)->withCustomProperties($customProps);
66 38
        if ($keepOriginal) {
67 2
            $fileAdd = $fileAdd->preservingOriginal();
68
        }
69
70 38
        $fileAdd->toMediaCollection();
71
72 38
        return $asset->load('media');
73
    }
74
75
    /**
76
     * @param $file
77
     * @return bool
78
     */
79 38
    private static function isImage($file): bool
80
    {
81 38
        return str_before($file->getMimetype(), '/') === 'image';
82
    }
83
}
84