diff --git a/app/Helpers/PermissionsHelper.php b/app/Helpers/PermissionsHelper.php new file mode 100644 index 0000000..8409cd0 --- /dev/null +++ b/app/Helpers/PermissionsHelper.php @@ -0,0 +1,102 @@ +get(); + $albumGroupPermissions = DB::table('album_group_permissions')->get(); + $albumAnonPermissions = DB::table('album_anonymous_permissions')->get(); + + // Get a list of all user->group memberships + $userGroups = DB::table('user_groups')->get(); + + // Build a matrix of new permissions + $permissionsCache = []; + + /** @var Album $album */ + foreach ($albums as $album) + { + $anonymousPermissions = array_filter($albumAnonPermissions->toArray(), function($item) use ($album) + { + return ($item->album_id == $album->id); + }); + + foreach ($anonymousPermissions as $anonymousPermission) + { + $permissionsCache[] = [ + 'album_id' => $album->id, + 'permission_id' => $anonymousPermission->permission_id, + 'created_at' => new \DateTime(), + 'updated_at' => new \DateTime() + ]; + } + + $userPermissions = array_filter($albumUserPermissions->toArray(), function($item) use ($album) + { + return ($item->album_id == $album->id); + }); + + foreach ($userPermissions as $userPermission) + { + $permissionsCache[] = [ + 'user_id' => $userPermission->user_id, + 'album_id' => $album->id, + 'permission_id' => $userPermission->permission_id, + 'created_at' => new \DateTime(), + 'updated_at' => new \DateTime() + ]; + } + + $groupPermissions = array_filter($albumGroupPermissions->toArray(), function($item) use ($album) + { + return ($item->album_id == $album->id); + }); + + foreach ($groupPermissions as $groupPermission) + { + // Get a list of users in this group, and add one per user + $usersInGroup = array_filter($userGroups->toArray(), function($item) use ($groupPermission) + { + return $item->group_id = $groupPermission->group_id; + }); + + foreach ($usersInGroup as $userGroup) + { + $permissionsCache[] = [ + 'user_id' => $userGroup->user_id, + 'album_id' => $album->id, + 'permission_id' => $groupPermission->permission_id, + 'created_at' => new \DateTime(), + 'updated_at' => new \DateTime() + ]; + } + } + } + + $this->savePermissionsCache($permissionsCache); + } + + private function savePermissionsCache(array $cacheToSave) + { + DB::transaction(function() use ($cacheToSave) + { + DB::table('album_permissions_cache')->truncate(); + + foreach ($cacheToSave as $cacheItem) + { + DB::table('album_permissions_cache')->insert($cacheItem); + } + }); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/DefaultController.php b/app/Http/Controllers/Admin/DefaultController.php index a797918..8be8d16 100644 --- a/app/Http/Controllers/Admin/DefaultController.php +++ b/app/Http/Controllers/Admin/DefaultController.php @@ -10,6 +10,7 @@ use App\Group; use App\Helpers\ConfigHelper; use App\Helpers\DbHelper; use App\Helpers\MiscHelper; +use App\Helpers\PermissionsHelper; use App\Http\Controllers\Controller; use App\Http\Requests\SaveSettingsRequest; use App\Label; @@ -218,6 +219,9 @@ class DefaultController extends Controller public function rebuildPermissionsCache() { + $helper = new PermissionsHelper(); + $helper->rebuildCache(); + return response()->json(true); } diff --git a/database/migrations/2018_09_14_091046_create_album_permissions_cache_table.php b/database/migrations/2018_09_14_091046_create_album_permissions_cache_table.php index ab1c524..91b7ca5 100644 --- a/database/migrations/2018_09_14_091046_create_album_permissions_cache_table.php +++ b/database/migrations/2018_09_14_091046_create_album_permissions_cache_table.php @@ -14,9 +14,10 @@ class CreateAlbumPermissionsCacheTable extends Migration public function up() { Schema::create('album_permissions_cache', function (Blueprint $table) { - $table->unsignedInteger('user_id'); + $table->unsignedInteger('user_id')->nullable(true); $table->unsignedInteger('album_id'); $table->unsignedInteger('permission_id'); + $table->timestamps(); $table->foreign('user_id') ->references('id')->on('users')