freescout-calendar-module/Http/Controllers/LJPcCalendarModuleCalendarController.php

116 lines
4.1 KiB
PHP

<?php
namespace Modules\LJPcCalendarModule\Http\Controllers;
use DateTimeImmutable;
use DateTimeZone;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\LJPcCalendarModule\Entities\Calendar;
use Modules\LJPcCalendarModule\Entities\CalendarItem;
use Modules\LJPcCalendarModule\Http\Helpers\DateTimeRange;
use Spatie\IcalendarGenerator\Components\Event;
class LJPcCalendarModuleCalendarController extends Controller {
public function index() {
$calendars = Calendar::all();
$authorizedCalendars = [];
foreach ( $calendars as $calendar ) {
if ( $calendar->enabled === false ) {
continue;
}
$permissions = $calendar->permissionsForCurrentUser();
if ( $permissions === null ) {
continue;
}
if ( $permissions['showInCalendar'] !== true ) {
continue;
}
$authorizedCalendars[] = [
'id' => $calendar->id,
'name' => $calendar->name,
'backgroundColor' => $calendar->color,
'type' => $calendar->type,
'permissions' => $permissions,
];
}
return view( 'calendar::index', [
'calendars' => $authorizedCalendars,
] );
}
public function getAsICS( int $id, Request $request ) {
$requiredTokenNormal = md5( $id . getenv( 'APP_KEY' ) );
$requiredTokenObfuscated = md5( $id . 'obfuscated' . getenv( 'APP_KEY' ) );
if ( ! $request->has( 'token' ) || ( $requiredTokenNormal !== $request->get( 'token' ) && $requiredTokenObfuscated !== $request->get( 'token' ) ) ) {
abort( 403 );
}
$isObfuscated = $requiredTokenObfuscated === $request->get( 'token' );
$defaultTimezone = config( 'app.timezone' );
/** @var Calendar|null $calendar */
$calendar = Calendar::find( $id );
if ( $calendar === null ) {
abort( 404 );
}
if ( $calendar->type === 'ics' || $calendar->type === 'caldav' ) {
$data = $calendar->getExternalContent();
}
if ( $calendar->type === 'normal' ) {
$events = json_decode( CalendarItem::where( 'calendar_id', $calendar->id )->get()->toJson(), true );
$ics = \Spatie\IcalendarGenerator\Components\Calendar::create( $calendar->name )->timezone( 'UTC' );
foreach ( $events as $event ) {
$start = new DateTimeImmutable( $event['start'] );
$end = new DateTimeImmutable( $event['end'] );
$isAllDay = DateTimeRange::isAllDay( $start, $end );
if ( $isObfuscated ) {
$newEvent = Event::create()
->name( 'Unavailable' )
->description( '' )
->startsAt( $start->setTimezone( new DateTimeZone( 'UTC' ) ) )
->endsAt( $end->setTimezone( new DateTimeZone( 'UTC' ) ) )
->address( '' )
->withoutTimezone();
if ( $isAllDay ) {
$newEvent
->fullDay()
->startsAt( $start->setTimezone( new DateTimeZone( $defaultTimezone ) ) )
->endsAt( $end->setTimezone( new DateTimeZone( $defaultTimezone ) ) );
}
} else {
$newEvent = Event::create()
->name( $event['title'] ?? '' )
->description( $event['body'] ?? '' )
->startsAt( $start->setTimezone( new DateTimeZone( 'UTC' ) ) )
->endsAt( $end->setTimezone( new DateTimeZone( 'UTC' ) ) )
->address( $event['location'] ?? '' )
->withoutTimezone();
if ( $isAllDay ) {
$newEvent->fullDay()
->startsAt( $start->setTimezone( new DateTimeZone( $defaultTimezone ) ) )
->endsAt( $end->setTimezone( new DateTimeZone( $defaultTimezone ) ) );
}
}
$ics->event( $newEvent );
}
$data = $ics->get();
}
return response( $data )
->header( 'Content-Type', 'text/calendar' )
->header( 'Content-Disposition', 'attachment; filename="' . $calendar->name . '.ics"' );
}
}