99namespace App \Http \Requests \Photo ;
1010
1111use App \Contracts \Http \Requests \HasAlbum ;
12+ use App \Contracts \Http \Requests \HasFromAlbum ;
1213use App \Contracts \Http \Requests \HasPhotos ;
1314use App \Contracts \Http \Requests \RequestAttribute ;
15+ use App \Contracts \Models \AbstractAlbum ;
1416use App \Http \Requests \BaseApiRequest ;
1517use App \Http \Requests \Traits \Authorize \AuthorizeCanEditPhotosAlbumTrait ;
1618use App \Http \Requests \Traits \HasAlbumTrait ;
19+ use App \Http \Requests \Traits \HasFromAlbumTrait ;
1720use App \Http \Requests \Traits \HasPhotosTrait ;
1821use App \Models \Album ;
1922use App \Models \Photo ;
23+ use App \Policies \AlbumPolicy ;
24+ use App \Policies \PhotoPolicy ;
2025use App \Rules \RandomIDRule ;
26+ use Illuminate \Support \Facades \Gate ;
2127
22- class MovePhotosRequest extends BaseApiRequest implements HasPhotos, HasAlbum
28+ class MovePhotosRequest extends BaseApiRequest implements HasPhotos, HasAlbum, HasFromAlbum
2329{
2430 use HasPhotosTrait;
2531 use HasAlbumTrait;
32+ use HasFromAlbumTrait;
2633 use AuthorizeCanEditPhotosAlbumTrait;
2734
35+ /**
36+ * {@inheritDoc}
37+ */
38+ public function authorize (): bool
39+ {
40+ if (!Gate::check (AlbumPolicy::CAN_EDIT , [AbstractAlbum::class, $ this ->album ])) {
41+ return false ;
42+ }
43+
44+ if (!Gate::check (AlbumPolicy::CAN_EDIT , [AbstractAlbum::class, $ this ->from_album ])) {
45+ return false ;
46+ }
47+
48+ // TODO: refactor this check so it does not explode.
49+ /** @var Photo $photo */
50+ foreach ($ this ->photos as $ photo ) {
51+ if (!Gate::check (PhotoPolicy::CAN_EDIT , $ photo )) {
52+ return false ;
53+ }
54+ }
55+
56+ return true ;
57+ }
58+
2859 /**
2960 * {@inheritDoc}
3061 */
@@ -34,6 +65,7 @@ public function rules(): array
3465 RequestAttribute::PHOTO_IDS_ATTRIBUTE => 'required|array|min:1 ' ,
3566 RequestAttribute::PHOTO_IDS_ATTRIBUTE . '.* ' => ['required ' , new RandomIDRule (false )],
3667 RequestAttribute::ALBUM_ID_ATTRIBUTE => ['present ' , new RandomIDRule (true )],
68+ RequestAttribute::FROM_ID_ATTRIBUTE => ['present ' , new RandomIDRule (true )],
3769 ];
3870 }
3971
@@ -46,8 +78,13 @@ protected function processValidatedValues(array $values, array $files): void
4678 $ photos_ids = $ values [RequestAttribute::PHOTO_IDS_ATTRIBUTE ];
4779 $ this ->photos = Photo::query ()
4880 ->findOrFail ($ photos_ids );
81+
4982 /** @var string|null */
5083 $ target_album_id = $ values [RequestAttribute::ALBUM_ID_ATTRIBUTE ];
5184 $ this ->album = $ target_album_id === null ? null : Album::query ()->findOrFail ($ target_album_id );
85+
86+ /** @var string|null */
87+ $ from_album_id = $ values [RequestAttribute::ALBUM_ID_ATTRIBUTE ];
88+ $ this ->from_album = $ from_album_id === null ? null : Album::query ()->findOrFail ($ from_album_id );
5289 }
5390}
0 commit comments