TenantUserMasterSyncService.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace App\Services;
  3. use App\Models\User;
  4. use Illuminate\Support\Facades\Auth;
  5. use Illuminate\Support\Facades\DB;
  6. use Illuminate\Support\Facades\Log;
  7. class TenantUserMasterSyncService
  8. {
  9. public function sync(User $tenantUser): ?int
  10. {
  11. $masterConfig = [
  12. 'driver' => 'mysql',
  13. 'host' => env('DB_HOST', '127.0.0.1'),
  14. 'port' => env('DB_PORT', '3306'),
  15. 'database' => env('DB_DATABASE'),
  16. 'username' => env('DB_USERNAME'),
  17. 'password' => env('DB_PASSWORD'),
  18. 'charset' => 'utf8mb4',
  19. 'collation' => 'utf8mb4_unicode_ci',
  20. 'prefix' => '',
  21. 'strict' => true,
  22. 'engine' => null,
  23. ];
  24. config(['database.connections.master_sync' => $masterConfig]);
  25. $authUser = Auth::user();
  26. $masterData = [
  27. 'name' => $tenantUser->name,
  28. 'email' => $tenantUser->email,
  29. 'password' => $tenantUser->password,
  30. 'tenant_database' => $authUser?->tenant_database,
  31. 'tenant_username' => $authUser?->tenant_username,
  32. 'tenant_password' => $authUser?->tenant_password,
  33. 'tenant_host' => '127.0.0.1',
  34. 'updated_at' => now(),
  35. ];
  36. $masterQuery = DB::connection('master_sync')->table('users');
  37. $masterUser = null;
  38. if (!empty($tenantUser->master_user_id)) {
  39. $masterUser = (clone $masterQuery)->where('id', $tenantUser->master_user_id)->first();
  40. }
  41. if (!$masterUser && !empty($tenantUser->email)) {
  42. $masterUser = (clone $masterQuery)->where('email', $tenantUser->email)->first();
  43. }
  44. if ($masterUser) {
  45. if (!empty($tenantUser->password)) {
  46. $masterData['password'] = $tenantUser->password;
  47. }
  48. (clone $masterQuery)->where('id', $masterUser->id)->update($masterData);
  49. if ((int) $tenantUser->master_user_id !== (int) $masterUser->id) {
  50. $tenantUser->forceFill([
  51. 'master_user_id' => $masterUser->id,
  52. ])->saveQuietly();
  53. }
  54. return (int) $masterUser->id;
  55. }
  56. $masterData['password'] = $tenantUser->password;
  57. $masterData['created_at'] = now();
  58. $masterId = (clone $masterQuery)->insertGetId($masterData);
  59. $tenantUser->forceFill([
  60. 'master_user_id' => $masterId,
  61. ])->saveQuietly();
  62. return (int) $masterId;
  63. }
  64. public function delete(User $tenantUser): bool
  65. {
  66. $masterConfig = [
  67. 'driver' => 'mysql',
  68. 'host' => env('DB_HOST', '127.0.0.1'),
  69. 'port' => env('DB_PORT', '3306'),
  70. 'database' => env('DB_DATABASE'),
  71. 'username' => env('DB_USERNAME'),
  72. 'password' => env('DB_PASSWORD'),
  73. 'charset' => 'utf8mb4',
  74. 'collation' => 'utf8mb4_unicode_ci',
  75. 'prefix' => '',
  76. 'strict' => true,
  77. 'engine' => null,
  78. ];
  79. config(['database.connections.master_sync' => $masterConfig]);
  80. $query = DB::connection('master_sync')->table('users');
  81. if (!empty($tenantUser->master_user_id)) {
  82. return $query->where('id', $tenantUser->master_user_id)->delete() > 0;
  83. }
  84. if (!empty($tenantUser->email)) {
  85. return $query->where('email', $tenantUser->email)->delete() > 0;
  86. }
  87. return false;
  88. }
  89. }