Completed
Push — develop ( da5129...ffe618 )
by Bob Olde
03:28 queued 53s
created

AuditLogService   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 186
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Test Coverage

Coverage 10.45%

Importance

Changes 24
Bugs 4 Features 7
Metric Value
wmc 20
c 24
b 4
f 7
lcom 0
cbo 0
dl 0
loc 186
ccs 7
cts 67
cp 0.1045
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A log() 0 8 1
C parseFieldData() 0 62 12
B elementHasChanged() 0 32 3
A onElementChanged() 0 4 1
A onFieldChanged() 0 4 1
B view() 0 26 2
1
<?php
2
3
namespace Craft;
4
5
/**
6
 * Audit Log service.
7
 *
8
 * Contains logics for logging
9
 *
10
 * @author    Bob Olde Hampsink <[email protected]>
11
 * @copyright Copyright (c) 2015, Bob Olde Hampsink
12
 * @license   MIT
13
 *
14
 * @link      http://github.com/boboldehampsink
15
 */
16
class AuditLogService extends BaseApplicationComponent
17
{
18
    /**
19
     * Show log with criteria.
20
     *
21
     * @param object $criteria
22
     *
23
     * @return array
24
     *
25
     * @codeCoverageIgnore
26
     */
27
    public function log($criteria)
28
    {
29
        // Build specific criteria
30
        $criteria = craft()->elements->getCriteria('AuditLog', $criteria);
31
32
        // Return occurences
33
        return $criteria->find();
34
    }
35
36
    /**
37
     * View a specific log item.
38
     *
39
     * @param int $id
40
     *
41
     * @return AuditLogModel
42
     */
43 1
    public function view($id)
44
    {
45
        // Get log from record
46 1
        $log = craft()->elements->getCriteria('AuditLog', array('id' => $id))->first();
47
48
        // Create diff
49 1
        $diff = array();
50
51
        // Loop through content
52 1
        foreach ($log->after as $handle => $item) {
53
54
            // Set parsed values
55
            $diff[$handle] = array(
56
                'label' => $item['label'],
57
                'changed' => ($item['value'] != $log['before'][$handle]['value']),
58
                'after' => $item['value'],
59
                'before' => $log['before'][$handle]['value'],
60
            );
61 1
        }
62
63
        // Set diff
64 1
        $log->setAttribute('diff', $diff);
65
66
        // Return the log
67 1
        return $log;
68
    }
69
70
    /**
71
     * Parse field values.
72
     *
73
     * @param string $handle
74
     * @param mixed  $data
75
     *
76
     * @return string
77
     */
78
    public function parseFieldData($handle, $data)
79
    {
80
81
        // Do we have any data at all
82
        if (!is_null($data)) {
83
84
            // Get field info
85
            $field = craft()->fields->getFieldByHandle($handle);
86
87
            // If it's a field ofcourse
88
            if (!is_null($field)) {
89
90
                // For some fieldtypes the're special rules
91
                switch ($field->type) {
92
93
                    case AuditLogModel::FieldTypeEntries:
94
                    case AuditLogModel::FieldTypeCategories:
95
                    case AuditLogModel::FieldTypeAssets:
96
                    case AuditLogModel::FieldTypeUsers:
97
98
                        // Show names
99
                        $data = implode(', ', $data->find());
100
101
                        break;
102
103
                    case AuditLogModel::FieldTypeLightswitch:
104
105
                        // Make data human readable
106
                        switch ($data) {
107
108
                            case '0':
109
                                $data = Craft::t('No');
110
                                break;
111
112
                            case '1':
113
                                $data = Craft::t('Yes');
114
                                break;
115
116
                        }
117
118
                        break;
119
120
                }
121
            }
122
        } else {
123
124
            // Don't return null, return empty
125
            $data = '';
126
        }
127
128
        // If it's an array, make it a string
129
        if (is_array($data)) {
130
            $data = StringHelper::arrayToString(array_filter(ArrayHelper::flattenArray($data), 'strlen'), ', ');
131
        }
132
133
        // If it's an object, make it a string
134
        if (is_object($data)) {
135
            $data = StringHelper::arrayToString(array_filter(ArrayHelper::flattenArray(get_object_vars($data)), 'strlen'), ', ');
136
        }
137
138
        return $data;
139
    }
140
141
    /**
142
     * Check if an element has changed while saving.
143
     *
144
     * @param string $elementType
145
     * @param int    $id
146
     * @param array  $before
147
     * @param array  $after
148
     */
149
    public function elementHasChanged($elementType, $id, $before, $after)
150
    {
151
152
        // Flatten arrays
153
        $flatBefore = ArrayHelper::flattenArray($before);
154
        $flatAfter = ArrayHelper::flattenArray($after);
155
156
        // Calculate the diffence
157
        $flatDiff = array_diff_assoc($flatAfter, $flatBefore);
158
159
        // Expand diff again
160
        $expanded = ArrayHelper::expandArray($flatDiff);
161
162
        // Add labels once again
163
        $diff = array();
164
        foreach ($expanded as $key => $value) {
165
            $diff[$key]['label'] = $before[$key]['label'];
166
            $diff[$key]['value'] = $value['value'];
167
        }
168
169
        // If there IS a difference
170
        if (count($diff)) {
171
172
            // Fire an "onElementChanged" event
173
            $event = new Event($this, array(
174
                'elementType' => $elementType,
175
                'id' => $id,
176
                'diff' => $diff,
177
            ));
178
            $this->onElementChanged($event);
179
        }
180
    }
181
182
    /**
183
     * Fires an "onElementChanged" event.
184
     *
185
     * @param Event $event
186
     */
187
    public function onElementChanged(Event $event)
188
    {
189
        $this->raiseEvent('onElementChanged', $event);
190
    }
191
192
    /**
193
     * Fires an "onFieldChanged" event.
194
     *
195
     * @param Event $event
196
     */
197
    public function onFieldChanged(Event $event)
198
    {
199
        $this->raiseEvent('onFieldChanged', $event);
200
    }
201
}
202