comsave/salesforce-mapper-bundle

View on GitHub
src/LogicItLab/Salesforce/MapperBundle/Response/MappedRecordIterator.php

Summary

Maintainability
A
0 mins
Test Coverage
F
39%
<?php

namespace LogicItLab\Salesforce\MapperBundle\Response;

use Countable;
use LogicItLab\Salesforce\MapperBundle\Mapper;
use OuterIterator;
use Phpforce\SoapClient\Result\RecordIterator;

/**
 * A mapped record iterator encapsulates a plain Salesforce record iterator and
 * returns a mapped domain model for each Salesforce record
 *
 * @author Logic It Lab <team@logicitlab.com>
 */
class MappedRecordIterator implements OuterIterator, Countable
{
    /**
     * Record iterator
     *
     * @var RecordIterator
     */
    protected $recordIterator;

    /**
     * Mapper
     *
     * @var Mapper
     */
    protected $mapper;

    /**
     * Domain model object
     *
     * @var mixed
     */
    protected $modelClass;

    /**
     * Construct a mapped record iterator
     *
     * @param RecordIterator $recordIterator
     * @param Mapper              Salesforce mapper
     * @param mixed $modelClass Model class name
     */
    public function __construct(RecordIterator $recordIterator, Mapper $mapper, $modelClass)
    {
        $this->recordIterator = $recordIterator;
        $this->mapper = $mapper;
        $this->modelClass = $modelClass;
    }

    /**
     * {@inheritdoc}
     *
     * @return RecordIterator
     */
    public function getInnerIterator()
    {
        return $this->recordIterator;
    }

    /**
     * Get domain model object
     *
     * @return mixed The domain model object containing the values from the
     *               Salesforce record
     *
     */
    public function current()
    {
        return $this->get($this->key());
    }

    /**
     * {@inheritdoc}
     */
    public function next()
    {
        $this->recordIterator->next();
    }

    /**
     * {@inheritdoc}
     */
    public function key()
    {
        return $this->recordIterator->key();
    }

    /**
     * {@inheritdoc}
     */
    public function valid()
    {
        return $this->recordIterator->valid();
    }

    /**
     * {@inheritdoc}
     */
    public function rewind()
    {
        $this->recordIterator->rewind();
    }

    /**
     * Get first domain model object in collection
     *
     * @return mixed
     */
    public function first()
    {
        return $this->get(0);
    }

    /**
     * Get total number of records returned by Salesforce
     *
     * @return int
     */
    public function count()
    {
        return $this->recordIterator->count();
    }

    /**
     * Get object at key
     *
     * @param int $key
     * @return object | null
     */
    public function get($key)
    {
        $sObject = $this->recordIterator->seek($key);
        if (!$sObject) {
            return null;
        }

        return $this->mapper->mapToDomainObject($sObject, $this->modelClass);
    }
}