Files
api/api/app/Http/Controllers/NewsController.php

183 lines
7.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class NewsController extends Controller
{
private static $NEWS_CATEGORY = 1;
private static $CALENDAR_CATEGORY = 42;
private static $BASE_SQL = <<<QUERY
SELECT `news`.`id`, `content`.`title`, `content`.`content`, `news`.`podcast` AS `podcast_id`, `news`.`video`, `news`.`keywords`, `news`.`titlewithdate`,
`news`.`creationdt` AS `published`, `content`.`creator`, `content`.`editingdt` AS `edited`, `content`.`editor`,
`news`.`startdt` AS `starts`, `news`.`enddt` AS `ends`,
`content`.`showsource` AS `showsource`, `sources`.`title` AS `source`, `sources`.`url` AS `source_url`,
`themes`.`title` AS `theme`, `themes`.`thumbnail` AS `theme_thumbnail`, `regions`.`title` AS `region`, `regions`.`slug` as `region_slug`
FROM `news`
LEFT JOIN `news_target_content` AS `content` ON `content`.`news` = `news`.`id`
LEFT JOIN `news_regions` AS `regions` ON `regions`.`id` = `news`.`region`
LEFT JOIN `news_sources` AS `sources` ON `sources`.`id` = `news`.`source`
LEFT JOIN `news_themes` AS `themes` ON `themes`.`id` = `news`.`theme`
WHERE `news`.`category` = :category AND `content`.`target` = 1 AND `news`.`active` = 1 AND `content`.`active` = 1
QUERY;
private static $LOAD_IMAGES =
'SELECT `id`, `file`, `description` AS `title` FROM `news_pictures` WHERE `news` = :newsId AND `active` = 1';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Lijst van alle nieuwsberichten
*/
public function newslist(Request $request, $filter = null) {
$count = (int)$request->get('aantal', 15);
$page = (int)$request->get('pagina', 1);
if($count <= 0 || $page <= 0) {
return abort(400);
}
$filterSql = "";
$params = ['category' => self::$NEWS_CATEGORY];
if($filter) {
foreach($filter as $field => $value) {
$paramName = preg_replace('/[^A-Za-z0-9]/', '', $field);
$filterSql .= " AND $field = :$paramName";
$params[$paramName] = $value;
}
}
$start = ($page - 1) * $count;
$newsItems = app('db')->select(self::$BASE_SQL
. $filterSql
. ' ORDER BY `published` DESC'
. ' LIMIT ' . (int)$start . ', ' . (int)$count, $params);
$result = array();
foreach($newsItems as $newsItem) {
// Note: content is stored in the database with an additional addslashes() - don't ask why, just remove it :)
$newsItem->content = $newsItem->content;
$pictures = app('db')->select(self::$LOAD_IMAGES, ['newsId' => $newsItem->id]);
$result[] = new \Model\NewsItem($newsItem, $pictures);
}
return response()->json(['page' => $page, 'count' => $count, 'news' => $result]);
}
public function regionlist(Request $request, $region) {
return $this->newslist($request, ['`regions`.`slug`' => $region]);
}
/**
* Agendaberichten ophalen
*/
public function calendarlist(Request $request) {
$today = new \DateTime('today');
$agendaItems = app('db')->select(self::$BASE_SQL
. ' AND `news`.`enddt` >= :today '
. ' ORDER BY `news`.`startdt` ASC, `news`.`enddt` ASC', ['category' => self::$CALENDAR_CATEGORY, 'today' => $today]);
$result = array();
foreach($agendaItems as $agendaItem) {
// Note: content is stored in the database with an additional addslashes() - don't ask why, just remove it :)
$agendaItem->content = $agendaItem->content;
$pictures = app('db')->select(self::$LOAD_IMAGES, ['newsId' => $agendaItem->id]);
$result[] = new \Model\CalendarEvent($agendaItem, $pictures);
}
return response()->json($result);
}
/**
* Populaire berichten ophalen
*/
public function popularNews(Request $request) {
return $this->popularInCategory($request, self::$NEWS_CATEGORY);
}
public function popularCalendar(Request $request) {
return $this->popularInCategory($request, self::$CALENDAR_CATEGORY);
}
protected function popularInCategory(Request $request, $category) {
$count = (int)$request->get('aantal', 5);
$recent = app('db')->select(<<<QUERY
SELECT `news`.`id`, COUNT(DISTINCT pagestats.visitor_ip) AS visitors
FROM news
INNER JOIN pagestats ON pagestats.type = :type AND pagestats.item_id = news.id
INNER JOIN `news_target_content` AS `content` ON `content`.`news` = `news`.`id`
WHERE `news`.`startdt` >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL :interval DAY)
AND `news`.`category` = :category AND `content`.`target` = 1 AND `news`.`active` = 1 AND `content`.`active` = 1
GROUP BY news.id ORDER BY visitors DESC
LIMIT 0, :count
QUERY
, [
'type' => $category == self::$NEWS_CATEGORY ? 'nieuws'
: ($category == self::$CALENDAR_CATEGORY ? 'agenda'
: ( "" ) ),
'interval' => $category == self::$NEWS_CATEGORY ? 60
: ($category == self::$CALENDAR_CATEGORY ? 0
: 60 ),
'category' => $category,
'count' => $count
]);
$result = array();
foreach($recent as $item)
{
$newsItem = app('db')->select(self::$BASE_SQL . ' AND `news`.`id` = :newsId', ['category' => $category, 'newsId' => $item->id])[0];
$pictures = app('db')->select(self::$LOAD_IMAGES, ['newsId' => $newsItem->id]);
$result[] = new \Model\NewsItem($newsItem, $pictures);
}
return response()->json($result);
}
/**
* Specifiek nieuwsbericht ophalen
*/
public function newsitem($id) {
$item = $this->itemFromCategory(self::$NEWS_CATEGORY, $id);
return $item ? response()->json(new \Model\NewsItem($item['data'], $item['images'], $item['podcast'])) : abort(404);
}
/**
* Specifiek agendaitem ophalen
*/
public function calendaritem($id) {
$item = $this->itemFromCategory(self::$CALENDAR_CATEGORY, $id);
return $item ? response()->json(new \Model\CalendarEvent($item['data'], $item['images'], $item['podcast'])) : abort(404);
}
private function itemFromCategory($category, $id) {
$newsItem = app('db')->select(self::$BASE_SQL
. ' AND `news`.`id` = :id LIMIT 0, 1',
['category' => $category, 'id' => (int)$id]);
if(count($newsItem) != 1) {
return null;
} else {
// Note: content is stored in the database with an additional addslashes() - don't ask why, just remove it :)
$newsItem[0]->content = $newsItem[0]->content;
$images = app('db')->select(self::$LOAD_IMAGES, ['newsId' => $id]);
$podcast = null;
if($newsItem[0]->podcast_id > 0)
{
$podcast = app('db')->select(PodcastController::$BASE_SQL . ' AND `podcast`.`id` = :podcastId', ['podcastId' => $newsItem[0]->podcast_id]);
$podcast = count($podcast) ? $podcast[0] : null;
}
return ['data' => $newsItem[0], 'images' => $images, 'podcast' => $podcast];
}
}
}