RSS-Bridge_rss-bridge/bridges/KununuBridge.php

157 lines
4.6 KiB
PHP

<?php
class KununuBridge extends BridgeAbstract
{
const MAINTAINER = 'logmanoriginal';
const NAME = 'Kununu Bridge';
const URI = 'https://www.kununu.com/';
const CACHE_TIMEOUT = 86400; // 24h
const DESCRIPTION = 'Returns the latest reviews for a company and site of your choice.';
const PARAMETERS = [
'global' => [
'site' => [
'name' => 'Site',
'type' => 'list',
'title' => 'Select your site',
'values' => [
'Austria' => 'at',
'Germany' => 'de',
'Switzerland' => 'ch'
],
'exampleValue' => 'de',
],
'include_ratings' => [
'name' => 'Include ratings',
'type' => 'checkbox',
'title' => 'Activate to include ratings in the feed'
],
'limit' => [
'name' => 'Limit',
'type' => 'number',
'defaultValue' => 3,
'title' => "Maximum number of items to return in the feed.\n0 = unlimited"
]
],
[
'company' => [
'name' => 'Company',
'required' => true,
'exampleValue' => 'kununu',
'title' => 'Insert company name (i.e. Kununu) or URI path (i.e. kununu)'
]
]
];
private $companyName = '';
public function getURI()
{
if (!is_null($this->getInput('company')) && !is_null($this->getInput('site'))) {
$company = $this->fixCompanyName($this->getInput('company'));
$site = $this->getInput('site');
return sprintf('%s%s/%s', self::URI, $site, $company);
}
return parent::getURI();
}
public function getName()
{
if (!is_null($this->getInput('company'))) {
$company = $this->fixCompanyName($this->getInput('company'));
return ($this->companyName ?: $company) . ' - ' . self::NAME;
}
return parent::getName();
}
public function getIcon()
{
return 'https://www.kununu.com/favicon-196x196.png';
}
public function collectData()
{
$full = $this->getInput('full');
// Load page
$json = json_decode(getContents($this->getAPI()), true);
$this->companyName = $json['common']['name'];
$baseURI = $this->getURI() . '/bewertung/';
$limit = $this->getInput('limit') ?: 0;
// Go through all articles
foreach ($json['reviews'] as $review) {
$item = [];
$item['author'] = $review['position'] . ' / ' . $review['department'];
$item['timestamp'] = $review['createdAt'];
$item['title'] = $review['roundedScore'] . ' : ' . $review['title'];
$item['uri'] = $baseURI . $review['uuid'];
$item['content'] = $this->extractArticleDescription($review);
$this->items[] = $item;
if ($limit > 0 && count($this->items) >= $limit) {
break;
}
}
}
/**
* Returns JSON API url
*/
private function getAPI()
{
$company = $this->fixCompanyName($this->getInput('company'));
$site = $this->getInput('site');
return self::URI . 'middlewares/profiles/' .
$site . '/' . $company .
'/reviews?reviewType=employees&urlParams=sort=newest&sort=newest&page=1';
}
/*
* Returns a fixed version of the provided company name
*/
private function fixCompanyName($company)
{
$company = trim($company);
$company = str_replace(' ', '-', $company);
$company = strtolower($company);
$umlauts = ['/ä/','/ö/','/ü/','/Ä/','/Ö/','/Ü/','/ß/'];
$replace = ['ae','oe','ue','Ae','Oe','Ue','ss'];
return preg_replace($umlauts, $replace, $company);
}
/**
* Returns the description from a given article
*/
private function extractArticleDescription($json)
{
$retVal = '';
foreach ($json['texts'] as $text) {
$retVal .= '<h4>' . $text['id'] . '</h4><p>' . $text['text'] . '</p>';
}
if ($this->getInput('include_ratings') && !empty($json['ratings'])) {
$retVal .= (empty($retVal) ? '' : '<hr>') . '<table>';
foreach ($json['ratings'] as $rating) {
$retVal .= <<<EOD
<tr>
<td>{$rating['id']}
<td>{$rating['roundedScore']}
<td>{$rating['text']}
</tr>
EOD;
}
$retVal .= '</table>';
}
return $retVal;
}
}