SuperdeskWebPublisher/SWPBridgeBundle

View on GitHub
Serializer/PackageSubscriber.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

/*
 * This file is part of the Superdesk Web Publisher Bridge Bundle.
 *
 * Copyright 2016 Sourcefabric z.ú. and contributors.
 *
 * For the full copyright and license information, please see the
 * AUTHORS and LICENSE files distributed with this source code.
 *
 * @copyright 2016 Sourcefabric z.ú
 * @license http://www.superdesk.org/license
 */

namespace SWP\Bundle\BridgeBundle\Serializer;

use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;
use SWP\Bundle\ContentBundle\Model\MediaAwareInterface;
use SWP\Component\Bridge\Model\ItemInterface;
use SWP\Component\Bridge\Model\Package;
use SWP\Component\Bridge\Model\PackageInterface;

class PackageSubscriber implements EventSubscriberInterface
{
    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        return [
            [
                'event' => 'serializer.post_deserialize',
                'method' => 'onPostDeserialize',
            ],
            [
                'event' => 'serializer.pre_serialize',
                'method' => 'onPreSerialize',
            ],
        ];
    }

    public function onPostDeserialize(ObjectEvent $event)
    {
        /** @var PackageInterface $package */
        $package = $event->getObject();
        if ($package instanceof PackageInterface) {
            foreach ($package->getItems() as $item) {
                $this->processRenditions($item);

                foreach ($item->getItems() as $imageItem) {
                    $this->processRenditions($imageItem);
                }
            }

            $this->processGroups($package);

            foreach ($package->getItems() as $key => $item) {
                $item->setName($key);
            }

            $this->setFeatureMedia($package);
        }
    }

    public function onPreSerialize(ObjectEvent $event)
    {
        /** @var PackageInterface $package */
        $package = $event->getObject();

        if ($package instanceof PackageInterface) {
            $this->setFeatureMedia($package);
        }
    }

    private function processGroups(PackageInterface $package): void
    {
        foreach ((array) $package->getGroups() as $groups) {
            foreach ((array) $groups as $key => $group) {
                $group->setCode($key);
                foreach ($group->getItems() as $groupItem) {
                    $groupItem->setGroup($group);
                    $groupItem->setName($groupItem->getGuid());
                    $this->processRenditions($groupItem);
                }

                $group->setPackage($package);
            }
        }
    }

    private function setFeatureMedia(PackageInterface $package)
    {
        /** @var ItemInterface $item */
        foreach ($package->getItems() as $item) {
            if (MediaAwareInterface::KEY_FEATURE_MEDIA === $item->getName()) {
                $package->setFeatureMedia($item);
            }
        }
    }

    private function processRenditions(ItemInterface $item)
    {
        foreach ($item->getRenditions() as $key => $rendition) {
            $rendition->setName($key);
            $rendition->setItem($item);
        }
    }
}