|
|
@@ -20,6 +20,7 @@ class User extends Component
|
|
|
public $records, $name, $cognome, $email, $password, $oldPassword, $level, $enabled, $dataId, $update = false, $add = false, $oldEmail = null;
|
|
|
public $userExists = false;
|
|
|
public $password_confirmation;
|
|
|
+ public $master_user_id = null;
|
|
|
|
|
|
protected $rules = [
|
|
|
'name' => 'required',
|
|
|
@@ -64,164 +65,6 @@ class User extends Component
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Create or update user in master database
|
|
|
- */
|
|
|
- private function syncUserToMasterDatabase($userData, $action = 'create', $oldEmail = null)
|
|
|
- {
|
|
|
- try {
|
|
|
- Log::info('Syncing user to master database', [
|
|
|
- 'action' => $action,
|
|
|
- 'email' => $userData['email'],
|
|
|
- 'old_email' => $oldEmail
|
|
|
- ]);
|
|
|
-
|
|
|
- $masterConfig = [
|
|
|
- 'driver' => 'mysql',
|
|
|
- 'host' => env('DB_HOST', '127.0.0.1'),
|
|
|
- 'port' => env('DB_PORT', '3306'),
|
|
|
- 'database' => env('DB_DATABASE'),
|
|
|
- 'username' => env('DB_USERNAME'),
|
|
|
- 'password' => env('DB_PASSWORD'),
|
|
|
- 'charset' => 'utf8mb4',
|
|
|
- 'collation' => 'utf8mb4_unicode_ci',
|
|
|
- 'prefix' => '',
|
|
|
- 'strict' => true,
|
|
|
- 'engine' => null,
|
|
|
- ];
|
|
|
-
|
|
|
- config(['database.connections.master_sync' => $masterConfig]);
|
|
|
-
|
|
|
- $currentUser = Auth::user();
|
|
|
-
|
|
|
- $masterData = [
|
|
|
- 'name' => $userData['name'],
|
|
|
- 'email' => $userData['email'],
|
|
|
- 'password' => $userData['password'],
|
|
|
- 'tenant_database' => $currentUser->tenant_database,
|
|
|
- 'tenant_username' => $currentUser->tenant_username,
|
|
|
- 'tenant_password' => $currentUser->tenant_password,
|
|
|
- 'tenant_host' => '127.0.0.1',
|
|
|
- 'created_at' => now(),
|
|
|
- 'updated_at' => now()
|
|
|
- ];
|
|
|
-
|
|
|
- if ($action === 'create') {
|
|
|
- $inserted = DB::connection('master_sync')
|
|
|
- ->table('users')
|
|
|
- ->insert($masterData);
|
|
|
-
|
|
|
- if ($inserted) {
|
|
|
- Log::info('Successfully created user in master database', [
|
|
|
- 'email' => $userData['email'],
|
|
|
- 'tenant_database' => $currentUser->tenant_database
|
|
|
- ]);
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- Log::warning('Failed to create user in master database', [
|
|
|
- 'email' => $userData['email']
|
|
|
- ]);
|
|
|
- return false;
|
|
|
- }
|
|
|
- } elseif ($action === 'update') {
|
|
|
- $searchEmail = $oldEmail ?: $userData['email'];
|
|
|
-
|
|
|
- unset($masterData['created_at']);
|
|
|
-
|
|
|
- $updated = DB::connection('master_sync')
|
|
|
- ->table('users')
|
|
|
- ->where('email', $searchEmail)
|
|
|
- ->update($masterData);
|
|
|
-
|
|
|
- if ($updated) {
|
|
|
- Log::info('Successfully updated user in master database', [
|
|
|
- 'old_email' => $searchEmail,
|
|
|
- 'new_email' => $userData['email']
|
|
|
- ]);
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- Log::warning('No user found in master database to update', [
|
|
|
- 'search_email' => $searchEmail
|
|
|
- ]);
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (\Exception $e) {
|
|
|
- Log::error('Failed to sync user to master database', [
|
|
|
- 'action' => $action,
|
|
|
- 'email' => $userData['email'],
|
|
|
- 'error' => $e->getMessage(),
|
|
|
- 'trace' => $e->getTraceAsString()
|
|
|
- ]);
|
|
|
- return false;
|
|
|
- } finally {
|
|
|
- // Clean up the temporary connection
|
|
|
- try {
|
|
|
- DB::purge('master_sync');
|
|
|
- } catch (\Exception $e) {
|
|
|
- // Ignore cleanup errors
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Delete user from master database
|
|
|
- */
|
|
|
- private function deleteUserFromMasterDatabase($email)
|
|
|
- {
|
|
|
- try {
|
|
|
- Log::info('Deleting user from master database', [
|
|
|
- 'email' => $email
|
|
|
- ]);
|
|
|
-
|
|
|
- $masterConfig = [
|
|
|
- 'driver' => 'mysql',
|
|
|
- 'host' => env('DB_HOST', '127.0.0.1'),
|
|
|
- 'port' => env('DB_PORT', '3306'),
|
|
|
- 'database' => env('DB_DATABASE'),
|
|
|
- 'username' => env('DB_USERNAME'),
|
|
|
- 'password' => env('DB_PASSWORD'),
|
|
|
- 'charset' => 'utf8mb4',
|
|
|
- 'collation' => 'utf8mb4_unicode_ci',
|
|
|
- 'prefix' => '',
|
|
|
- 'strict' => true,
|
|
|
- 'engine' => null,
|
|
|
- ];
|
|
|
-
|
|
|
- config(['database.connections.master_delete' => $masterConfig]);
|
|
|
-
|
|
|
- $deleted = DB::connection('master_delete')
|
|
|
- ->table('users')
|
|
|
- ->where('email', $email)
|
|
|
- ->delete();
|
|
|
-
|
|
|
- if ($deleted) {
|
|
|
- Log::info('Successfully deleted user from master database', [
|
|
|
- 'email' => $email,
|
|
|
- 'rows_affected' => $deleted
|
|
|
- ]);
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- Log::warning('No user found in master database to delete', [
|
|
|
- 'email' => $email
|
|
|
- ]);
|
|
|
- return false;
|
|
|
- }
|
|
|
- } catch (\Exception $e) {
|
|
|
- Log::error('Failed to delete user from master database', [
|
|
|
- 'email' => $email,
|
|
|
- 'error' => $e->getMessage(),
|
|
|
- 'trace' => $e->getTraceAsString()
|
|
|
- ]);
|
|
|
- return false;
|
|
|
- } finally {
|
|
|
- try {
|
|
|
- DB::purge('master_delete');
|
|
|
- } catch (\Exception $e) {
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* Send welcome email to new user
|
|
|
*/
|
|
|
@@ -296,6 +139,7 @@ class User extends Component
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
public function sendSimpleWelcomeEmail($email, $userData)
|
|
|
{
|
|
|
try {
|
|
|
@@ -311,7 +155,6 @@ class User extends Component
|
|
|
$message .= "Grazie e benvenuto!\n";
|
|
|
$message .= "Il team di " . $userData['company'];
|
|
|
|
|
|
- // Send simple text email
|
|
|
mail($email, $subject, $message, [
|
|
|
'From' => config('mail.from.address'),
|
|
|
'Reply-To' => config('mail.from.address'),
|
|
|
@@ -327,6 +170,7 @@ class User extends Component
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
public function resetFields()
|
|
|
{
|
|
|
$this->name = '';
|
|
|
@@ -337,6 +181,7 @@ class User extends Component
|
|
|
$this->oldPassword = '';
|
|
|
$this->level = 0;
|
|
|
$this->enabled = true;
|
|
|
+ $this->master_user_id = null;
|
|
|
$this->emit('load-data-table');
|
|
|
}
|
|
|
|
|
|
@@ -344,7 +189,7 @@ class User extends Component
|
|
|
{
|
|
|
$this->logCurrentDatabase('Before fetching users in render()');
|
|
|
|
|
|
- $this->records = \App\Models\User::select('id', 'name', 'cognome', 'email', 'password', 'level', 'enabled')->get();
|
|
|
+ $this->records = \App\Models\User::select('id', 'name', 'cognome', 'email', 'password', 'level', 'enabled', 'master_user_id')->get();
|
|
|
|
|
|
$this->logCurrentDatabase('After fetching users in render()');
|
|
|
|
|
|
@@ -410,7 +255,6 @@ class User extends Component
|
|
|
|
|
|
try {
|
|
|
$plainPassword = $this->password;
|
|
|
-
|
|
|
$hashedPassword = bcrypt($this->password);
|
|
|
|
|
|
$user = \App\Models\User::create([
|
|
|
@@ -419,13 +263,17 @@ class User extends Component
|
|
|
'email' => $this->email,
|
|
|
'password' => $hashedPassword,
|
|
|
'level' => $this->level,
|
|
|
- 'enabled' => $this->enabled
|
|
|
+ 'enabled' => $this->enabled,
|
|
|
+ 'master_user_id' => null,
|
|
|
]);
|
|
|
|
|
|
$this->logCurrentDatabase('After creating user in tenant database');
|
|
|
|
|
|
+ $this->master_user_id = $user->fresh()->master_user_id;
|
|
|
+
|
|
|
Log::info('User created successfully in tenant database', [
|
|
|
'user_id' => $user->id,
|
|
|
+ 'master_user_id' => $this->master_user_id,
|
|
|
'name' => $this->name,
|
|
|
'cognome' => $this->cognome,
|
|
|
'email' => $this->email,
|
|
|
@@ -434,43 +282,30 @@ class User extends Component
|
|
|
'database' => DB::connection()->getDatabaseName()
|
|
|
]);
|
|
|
|
|
|
- $masterSyncSuccess = $this->syncUserToMasterDatabase([
|
|
|
+ $emailSent = $this->sendWelcomeEmail([
|
|
|
'name' => $this->name,
|
|
|
'cognome' => $this->cognome,
|
|
|
'email' => $this->email,
|
|
|
- 'password' => $hashedPassword,
|
|
|
- 'level' => $this->level,
|
|
|
- 'enabled' => $this->enabled
|
|
|
- ], 'create');
|
|
|
+ 'level' => $this->level
|
|
|
+ ], $plainPassword);
|
|
|
|
|
|
- if ($masterSyncSuccess) {
|
|
|
- $emailSent = $this->sendWelcomeEmail([
|
|
|
+ if (!$emailSent) {
|
|
|
+ Log::info('HTML email failed, trying simple email', ['email' => $this->email]);
|
|
|
+ $emailSent = $this->sendSimpleWelcomeEmail($this->email, [
|
|
|
'name' => $this->name,
|
|
|
'cognome' => $this->cognome,
|
|
|
'email' => $this->email,
|
|
|
- 'level' => $this->level
|
|
|
- ], $plainPassword);
|
|
|
-
|
|
|
- if (!$emailSent) {
|
|
|
- Log::info('HTML email failed, trying simple email', ['email' => $this->email]);
|
|
|
- $emailSent = $this->sendSimpleWelcomeEmail($this->email, [
|
|
|
- 'name' => $this->name,
|
|
|
- 'cognome' => $this->cognome,
|
|
|
- 'email' => $this->email,
|
|
|
- 'password' => $plainPassword,
|
|
|
- 'level' => $this->level,
|
|
|
- 'company' => 'Leezard',
|
|
|
- 'login_url' => url('/')
|
|
|
- ]);
|
|
|
- }
|
|
|
+ 'password' => $plainPassword,
|
|
|
+ 'level' => $this->level,
|
|
|
+ 'company' => 'Leezard',
|
|
|
+ 'login_url' => url('/'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
|
|
|
- if ($emailSent) {
|
|
|
- session()->flash('success', 'Utente creato e email di benvenuto inviata con successo');
|
|
|
- } else {
|
|
|
- session()->flash('success', 'Utente creato ma errore nell\'invio dell\'email. Controlla i log per dettagli.');
|
|
|
- }
|
|
|
+ if ($emailSent) {
|
|
|
+ session()->flash('success', 'Utente creato e email di benvenuto inviata con successo');
|
|
|
} else {
|
|
|
- session()->flash('success', 'Utente creato nel database tenant ma errore nella sincronizzazione master');
|
|
|
+ session()->flash('success', 'Utente creato ma errore nell\'invio dell\'email. Controlla i log per dettagli.');
|
|
|
}
|
|
|
|
|
|
$this->resetFields();
|
|
|
@@ -520,12 +355,13 @@ class User extends Component
|
|
|
$this->add = false;
|
|
|
$this->enabled = $user->enabled;
|
|
|
$this->userExists = true;
|
|
|
- // Store old email for master database update
|
|
|
$this->oldEmail = $user->email;
|
|
|
+ $this->master_user_id = $user->master_user_id;
|
|
|
}
|
|
|
|
|
|
Log::info('User edit loaded', [
|
|
|
'user_id' => $id,
|
|
|
+ 'master_user_id' => $this->master_user_id,
|
|
|
'name' => $this->name,
|
|
|
'cognome' => $this->cognome,
|
|
|
'email' => $this->email,
|
|
|
@@ -545,7 +381,6 @@ class User extends Component
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
public function update()
|
|
|
{
|
|
|
$this->logCurrentDatabase('Start of update() method');
|
|
|
@@ -555,36 +390,39 @@ class User extends Component
|
|
|
'cognome' => 'required',
|
|
|
'email' => 'required|email',
|
|
|
'password' => 'nullable|min:6',
|
|
|
- 'password_confirmation' => 'required|same:password'
|
|
|
];
|
|
|
|
|
|
+ if ($this->master_user_id == Auth::user()->id) {
|
|
|
+ $rules['password_confirmation'] = 'required_with:password|same:password';
|
|
|
+ }
|
|
|
+
|
|
|
$this->validate($rules, $this->messages);
|
|
|
|
|
|
try {
|
|
|
$currentUser = \App\Models\User::findOrFail($this->dataId);
|
|
|
- $oldEmail = $currentUser->email;
|
|
|
- $oldName = $currentUser->name;
|
|
|
-
|
|
|
- $updateData = [
|
|
|
- 'name' => $this->name,
|
|
|
- 'cognome' => $this->cognome,
|
|
|
- 'email' => $this->email,
|
|
|
- 'level' => $this->level,
|
|
|
- 'enabled' => $this->enabled
|
|
|
- ];
|
|
|
|
|
|
$passwordChanged = !empty($this->password);
|
|
|
+
|
|
|
+ $currentUser->name = $this->name;
|
|
|
+ $currentUser->cognome = $this->cognome;
|
|
|
+ $currentUser->email = $this->email;
|
|
|
+ $currentUser->level = $this->level;
|
|
|
+ $currentUser->enabled = $this->enabled;
|
|
|
+
|
|
|
if ($passwordChanged) {
|
|
|
- $hashedPassword = bcrypt($this->password);
|
|
|
- $updateData['password'] = $hashedPassword;
|
|
|
+ $currentUser->password = bcrypt($this->password);
|
|
|
}
|
|
|
|
|
|
- \App\Models\User::whereId($this->dataId)->update($updateData);
|
|
|
+ $currentUser->save();
|
|
|
+
|
|
|
+ $currentUser = $currentUser->fresh();
|
|
|
+ $this->master_user_id = $currentUser->master_user_id;
|
|
|
|
|
|
$this->logCurrentDatabase('After updating user');
|
|
|
|
|
|
Log::info('User updated successfully in tenant database', [
|
|
|
'user_id' => $this->dataId,
|
|
|
+ 'master_user_id' => $this->master_user_id,
|
|
|
'name' => $this->name,
|
|
|
'cognome' => $this->cognome,
|
|
|
'email' => $this->email,
|
|
|
@@ -594,22 +432,6 @@ class User extends Component
|
|
|
'database' => DB::connection()->getDatabaseName()
|
|
|
]);
|
|
|
|
|
|
- $emailChanged = $oldEmail !== $this->email;
|
|
|
- $nameChanged = $oldName !== $this->name;
|
|
|
-
|
|
|
- if ($emailChanged || $nameChanged || $passwordChanged) {
|
|
|
- $masterData = [
|
|
|
- 'name' => $this->name,
|
|
|
- 'email' => $this->email
|
|
|
- ];
|
|
|
-
|
|
|
- if ($passwordChanged) {
|
|
|
- $masterData['password'] = $hashedPassword;
|
|
|
- }
|
|
|
-
|
|
|
- $this->syncUserToMasterDatabase($masterData, 'update', $oldEmail);
|
|
|
- }
|
|
|
-
|
|
|
session()->flash('success', 'Dato aggiornato');
|
|
|
$this->resetFields();
|
|
|
$this->update = false;
|
|
|
@@ -669,9 +491,11 @@ class User extends Component
|
|
|
$userEmail = $user->email;
|
|
|
$userName = $user->name;
|
|
|
$userCognome = $user->cognome;
|
|
|
+ $masterUserId = $user->master_user_id;
|
|
|
|
|
|
Log::info('Found user for deletion', [
|
|
|
'user_id' => $id,
|
|
|
+ 'master_user_id' => $masterUserId,
|
|
|
'user_email' => $userEmail,
|
|
|
'user_name' => $userName . ' ' . $userCognome
|
|
|
]);
|
|
|
@@ -684,27 +508,14 @@ class User extends Component
|
|
|
|
|
|
$this->logCurrentDatabase('After deleting user from tenant');
|
|
|
|
|
|
- Log::info('User deleted successfully from tenant database', [
|
|
|
+ Log::info('User deleted successfully from tenant database; master sync delegated to observer', [
|
|
|
'user_id' => $id,
|
|
|
+ 'master_user_id' => $masterUserId,
|
|
|
'user_email' => $userEmail,
|
|
|
'database' => DB::connection()->getDatabaseName()
|
|
|
]);
|
|
|
|
|
|
- $masterDeleted = $this->deleteUserFromMasterDatabase($userEmail);
|
|
|
-
|
|
|
- if ($masterDeleted) {
|
|
|
- Log::info('User deleted from both databases successfully', [
|
|
|
- 'user_id' => $id,
|
|
|
- 'user_email' => $userEmail
|
|
|
- ]);
|
|
|
- session()->flash('success', "Utente {$userName} {$userCognome} eliminato con successo");
|
|
|
- } else {
|
|
|
- Log::warning('User deleted from tenant but failed to delete from master', [
|
|
|
- 'user_id' => $id,
|
|
|
- 'user_email' => $userEmail
|
|
|
- ]);
|
|
|
- session()->flash('success', "Utente eliminato dal database tenant, ma errore nella sincronizzazione master");
|
|
|
- }
|
|
|
+ session()->flash('success', "Utente {$userName} {$userCognome} eliminato con successo");
|
|
|
|
|
|
$this->emit('userDeleted');
|
|
|
$this->emit('load-data-table');
|
|
|
@@ -722,14 +533,14 @@ class User extends Component
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
private function canEditUser($userId)
|
|
|
{
|
|
|
$currentUser = Auth::user();
|
|
|
|
|
|
if ($currentUser->level == 0) {
|
|
|
$targetUser = \App\Models\User::find($userId);
|
|
|
- return $targetUser && $targetUser->email != 'admin@admin.com';
|
|
|
+ // return $targetUser && $targetUser->email != 'admin@admin.com';
|
|
|
+ return $targetUser;
|
|
|
}
|
|
|
|
|
|
return $userId == $currentUser->id;
|