From b86d4da26b988e5c91fdc49d41837127f8a39f29 Mon Sep 17 00:00:00 2001 From: Mischa Spelt Date: Sun, 9 Jul 2017 12:32:57 +0200 Subject: [PATCH] Documentatie bijgewerkt; Begonnen aan /programma/details --- .../Http/Controllers/ProgramController.php | 126 +++++++++++++-- api/public/api.json | 153 +++++++++++++++--- api/routes/web.php | 2 +- common/classes/Program.php | 4 +- common/classes/ProgramHost.php | 10 ++ 5 files changed, 258 insertions(+), 37 deletions(-) create mode 100644 common/classes/ProgramHost.php diff --git a/api/app/Http/Controllers/ProgramController.php b/api/app/Http/Controllers/ProgramController.php index 9eff212..5b8cea1 100644 --- a/api/app/Http/Controllers/ProgramController.php +++ b/api/app/Http/Controllers/ProgramController.php @@ -10,7 +10,7 @@ ini_set('display_errors', true); class ProgramController extends Controller { private static $SCHEDULE_SQL = <<select("SELECT `id`, `longname`, `description`, `email` FROM `programs` WHERE `id` = :id", ['id' => (int)$id]); + if(count($programs) != 1) { + return abort(404); + } + + $program = $programs[0]; + + $hosts = app('db')->select("SELECT `programs_users`.`user` AS `id`, `medewerkers`.`adressering` AS `name`, `user_emailaddresses`.`email` AS `email` + FROM `programs_users` + LEFT JOIN `users` ON `programs_users`.`user` = `users`.`id` + LEFT JOIN `medewerkers` ON `users`.`medewerkersid` = `medewerkers`.`id` + LEFT JOIN `user_emailaddresses` ON `user_emailaddresses`.`user` = `users`.`id` + WHERE `programs_users`.`program` = :program + AND `user_emailaddresses`.`preference` = 0 + AND `programs_users`.`active` = 1", ['program' => $program->id]); + foreach($hosts as $host) { + $program->hosts[] = new \Model\ProgramHost($host); + } + + $schedule = app('db')->select(<<= :startdate)) AND +1=1 + ORDER BY `schedule`.`priority` DESC, MOD(`startday` + 6, 7) + 1, `schedule`.`starttime` ASC +QUERY + , ['program' => $program->id] ); + $recentSchedule = $this->recent($schedule); + $program->schedule = $recentSchedule; + + return response()->json($program); + } + + private function recent($schedule) { + $now = new \DateTimeImmutable(); + $ONE_DAY = \DateInterval::createFromDateString('1 day'); + $ONE_WEEK = \DateInterval::createFromDateString('1 week'); + $recent = []; + $next = []; + + // Vind voor elke regel in de uitzendmomenten de eerstvolgende en twee meest recente. + $isCurrent = false; + foreach($schedule as $broadcast) { + $startTijd = new \DateTimeImmutable($broadcast->starttime); + $endDate = ($broadcast->enddate == null) ? $now : new \DateTimeImmutable($broadcast->enddate); + $endDate = $endDate->setTime($startTijd->format('H'), $startTijd->format('i'), $startTijd->format('s')); + $endDateWeekday = $endDate->format('N'); + + // Zoek de laatste uitzending voor de einddatum (of voor het huidige tijdstip), op de juiste weekdag + while($endDateWeekday != $broadcast->startday) { + $endDate = $endDate->sub($ONE_DAY); + if(--$endDateWeekday < 0) { $endDateWeekday += 7; } + } + + $eindTijd = new \DateTimeImmutable($broadcast->endtime); + $endOfBroadcast = $endDate->setTime($eindTijd->format('H'), $eindTijd->format('i'), $eindTijd->format('s')); + if($endOfBroadcast < $endDate) { $endOfBroadcast = $endOfBroadcast->add($ONE_DAY); } + + if($isInProgress = (($endDate <= $now) && ($endOfBroadcast > $now))) { + $isCurrent = true; + } + + // Als de uitzending niet al afgelopen is, telt hij als volgende. + // Dit gebeurt als de uitzending later vandaag is of nu loopt. + if($endOfBroadcast >= $now) { + $next[] = $endDate; + $endDate = $endDate->sub($ONE_WEEK); + $endOfBroadcast = $endOfBroadcast->sub($ONE_WEEK); + } + + if(($broadcast->startdate == null) || ($broadcast->startdate <= $endDate)) { + $recent[] = $endDate; + } + + $previous = $endDate->sub($ONE_WEEK); + if(($broadcast->startdate == null) || ($broadcast->startdate <= $previous)) { + $recent[] = $previous; + } + + $following = $endDate->add($ONE_WEEK); + if(($broadcast->enddate == null) || ($broadcast->enddate >= $following)) { + $next[] = $following; + } + } + + sort($next); + rsort($recent); + return ['recent' => array_splice($recent, 0, 2), 'next' => array_splice($next, 0, 1), 'iscurrent' => $isCurrent]; + } + /** * Programmas nu en straks (24 uur vooruit) */ @@ -46,7 +142,8 @@ QUERY; * Programmaschema per week */ public function schedule(Request $request, $weeksAhead = null) { - if($weeksAhead <= 0) { $weeksAhead = 1; } + if($weeksAhead === null) { $weeksAhead = 1; } + else if($weeksAhead <= 0) { return abort(400); } $start = new \DateTimeImmutable('Monday this week'); $einde = $start->add(\DateInterval::createFromDateString((int)$weeksAhead . ' weeks')); @@ -67,12 +164,15 @@ QUERY; $programmas = app('db')->select(self::$SCHEDULE_SQL, - ['enddate' => $einde->format('Y-m-d'), 'startdate' => $start->format('Y-m-d')]); + ['enddate' => $einde->format('Y-m-d'), 'startdate' => $start->format('Y-m-d')]); + $programmaInfo = []; // Maak een lijstje van alle start en eindtijden en welk programma dan begint/eindigt $startEinde = []; $startMaandag = $start->modify('Monday this week'); foreach($programmas as $programma) { + $programmaInfo[$programma->id] = new \Model\Program($programma); + $programmaStart = $startMaandag->add(\DateInterval::createFromDateString(($programma->startday - 1) % 7 . ' days')); $programmaEinde = $startMaandag->add(\DateInterval::createFromDateString(($programma->endday - 1) % 7 . ' days')); @@ -120,24 +220,24 @@ QUERY; if($programmaWissel[PW_TYPE] == PROGRAMMA_START) { if($actieveProgrammas[$programma->priority] != null) { - $fouten[] = [$tijdstip, "Begin van {$programma->longname} maar {$actieveProgrammas[$programma->priority]->longname} is nog actief."]; + $fouten[] = [$tijdstip, "Begin van {$programma->name} maar {$actieveProgrammas[$programma->priority]->name} is nog actief."]; } $actieveProgrammas[$programma->priority] = $programma; for($prio = $programma->priority; $prio >= 0; --$prio) { if($actieveProgrammas[$prio] != null) { - if(($index == -1) || ($schema[$index]['tijdstip'] != $tijdstip)) { $index++; } - $schema[$index] = ['tijdstip' => $tijdstip, 'programma' => $actieveProgrammas[$prio]]; + if(($index == -1) || ($schema[$index]['time'] != $tijdstip)) { $index++; } + $schema[$index] = ['time' => $tijdstip, 'program' => $programmaInfo[$actieveProgrammas[$prio]->id]]; break; } } } else /*if($programmaWissel[PW_TYPE] == PROGRAMMA_EINDE)*/ { $actieveProgrammas[$programma->priority] = null; - if(($index == -1) || ($schema[$index]['programma'] != null)) { $index++; } - $schema[$index] = ['tijdstip' => $tijdstip, 'programma' => null]; + if(($index == -1) || ($schema[$index]['program'] != null)) { $index++; } + $schema[$index] = ['time' => $tijdstip, 'program' => null]; for($prio = $programma->priority; $prio < count($actieveProgrammas); ++$prio) { if($actieveProgrammas[$prio] != null) { - $schema[$index] = ['tijdstip' => $tijdstip, 'programma' => $actieveProgrammas[$prio]]; + $schema[$index] = ['time' => $tijdstip, 'program' => $programmaInfo[$actieveProgrammas[$prio]->id]]; break; } } @@ -146,12 +246,12 @@ QUERY; if(false) { for($i = 1; $i <= count($schema); $i++) { - $eindTijd = ($i == count($schema)) ? $einde : $schema[$i]['tijdstip']; - $programma = $schema[$i-1]['programma']; - print $schema[$i-1]['tijdstip']->format('D d-m-Y, H:i:s') . " - " . $eindTijd->format('D d-m-Y, H:i:s') . ": " . ($programma != null ? $programma->longname : "NULL") . "\n"; + $eindTijd = ($i == count($schema)) ? $einde : $schema[$i]['time']; + $programma = $schema[$i-1]['program']; + print $schema[$i-1]['time']->format('D d-m-Y, H:i:s') . " - " . $eindTijd->format('D d-m-Y, H:i:s') . ": " . ($programma != null ? $programma->name : "NULL") . "\n"; } } - return ['startdate' => $start, 'enddate' => $einde, 'schema' => $schema, 'fouten' => $fouten]; + return ['startdate' => $start, 'enddate' => $einde, 'schedule' => $schema, 'errors' => $fouten]; } } diff --git a/api/public/api.json b/api/public/api.json index bfbc55e..12f0979 100644 --- a/api/public/api.json +++ b/api/public/api.json @@ -55,7 +55,7 @@ paths: 200: description: 'Success' schema: - type: 'object' + type: object properties: page: type: integer @@ -150,14 +150,14 @@ paths: 200: description: 'Success' schema: - type: 'object' + type: object properties: items: type: array items: $ref: '#/definitions/AgendaItem' days: - type: 'object' + type: object description: 'Eigenschapnamen zijn datum binnen gegeven maand in yyyy-mm-dd formaat' additionalProperties: type: array @@ -194,14 +194,14 @@ paths: 200: description: 'Success' schema: - type: 'object' + type: object properties: items: type: array items: $ref: '#/definitions/AgendaItem' days: - type: 'object' + type: object description: 'Eigenschapnamen zijn datum binnen gegeven maand in yyyy-mm-dd formaat' additionalProperties: type: array @@ -258,7 +258,7 @@ paths: 200: description: 'Success' schema: - type: 'object' + type: object properties: page: type: integer @@ -327,6 +327,103 @@ paths: 404: description: 'Podcast ID of authorisatiesleutel is ongeldig' + '/programma/schema/nustraks': + get: + tags: + - 'programma' + summary: 'Programmas nu en straks' + description: 'Geeft een overzicht van de programmas in de komende 24 tot 48 uur. Let op: van de programmas zijn de podcasts en het uitzendschema niet ingevuld.' + responses: + 200: + description: 'Success' + schema: + type: object + properties: + startdate: + $ref: '#/definitions/DateTime' + enddate: + $ref: '#/definitions/DateTime' + schedule: + type: array + items: + type: object + properties: + time: + $ref: '#/definitions/DateTime' + program: + $ref: '#/definitions/Program' + errors: + type: array + items: + type: string + + '/programma/schema/week': + get: + tags: + - 'programma' + summary: 'Programmaschema van de huidige week' + description: 'Geeft een overzicht van de programmas in de huidige week. De week begint op maandag.' + responses: + 200: + description: 'Success' + schema: + type: object + properties: + startdate: + $ref: '#/definitions/DateTime' + enddate: + $ref: '#/definitions/DateTime' + schedule: + type: array + items: + type: object + properties: + time: + $ref: '#/definitions/DateTime' + program: + $ref: '#/definitions/Program' + errors: + type: array + items: + type: string + + '/programma/schema/week/{weken}': + get: + tags: + - 'programma' + summary: 'Programmaschema van de huidige week en één of meer weken vooruit' + description: 'Geeft een overzicht van de programmas voor een aantal weken vooruit, beginnend op maandag van de huidige week.' + parameters: + - name: weken + in: path + description: 'Het aantal op te vragen weken' + required: true + type: integer + responses: + 400: + description: 'Parameter ''weken'' heeft geen geldige waarde.' + 200: + description: 'Success' + schema: + type: object + properties: + startdate: + $ref: '#/definitions/DateTime' + enddate: + $ref: '#/definitions/DateTime' + schedule: + type: array + items: + type: object + properties: + time: + $ref: '#/definitions/DateTime' + program: + $ref: '#/definitions/Program' + errors: + type: array + items: + type: string #securityDefinitions: #petstore_auth: @@ -342,7 +439,7 @@ paths: # in: 'header' definitions: DateTime: - type: 'object' + type: object properties: date: type: string @@ -355,7 +452,7 @@ definitions: type: string example: 'Europe/Amsterdam' NewsSource: - type: 'object' + type: object properties: title: type: string @@ -364,7 +461,7 @@ definitions: show: type: 'boolean' NewsImage: - type: 'object' + type: object properties: id: type: integer @@ -374,7 +471,7 @@ definitions: type: string NewsItem: - type: 'object' + type: object properties: id: type: integer @@ -410,7 +507,7 @@ definitions: type: string AgendaItem: - type: 'object' + type: object properties: id: type: integer @@ -432,7 +529,7 @@ definitions: type: string Podcast: - type: 'object' + type: object properties: id: type: integer @@ -450,7 +547,7 @@ definitions: description: 'Link om de podcast als MP3 te streamen of te downloaden. Voeg hiervoor /podcast/stream/ of /podcast/download/ toe voor de url, bijvoorbeeld: /podcast/stream/213723/6fm-podcast-titel-slug?auth=15ff823563323fe3342812937b4013984218' Program: - type: 'object' + type: object properties: id: type: integer @@ -458,23 +555,35 @@ definitions: type: string description: type: string + email: + type: string + description: 'Het (hoofd)mailadres van het programma, zonder @6fm.nl' + example: 'vroegeroflater' hosts: type: array items: - type: string # Voor nu - description: 'NOT IMPLEMENTED YET!' + $ref: '#/definitions/ProgramHost' required: false - schedule: + listenagain: type: array description: 'NOT IMPLEMENTED YET!' required: false - podcasts: - type: array - items: - $ref: '#/definitions/Podcast' - description: 'Podcasts in deze lijst hebben geen {programma} ingevuld.' + next: + type: string + description: 'NOT IMPLEMENTED YET!' required: false - + + ProgramHost: + type: object + properties: + id: + type: integer + name: + type: string + email: + type: string + description: 'Het (hoofd)mailadres van de gebruiker, zonder @6fm.nl. (Verwacht maximaal één adres met preference 0).' + #externalDocs: # description: 'Find out more about Swagger' # url: 'http://swagger.io' diff --git a/api/routes/web.php b/api/routes/web.php index d230eac..b154359 100644 --- a/api/routes/web.php +++ b/api/routes/web.php @@ -31,7 +31,7 @@ $app->get('podcast/stream/{id:\d+}/[{title}]', 'PodcastController@stream' ); $app->get('programma/schema/nustraks', 'ProgramController@comingup' ); $app->get('programma/schema/week[/{weeksAhead:\d+}]', 'ProgramController@schedule' ); -// programma/details/{id:\d+} +$app->get('/programma/details/{id:\d+}', 'ProgramController@details' ); // live/onair // live/stream diff --git a/common/classes/Program.php b/common/classes/Program.php index bf9ebbf..1f90780 100644 --- a/common/classes/Program.php +++ b/common/classes/Program.php @@ -6,13 +6,15 @@ class Program extends Model { public $id; public $name; public $description; + public $email; // TODO: Implementeren public $hosts; public $schedule; - public $podcasts; public function __construct($data) { parent::__construct($data); + + $this->email = explode(',', $data->email); } } diff --git a/common/classes/ProgramHost.php b/common/classes/ProgramHost.php new file mode 100644 index 0000000..7615fb4 --- /dev/null +++ b/common/classes/ProgramHost.php @@ -0,0 +1,10 @@ +