<?php
/**
* Copyright 2017 Facebook, Inc.
*
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
* use, copy, modify, and distribute this software in source code or binary
* form for use in connection with the web services and APIs provided by
* Facebook.
*
* As with any software that integrates with the Facebook platform, your use
* of this software is subject to the Facebook Developer Principles and
* Policies [http://developers.facebook.com/policy/]. This copyright notice
* shall be included in all copies or substantial portions of the software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace Facebook\GraphNodes;
use Facebook\FacebookRequest;
use Facebook\Url\FacebookUrlManipulator;
use Facebook\Exceptions\FacebookSDKException;
/**
* Class GraphEdge
*
* @package Facebook
*/
class GraphEdge extends Collection
{
/**
* @var FacebookRequest The original request that generated this data.
*/
protected $request;
/**
* @var array An array of Graph meta data like pagination, etc.
*/
protected $metaData = [];
/**
* @var string|null The parent Graph edge endpoint that generated the list.
*/
protected $parentEdgeEndpoint;
/**
* @var string|null The subclass of the child GraphNode's.
*/
protected $subclassName;
/**
* Init this collection of GraphNode's.
*
* @param FacebookRequest $request The original request that generated this data.
* @param array $data An array of GraphNode's.
* @param array $metaData An array of Graph meta data like pagination, etc.
* @param string|null $parentEdgeEndpoint The parent Graph edge endpoint that generated the list.
* @param string|null $subclassName The subclass of the child GraphNode's.
*/
public function __construct(FacebookRequest $request, array $data = [], array $metaData = [], $parentEdgeEndpoint = null, $subclassName = null)
{
$this->request = $request;
$this->metaData = $metaData;
$this->parentEdgeEndpoint = $parentEdgeEndpoint;
$this->subclassName = $subclassName;
parent::__construct($data);
}
/**
* Gets the parent Graph edge endpoint that generated the list.
*
* @return string|null
*/
public function getParentGraphEdge()
{
return $this->parentEdgeEndpoint;
}
/**
* Gets the subclass name that the child GraphNode's are cast as.
*
* @return string|null
*/
public function getSubClassName()
{
return $this->subclassName;
}
/**
* Returns the raw meta data associated with this GraphEdge.
*
* @return array
*/
public function getMetaData()
{
return $this->metaData;
}
/**
* Returns the next cursor if it exists.
*
* @return string|null
*/
public function getNextCursor()
{
return $this->getCursor('after');
}
/**
* Returns the previous cursor if it exists.
*
* @return string|null
*/
public function getPreviousCursor()
{
return $this->getCursor('before');
}
/**
* Returns the cursor for a specific direction if it exists.
*
* @param string $direction The direction of the page: after|before
*
* @return string|null
*/
public function getCursor($direction)
{
if (isset($this->metaData['paging']['cursors'][$direction])) {
return $this->metaData['paging']['cursors'][$direction];
}
return null;
}
/**
* Generates a pagination URL based on a cursor.
*
* @param string $direction The direction of the page: next|previous
*
* @return string|null
*
* @throws FacebookSDKException
*/
public function getPaginationUrl($direction)
{
$this->validateForPagination();
// Do we have a paging URL?
if (!isset($this->metaData['paging'][$direction])) {
return null;
}
$pageUrl = $this->metaData['paging'][$direction];
return FacebookUrlManipulator::baseGraphUrlEndpoint($pageUrl);
}
/**
* Validates whether or not we can paginate on this request.
*
* @throws FacebookSDKException
*/
public function validateForPagination()
{
if ($this->request->getMethod() !== 'GET') {
throw new FacebookSDKException('You can only paginate on a GET request.', 720);
}
}
/**
* Gets the request object needed to make a next|previous page request.
*
* @param string $direction The direction of the page: next|previous
*
* @return FacebookRequest|null
*
* @throws FacebookSDKException
*/
public function getPaginationRequest($direction)
{
$pageUrl = $this->getPaginationUrl($direction);
if (!$pageUrl) {
return null;
}
$newRequest = clone $this->request;
$newRequest->setEndpoint($pageUrl);
return $newRequest;
}
/**
* Gets the request object needed to make a "next" page request.
*
* @return FacebookRequest|null
*
* @throws FacebookSDKException
*/
public function getNextPageRequest()
{
return $this->getPaginationRequest('next');
}
/**
* Gets the request object needed to make a "previous" page request.
*
* @return FacebookRequest|null
*
* @throws FacebookSDKException
*/
public function getPreviousPageRequest()
{
return $this->getPaginationRequest('previous');
}
/**
* The total number of results according to Graph if it exists.
*
* This will be returned if the summary=true modifier is present in the request.
*
* @return int|null
*/
public function getTotalCount()
{
if (isset($this->metaData['summary']['total_count'])) {
return $this->metaData['summary']['total_count'];
}
return null;
}
/**
* @inheritDoc
*/
public function map(\Closure $callback)
{
return new static(
$this->request,
array_map($callback, $this->items, array_keys($this->items)),
$this->metaData,
$this->parentEdgeEndpoint,
$this->subclassName
);
}
}