-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathDeleteUserBehavior.php
More file actions
129 lines (112 loc) · 3.42 KB
/
DeleteUserBehavior.php
File metadata and controls
129 lines (112 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
/**
* DeleteUser Behavior
*
* @author Noriko Arai <arai@nii.ac.jp>
* @author Shohei Nakajima <nakajimashouhei@gmail.com>
* @link http://www.netcommons.org NetCommons Project
* @license http://www.netcommons.org/license.txt NetCommons License
* @copyright Copyright 2014, NetCommons Project
*/
App::uses('ModelBehavior', 'Model');
/**
* DeleteUser Behavior
*
* @author Shohei Nakajima <nakajimashouhei@gmail.com>
* @package NetCommons\Users\Model\Behavior
*/
class DeleteUserBehavior extends ModelBehavior {
/**
* ユーザの削除
*
* @param Model $model ビヘイビア呼び出し元モデル
* @param array $data data
* @return mixed On success Model::$data, false on failure
* @throws InternalErrorException
*/
public function deleteUser(Model $model, $data) {
//トランザクションBegin
$model->begin();
$model->prepare();
try {
//Userデータの削除->論理削除
$user = $model->create(array(
'id' => $data['User']['id'],
'handlename' => $data['User']['handlename'],
'is_deleted' => true,
));
if (! $model->save($user, false)) {
throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
}
//関連DBの削除
$model->deleteUserAssociations($user['User']['id']);
//トランザクションCommit
$model->commit();
} catch (Exception $ex) {
//トランザクションRollback
$model->rollback($ex);
}
return true;
}
/**
* usersテーブルに関連するテーブル削除
*
* @param Model $model ビヘイビア呼び出し元モデル
* @param int $userId ユーザID
* @return bool True on success
* @throws InternalErrorException
*/
public function deleteUserAssociations(Model $model, $userId) {
$models = array(
'UsersLanguage' => 'Users.UsersLanguage',
'RolesRoomsUser' => 'Rooms.RolesRoomsUser',
);
$model->loadModels($models);
$modelNames = array_keys($models);
foreach ($modelNames as $modelName) {
$conditions = array(
$model->$modelName->alias . '.user_id' => $userId
);
if (! $model->$modelName->deleteAll($conditions, false)) {
throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
}
}
////user_idがついているテーブルに対して削除する(必要ない?)
//$tables = $model->query('SHOW TABLES');
//foreach ($tables as $table) {
// $tableName = array_shift($table['TABLE_NAMES']);
// $columns = $model->query('SHOW COLUMNS FROM ' . $tableName);
// if (! Hash::check($columns, '{n}.COLUMNS[Field=user_id]')) {
// continue;
// }
//
// $model->query('DELETE FROM ' . $tableName . ' WHERE user_id = ' . $userId);
//}
return true;
}
/**
* ユーザの削除出来るかどうか
*
* @param Model $model ビヘイビア呼び出し元モデル
* @param array $user ユーザデータ
* @return bool
*/
public function canUserDelete(Model $model, $user) {
if (Current::read('User.role_key') !== UserRole::USER_ROLE_KEY_SYSTEM_ADMINISTRATOR &&
(! $user || $user['User']['role_key'] === UserRole::USER_ROLE_KEY_SYSTEM_ADMINISTRATOR)) {
return false;
}
if ($user['User']['role_key'] === UserRole::USER_ROLE_KEY_SYSTEM_ADMINISTRATOR) {
$count = $model->find('count', array(
'recursive' => -1,
'conditions' => array(
$model->alias . '.role_key' => UserRole::USER_ROLE_KEY_SYSTEM_ADMINISTRATOR,
$model->alias . '.is_deleted' => false,
),
));
return ($count > 1);
} else {
return true;
}
}
}