GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( 37b02e...ebbbe1 )
by James
08:59
created

app/Repositories/Rule/RuleRepository.php (2 issues)

Labels
Severity
1
<?php
2
/**
3
 * RuleRepository.php
4
 * Copyright (c) 2017 [email protected]
5
 *
6
 * This file is part of Firefly III.
7
 *
8
 * Firefly III is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * Firefly III is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
20
 */
21
declare(strict_types=1);
22
23
namespace FireflyIII\Repositories\Rule;
24
25
use FireflyIII\Exceptions\FireflyException;
26
use FireflyIII\Models\Rule;
27
use FireflyIII\Models\RuleAction;
28
use FireflyIII\Models\RuleGroup;
29
use FireflyIII\Models\RuleTrigger;
30
use FireflyIII\User;
31
32
/**
33
 * Class RuleRepository.
34
 */
35
class RuleRepository implements RuleRepositoryInterface
36
{
37
    /** @var User */
38
    private $user;
39
40
    /**
41
     * @return int
42
     */
43
    public function count(): int
44
    {
45
        return $this->user->rules()->count();
46
    }
47
48
    /**
49
     * @param Rule $rule
50
     *
51
     * @return bool
52
     *
53
     * @throws \Exception
54
     * @throws \Exception
55
     * @throws \Exception
56
     */
57
    public function destroy(Rule $rule): bool
58
    {
59
        foreach ($rule->ruleTriggers as $trigger) {
60
            $trigger->delete();
61
        }
62
        foreach ($rule->ruleActions as $action) {
63
            $action->delete();
64
        }
65
        $rule->delete();
66
67
        return true;
68
    }
69
70
    /**
71
     * @param int $ruleId
72
     *
73
     * @return Rule
74
     */
75
    public function find(int $ruleId): Rule
76
    {
77
        $rule = $this->user->rules()->find($ruleId);
78
        if (null === $rule) {
79
            return new Rule;
80
        }
81
82
        return $rule;
83
    }
84
85
    /**
86
     * FIxXME can return null.
87
     *
88
     * @return RuleGroup
89
     */
90
    public function getFirstRuleGroup(): RuleGroup
91
    {
92
        return $this->user->ruleGroups()->first();
93
    }
94
95
    /**
96
     * @param RuleGroup $ruleGroup
97
     *
98
     * @return int
99
     */
100
    public function getHighestOrderInRuleGroup(RuleGroup $ruleGroup): int
101
    {
102
        return intval($ruleGroup->rules()->max('order'));
103
    }
104
105
    /**
106
     * @param Rule $rule
107
     *
108
     * @return string
109
     *
110
     * @throws FireflyException
111
     */
112
    public function getPrimaryTrigger(Rule $rule): string
113
    {
114
        $count = $rule->ruleTriggers()->count();
115
        if (0 === $count) {
116
            throw new FireflyException('Rules should have more than zero triggers, rule #' . $rule->id . ' has none!');
117
        }
118
119
        return $rule->ruleTriggers()->where('trigger_type', 'user_action')->first()->trigger_value;
120
    }
121
122
    /**
123
     * @param Rule $rule
124
     *
125
     * @return bool
126
     */
127
    public function moveDown(Rule $rule): bool
128
    {
129
        $order = $rule->order;
130
131
        // find the rule with order+1 and give it order-1
132
        $other = $rule->ruleGroup->rules()->where('order', $order + 1)->first();
133
        if ($other) {
134
            --$other->order;
135
            $other->save();
136
        }
137
138
        ++$rule->order;
139
        $rule->save();
140
        $this->resetRulesInGroupOrder($rule->ruleGroup);
141
142
        return true;
143
    }
144
145
    /**
146
     * @param Rule $rule
147
     *
148
     * @return bool
149
     */
150
    public function moveUp(Rule $rule): bool
151
    {
152
        $order = $rule->order;
153
154
        // find the rule with order-1 and give it order+1
155
        $other = $rule->ruleGroup->rules()->where('order', $order - 1)->first();
156
        if ($other) {
157
            ++$other->order;
158
            $other->save();
159
        }
160
161
        --$rule->order;
162
        $rule->save();
163
        $this->resetRulesInGroupOrder($rule->ruleGroup);
164
165
        return true;
166
    }
167
168
    /**
169
     * @param Rule  $rule
170
     * @param array $ids
171
     *
172
     * @return bool
173
     */
174
    public function reorderRuleActions(Rule $rule, array $ids): bool
175
    {
176
        $order = 1;
177
        foreach ($ids as $actionId) {
178
            /** @var RuleTrigger $trigger */
179
            $action = $rule->ruleActions()->find($actionId);
180
            if (null !== $action) {
181
                $action->order = $order;
182
                $action->save();
183
                ++$order;
184
            }
185
        }
186
187
        return true;
188
    }
189
190
    /**
191
     * @param Rule  $rule
192
     * @param array $ids
193
     *
194
     * @return bool
195
     */
196
    public function reorderRuleTriggers(Rule $rule, array $ids): bool
197
    {
198
        $order = 1;
199
        foreach ($ids as $triggerId) {
200
            /** @var RuleTrigger $trigger */
201
            $trigger = $rule->ruleTriggers()->find($triggerId);
202
            if (null !== $trigger) {
203
                $trigger->order = $order;
204
                $trigger->save();
205
                ++$order;
206
            }
207
        }
208
209
        return true;
210
    }
211
212
    /**
213
     * @param RuleGroup $ruleGroup
214
     *
215
     * @return bool
216
     */
217
    public function resetRulesInGroupOrder(RuleGroup $ruleGroup): bool
218
    {
219
        $ruleGroup->rules()->whereNotNull('deleted_at')->update(['order' => 0]);
220
221
        $set   = $ruleGroup->rules()
222
                           ->orderBy('order', 'ASC')
223
                           ->orderBy('updated_at', 'DESC')
224
                           ->get();
225
        $count = 1;
226
        /** @var Rule $entry */
227
        foreach ($set as $entry) {
228
            $entry->order = $count;
229
            $entry->save();
230
            ++$count;
231
        }
232
233
        return true;
234
    }
235
236
    /**
237
     * @param User $user
238
     */
239
    public function setUser(User $user)
240
    {
241
        $this->user = $user;
242
    }
243
244
    /**
245
     * @param array $data
246
     *
247
     * @return Rule
248
     */
249
    public function store(array $data): Rule
250
    {
251
        /** @var RuleGroup $ruleGroup */
252
        $ruleGroup = $this->user->ruleGroups()->find($data['rule_group_id']);
253
254
        // get max order:
255
        $order = $this->getHighestOrderInRuleGroup($ruleGroup);
256
257
        // start by creating a new rule:
258
        $rule = new Rule;
259
        $rule->user()->associate($this->user->id);
260
261
        $rule->rule_group_id   = $data['rule_group_id'];
262
        $rule->order           = ($order + 1);
263
        $rule->active          = 1;
264
        $rule->stop_processing = 1 === intval($data['stop_processing']);
265
        $rule->title           = $data['title'];
266
        $rule->description     = strlen($data['description']) > 0 ? $data['description'] : null;
267
268
        $rule->save();
269
270
        // start storing triggers:
271
        $this->storeTriggers($rule, $data);
272
273
        // same for actions.
274
        $this->storeActions($rule, $data);
275
276
        return $rule;
277
    }
278
279
    /**
280
     * @param Rule  $rule
281
     * @param array $values
282
     *
283
     * @return RuleAction
284
     */
285
    public function storeAction(Rule $rule, array $values): RuleAction
286
    {
287
        $ruleAction = new RuleAction;
288
        $ruleAction->rule()->associate($rule);
289
        $ruleAction->order           = $values['order'];
290
        $ruleAction->active          = 1;
291
        $ruleAction->stop_processing = $values['stopProcessing'];
292
        $ruleAction->action_type     = $values['action'];
293
        $ruleAction->action_value    = null === $values['value'] ? '' : $values['value'];
0 ignored issues
show
The property action_value does not seem to exist on FireflyIII\Models\RuleAction. Are you sure there is no database migration missing?

Checks if undeclared accessed properties appear in database migrations and if the creating migration is correct.

Loading history...
294
        $ruleAction->save();
295
296
        return $ruleAction;
297
    }
298
299
    /**
300
     * @param Rule  $rule
301
     * @param array $values
302
     *
303
     * @return RuleTrigger
304
     */
305
    public function storeTrigger(Rule $rule, array $values): RuleTrigger
306
    {
307
        $ruleTrigger = new RuleTrigger;
308
        $ruleTrigger->rule()->associate($rule);
309
        $ruleTrigger->order           = $values['order'];
310
        $ruleTrigger->active          = 1;
311
        $ruleTrigger->stop_processing = $values['stopProcessing'];
312
        $ruleTrigger->trigger_type    = $values['action'];
313
        $ruleTrigger->trigger_value   = null === $values['value'] ? '' : $values['value'];
0 ignored issues
show
The property trigger_value does not seem to exist on FireflyIII\Models\RuleTrigger. Are you sure there is no database migration missing?

Checks if undeclared accessed properties appear in database migrations and if the creating migration is correct.

Loading history...
314
        $ruleTrigger->save();
315
316
        return $ruleTrigger;
317
    }
318
319
    /**
320
     * @param Rule  $rule
321
     * @param array $data
322
     *
323
     * @return Rule
324
     */
325
    public function update(Rule $rule, array $data): Rule
326
    {
327
        // update rule:
328
        $rule->rule_group_id   = $data['rule_group_id'];
329
        $rule->active          = $data['active'];
330
        $rule->stop_processing = $data['stop_processing'];
331
        $rule->title           = $data['title'];
332
        $rule->description     = $data['description'];
333
        $rule->save();
334
335
        // delete triggers:
336
        $rule->ruleTriggers()->delete();
337
338
        // delete actions:
339
        $rule->ruleActions()->delete();
340
341
        // recreate triggers:
342
        $this->storeTriggers($rule, $data);
343
344
        // recreate actions:
345
        $this->storeActions($rule, $data);
346
347
        return $rule;
348
    }
349
350
    /**
351
     * @param Rule  $rule
352
     * @param array $data
353
     *
354
     * @return bool
355
     */
356
    private function storeActions(Rule $rule, array $data): bool
357
    {
358
        $order = 1;
359
        foreach ($data['rule-actions'] as $index => $action) {
360
            $value          = $data['rule-action-values'][$index] ?? '';
361
            $stopProcessing = isset($data['rule-action-stop'][$index]) ? true : false;
362
363
            $actionValues = [
364
                'action'         => $action,
365
                'value'          => $value,
366
                'stopProcessing' => $stopProcessing,
367
                'order'          => $order,
368
            ];
369
370
            $this->storeAction($rule, $actionValues);
371
        }
372
373
        return true;
374
    }
375
376
    /**
377
     * @param Rule  $rule
378
     * @param array $data
379
     *
380
     * @return bool
381
     */
382
    private function storeTriggers(Rule $rule, array $data): bool
383
    {
384
        $order          = 1;
385
        $stopProcessing = false;
386
387
        $triggerValues = [
388
            'action'         => 'user_action',
389
            'value'          => $data['trigger'],
390
            'stopProcessing' => $stopProcessing,
391
            'order'          => $order,
392
        ];
393
394
        $this->storeTrigger($rule, $triggerValues);
395
        foreach ($data['rule-triggers'] as $index => $trigger) {
396
            $value          = $data['rule-trigger-values'][$index] ?? '';
397
            $stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false;
398
399
            $triggerValues = [
400
                'action'         => $trigger,
401
                'value'          => $value,
402
                'stopProcessing' => $stopProcessing,
403
                'order'          => $order,
404
            ];
405
406
            $this->storeTrigger($rule, $triggerValues);
407
            ++$order;
408
        }
409
410
        return true;
411
    }
412
}
413