Skip to content

Commit

Permalink
DEV-1283. Adds a route for public ical
Browse files Browse the repository at this point in the history
  • Loading branch information
geoff-maddock committed Dec 20, 2024
1 parent 15e4e2f commit ec6dd98
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 1 deletion.
84 changes: 83 additions & 1 deletion app/Http/Controllers/EventsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,14 @@
use Intervention\Image\Facades\Image;
use Illuminate\Http\File as HttpFile;
use Storage;

use Illuminate\Support\Str;
use Illuminate\View\View;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Route;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Eluceo\iCal\Component\Calendar;
use Eluceo\iCal\Component\Event as iCalEvent;

class EventsController extends Controller
{
Expand Down Expand Up @@ -190,6 +191,86 @@ public function index(
->render();
}


/**
* Return all future events in iCal format.
*/
public function indexIcal(
Request $request,
ListParameterSessionStore $listParamSessionStore,
ListEntityResultBuilder $listEntityResultBuilder,
)
{

// initialized listParamSessionStore with baseindex key
$listParamSessionStore->setBaseIndex('internal_event');
$listParamSessionStore->setKeyPrefix('internal_event_index');

// set the index tab in the session
$listParamSessionStore->setIndexTab(action([EventsController::class, 'index']));

// create the base query including any required joins; needs select to make sure only event entities are returned
$baseQuery = Event::query()
->leftJoin('event_types', 'events.event_type_id', '=', 'event_types.id')
->select('events.*')
;

// set the default filter to starting today, can override
$defaultFilter = ['start_at' => ['start' => Carbon::now()->format('Y-m-d')]];

$listEntityResultBuilder
->setFilter($this->filter)
->setQueryBuilder($baseQuery)
->setDefaultFilters($defaultFilter)
->setDefaultSort(['events.start_at' => 'asc'])
;

// get the result set from the builder
$listResultSet = $listEntityResultBuilder->listResultSetFactory();

// get the query builder
$query = $listResultSet->getList();

// get the events
/* @phpstan-ignore-next-line */
$events = $query->visible($this->user)
->with('visibility', 'venue')
->paginate($listResultSet->getLimit());

// define the iCal format
define('ICAL_FORMAT', 'Ymd\THis\Z');

// create a calendar object
$vCalendar = new Calendar('Arcane City Calendar');

// loop over events
foreach ($events as $event) {
$venue = $event->venue ? $event->venue->name : '';

$vEvent = new iCalEvent();
$vEvent
->setDtStart($event->start_at)
->setDtEnd($event->end_at)
->setDtStamp($event->created_at)
->setSummary($event->name)
->setDescription($event->description)
->setUniqueId($event->id)
->setLocation($venue)
->setModified($event->updated_at)
->setStatus('CONFIRMED')
->setUrl($event->primary_link);

$vCalendar->addComponent($vEvent);
}

// Set the headers
header('Content-type: text/calendar; charset=utf-8');
header('Content-Disposition: attachment; filename="arcane-city-ical.ics"');

return $vCalendar->render();
}


/**
* Display a listing of events by date.
*
Expand Down Expand Up @@ -3583,6 +3664,7 @@ public function exportAttending(
return view('events.feed', compact('events'));
}


public function rss(RssFeed $feed): Response
{
$rss = $feed->getRSS();
Expand Down
8 changes: 8 additions & 0 deletions resources/views/events/ical.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
@extends('minimal')


@section('title', 'Arcane City Events Ical')

@section('content')
{{ $ical }}
@stop
1 change: 1 addition & 0 deletions routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@
Route::get('events/type/{slug}', 'EventsController@indexTypes');
Route::get('events/series/{slug}', 'EventsController@indexSeries');
Route::get('events/feed', 'EventsController@feed');
Route::get('events/ical', 'EventsController@indexIcal');
Route::get('events/feed/tag/{tag}', 'EventsController@feedTags');
Route::get('events/brief-text', 'EventsController@briefText');
Route::get(
Expand Down

0 comments on commit ec6dd98

Please sign in to comment.