Files
portal/app/Http/Controllers/EventController.php
2021-10-01 22:22:43 +02:00

177 lines
4.4 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\EventRequest;
use App\Models\Event;
use App\Http\Resources\Event as EventResource;
use App\Models\EventGuestsNonUsers;
use App\Models\User;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class EventController extends Controller
{
/**
* Display a listing of the resource.
*
* @return JsonResponse
*/
public function index(): JsonResponse
{
$events = Event::all();
return response()->json(EventResource::collection($events));
}
/**
* Store a newly created resource in storage.
*
* @param EventRequest $request
* @return JsonResponse
*/
public function store(EventRequest $request): JsonResponse
{
$validated = $request->validated();
$event = $request->user()->events()->create($validated);
$event->save();
return response()->json(new EventResource($event), 201);
}
/**
* Display the specified resource.
*
* @param Event $event
* @return JsonResponse
*/
public function show(Event $event): JsonResponse
{
return response()->json(new EventResource($event));
}
/**
* Update the specified resource in storage.
*
* @param EventRequest $request
* @param Event $event
* @return JsonResponse
* @throws AuthorizationException
*/
public function update(EventRequest $request, Event $event): JsonResponse
{
$this->authorize('update', $event);
$event->update($request->all());
return response()->json(new EventResource($event));
}
/**
* Remove the specified resource from storage.
*
* @param Event $event
* @return JsonResponse
*/
public function destroy(Event $event): JsonResponse
{
$this->authorize('delete', $event);
$event->delete();
return response()->json([], 204);
}
public function inviteUser(Event $event, User $user): JsonResponse
{
$this->authorize('update', $event);
$event->guests()->attach($user);
return response()->json(new EventResource($event));
}
public function removeInviteUser(Event $event, User $user)
{
$this->authorize('delete', $event);
$event->guests()->detach($user);
return (new EventResource($event))
->response()
->setStatusCode(204);
}
public function addGuestToStaffEvent(Event $event, User $user): JsonResponse
{
$this->authorize('delete', $event);
$event->guests()->updateExistingPivot($user, ['is_staff' => true], false);
return response()->json(new EventResource($event));
}
public function deleteGuestToStaffEvent(Event $event, User $user): JsonResponse
{
$this->authorize('delete', $event);
$event->guests()->updateExistingPivot($user, ['is_staff' => false], false);
return response()->json(new EventResource($event));
}
public function userConfirmParticipation(Event $event)
{
$this->authorize('participation', $event);
$event->guests()->updateExistingPivot(auth()->user(), ['validated_at' => now()->toDateTimeString()], false);
return (new EventResource($event))
->response()
->setStatusCode(200);
}
public function userDeleteInvitation(Event $event)
{
$this->authorize('participation', $event);
$event->guests()->detach(auth()->user());
return response([], 204);
}
public function addGuestWithEmail(Request $request, Event $event)
{
$data = $request->validate([
'email' => 'required|email',
]);
$event->emailedGuests()->save(new EventGuestsNonUsers(['email' => $data['email']]));
return response()->json(new EventResource($event), 201);
}
public function guestCanReadEvent(Request $request, Event $event)
{
$guest = $request->guest;
if (!$guest->read_at) {
$guest->update(['read_at' => now()->toDateTimeString()]);
}
return response()->json(new EventResource($event));
}
public function guestCanConfirmEvent(Request $request, Event $event)
{
$guest = $request->guest;
$guest->update(['validated_at' => now()->toDateTimeString()]);
return response()->json(new EventResource($event));
}
}