Completed
Push — master ( ea324c...2e8bb7 )
by Andrey
01:33
created

MediaFilesTrait   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 149
Duplicated Lines 13.42 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 7
dl 20
loc 149
c 0
b 0
f 0
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A deleteMediafiles() 0 32 2
A findMediafileModel() 20 21 3
B deleteMediafileEntry() 0 38 7
A setComponentIfNotIsset() 0 6 2

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
namespace Itstructure\MFUploader\traits;
3
4
use Yii;
5
use yii\web\NotFoundHttpException;
6
use yii\base\{InvalidConfigException, UnknownMethodException};
7
use Itstructure\MFUploader\Module;
8
use Itstructure\MFUploader\models\{Mediafile, OwnerMediafile};
9
use Itstructure\MFUploader\models\upload\BaseUpload;
10
use Itstructure\MFUploader\components\{LocalUploadComponent, S3UploadComponent};
11
use Itstructure\MFUploader\interfaces\{UploadComponentInterface, UploadModelInterface};
12
13
/**
14
 * Trait DeleteFilesTrait
15
 *
16
 * @property UploadComponentInterface[]|LocalUploadComponent[]|S3UploadComponent[] $tmpUploadComponents
17
 * Upload components to delete files according with their different types.
18
 *
19
 * @package Itstructure\MFUploader\traits
20
 *
21
 * @author Andrey Girnik <[email protected]>
22
 */
23
trait MediaFilesTrait
24
{
25
    /**
26
     * Upload components to delete files according with their different types.
27
     *
28
     * @var UploadComponentInterface[]|LocalUploadComponent[]|S3UploadComponent[]
29
     */
30
    protected $tmpUploadComponents = [];
31
32
    /**
33
     * Delete mediafiles from owner.
34
     *
35
     * @param string $owner
36
     * @param int $ownerId
37
     * @param Module $module
38
     * @param bool $protectMultiplied
39
     *
40
     * @return void
41
     */
42
    protected function deleteMediafiles(string $owner, int $ownerId, Module $module, bool $protectMultiplied = true): void
43
    {
44
        $mediafileIds = array_map(function ($data) {
45
            return $data->id;
46
47
        }, OwnerMediafile::getMediaFilesQuery([
48
            'owner' => $owner,
49
            'ownerId' => $ownerId
50
        ])
51
            ->select('id')
52
            ->all()
53
        );
54
55
        if ($protectMultiplied) {
56
            $multipliedMediafileIds = array_map(function ($data) {
57
                return $data->mediafileId;
58
59
            }, OwnerMediafile::filterMultipliedEntityIds($owner, $ownerId, $mediafileIds));
60
61
            $mediafileIds = array_filter($mediafileIds, function ($item) use ($multipliedMediafileIds) {
62
                return !in_array($item, $multipliedMediafileIds);
63
            });
64
65
            OwnerMediafile::deleteAll([
66
                'owner' => $owner,
67
                'ownerId' => $ownerId,
68
                'mediafileId' => $multipliedMediafileIds
69
            ]);
70
        }
71
72
        $this->deleteMediafileEntry($mediafileIds, $module);
73
    }
74
75
    /**
76
     * Find the media model entry.
77
     *
78
     * @param int $id
79
     *
80
     * @throws UnknownMethodException
81
     * @throws NotFoundHttpException
82
     *
83
     * @return Mediafile
84
     */
85 View Code Duplication
    protected function findMediafileModel(int $id): Mediafile
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
86
    {
87
        $modelObject = new Mediafile();
88
89
        if (!method_exists($modelObject, 'findOne')) {
90
            $class = (new\ReflectionClass($modelObject));
91
            throw new UnknownMethodException('Method findOne does not exists in ' . $class->getNamespaceName() . '\\' .
92
                $class->getShortName().' class.');
93
        }
94
95
        $result = call_user_func([
96
            $modelObject,
97
            'findOne',
98
        ], $id);
99
100
        if ($result !== null) {
101
            return $result;
102
        }
103
104
        throw new NotFoundHttpException('The requested page does not exist.');
105
    }
106
107
    /**
108
     * Delete mediafile record with files.
109
     *
110
     * @param array|int|string $id
111
     * @param Module $module
112
     *
113
     * @throws InvalidConfigException
114
     *
115
     * @return bool|int
116
     */
117
    protected function deleteMediafileEntry($id, Module $module)
118
    {
119
        if (is_array($id)) {
120
            $i = 0;
121
            foreach ($id as $item) {
122
                if (!$this->deleteMediafileEntry((int)$item, $module)) {
123
                    return false;
124
                }
125
                $i += 1;
126
            }
127
            return $i;
128
129
        } else {
130
            $mediafileModel = $this->findMediafileModel((int)$id);
131
132
            switch ($mediafileModel->storage) {
133
                case Module::STORAGE_TYPE_LOCAL:
134
                    $this->setComponentIfNotIsset($mediafileModel->storage, 'local-upload-component', $module);
135
                    break;
136
137
                case Module::STORAGE_TYPE_S3:
138
                    $this->setComponentIfNotIsset($mediafileModel->storage, 's3-upload-component', $module);
139
                    break;
140
141
                default:
142
                    throw new InvalidConfigException('Unknown type of the file storage');
143
            }
144
145
            /** @var UploadModelInterface|BaseUpload $deleteModel */
146
            $deleteModel = $this->tmpUploadComponents[$mediafileModel->storage]->setModelForDelete($mediafileModel);
147
148
            if ($deleteModel->delete() === 0) {
149
                return false;
150
            }
151
152
            return 1;
153
        }
154
    }
155
156
    /**
157
     * Set tmp upload component if not isset.
158
     *
159
     * @param string $storage
160
     * @param string $componentName
161
     * @param Module $module
162
     *
163
     * @return void
164
     */
165
    private function setComponentIfNotIsset(string $storage, string $componentName, Module $module): void
166
    {
167
        if (!isset($this->tmpUploadComponents[$storage])) {
168
            $this->tmpUploadComponents[$storage] = $module->get($componentName);
169
        }
170
    }
171
}
172