User.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. <?php
  2. namespace App\Http\Livewire;
  3. use Illuminate\Support\Facades\Log;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Support\Facades\Mail;
  6. use Livewire\Component;
  7. use App\Http\Middleware\TenantMiddleware;
  8. use Illuminate\Support\Facades\Auth;
  9. class User extends Component
  10. {
  11. public function boot()
  12. {
  13. app(TenantMiddleware::class)->setupTenantConnection();
  14. $this->logCurrentDatabase('After tenant connection setup in boot()');
  15. }
  16. public $records, $name, $cognome, $email, $password, $oldPassword, $level, $enabled, $dataId, $update = false, $add = false, $oldEmail = null;
  17. public $userExists = false;
  18. protected $rules = [
  19. 'name' => 'required',
  20. 'cognome' => 'required',
  21. 'email' => 'required',
  22. 'password' => 'required'
  23. ];
  24. protected $messages = [
  25. 'name.required' => 'Il nome è obbligatorio',
  26. 'cognome.required' => 'Il cognome è obbligatorio',
  27. 'email.required' => 'La mail è obbligatoria',
  28. 'password.required' => 'La password è obbligatoria',
  29. ];
  30. /**
  31. * Helper method to log current database information
  32. */
  33. private function logCurrentDatabase($context = '')
  34. {
  35. try {
  36. $currentConnection = DB::getDefaultConnection();
  37. $currentDatabase = DB::connection()->getDatabaseName();
  38. $user = Auth::user();
  39. Log::info('Database Connection Info', [
  40. 'context' => $context,
  41. 'current_connection' => $currentConnection,
  42. 'current_database' => $currentDatabase,
  43. 'user_id' => $user ? $user->id : null,
  44. 'user_tenant_database' => $user ? $user->tenant_database : null,
  45. 'user_tenant_username' => $user ? $user->tenant_username : null,
  46. ]);
  47. } catch (\Exception $e) {
  48. Log::error('Failed to get database info', [
  49. 'context' => $context,
  50. 'error' => $e->getMessage()
  51. ]);
  52. }
  53. }
  54. /**
  55. * Create or update user in master database
  56. */
  57. private function syncUserToMasterDatabase($userData, $action = 'create', $oldEmail = null)
  58. {
  59. try {
  60. Log::info('Syncing user to master database', [
  61. 'action' => $action,
  62. 'email' => $userData['email'],
  63. 'old_email' => $oldEmail
  64. ]);
  65. $masterConfig = [
  66. 'driver' => 'mysql',
  67. 'host' => env('DB_HOST', '127.0.0.1'),
  68. 'port' => env('DB_PORT', '3306'),
  69. 'database' => env('DB_DATABASE'),
  70. 'username' => env('DB_USERNAME'),
  71. 'password' => env('DB_PASSWORD'),
  72. 'charset' => 'utf8mb4',
  73. 'collation' => 'utf8mb4_unicode_ci',
  74. 'prefix' => '',
  75. 'strict' => true,
  76. 'engine' => null,
  77. ];
  78. config(['database.connections.master_sync' => $masterConfig]);
  79. $currentUser = Auth::user();
  80. $masterData = [
  81. 'name' => $userData['name'],
  82. 'email' => $userData['email'],
  83. 'password' => $userData['password'],
  84. 'tenant_database' => $currentUser->tenant_database,
  85. 'tenant_username' => $currentUser->tenant_username,
  86. 'tenant_password' => $currentUser->tenant_password,
  87. 'tenant_host' => '127.0.0.1',
  88. 'created_at' => now(),
  89. 'updated_at' => now()
  90. ];
  91. if ($action === 'create') {
  92. $inserted = DB::connection('master_sync')
  93. ->table('users')
  94. ->insert($masterData);
  95. if ($inserted) {
  96. Log::info('Successfully created user in master database', [
  97. 'email' => $userData['email'],
  98. 'tenant_database' => $currentUser->tenant_database
  99. ]);
  100. return true;
  101. } else {
  102. Log::warning('Failed to create user in master database', [
  103. 'email' => $userData['email']
  104. ]);
  105. return false;
  106. }
  107. } elseif ($action === 'update') {
  108. $searchEmail = $oldEmail ?: $userData['email'];
  109. unset($masterData['created_at']);
  110. $updated = DB::connection('master_sync')
  111. ->table('users')
  112. ->where('email', $searchEmail)
  113. ->update($masterData);
  114. if ($updated) {
  115. Log::info('Successfully updated user in master database', [
  116. 'old_email' => $searchEmail,
  117. 'new_email' => $userData['email']
  118. ]);
  119. return true;
  120. } else {
  121. Log::warning('No user found in master database to update', [
  122. 'search_email' => $searchEmail
  123. ]);
  124. return false;
  125. }
  126. }
  127. } catch (\Exception $e) {
  128. Log::error('Failed to sync user to master database', [
  129. 'action' => $action,
  130. 'email' => $userData['email'],
  131. 'error' => $e->getMessage(),
  132. 'trace' => $e->getTraceAsString()
  133. ]);
  134. return false;
  135. } finally {
  136. // Clean up the temporary connection
  137. try {
  138. DB::purge('master_sync');
  139. } catch (\Exception $e) {
  140. // Ignore cleanup errors
  141. }
  142. }
  143. }
  144. /**
  145. * Delete user from master database
  146. */
  147. private function deleteUserFromMasterDatabase($email)
  148. {
  149. try {
  150. Log::info('Deleting user from master database', [
  151. 'email' => $email
  152. ]);
  153. $masterConfig = [
  154. 'driver' => 'mysql',
  155. 'host' => env('DB_HOST', '127.0.0.1'),
  156. 'port' => env('DB_PORT', '3306'),
  157. 'database' => env('DB_DATABASE'),
  158. 'username' => env('DB_USERNAME'),
  159. 'password' => env('DB_PASSWORD'),
  160. 'charset' => 'utf8mb4',
  161. 'collation' => 'utf8mb4_unicode_ci',
  162. 'prefix' => '',
  163. 'strict' => true,
  164. 'engine' => null,
  165. ];
  166. config(['database.connections.master_delete' => $masterConfig]);
  167. $deleted = DB::connection('master_delete')
  168. ->table('users')
  169. ->where('email', $email)
  170. ->delete();
  171. if ($deleted) {
  172. Log::info('Successfully deleted user from master database', [
  173. 'email' => $email,
  174. 'rows_affected' => $deleted
  175. ]);
  176. return true;
  177. } else {
  178. Log::warning('No user found in master database to delete', [
  179. 'email' => $email
  180. ]);
  181. return false;
  182. }
  183. } catch (\Exception $e) {
  184. Log::error('Failed to delete user from master database', [
  185. 'email' => $email,
  186. 'error' => $e->getMessage(),
  187. 'trace' => $e->getTraceAsString()
  188. ]);
  189. return false;
  190. } finally {
  191. try {
  192. DB::purge('master_delete');
  193. } catch (\Exception $e) {
  194. }
  195. }
  196. }
  197. /**
  198. * Send welcome email to new user
  199. */
  200. private function sendWelcomeEmail($userData, $plainPassword)
  201. {
  202. try {
  203. $currentUser = Auth::user();
  204. $companyName = 'Leezard';
  205. Log::info('Preparing to send welcome email', [
  206. 'recipient' => $userData['email'],
  207. 'company' => $companyName,
  208. 'mail_from' => config('mail.from.address'),
  209. 'mail_host' => config('mail.mailers.smtp.host'),
  210. 'mail_port' => config('mail.mailers.smtp.port')
  211. ]);
  212. $emailData = [
  213. 'name' => $userData['name'],
  214. 'cognome' => $userData['cognome'],
  215. 'email' => $userData['email'],
  216. 'password' => $plainPassword,
  217. 'level' => $userData['level'],
  218. 'company' => $companyName,
  219. 'login_url' => url('/'),
  220. 'created_by' => $currentUser->name
  221. ];
  222. try {
  223. $viewContent = view('emails.welcome-user', $emailData)->render();
  224. Log::info('Email template rendered successfully', ['template_length' => strlen($viewContent)]);
  225. } catch (\Exception $viewException) {
  226. Log::error('Email template rendering failed', ['error' => $viewException->getMessage()]);
  227. throw new \Exception('Email template error: ' . $viewException->getMessage());
  228. }
  229. Mail::send('emails.welcome-user', $emailData, function ($message) use ($userData, $companyName) {
  230. $message->to($userData['email'], $userData['name'] . ' ' . $userData['cognome'])
  231. ->subject('Benvenuto su Leezard - Account Creato')
  232. ->from(config('mail.from.address'), config('mail.from.name'));
  233. if (env('MAIL_CCN')) {
  234. $message->bcc(env('MAIL_CCN'));
  235. }
  236. });
  237. Log::info('Welcome email sent successfully', [
  238. 'recipient' => $userData['email'],
  239. 'company' => $companyName,
  240. 'subject' => 'Benvenuto in ' . $companyName . ' - Account Creato'
  241. ]);
  242. return true;
  243. } catch (\Exception $e) {
  244. Log::error('SMTP Transport error when sending welcome email', [
  245. 'recipient' => $userData['email'],
  246. 'error' => $e->getMessage(),
  247. 'mail_config' => [
  248. 'host' => config('mail.mailers.smtp.host'),
  249. 'port' => config('mail.mailers.smtp.port'),
  250. 'encryption' => config('mail.mailers.smtp.encryption'),
  251. 'username' => config('mail.mailers.smtp.username')
  252. ]
  253. ]);
  254. return false;
  255. } catch (\Exception $e) {
  256. Log::error('General error when sending welcome email', [
  257. 'recipient' => $userData['email'],
  258. 'error' => $e->getMessage(),
  259. 'trace' => $e->getTraceAsString()
  260. ]);
  261. return false;
  262. }
  263. }
  264. public function resetFields()
  265. {
  266. $this->name = '';
  267. $this->cognome = '';
  268. $this->email = '';
  269. $this->password = '';
  270. $this->oldPassword = '';
  271. $this->level = 0;
  272. $this->enabled = true;
  273. $this->emit('load-data-table');
  274. }
  275. public function render()
  276. {
  277. $this->logCurrentDatabase('Before fetching users in render()');
  278. $this->records = \App\Models\User::select('id', 'name', 'cognome', 'email', 'password', 'level', 'enabled')->get();
  279. $this->logCurrentDatabase('After fetching users in render()');
  280. return view('livewire.user');
  281. }
  282. public function add()
  283. {
  284. if (!$this->canAddUser()) {
  285. session()->flash('error', 'Non hai i permessi per aggiungere utenti.');
  286. return;
  287. }
  288. $this->logCurrentDatabase('In add() method');
  289. $this->resetFields();
  290. $this->add = true;
  291. $this->update = false;
  292. $this->enabled = true;
  293. $this->userExists = false;
  294. }
  295. public function store()
  296. {
  297. if (!$this->canAddUser()) {
  298. session()->flash('error', 'Non hai i permessi per aggiungere utenti.');
  299. return;
  300. }
  301. $this->logCurrentDatabase('Start of store() method');
  302. Log::info('User store', [
  303. 'name' => $this->name,
  304. 'cognome' => $this->cognome,
  305. 'email' => $this->email,
  306. 'level' => $this->level,
  307. 'enabled' => $this->enabled
  308. ]);
  309. $rules = [
  310. 'name' => 'required',
  311. 'cognome' => 'required',
  312. 'email' => 'required|email|unique:users,email',
  313. 'password' => 'required|min:6'
  314. ];
  315. $messages = [
  316. 'name.required' => 'Il nome è obbligatorio',
  317. 'cognome.required' => 'Il cognome è obbligatorio',
  318. 'email.required' => 'La mail è obbligatoria',
  319. 'email.email' => 'La mail deve essere un indirizzo valido',
  320. 'email.unique' => 'Questa mail è già stata utilizzata',
  321. 'password.required' => 'La password è obbligatoria',
  322. 'password.min' => 'La password deve essere di almeno 6 caratteri'
  323. ];
  324. $this->validate($rules, $messages);
  325. $this->logCurrentDatabase('Before creating user in store()');
  326. try {
  327. $plainPassword = $this->password;
  328. $hashedPassword = bcrypt($this->password);
  329. $user = \App\Models\User::create([
  330. 'name' => $this->name,
  331. 'cognome' => $this->cognome,
  332. 'email' => $this->email,
  333. 'password' => $hashedPassword,
  334. 'level' => $this->level,
  335. 'enabled' => $this->enabled
  336. ]);
  337. $this->logCurrentDatabase('After creating user in tenant database');
  338. Log::info('User created successfully in tenant database', [
  339. 'user_id' => $user->id,
  340. 'name' => $this->name,
  341. 'cognome' => $this->cognome,
  342. 'email' => $this->email,
  343. 'level' => $this->level,
  344. 'enabled' => $this->enabled,
  345. 'database' => DB::connection()->getDatabaseName()
  346. ]);
  347. $masterSyncSuccess = $this->syncUserToMasterDatabase([
  348. 'name' => $this->name,
  349. 'cognome' => $this->cognome,
  350. 'email' => $this->email,
  351. 'password' => $hashedPassword,
  352. 'level' => $this->level,
  353. 'enabled' => $this->enabled
  354. ], 'create');
  355. if ($masterSyncSuccess) {
  356. $emailSent = $this->sendWelcomeEmail([
  357. 'name' => $this->name,
  358. 'cognome' => $this->cognome,
  359. 'email' => $this->email,
  360. 'level' => $this->level
  361. ], $plainPassword);
  362. if (!$emailSent) {
  363. Log::info('HTML email failed, trying simple email', ['email' => $this->email]);
  364. $emailSent = $this->sendSimpleWelcomeEmail([
  365. 'name' => $this->name,
  366. 'cognome' => $this->cognome,
  367. 'email' => $this->email,
  368. 'level' => $this->level
  369. ], $plainPassword);
  370. }
  371. if ($emailSent) {
  372. session()->flash('success', 'Utente creato e email di benvenuto inviata con successo');
  373. } else {
  374. session()->flash('success', 'Utente creato ma errore nell\'invio dell\'email. Controlla i log per dettagli.');
  375. }
  376. } else {
  377. session()->flash('success', 'Utente creato nel database tenant ma errore nella sincronizzazione master');
  378. }
  379. $this->resetFields();
  380. $this->add = false;
  381. } catch (\Exception $ex) {
  382. $this->logCurrentDatabase('Error in store() method');
  383. Log::error('User creation failed', [
  384. 'error' => $ex->getMessage(),
  385. 'database' => DB::connection()->getDatabaseName(),
  386. 'user_data' => [
  387. 'name' => $this->name,
  388. 'cognome' => $this->cognome,
  389. 'email' => $this->email,
  390. 'level' => $this->level,
  391. 'enabled' => $this->enabled
  392. ]
  393. ]);
  394. session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
  395. }
  396. }
  397. public function edit($id)
  398. {
  399. if (!$this->canEditUser($id)) {
  400. session()->flash('error', 'Non hai i permessi per modificare questo utente.');
  401. return;
  402. }
  403. $this->logCurrentDatabase('Start of edit() method');
  404. try {
  405. $user = \App\Models\User::findOrFail($id);
  406. $this->logCurrentDatabase('After finding user in edit()');
  407. if (!$user) {
  408. session()->flash('error', 'Utente non trovato');
  409. } else {
  410. $this->name = $user->name;
  411. $this->cognome = $user->cognome;
  412. $this->email = $user->email;
  413. $this->level = $user->level;
  414. $this->dataId = $user->id;
  415. $this->update = true;
  416. $this->add = false;
  417. $this->enabled = $user->enabled;
  418. $this->userExists = true;
  419. // Store old email for master database update
  420. $this->oldEmail = $user->email;
  421. }
  422. Log::info('User edit loaded', [
  423. 'user_id' => $id,
  424. 'name' => $this->name,
  425. 'cognome' => $this->cognome,
  426. 'email' => $this->email,
  427. 'level' => $this->level,
  428. 'database' => DB::connection()->getDatabaseName()
  429. ]);
  430. } catch (\Exception $ex) {
  431. $this->logCurrentDatabase('Error in edit() method');
  432. Log::error('User edit failed', [
  433. 'user_id' => $id,
  434. 'error' => $ex->getMessage(),
  435. 'database' => DB::connection()->getDatabaseName()
  436. ]);
  437. session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
  438. }
  439. }
  440. public function update()
  441. {
  442. $this->logCurrentDatabase('Start of update() method');
  443. $rules = [
  444. 'name' => 'required',
  445. 'cognome' => 'required',
  446. 'email' => 'required|email',
  447. 'password' => 'nullable|min:6'
  448. ];
  449. $this->validate($rules, $this->messages);
  450. try {
  451. $currentUser = \App\Models\User::findOrFail($this->dataId);
  452. $oldEmail = $currentUser->email;
  453. $oldName = $currentUser->name;
  454. $updateData = [
  455. 'name' => $this->name,
  456. 'cognome' => $this->cognome,
  457. 'email' => $this->email,
  458. 'level' => $this->level,
  459. 'enabled' => $this->enabled
  460. ];
  461. $passwordChanged = !empty($this->password);
  462. if ($passwordChanged) {
  463. $hashedPassword = bcrypt($this->password);
  464. $updateData['password'] = $hashedPassword;
  465. }
  466. \App\Models\User::whereId($this->dataId)->update($updateData);
  467. $this->logCurrentDatabase('After updating user');
  468. Log::info('User updated successfully in tenant database', [
  469. 'user_id' => $this->dataId,
  470. 'name' => $this->name,
  471. 'cognome' => $this->cognome,
  472. 'email' => $this->email,
  473. 'level' => $this->level,
  474. 'enabled' => $this->enabled,
  475. 'password_changed' => $passwordChanged,
  476. 'database' => DB::connection()->getDatabaseName()
  477. ]);
  478. $emailChanged = $oldEmail !== $this->email;
  479. $nameChanged = $oldName !== $this->name;
  480. if ($emailChanged || $nameChanged || $passwordChanged) {
  481. $masterData = [
  482. 'name' => $this->name,
  483. 'email' => $this->email
  484. ];
  485. if ($passwordChanged) {
  486. $masterData['password'] = $hashedPassword;
  487. }
  488. $this->syncUserToMasterDatabase($masterData, 'update', $oldEmail);
  489. }
  490. session()->flash('success', 'Dato aggiornato');
  491. $this->resetFields();
  492. $this->update = false;
  493. } catch (\Exception $ex) {
  494. $this->logCurrentDatabase('Error in update() method');
  495. Log::error('User update failed', [
  496. 'user_id' => $this->dataId,
  497. 'error' => $ex->getMessage(),
  498. 'database' => DB::connection()->getDatabaseName()
  499. ]);
  500. session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
  501. }
  502. }
  503. public function cancel()
  504. {
  505. $this->logCurrentDatabase('In cancel() method');
  506. $this->resetFields();
  507. $this->add = false;
  508. $this->update = false;
  509. $this->userExists = false;
  510. $this->enabled = false;
  511. }
  512. public function delete($id)
  513. {
  514. Log::info('Delete method called', [
  515. 'user_id_to_delete' => $id,
  516. 'current_user_id' => Auth::id(),
  517. 'current_user_level' => Auth::user()->level
  518. ]);
  519. if (!$this->canDeleteUser($id)) {
  520. Log::warning('Delete permission denied', [
  521. 'user_id_to_delete' => $id,
  522. 'current_user_id' => Auth::id(),
  523. 'current_user_level' => Auth::user()->level
  524. ]);
  525. session()->flash('error', 'Non hai i permessi per eliminare questo utente.');
  526. return;
  527. }
  528. $this->logCurrentDatabase('Start of delete() method');
  529. try {
  530. $user = \App\Models\User::find($id);
  531. if (!$user) {
  532. Log::error('User not found for deletion', ['user_id' => $id]);
  533. session()->flash('error', 'Utente non trovato.');
  534. return;
  535. }
  536. $userEmail = $user->email;
  537. $userName = $user->name;
  538. $userCognome = $user->cognome;
  539. Log::info('Found user for deletion', [
  540. 'user_id' => $id,
  541. 'user_email' => $userEmail,
  542. 'user_name' => $userName . ' ' . $userCognome
  543. ]);
  544. $deleted = $user->delete();
  545. if (!$deleted) {
  546. throw new \Exception('Failed to delete user from tenant database');
  547. }
  548. $this->logCurrentDatabase('After deleting user from tenant');
  549. Log::info('User deleted successfully from tenant database', [
  550. 'user_id' => $id,
  551. 'user_email' => $userEmail,
  552. 'database' => DB::connection()->getDatabaseName()
  553. ]);
  554. $masterDeleted = $this->deleteUserFromMasterDatabase($userEmail);
  555. if ($masterDeleted) {
  556. Log::info('User deleted from both databases successfully', [
  557. 'user_id' => $id,
  558. 'user_email' => $userEmail
  559. ]);
  560. session()->flash('success', "Utente {$userName} {$userCognome} eliminato con successo");
  561. } else {
  562. Log::warning('User deleted from tenant but failed to delete from master', [
  563. 'user_id' => $id,
  564. 'user_email' => $userEmail
  565. ]);
  566. session()->flash('success', "Utente eliminato dal database tenant, ma errore nella sincronizzazione master");
  567. }
  568. $this->emit('userDeleted');
  569. $this->emit('load-data-table');
  570. } catch (\Exception $e) {
  571. $this->logCurrentDatabase('Error in delete() method');
  572. Log::error('User deletion failed', [
  573. 'user_id' => $id,
  574. 'error' => $e->getMessage(),
  575. 'trace' => $e->getTraceAsString(),
  576. 'database' => DB::connection()->getDatabaseName()
  577. ]);
  578. session()->flash('error', 'Errore durante l\'eliminazione: ' . $e->getMessage());
  579. }
  580. }
  581. private function canEditUser($userId)
  582. {
  583. $currentUser = Auth::user();
  584. if ($currentUser->level == 0) {
  585. $targetUser = \App\Models\User::find($userId);
  586. return $targetUser && $targetUser->email != 'admin@admin.com';
  587. }
  588. return $userId == $currentUser->id;
  589. }
  590. /**
  591. * Check if current user can edit email and password of a specific user
  592. */
  593. private function canEditEmailAndPassword($userId)
  594. {
  595. $currentUser = Auth::user();
  596. return $userId == $currentUser->id;
  597. }
  598. /**
  599. * Check if current user can delete a specific user
  600. */
  601. private function canDeleteUser($userId)
  602. {
  603. $currentUser = Auth::user();
  604. if ($currentUser->level != 0) {
  605. return false;
  606. }
  607. if ($userId == $currentUser->id) {
  608. return false;
  609. }
  610. $targetUser = \App\Models\User::find($userId);
  611. if ($targetUser && $targetUser->email == 'admin@admin.com') {
  612. return false;
  613. }
  614. return true;
  615. }
  616. /**
  617. * Check if current user can add users
  618. */
  619. private function canAddUser()
  620. {
  621. $currentUser = Auth::user();
  622. return $currentUser->level == 0;
  623. }
  624. }