Passed
Push — master ( 437196...79106b )
by kicaj
14:52
created

DeletedBehavior::beforeFind()   A

Complexity

Conditions 6
Paths 5

Size

Total Lines 25
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 12
nc 5
nop 2
dl 0
loc 25
rs 9.2222
c 0
b 0
f 0
1
<?php
2
namespace SlicesCake\Delete\Model\Behavior;
3
4
use Cake\Datasource\EntityInterface;
5
use Cake\Database\Expression\Comparison;
6
use Cake\ORM\Behavior;
7
use Cake\ORM\Query;
8
use Cake\Event\Event;
9
use Cake\I18n\Time;
10
11
class DeletedBehavior extends Behavior
12
{
13
14
    /**
15
     * {@inheritDoc}
16
     */
17
    protected $_defaultConfig = [
18
        'field' => 'deleted',
19
    ];
20
21
    /**
22
     * {@inheritDoc}
23
     */
24
    public function beforeFind(Event $event, Query $query)
25
    {
26
        $field = $this->getConfig('field');
27
28
        if ($this->getTable()->hasField($field)) {
29
            $deleted = true;
30
31
            if ($query->clause('where')) {
32
                $query->clause('where')->traverse(function ($expression) use (&$deleted, $field) {
33
                    if ($expression instanceof Comparison) {
34
                        if ($expression->getField() === $this->getTable()->getAlias() . '.' . $field) {
35
                            $deleted = false;
36
                        }
37
                    }
38
                });
39
            }
40
41
            if ($deleted === true) {
42
                $query->where([
43
                    $this->getTable()->getAlias() . '.' . $field . ' IS NULL',
44
                ]);
45
            }
46
        }
47
48
        return $query;
49
    }
50
51
    /**
52
     * {@inheritDoc}
53
     */
54
    public function beforeDelete(Event $event, EntityInterface $entity)
55
    {
56
        $field = $this->getConfig('field');
57
58
        if ($this->getTable()->hasField($field)) {
59
            foreach ($this->getTable()->associations() as $association) {
60
                $association->cascadeDelete($entity, [
61
                    '_primary' => false,
62
                ]);
63
            }
64
65
            $event->stopPropagation();
66
67
            if ($entity->isAccessible($field) === false) {
68
                $entity->setAccess($field, true);
69
            }
70
71
            $entity = $this->getTable()->patchEntity($entity, [
72
                $field => Time::now(),
73
            ]);
74
75
            return $this->getTable()->save($entity);
76
        }
77
78
        return true;
79
    }
80
}
81