|
19 | 19 | use App\Models\Builders\AlbumBuilder; |
20 | 20 | use App\Models\Builders\TagAlbumBuilder; |
21 | 21 | use App\Models\TagAlbum; |
| 22 | +use App\Models\User; |
22 | 23 | use Illuminate\Database\Eloquent\Builder; |
23 | 24 | use Illuminate\Database\Query\Builder as BaseBuilder; |
24 | 25 | use Illuminate\Support\Facades\Auth; |
@@ -517,26 +518,49 @@ private function getComputedAccessPermissionSubQuery(bool $full = false): BaseBu |
517 | 518 | $select[] = APC::GRANTS_UPLOAD; |
518 | 519 | $select[] = APC::USER_ID; |
519 | 520 | } |
520 | | - $user_id = Auth::id(); |
| 521 | + if (Auth::guest()) { |
| 522 | + return DB::table('access_permissions', APC::COMPUTED_ACCESS_PERMISSIONS)->select($select)->whereNull(APC::USER_ID)->whereNull(APC::USER_GROUP_ID); |
| 523 | + } |
521 | 524 |
|
522 | | - return DB::table('access_permissions', APC::COMPUTED_ACCESS_PERMISSIONS)->select($select) |
523 | | - ->when( |
524 | | - Auth::check(), |
525 | | - fn ($q1) => $q1 |
526 | | - ->where(APC::USER_ID, '=', $user_id) |
527 | | - ->orWhere( |
528 | | - fn ($q2) => $q2->whereNull(APC::USER_ID) |
529 | | - ->whereNotIn( |
530 | | - APC::COMPUTED_ACCESS_PERMISSIONS . '.' . APC::BASE_ALBUM_ID, |
531 | | - fn ($q3) => $q3->select('acc_per.' . APC::BASE_ALBUM_ID) |
532 | | - ->from('access_permissions', 'acc_per') |
533 | | - ->where(APC::USER_ID, '=', $user_id) |
534 | | - ) |
| 525 | + /** @var User $user */ |
| 526 | + $user = Auth::user(); |
| 527 | + // Collect the user groups of the current user. |
| 528 | + /** @var int[] $user_groups */ |
| 529 | + $user_groups = $user->user_groups->map(fn ($g) => $g->id)->all(); |
| 530 | + |
| 531 | + return DB::table('access_permissions', APC::COMPUTED_ACCESS_PERMISSIONS) |
| 532 | + ->select($select) |
| 533 | + // First select the permissions based on the user. |
| 534 | + ->where(APC::USER_ID, '=', $user->id) |
| 535 | + // Then select the permissions based on the user groups. |
| 536 | + ->orWhere( |
| 537 | + fn ($q2) => $q2->whereIn( |
| 538 | + APC::COMPUTED_ACCESS_PERMISSIONS . '.' . APC::USER_GROUP_ID, |
| 539 | + $user_groups |
| 540 | + ) |
| 541 | + // and ensure that we already have not selected the user permissions. |
| 542 | + // This is important to avoid selecting the user permissions twice. |
| 543 | + ->whereNotIn( |
| 544 | + APC::COMPUTED_ACCESS_PERMISSIONS . '.' . APC::BASE_ALBUM_ID, |
| 545 | + fn ($q3) => $q3->select('acc_per.' . APC::BASE_ALBUM_ID) |
| 546 | + ->from('access_permissions', 'acc_per') |
| 547 | + ->where(APC::USER_ID, '=', $user->id) |
535 | 548 | ) |
536 | 549 | ) |
537 | | - ->when( |
538 | | - !Auth::check(), |
539 | | - fn ($q1) => $q1->whereNull(APC::USER_ID) |
| 550 | + // Then select the public permissions. |
| 551 | + ->orWhere( |
| 552 | + fn ($q2) => $q2->whereNull(APC::USER_ID)->whereNull(APC::USER_GROUP_ID) |
| 553 | + ->whereNotIn( |
| 554 | + APC::COMPUTED_ACCESS_PERMISSIONS . '.' . APC::BASE_ALBUM_ID, |
| 555 | + // Ensure that we already have not selected the user or group permissions. |
| 556 | + fn ($q3) => $q3->select('acc_per.' . APC::BASE_ALBUM_ID) |
| 557 | + ->from('access_permissions', 'acc_per') |
| 558 | + ->where(APC::USER_ID, '=', $user->id) |
| 559 | + ->orWhereIn( |
| 560 | + APC::COMPUTED_ACCESS_PERMISSIONS . '.' . APC::USER_GROUP_ID, |
| 561 | + $user_groups |
| 562 | + ) |
| 563 | + ) |
540 | 564 | ); |
541 | 565 | } |
542 | 566 |
|
|
0 commit comments