From 8eb9e5f19b74c575c74414e30f0017fac373c7a6 Mon Sep 17 00:00:00 2001 From: lukinovec Date: Wed, 24 May 2023 12:02:46 +0200 Subject: [PATCH] Put DB operations inside transactions --- src/Jobs/CreatePostgresUserForTenant.php | 10 +++++++--- src/Jobs/DeleteTenantsPostgresUser.php | 6 ++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Jobs/CreatePostgresUserForTenant.php b/src/Jobs/CreatePostgresUserForTenant.php index b81c64a8..371a9053 100644 --- a/src/Jobs/CreatePostgresUserForTenant.php +++ b/src/Jobs/CreatePostgresUserForTenant.php @@ -39,7 +39,9 @@ class CreatePostgresUserForTenant implements ShouldQueue // Create the user only if it doesn't already exist if (! count(DB::select("SELECT usename FROM pg_user WHERE usename = '$name';")) > 0) { - DB::statement("CREATE USER \"$name\" LOGIN PASSWORD '$password';"); + DB::transaction(function () use ($name, $password) { + DB::statement("CREATE USER \"$name\" LOGIN PASSWORD '$password';"); + }); } $this->grantPermissions((string) $name); @@ -60,8 +62,10 @@ class CreatePostgresUserForTenant implements ShouldQueue foreach ($rlsModels as $model) { $table = $model->getTable(); - $databaseManager->database()->statement("GRANT ALL ON {$table} TO \"{$userName}\""); - $databaseManager->database()->statement("GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO \"{$userName}\""); + $databaseManager->database()->transaction(function () use ($databaseManager, $table, $userName) { + $databaseManager->database()->statement("GRANT ALL ON {$table} TO \"{$userName}\""); + $databaseManager->database()->statement("GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO \"{$userName}\""); + }); } } } diff --git a/src/Jobs/DeleteTenantsPostgresUser.php b/src/Jobs/DeleteTenantsPostgresUser.php index 6c5e9689..7f4cf8eb 100644 --- a/src/Jobs/DeleteTenantsPostgresUser.php +++ b/src/Jobs/DeleteTenantsPostgresUser.php @@ -39,8 +39,10 @@ class DeleteTenantsPostgresUser implements ShouldQueue // Revoke all permissions of a Postgres user before dropping it // Skip dropping permissions if the user doesn't exist if (count(DB::select("SELECT usename FROM pg_user WHERE usename = '$name';")) > 0) { - DB::statement("DROP OWNED BY \"{$name}\";"); - DB::statement("DROP USER \"{$name}\";"); + DB::transaction(function () use ($name) { + DB::statement("DROP OWNED BY \"{$name}\";"); + DB::statement("DROP USER \"{$name}\";"); + }); } } }