mirror of
https://gh.wpcy.net/https://github.com/LJPc-solutions/freescout-calendar-module.git
synced 2026-05-26 01:04:16 +08:00
116 lines
4.1 KiB
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"' );
|
|
|
|
}
|
|
|
|
}
|