Passed
Push — master ( a8e4d4...81b17d )
by Giacomo
51:25 queued 46:20
created

src/Traits/MainMongoTrait.php (3 issues)

1
<?php
2
3
namespace OfflineAgency\MongoAutoSync\Traits;
4
5
use Exception;
6
use Illuminate\Http\Request;
7
use Illuminate\Support\Arr;
8
use stdClass;
9
10
trait MainMongoTrait
11
{
12
    protected $has_partial_request;
13
    protected $request;
14
    protected $target_additional_data;
15
    protected $partial_generated_request;
16
    protected $options;
17
    protected $tempEM;
18
19
    /**
20
     * @param Request $request
21
     * @param array $additionalData
22
     * @param array $options
23
     * @param array $target_additional_data
24
     * @return $this
25
     * @throws Exception
26
     */
27
    public function storeWithSync(Request $request, array $additionalData = [], array $options = [], array $target_additional_data = [])
28
    {
29
        $this->initDataForSync($request, $additionalData, $options, $target_additional_data);
30
        $this->storeEditAllItems($request, 'add', $options);
31
        $this->processAllRelationships($request, 'add', '', '', $options);
32
33
        //Dispatch the creation event
34
        $this->fireModelEvent('storeWithSync');
35
36
        return $this->fresh();
37
    }
38
39
    /**
40
     * @param Request $request
41
     * @param array $additionalData
42
     * @param array $options
43
     * @param array $target_additional_data
44
     * @return $this
45
     * @throws Exception
46
     */
47
    public function updateWithSync(Request $request, array $additionalData = [], array $options = [], array $target_additional_data = [])
48
    {
49
        $this->initDataForSync($request, $additionalData, $options, $target_additional_data);
50
        $this->storeEditAllItems($request, 'update', $options);
51
        $this->processAllRelationships($request, 'update', '', '', $options);
52
53
        //Dispatch the update event
54
        $this->fireModelEvent('updateWithSync');
55
56
        return $this->fresh();
57
    }
58
59
    /**
60
     * @return $this
61
     */
62
    public function destroyWithSync()
63
    {
64
        //Get the relation info
65
        $relations = $this->getMongoRelation();
66
        //Process all relationships
67
        foreach ($relations as $method => $relation) {
68
            //Get Relation Save Mode
69
            $type = $relation['type'];
70
            $hasTarget = hasTarget($relation);
71
            if ($hasTarget) {
72
                $modelTarget = $relation['modelTarget'];
73
                $methodOnTarget = $relation['methodOnTarget'];
74
                $modelOnTarget = $relation['modelOnTarget'];
75
                $is_EO = is_EO($type);
76
                $is_EM = is_EM($type);
77
                $is_HO = is_HO($type);
0 ignored issues
show
The assignment to $is_HO is dead and can be removed.
Loading history...
78
                $is_HM = is_HM($type);
0 ignored issues
show
The assignment to $is_HM is dead and can be removed.
Loading history...
79
                $typeOnTarget = getTypeOnTarget($relation);
80
                $is_EM_target = is_EM($typeOnTarget);
81
                $is_EO_target = is_EO($typeOnTarget);
82
                if ($is_EO || $is_EM) {//EmbedsOne Create - EmbedsMany Create
83
                    //Delete EmbedsMany or EmbedsOne on Target
84
                    $this->deleteTargetObj($method, $modelTarget, $methodOnTarget, $is_EO, $is_EM, $is_EO_target, $is_EM_target);
0 ignored issues
show
It seems like deleteTargetObj() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

84
                    $this->/** @scrutinizer ignore-call */ 
85
                           deleteTargetObj($method, $modelTarget, $methodOnTarget, $is_EO, $is_EM, $is_EO_target, $is_EM_target);
Loading history...
85
                }
86
                //TODO: Need to be implemented
87
                /* elseif ($is_HM) {//HasMany
88
                 } elseif ($is_HO) {//HasOne Create
89
                 }*/
90
            }
91
        }
92
        //Delete current object
93
        $this->delete();
94
        //Dispatch the destroy event
95
        $this->fireModelEvent('destroyWithSync');
96
97
        return $this;
98
    }
99
100
    /**
101
     * @param array $options
102
     * @param string $key
103
     * @return bool|mixed
104
     */
105
    private function getOptionValue(array $options, string $key)
106
    {
107
        return Arr::has($options, $key) ? $options[$key] : '';
108
    }
109
110
    /**
111
     * @param $obj
112
     * @param string $EOkey
113
     * @param string $method
114
     * @param string $model
115
     * @throws Exception
116
     */
117
    public function checkPropertyExistence($obj, string $EOkey, $method = '', $model = '')
118
    {
119
        if (! property_exists($obj, $EOkey)) {
120
            $msg = 'Error - '.$EOkey.' attribute not found on obj '.json_encode($obj).' during save of model: '.$model.' and attribute: '.$method;
121
            throw new Exception($msg);
122
        }
123
    }
124
125
    /**
126
     * @param $arr
127
     * @param string $key
128
     * @throws Exception
129
     */
130
    public function checkArrayExistence($arr, string $key)
131
    {
132
        if (! Arr::has($arr, $key)) {
133
            $msg = ('Error - '.$key.' attribute not found on obj '.json_encode($arr));
134
            throw new Exception($msg);
135
        }
136
    }
137
138
    /**
139
     * @param Request $request
140
     * @param string $key
141
     * @throws Exception
142
     */
143
    private function checkRequestExistence(Request $request, string $key)
144
    {
145
        if (! $request->has($key)) {
146
            $msg = ('Error - '.$key.' attribute not found in Request '.json_encode($request->all()));
147
            throw new Exception($msg);
148
        }
149
    }
150
151
    /**
152
     * @param bool $request_has_key
153
     * @param bool $hasTarget
154
     * @return bool
155
     */
156
    public function getIsSkippable($request_has_key, $hasTarget = false)
157
    {
158
        return ! $request_has_key && $this->getHasPartialRequest() && ! $hasTarget;
159
    }
160
161
    /**
162
     * @return bool
163
     */
164
    public function getHasPartialRequest()
165
    {
166
        return $this->has_partial_request;
167
    }
168
169
    public function setHasPartialRequest(): void
170
    {
171
        $this->has_partial_request = $this->getOptionValue(
172
                $this->getOptions(),
173
                'request_type'
174
            ) == 'partial';
175
    }
176
177
    /**
178
     * @param string $modelTarget
179
     * @param stdClass $obj
180
     * @return MDModel|null
181
     * @throws Exception
182
     */
183
    private function getModelTobeSync(string $modelTarget, stdClass $obj)
184
    {
185
        $this->checkPropertyExistence($obj, 'ref_id');
186
        $target_id = $obj->ref_id;
187
188
        //Init the Target Model
189
        $modelToBeSync = new $modelTarget;
190
191
        return $modelToBeSync->find($target_id);
192
    }
193
194
    /**
195
     * @param string $key
196
     * @param Request $request
197
     * @return mixed
198
     * @throws Exception
199
     */
200
    private function getRelationshipRequest(string $key, Request $request)
201
    {
202
        $this->checkRequestExistence(
203
            $request,
204
            $key
205
        );
206
207
        return $request->input($key);
208
    }
209
210
    /**
211
     * @return Request
212
     */
213
    public function getRequest()
214
    {
215
        return $this->request;
216
    }
217
218
    /**
219
     * @param Request $request
220
     * @param array $additionalData
221
     */
222
    public function setRequest(Request $request, array $additionalData): void
223
    {
224
        $request = $request->merge($additionalData);
225
        $this->request = $request;
226
    }
227
228
    /**
229
     * @return Request
230
     */
231
    public function getPartialGeneratedRequest()
232
    {
233
        return $this->partial_generated_request;
234
    }
235
236
    /**
237
     * @param array $arr
238
     */
239
    public function setPartialGeneratedRequest(array $arr): void
240
    {
241
        $partial_generated_request = new Request;
242
        $partial_generated_request->merge($arr);
243
244
        $this->partial_generated_request = $partial_generated_request;
245
    }
246
247
    /**
248
     * @return array
249
     */
250
    public function getOptions()
251
    {
252
        return $this->options;
253
    }
254
255
    /**
256
     * @param array $options
257
     */
258
    public function setOptions(array $options): void
259
    {
260
        $this->options = $options;
261
    }
262
263
    /**
264
     * @return array
265
     */
266
    public function getTargetAdditionalData()
267
    {
268
        return $this->target_additional_data;
269
    }
270
271
    /**
272
     * @param array $target_additional_data
273
     */
274
    public function setTargetAdditionalData($target_additional_data): void
275
    {
276
        $this->target_additional_data = $target_additional_data;
277
    }
278
279
    /**
280
     * @param Request $request
281
     * @param array $additionalData
282
     * @param array $options
283
     * @param array $target_additional_data
284
     */
285
    public function initDataForSync(Request $request, array $additionalData, array $options, array $target_additional_data)
286
    {
287
        $this->setRequest($request, $additionalData);
288
        $this->setTargetAdditionalData($target_additional_data);
289
        $this->setOptions($options);
290
        $this->setHasPartialRequest();
291
    }
292
}
293