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