open-orchestra/open-orchestra-cms-bundle

View on GitHub
ModelLogBundle/Repository/LogRepository.php

Summary

Maintainability
A
35 mins
Test Coverage
<?php

namespace OpenOrchestra\ModelLogBundle\Repository;

use OpenOrchestra\LogBundle\Repository\LogRepositoryInterface;
use OpenOrchestra\Repository\AbstractAggregateRepository;
use OpenOrchestra\Pagination\Configuration\PaginateFinderConfiguration;
use Solution\MongoAggregation\Pipeline\Stage;

/**
 * Class LogRepository
 */
class LogRepository extends AbstractAggregateRepository implements LogRepositoryInterface
{
    /**
     * @param PaginateFinderConfiguration $configuration
     *
     * @return array
     */
    public function findForPaginate(PaginateFinderConfiguration $configuration)
    {
        $qa = $this->createAggregationQuery();

        $this->filterSearch($configuration, $qa);

        $order = $configuration->getOrder();
        if (!empty($order)) {
            $qa->sort($order);
        }

        $qa->skip($configuration->getSkip());
        $qa->limit($configuration->getLimit());

        return $this->hydrateAggregateQuery($qa);
    }

    /**
     * @return int
     */
    public function count()
    {
        $qa = $this->createAggregationQuery();

        return $this->countDocumentAggregateQuery($qa);
    }

    /**
     * @param PaginateFinderConfiguration $configuration
     *
     * @return int
     */
    public function countWithFilter(PaginateFinderConfiguration $configuration)
    {
        $qa = $this->createAggregationQuery();
        $this->filterSearch($configuration, $qa);

        return $this->countDocumentAggregateQuery($qa);
    }

    /**
     * @param PaginateFinderConfiguration $configuration
     * @param Stage                       $qa
     *
     * @return array
     */
    protected function filterSearch(PaginateFinderConfiguration $configuration, Stage $qa)
    {
        $qa->match(array('extra.site_id' => $configuration->getSearchIndex('site_id')));

        $userName = $configuration->getSearchIndex('user_name');
        if (null !== $userName && '' !== $userName) {
            $qa->match(array('extra.user_name' => new \MongoRegex('/.*' . $userName . '.*/i')));
        }

        $userIP = $configuration->getSearchIndex('user_ip');
        if (null !== $userIP && '' !== $userIP) {
            $qa->match(array('extra.user_ip' => new \MongoRegex('/.*' . $userIP . '.*/i')));
        }

        $date = $configuration->getSearchIndex('date');
        if (null !== $date && '' !== $date) {
            $dateFormat = $configuration->getSearchIndex('date-format');
            if (null !== $dateFormat && '' !== $dateFormat) {
                $dateFormat = str_replace('yy', 'Y', $dateFormat);
                $dateFormat = str_replace('mm', 'm', $dateFormat);
                $dateFormat = str_replace('dd', 'd', $dateFormat);
                $date = \DateTime::createFromFormat($dateFormat, $date)->format('Y-m-d');
                $qa->match(array('datetime' => new \MongoRegex('/' . $date . '.*/i')));
            }
        }

        return $qa;
    }
}