diff --git a/app/Conductors/EventConductor.php b/app/Conductors/EventConductor.php index 4cc6982..d474ec5 100644 --- a/app/Conductors/EventConductor.php +++ b/app/Conductors/EventConductor.php @@ -4,6 +4,7 @@ namespace App\Conductors; use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\InvalidCastException; use Illuminate\Database\Eloquent\Model; class EventConductor extends Conductor @@ -89,4 +90,21 @@ class EventConductor extends Conductor $user = auth()->user(); return ($user !== null && $user->hasPermission('admin/events') === true); } + + /** + * Transform the model + * + * @param Model $model The model to transform. + * @return array The transformed model. + * @throws InvalidCastException Cannot cast item to model. + */ + public function transform(Model $model) + { + $result = $model->toArray(); + $result['attachments'] = $model->attachments()->get()->map(function ($attachment) { + return MediaConductor::model(request(), $attachment->media); + }); + + return $result; + } } diff --git a/app/Http/Controllers/Api/EventController.php b/app/Http/Controllers/Api/EventController.php index 402337d..686acdb 100644 --- a/app/Http/Controllers/Api/EventController.php +++ b/app/Http/Controllers/Api/EventController.php @@ -5,7 +5,9 @@ namespace App\Http\Controllers\Api; use App\Enum\HttpResponseCodes; use App\Models\Event; use App\Conductors\EventConductor; +use App\Conductors\MediaConductor; use App\Http\Requests\EventRequest; +use App\Models\Media; use Illuminate\Http\Request; class EventController extends ApiController @@ -32,7 +34,8 @@ class EventController extends ApiController return $this->respondAsResource( $collection, ['isCollection' => true, - 'appendData' => ['total' => $total]] + 'appendData' => ['total' => $total] + ] ); } @@ -103,4 +106,133 @@ class EventController extends ApiController return $this->respondForbidden(); } } + + /** + * Get a list of attachments related to this model. + * + * @param Request $request The user request. + * @param Post $post The post model. + * @return JsonResponse Returns the post attachments. + * @throws InvalidFormatException + * @throws BindingResolutionException + * @throws InvalidCastException + */ + public function getAttachments(Request $request, Event $event) + { + if (EventConductor::viewable($event) === true) { + $medium = $event->attachments->map(function ($attachment) { + return $attachment->media; + }); + + return $this->respondAsResource(MediaConductor::collection($request, $medium), ['isCollection' => true, 'resourceName' => 'attachment']); + } + + return $this->respondForbidden(); + } + + /** + * Store an attachment related to this model. + * + * @param Request $request The user request. + * @param Post $post The post model. + * @return JsonResponse The response. + * @throws BindingResolutionException + * @throws MassAssignmentException + */ + public function storeAttachment(Request $request, Event $event) + { + if (EventConductor::updatable($event) === true) { + if ($request->has("medium") && Media::find($request->medium)) { + $event->attachments()->create(['media_id' => $request->medium]); + return $this->respondCreated(); + } + + return $this->respondWithErrors(['media' => 'The media ID was not found']); + } + + return $this->respondForbidden(); + } + + /** + * Update/replace attachments related to this model. + * + * @param Request $request The user request. + * @param Post $post The related model. + * @return JsonResponse + * @throws BindingResolutionException + * @throws MassAssignmentException + */ + public function updateAttachments(Request $request, Event $event) + { + if (EventConductor::updatable($event) === true) { + $mediaIds = $request->attachments; + if (is_array($mediaIds) === false) { + $mediaIds = explode(',', $request->attachments); + } + + $mediaIds = array_map('trim', $mediaIds); // trim each media ID + $attachments = $event->attachments; + + // Delete attachments that are not in $mediaIds + foreach ($attachments as $attachment) { + if (!in_array($attachment->media_id, $mediaIds)) { + $attachment->delete(); + } + } + + // Create new attachments for media IDs that are not already in $post->attachments() + foreach ($mediaIds as $mediaId) { + $found = false; + + foreach ($attachments as $attachment) { + if ($attachment->media_id == $mediaId) { + $found = true; + break; + } + } + + if (!$found) { + $event->attachments()->create(['media_id' => $mediaId]); + } + } + + return $this->respondNoContent(); + }//end if + + return $this->respondForbidden(); + } + + /** + * Delete a specific related attachment. + * @param Request $request The user request. + * @param Post $post The model. + * @param Media $medium The attachment medium. + * @return JsonResponse + * @throws BindingResolutionException + */ + public function deleteAttachment(Request $request, Event $event, Media $medium) + { + if (EventConductor::updatable($event) === true) { + $attachments = $event->attachments; + $deleted = false; + + foreach ($attachments as $attachment) { + if ($attachment->media_id === $medium->id) { + $attachment->delete(); + $deleted = true; + break; + } + } + + if ($deleted) { + // Attachment was deleted successfully + return $this->respondNoContent(); + } else { + // Attachment with matching media ID was not found + return $this->respondNotFound(); + } + } + + return $this->respondForbidden(); + } } diff --git a/app/Models/Event.php b/app/Models/Event.php index 45952e6..21946da 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -32,11 +32,12 @@ class Event extends Model 'ages', ]; + /** * Get all of the post's attachments. */ public function attachments() { - return $this->morphMany('App\Attachment', 'attachable'); + return $this->morphMany('App\Models\Attachment', 'attachable'); } } diff --git a/resources/js/views/EventView.vue b/resources/js/views/EventView.vue index 4beec14..7cd95e8 100644 --- a/resources/js/views/EventView.vue +++ b/resources/js/views/EventView.vue @@ -18,6 +18,7 @@