Completed
Push — develop ( e0670d...e5caae )
by Bob Olde
02:29
created

AuditLog_UserService::onBeforeSaveUser()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 18
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2.2109

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 18
ccs 5
cts 8
cp 0.625
rs 9.4285
cc 2
eloc 7
nc 2
nop 1
crap 2.2109
1
<?php
2
3
namespace Craft;
4
5
/**
6
 * Audit Log User service.
7
 *
8
 * Contains logics for logging users
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 AuditLog_UserService extends BaseApplicationComponent
17
{
18
    /**
19
     * Catch value before saving.
20
     *
21
     * @var array
22
     */
23
    public $before = array();
24
25
    /**
26
     * Catch value after saving.
27
     *
28
     * @var array
29
     */
30
    public $after = array();
31
32
    /**
33
     * Initialize the user saving/deleting events.
34
     *
35
     * @codeCoverageIgnore
36
     */
37
    public function log()
38
    {
39
        // Get values before saving
40
        craft()->on('users.onBeforeSaveUser', array($this, 'onBeforeSaveUser'));
41
42
        // Get values after saving
43
        craft()->on('users.onSaveUser', array($this, 'onSaveUser'));
44
45
        // Get values before deleting
46
        craft()->on('users.onBeforeDeleteUser', array($this, 'onBeforeDeleteUser'));
47
    }
48
49
    /**
50
     * Handle the onBeforeSaveUser event.
51
     *
52
     * @param Event $event
53
     */
54 3
    public function onBeforeSaveUser(Event $event)
55
    {
56
        // Get user id to save
57 3
        $id = $event->params['user']->id;
58
59 3
        if (!$event->params['isNewUser']) {
60
61
            // Get old user from db
62 2
            $user = UserModel::populateModel(UserRecord::model()->findById($id));
63
64
            // Get fields
65
            $this->before = $this->fields($user);
66
        } else {
67
68
            // Get fields
69 1
            $this->before = $this->fields($event->params['user'], true);
70
        }
71
    }
72
73
    /**
74
     * Handle the onSaveUser event.
75
     *
76
     * @param Event $event
77
     */
78
    public function onSaveUser(Event $event)
79
    {
80
        // Get saved user
81
        $user = $event->params['user'];
82
83
        // Get fields
84
        $this->after = $this->fields($user);
85
86
        // New row
87
        $log = new AuditLogRecord();
88
89
        // Set user id
90
        $log->userId = craft()->userSession->getUser() ? craft()->userSession->getUser()->id : $user->id;
91
92
        // Set element type
93
        $log->type = ElementType::User;
94
95
        // Set origin
96
        $log->origin = craft()->request->isCpRequest() ? craft()->config->get('cpTrigger').'/'.craft()->request->path : craft()->request->path;
97
98
        // Set before
99
        $log->before = $this->before;
100
101
        // Set after
102
        $log->after = $this->after;
103
104
        // Set status
105
        $log->status = ($event->params['isNewUser'] ? AuditLogModel::CREATED : AuditLogModel::MODIFIED);
106
107
        // Save row
108
        $log->save(false);
109
110
        // Callback
111
        craft()->auditLog->elementHasChanged(ElementType::User, $user->id, $this->before, $this->after);
112
    }
113
114
    /**
115
     * Handle the onBeforeDeleteUser event.
116
     *
117
     * @param Event $event
118
     */
119
    public function onBeforeDeleteUser(Event $event)
120
    {
121
        // Get deleted user
122
        $user = $event->params['user'];
123
124
        // Get fields
125
        $this->before = $this->fields($user);
126
        $this->after = $this->fields($user, true);
127
128
        // New row
129
        $log = new AuditLogRecord();
130
131
        // Set user id
132
        $log->userId = craft()->userSession->getUser()->id;
133
134
        // Set element type
135
        $log->type = ElementType::User;
136
137
        // Set origin
138
        $log->origin = craft()->request->isCpRequest() ? craft()->config->get('cpTrigger').'/'.craft()->request->path : craft()->request->path;
139
140
        // Set before
141
        $log->before = $this->before;
142
143
        // Set after
144
        $log->after = $this->after;
145
146
        // Set status
147
        $log->status = AuditLogModel::DELETED;
148
149
        // Save row
150
        $log->save(false);
151
152
        // Callback
153
        craft()->auditLog->elementHasChanged(ElementType::User, $user->id, $this->before, $this->after);
154
    }
155
156
    /**
157
     * Parse user fields.
158
     *
159
     * @param UserModel $user
160
     * @param bool      $empty
161
     *
162
     * @return array
163
     */
164 1
    public function fields(UserModel $user, $empty = false)
165
    {
166
        // Check if we are saving new groups
167 1
        $groupIds = craft()->request->getPost('groups', false);
168
169
        // If this is before saving, or no groups have changed
170 1
        if (!count($this->before) || !$groupIds) {
171
172
            // Get user's groups
173 1
            $groups = craft()->userGroups->getGroupsByUserId($user->id);
174
        } else {
175
176
            // This is after saving
177
            // Get posted groups
178
            $groups = array();
179
            foreach ($groupIds as $id) {
180
                $groups[] = craft()->userGroups->getGroupById($id);
181
            }
182
        }
183
184
        // Always save id
185
        $fields = array(
186
            'id' => array(
187
                'label' => Craft::t('ID'),
188
                'value' => $user->id,
189
            ),
190
            'groups' => array(
191
                'label' => Craft::t('Groups'),
192
                'value' => implode(', ', $groups),
193
            ),
194
        );
195
196
        // Get element type
197
        $elementType = craft()->elements->getElementType(ElementType::User);
198
199
        // Get nice attributes
200
        $availableAttributes = $elementType->defineAvailableTableAttributes();
201
202
        // Make 'em fit
203
        $attributes = array();
204
        foreach ($availableAttributes as $key => $result) {
205
            $attributes[$key] = $result['label'];
206
        }
207
208
        // Get static "fields"
209
        foreach ($user->getAttributes() as $handle => $value) {
210
211
            // Only show nice attributes
212
            if (array_key_exists($handle, $attributes)) {
213
                $fields[$handle] = array(
214
                    'label' => $attributes[$handle],
215
                    'value' => StringHelper::arrayToString(is_array($value) ? array_filter(ArrayHelper::flattenArray($value), 'strlen') : $value, ', '),
216
                );
217
            }
218
        }
219
220
        // Get fieldlayout
221
        foreach (craft()->fields->getLayoutByType(ElementType::User)->getFields() as $field) {
222
223
            // Get field values
224
            $field = $field->getField();
225
            $handle = $field->handle;
226
            $label = $field->name;
227
            $value = $empty ? '' : craft()->auditLog->parseFieldData($handle, $user->$handle);
228
229
            // Set on fields
230
            $fields[$handle] = array(
231
                'label' => $label,
232
                'value' => $value,
233
            );
234
        }
235
236
        // Return
237
        return $fields;
238
    }
239
}
240