Skip to content

Instantly share code, notes, and snippets.

@mlebkowski
Last active August 29, 2015 14:16
Show Gist options
  • Save mlebkowski/9cb952dbf0936de340bb to your computer and use it in GitHub Desktop.
Save mlebkowski/9cb952dbf0936de340bb to your computer and use it in GitHub Desktop.
<?php
namespace Metricso\Fetcher\ObjectProcessor ;
use Generator ;
use Metricso\Model\Fb\AppUser ;
use Metricso\Model\Fb\FbPage ;
use Metricso\Model\Fb\FbPageFeedQuery ;
class PageProcessor extends AbstractObjectProcessor implements ObjectProcessorInterface, UsingAlternateTokensInterface {
private $queryFactory ;
private $tokenSource ;
private $sessionFactory ;
public function __construct(\Closure $fetcher, \Closure $apiResolverFactory, FbPageFeedQuery $query) {
$this->queryFactory = function () use ($query) {
return clone $query ;};
parent::__construct($fetcher, $apiResolverFactory) ;}
public function setSessionFactory(callable $sessionFactory) {
$this->sessionFactory = function (AppUser $user) use ($sessionFactory) {
return call_user_func($sessionFactory, $user, true) ;};
return $this ;}
protected function doProcessObject(ProcessableObjectInterface $page, \Closure $callback) {
if (false === $page instanceof FbPage) {
throw new \InvalidArgumentException(sprintf('Page must be of type "%s", "%s" given' ,
FbPage::class, get_class($page)
)) ;}
$this->getPageFeedQuery()->filterByFbPage($page)->delete() ;
try {
$callback($page) ;}
catch (\Exception $e) {
$page->setStatus(FbPage::STATUS_ERROR)->save() ;
throw new ProcessingException(['page_id' => $page->getId(), 'page_name' => $page->getName()], $e) ;}
$page->setStatus(FbPage::STATUS_COMPLETE)->save() ;}
private function getPageFeedQuery() {
return call_user_func($this->queryFactory) ;}
public function setAdditionalTokensSource(Generator $source) {
$this->tokenSource = $source ;}
public function getNewFacebookSession($wasPreviousThrottled = true) {
if (null === $this->tokenSource || false === $this->tokenSource->valid()) {
return null ;}
if (null === $this->sessionFactory) {
throw new \RuntimeException('I need a SessionFactory to create new facebook sesisons based on AppUser') ;}
$this->tokenSource->send($wasPreviousThrottled) ;
$user = $this->tokenSource->current() ;
if (null === $user) {
return null ;}
return call_user_func($this->sessionFactory, $user) ;}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment