User.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  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 sendSimpleWelcomeEmail($email, $userData)
  265. {
  266. try {
  267. $subject = "Benvenuto su " . $userData['company'] . " – Account Creato";
  268. $message = "Ciao " . $userData['name'] . " " . $userData['cognome'] . ",\n\n";
  269. $message .= "Il tuo account è stato creato con successo su " . $userData['company'] . ".\n\n";
  270. $message .= "Le tue credenziali di accesso:\n";
  271. $message .= "Email: " . $userData['email'] . "\n";
  272. $message .= "Password: " . $userData['password'] . "\n\n";
  273. $message .= "Per motivi di sicurezza, dovrai cambiare la password al primo accesso.\n\n";
  274. $message .= "Accedi ora: " . $userData['login_url'] . "\n\n";
  275. $message .= "Grazie e benvenuto!\n";
  276. $message .= "Il team di " . $userData['company'];
  277. // Send simple text email
  278. mail($email, $subject, $message, [
  279. 'From' => config('mail.from.address'),
  280. 'Reply-To' => config('mail.from.address'),
  281. 'Content-Type' => 'text/plain; charset=UTF-8'
  282. ]);
  283. return true;
  284. } catch (\Exception $e) {
  285. Log::error('Simple email sending failed', [
  286. 'email' => $email,
  287. 'error' => $e->getMessage()
  288. ]);
  289. return false;
  290. }
  291. }
  292. public function resetFields()
  293. {
  294. $this->name = '';
  295. $this->cognome = '';
  296. $this->email = '';
  297. $this->password = '';
  298. $this->oldPassword = '';
  299. $this->level = 0;
  300. $this->enabled = true;
  301. $this->emit('load-data-table');
  302. }
  303. public function render()
  304. {
  305. $this->logCurrentDatabase('Before fetching users in render()');
  306. $this->records = \App\Models\User::select('id', 'name', 'cognome', 'email', 'password', 'level', 'enabled')->get();
  307. $this->logCurrentDatabase('After fetching users in render()');
  308. return view('livewire.user');
  309. }
  310. public function add()
  311. {
  312. if (!$this->canAddUser()) {
  313. session()->flash('error', 'Non hai i permessi per aggiungere utenti.');
  314. return;
  315. }
  316. $this->logCurrentDatabase('In add() method');
  317. $this->resetFields();
  318. $this->add = true;
  319. $this->update = false;
  320. $this->enabled = true;
  321. $this->userExists = false;
  322. }
  323. public function store()
  324. {
  325. if (!$this->canAddUser()) {
  326. session()->flash('error', 'Non hai i permessi per aggiungere utenti.');
  327. return;
  328. }
  329. $this->logCurrentDatabase('Start of store() method');
  330. Log::info('User store', [
  331. 'name' => $this->name,
  332. 'cognome' => $this->cognome,
  333. 'email' => $this->email,
  334. 'level' => $this->level,
  335. 'enabled' => $this->enabled
  336. ]);
  337. $rules = [
  338. 'name' => 'required',
  339. 'cognome' => 'required',
  340. 'email' => 'required|email|unique:users,email',
  341. 'password' => 'required|min:6'
  342. ];
  343. $messages = [
  344. 'name.required' => 'Il nome è obbligatorio',
  345. 'cognome.required' => 'Il cognome è obbligatorio',
  346. 'email.required' => 'La mail è obbligatoria',
  347. 'email.email' => 'La mail deve essere un indirizzo valido',
  348. 'email.unique' => 'Questa mail è già stata utilizzata',
  349. 'password.required' => 'La password è obbligatoria',
  350. 'password.min' => 'La password deve essere di almeno 6 caratteri'
  351. ];
  352. $this->validate($rules, $messages);
  353. $this->logCurrentDatabase('Before creating user in store()');
  354. try {
  355. $plainPassword = $this->password;
  356. $hashedPassword = bcrypt($this->password);
  357. $user = \App\Models\User::create([
  358. 'name' => $this->name,
  359. 'cognome' => $this->cognome,
  360. 'email' => $this->email,
  361. 'password' => $hashedPassword,
  362. 'level' => $this->level,
  363. 'enabled' => $this->enabled
  364. ]);
  365. $this->logCurrentDatabase('After creating user in tenant database');
  366. Log::info('User created successfully in tenant database', [
  367. 'user_id' => $user->id,
  368. 'name' => $this->name,
  369. 'cognome' => $this->cognome,
  370. 'email' => $this->email,
  371. 'level' => $this->level,
  372. 'enabled' => $this->enabled,
  373. 'database' => DB::connection()->getDatabaseName()
  374. ]);
  375. $masterSyncSuccess = $this->syncUserToMasterDatabase([
  376. 'name' => $this->name,
  377. 'cognome' => $this->cognome,
  378. 'email' => $this->email,
  379. 'password' => $hashedPassword,
  380. 'level' => $this->level,
  381. 'enabled' => $this->enabled
  382. ], 'create');
  383. if ($masterSyncSuccess) {
  384. $emailSent = $this->sendWelcomeEmail([
  385. 'name' => $this->name,
  386. 'cognome' => $this->cognome,
  387. 'email' => $this->email,
  388. 'level' => $this->level
  389. ], $plainPassword);
  390. if (!$emailSent) {
  391. Log::info('HTML email failed, trying simple email', ['email' => $this->email]);
  392. $emailSent = $this->sendSimpleWelcomeEmail($this->email, [
  393. 'name' => $this->name,
  394. 'cognome' => $this->cognome,
  395. 'email' => $this->email,
  396. 'password' => $plainPassword,
  397. 'level' => $this->level,
  398. 'company' => 'Leezard',
  399. 'login_url' => url('/')
  400. ]);
  401. }
  402. if ($emailSent) {
  403. session()->flash('success', 'Utente creato e email di benvenuto inviata con successo');
  404. } else {
  405. session()->flash('success', 'Utente creato ma errore nell\'invio dell\'email. Controlla i log per dettagli.');
  406. }
  407. } else {
  408. session()->flash('success', 'Utente creato nel database tenant ma errore nella sincronizzazione master');
  409. }
  410. $this->resetFields();
  411. $this->add = false;
  412. } catch (\Exception $ex) {
  413. $this->logCurrentDatabase('Error in store() method');
  414. Log::error('User creation failed', [
  415. 'error' => $ex->getMessage(),
  416. 'database' => DB::connection()->getDatabaseName(),
  417. 'user_data' => [
  418. 'name' => $this->name,
  419. 'cognome' => $this->cognome,
  420. 'email' => $this->email,
  421. 'level' => $this->level,
  422. 'enabled' => $this->enabled
  423. ]
  424. ]);
  425. session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
  426. }
  427. }
  428. public function edit($id)
  429. {
  430. if (!$this->canEditUser($id)) {
  431. session()->flash('error', 'Non hai i permessi per modificare questo utente.');
  432. return;
  433. }
  434. $this->logCurrentDatabase('Start of edit() method');
  435. try {
  436. $user = \App\Models\User::findOrFail($id);
  437. $this->logCurrentDatabase('After finding user in edit()');
  438. if (!$user) {
  439. session()->flash('error', 'Utente non trovato');
  440. } else {
  441. $this->name = $user->name;
  442. $this->cognome = $user->cognome;
  443. $this->email = $user->email;
  444. $this->level = $user->level;
  445. $this->dataId = $user->id;
  446. $this->update = true;
  447. $this->add = false;
  448. $this->enabled = $user->enabled;
  449. $this->userExists = true;
  450. // Store old email for master database update
  451. $this->oldEmail = $user->email;
  452. }
  453. Log::info('User edit loaded', [
  454. 'user_id' => $id,
  455. 'name' => $this->name,
  456. 'cognome' => $this->cognome,
  457. 'email' => $this->email,
  458. 'level' => $this->level,
  459. 'database' => DB::connection()->getDatabaseName()
  460. ]);
  461. } catch (\Exception $ex) {
  462. $this->logCurrentDatabase('Error in edit() method');
  463. Log::error('User edit failed', [
  464. 'user_id' => $id,
  465. 'error' => $ex->getMessage(),
  466. 'database' => DB::connection()->getDatabaseName()
  467. ]);
  468. session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
  469. }
  470. }
  471. public function update()
  472. {
  473. $this->logCurrentDatabase('Start of update() method');
  474. $rules = [
  475. 'name' => 'required',
  476. 'cognome' => 'required',
  477. 'email' => 'required|email',
  478. 'password' => 'nullable|min:6'
  479. ];
  480. $this->validate($rules, $this->messages);
  481. try {
  482. $currentUser = \App\Models\User::findOrFail($this->dataId);
  483. $oldEmail = $currentUser->email;
  484. $oldName = $currentUser->name;
  485. $updateData = [
  486. 'name' => $this->name,
  487. 'cognome' => $this->cognome,
  488. 'email' => $this->email,
  489. 'level' => $this->level,
  490. 'enabled' => $this->enabled
  491. ];
  492. $passwordChanged = !empty($this->password);
  493. if ($passwordChanged) {
  494. $hashedPassword = bcrypt($this->password);
  495. $updateData['password'] = $hashedPassword;
  496. }
  497. \App\Models\User::whereId($this->dataId)->update($updateData);
  498. $this->logCurrentDatabase('After updating user');
  499. Log::info('User updated successfully in tenant database', [
  500. 'user_id' => $this->dataId,
  501. 'name' => $this->name,
  502. 'cognome' => $this->cognome,
  503. 'email' => $this->email,
  504. 'level' => $this->level,
  505. 'enabled' => $this->enabled,
  506. 'password_changed' => $passwordChanged,
  507. 'database' => DB::connection()->getDatabaseName()
  508. ]);
  509. $emailChanged = $oldEmail !== $this->email;
  510. $nameChanged = $oldName !== $this->name;
  511. if ($emailChanged || $nameChanged || $passwordChanged) {
  512. $masterData = [
  513. 'name' => $this->name,
  514. 'email' => $this->email
  515. ];
  516. if ($passwordChanged) {
  517. $masterData['password'] = $hashedPassword;
  518. }
  519. $this->syncUserToMasterDatabase($masterData, 'update', $oldEmail);
  520. }
  521. session()->flash('success', 'Dato aggiornato');
  522. $this->resetFields();
  523. $this->update = false;
  524. } catch (\Exception $ex) {
  525. $this->logCurrentDatabase('Error in update() method');
  526. Log::error('User update failed', [
  527. 'user_id' => $this->dataId,
  528. 'error' => $ex->getMessage(),
  529. 'database' => DB::connection()->getDatabaseName()
  530. ]);
  531. session()->flash('error', 'Errore (' . $ex->getMessage() . ')');
  532. }
  533. }
  534. public function cancel()
  535. {
  536. $this->logCurrentDatabase('In cancel() method');
  537. $this->resetFields();
  538. $this->add = false;
  539. $this->update = false;
  540. $this->userExists = false;
  541. $this->enabled = false;
  542. }
  543. public function delete($id)
  544. {
  545. Log::info('Delete method called', [
  546. 'user_id_to_delete' => $id,
  547. 'current_user_id' => Auth::id(),
  548. 'current_user_level' => Auth::user()->level
  549. ]);
  550. if (!$this->canDeleteUser($id)) {
  551. Log::warning('Delete permission denied', [
  552. 'user_id_to_delete' => $id,
  553. 'current_user_id' => Auth::id(),
  554. 'current_user_level' => Auth::user()->level
  555. ]);
  556. session()->flash('error', 'Non hai i permessi per eliminare questo utente.');
  557. return;
  558. }
  559. $this->logCurrentDatabase('Start of delete() method');
  560. try {
  561. $user = \App\Models\User::find($id);
  562. if (!$user) {
  563. Log::error('User not found for deletion', ['user_id' => $id]);
  564. session()->flash('error', 'Utente non trovato.');
  565. return;
  566. }
  567. $userEmail = $user->email;
  568. $userName = $user->name;
  569. $userCognome = $user->cognome;
  570. Log::info('Found user for deletion', [
  571. 'user_id' => $id,
  572. 'user_email' => $userEmail,
  573. 'user_name' => $userName . ' ' . $userCognome
  574. ]);
  575. $deleted = $user->delete();
  576. if (!$deleted) {
  577. throw new \Exception('Failed to delete user from tenant database');
  578. }
  579. $this->logCurrentDatabase('After deleting user from tenant');
  580. Log::info('User deleted successfully from tenant database', [
  581. 'user_id' => $id,
  582. 'user_email' => $userEmail,
  583. 'database' => DB::connection()->getDatabaseName()
  584. ]);
  585. $masterDeleted = $this->deleteUserFromMasterDatabase($userEmail);
  586. if ($masterDeleted) {
  587. Log::info('User deleted from both databases successfully', [
  588. 'user_id' => $id,
  589. 'user_email' => $userEmail
  590. ]);
  591. session()->flash('success', "Utente {$userName} {$userCognome} eliminato con successo");
  592. } else {
  593. Log::warning('User deleted from tenant but failed to delete from master', [
  594. 'user_id' => $id,
  595. 'user_email' => $userEmail
  596. ]);
  597. session()->flash('success', "Utente eliminato dal database tenant, ma errore nella sincronizzazione master");
  598. }
  599. $this->emit('userDeleted');
  600. $this->emit('load-data-table');
  601. } catch (\Exception $e) {
  602. $this->logCurrentDatabase('Error in delete() method');
  603. Log::error('User deletion failed', [
  604. 'user_id' => $id,
  605. 'error' => $e->getMessage(),
  606. 'trace' => $e->getTraceAsString(),
  607. 'database' => DB::connection()->getDatabaseName()
  608. ]);
  609. session()->flash('error', 'Errore durante l\'eliminazione: ' . $e->getMessage());
  610. }
  611. }
  612. private function canEditUser($userId)
  613. {
  614. $currentUser = Auth::user();
  615. if ($currentUser->level == 0) {
  616. $targetUser = \App\Models\User::find($userId);
  617. return $targetUser && $targetUser->email != 'admin@admin.com';
  618. }
  619. return $userId == $currentUser->id;
  620. }
  621. /**
  622. * Check if current user can edit email and password of a specific user
  623. */
  624. private function canEditEmailAndPassword($userId)
  625. {
  626. $currentUser = Auth::user();
  627. return $userId == $currentUser->id;
  628. }
  629. /**
  630. * Check if current user can delete a specific user
  631. */
  632. private function canDeleteUser($userId)
  633. {
  634. $currentUser = Auth::user();
  635. if ($currentUser->level != 0) {
  636. return false;
  637. }
  638. if ($userId == $currentUser->id) {
  639. return false;
  640. }
  641. $targetUser = \App\Models\User::find($userId);
  642. if ($targetUser && $targetUser->email == 'admin@admin.com') {
  643. return false;
  644. }
  645. return true;
  646. }
  647. /**
  648. * Check if current user can add users
  649. */
  650. private function canAddUser()
  651. {
  652. $currentUser = Auth::user();
  653. return $currentUser->level == 0;
  654. }
  655. }