Skip to content

Commit

Permalink
Improve job transmission
Browse files Browse the repository at this point in the history
  • Loading branch information
TiSiE committed Oct 12, 2017
1 parent c05e121 commit 5d0fe36
Show file tree
Hide file tree
Showing 9 changed files with 467 additions and 53 deletions.
22 changes: 16 additions & 6 deletions config/services.config.php
Expand Up @@ -7,16 +7,26 @@
* @copyright 2016 Cross Solution <http://cross-solution.de>
*/

namespace StackoverflowApi;

use Zend\ServiceManager\Factory\InvokableFactory;

return [
'service_manager' => [
'factories' => [
\StackoverflowApi\Service\JobsManager::class => \StackoverflowApi\Factory\Service\JobsManagerFactory::class,
\StackoverflowApi\Client\Client::class => \StackoverflowApi\Factory\Client\ClientFactory::class,
\StackoverflowApi\Client\DataTransformer::class => \StackoverflowApi\Factory\Client\DataTransformerFactory::class,
\StackoverflowApi\Listener\JobsListener::class => \StackoverflowApi\Factory\Listener\JobsListenerFactory::class,
Service\JobsManager::class => Factory\Service\JobsManagerFactory::class,
Client\Client::class => Factory\Client\ClientFactory::class,
Client\DataTransformer::class => Factory\Client\DataTransformerFactory::class,
Listener\JobsListener::class => Factory\Listener\JobsListenerFactory::class,
],
'aliases' => [
'StackoverflowApi/Client' => \StackoverflowApi\Client\Client::class,
'StackoverflowApi/Client' => Client\Client::class,
],
],

'filters' => [
'factories' => [
Client\JobDescriptionFilter::class => InvokableFactory::class,
],
],
];
];
114 changes: 76 additions & 38 deletions src/Client/DataTransformer.php
Expand Up @@ -14,6 +14,7 @@
use Jobs\Entity\JobInterface;
use Jobs\View\Helper\ApplyUrl;
use Organizations\ImageFileCache\Manager as ImageManager;
use StackoverflowApi\Utils\XmlBuilder;
use Zend\View\Helper\ServerUrl;

/**
Expand Down Expand Up @@ -48,6 +49,13 @@ class DataTransformer
*/
protected $organizationImageManager;

/**
*
*
* @var JobDescriptionFilter
*/
protected $descriptionFilter;

/**
* @param ApplyUrl $applyUrlHelper
*
Expand Down Expand Up @@ -108,6 +116,32 @@ public function getServerUrlHelper()
return $this->serverUrlHelper;
}

/**
* @return JobDescriptionFilter
*/
public function getDescriptionFilter()
{
if (!$this->descriptionFilter) {
$this->descriptionFilter = new JobDescriptionFilter();
}

return $this->descriptionFilter;
}

/**
* @param JobDescriptionFilter $descriptionFilter
*
* @return self
*/
public function setDescriptionFilter($descriptionFilter)
{
$this->descriptionFilter = $descriptionFilter;

return $this;
}




/**
* Transform a job to stackoverflow XML
Expand All @@ -123,107 +157,111 @@ public function transform(JobInterface $job, $options = [])
$serverUrl = $this->getServerUrlHelper();
$imageManager = $this->getOrganizationImageManager();

/* @var \Jobs\Entity\Job $job */
$xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><job></job>');

/*
* FOR TESTING
*/
$xml->addChild('test', 'true');
$jobSpec = [
'action' => isset($options['action']) ? $options['action'] : 'post',
//'test' => 'true',


$xml->addChild('action', isset($options['action']) ? $options['action'] : 'post');
];

if (isset($options['externalId'])) {
$xml->addChild('jobid', $options['externalId']);
$jobSpec['jobid'] = $options['externalId'];
}

$xml->addChild('title', $job->getTitle());
$xml->addChild('company', $job->getOrganization()->getOrganizationName()->getName());
$xml->addChild('companyurl', $job->getOrganization()->getContact()->getWebsite() ?: 'http://cross-solution.de');
$jobSpec[':title'] = $job->getTitle();
$jobSpec[':company'] = $job->getOrganization()->getOrganizationName()->getName();
$jobSpec[':companyurl'] = $job->getOrganization()->getContact()->getWebsite() ?: '';

if (($image = $job->getOrganization()->getImage()) && $serverUrl && $imageManager) {
$imageUri = $imageManager->getUri($image);
$xml->addChild('logourl', $serverUrl($imageUri));
$jobSpec['logourl'] = $serverUrl($imageUri);
}

if ($companyDesc = $job->getOrganization()->getDescription()) {
$xml->addChild('aboutcompany', $companyDesc);
$jobSpec[':aboutcompany'] = $companyDesc;
}

$xml->addChild('vendorid', $job->getId());
$jobSpec['vendorid'] = $job->getId();

$atsMode = $job->getAtsMode();
if ($atsMode->isDisabled()) {
$xml->addChild('howtoapply', 'postalisch');
$jobSpec['howtoapply'] = 'postalisch';
} else if ($atsMode->isEmail()) {
$xml->addChild('howtoapply', $atsMode->getEmail());
$jobSpec['howtoapply'] = $atsMode->getEmail();
} else if ($atsMode->isUri()) {
$xml->addChild('howtoapply', $atsMode->getUri());
$jobSpec['howtoapply'] = $atsMode->getUri();
} else if (is_callable($applyUrl) && $serverUrl) {
$xml->addChild('howtoapply', $serverUrl($applyUrl($job, ['linkOnly' => true, 'absolute' => true])));
$jobSpec['howtoapply'] = $serverUrl($applyUrl($job, ['linkOnly' => true, 'absolute' => true]));
} else {
$xml->addChild('howtoapply', 'postalisch');
$jobSpec['howtoapply'] = 'postalisch';
}



$locations = $job->getLocations();
if ($locations->count()) {
$loc = $xml->addChild('locations');
$loc = [];

foreach ($locations as $location) {
$l = $loc->addChild('location', $location->getCity());
$l = [];
$l['location'] = $location->getCity();
$coords = $location->getCoordinates();
if (CoordinatesInterface::TYPE_POINT == $coords->getType()) {
$c = $coords->getCoordinates();
$l->addAttribute('lon', $c[0]);
$l->addAttribute('lat', $c[1]);
$l['location']['@lon'] = $c[0];
$l['location']['@lat'] = $c[1];
}
$loc[] = $l;
}

$jobSpec['locations'] = $loc;
}

foreach (['topspot', 'featured', 'remote', 'relocation', 'visasponsorship', 'sysadmin'] as $boolOpt) {
if (isset($options[$boolOpt])) {
$xml->addChild($boolOpt, $options[$boolOpt] ? 'true' : 'false');
$jobSpec[$boolOpt] = $options[$boolOpt] ? 'true' : 'false';
}
}

foreach (['length', 'coupon', 'pixel'] as $strOpt) {
if (isset($options[$strOpt])) {
$xml->addChild($strOpt, $options[$strOpt]);
$jobSpec[$strOpt] = $options[$strOpt];
}
}

$xml->addChild('description', html_entity_decode($job->getTemplateValues()->getDescription()) ?: '<p></p>');
$link = $job->getLink();
$jobSpec[':description'] = $link ? $this->getDescriptionFilter()->filter($link) : '<p></p>';

if ($requirements = $job->getTemplateValues()->getRequirements()) {
$xml->addChild('requirements', $requirements);
$jobSpec[':requirements'] = $requirements;
}

$tags = $xml->addChild('tags');
$tags = [];
if (isset($options['keywords']) && is_array($options['keyword'])) {
foreach ($options['keywords'] as $keyword) {
$tags->addChild('tag', $keyword);
$tags[] = ['tag' => $keyword];
}
} else {
$tags->addChild('tag', 'none');
$tags[] = ['tag' => 'none'];
}
$jobSpec['tags'] = $tags;

if (isset($options['advertisingregions']) && is_array($options['advertisingregions'])) {
$regions = $xml->addChild('advertisingregioncodes');
$regions = [];
foreach ($options['advertisingregions'] as $adreg) {
$regions->addChild('regioncode', $adreg);
$regions[] = ['regioncode' => $adreg];
}
$jobSpec['advertisingregions'] = $regions;
}

if (isset($options['advertisingcountries']) && is_array($options['advertisingcountries'])) {
$countries = $xml->addChild('advertisingcountrycodes');
$countries = [];
foreach ($options['advertisingcountries'] as $adcountry) {
$countries->addChild('regioncode', $adcountry);
$countries[] = ['regioncode' => $adcountry];
}
$jobSpec['advertisingcountrycodes'] = $countries;
}


return $xml->asXml();
return XmlBuilder::createXml(['job' => $jobSpec]);
}
}
}
54 changes: 54 additions & 0 deletions src/Client/JobDescriptionFilter.php
@@ -0,0 +1,54 @@
<?php
/**
* YAWIK
*
* @filesource
* @license MIT
* @copyright 2013 - 2017 Cross Solution <http://cross-solution.de>
*/

/** */
namespace StackoverflowApi\Client;

use Zend\Filter\StripTags;

/**
* ${CARET}
*
* @author Mathias Gelhausen <gelhausen@cross-solution.de>
* @todo write test
*/
class JobDescriptionFilter extends StripTags
{
public function __construct()
{
parent::__construct([
'b', 'strong', 'p', 'ul', 'li', 'ol', 'table', 'tr', 'td', 'tbody',
'thead', 'th', 'br', 'i', 'em'
]);
}

public function filter($value)
{
$oldErrorReporting = error_reporting(0);
$dom = new \DOMDocument();
$dom->loadHTMLFile($value);

$body = $dom->getElementsByTagName('body')->item(0);

foreach (['script', 'style'] as $name) {
while ($elem = $body->getElementsByTagName($name)->item(0)) {
$elem->parentNode->removeChild($elem);
}
}

$html = $dom->saveHTML($body);
error_reporting($oldErrorReporting);

$html = parent::filter($html);

return $html;
}


}

0 comments on commit 5d0fe36

Please sign in to comment.