AuditLog_UserService::onBeforeDeleteUser()   B
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 36
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 2

Importance

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