253 lines
6.7 KiB
PHP
Executable File
253 lines
6.7 KiB
PHP
Executable File
<?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
|
|
);
|
|
}
|
|
}
|