177 lines
4.4 KiB
PHP
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));
|
|
}
|
|
}
|