Commit 369171d1 authored by Emiliano Balbuena's avatar Emiliano Balbuena
Browse files

(wip): SEO

parent 79f1c4b4
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -133,6 +133,11 @@ class Manager
            return null;
            return null;
        }
        }


        return $this->hydrate($settings);
    }

    public function hydrate($settings)
    {
        return $this->hydrateSettingsDelegate
        return $this->hydrateSettingsDelegate
            ->onGet($this->user, $settings);
            ->onGet($this->user, $settings);
    }
    }
+4 −0
Original line number Original line Diff line number Diff line
@@ -24,6 +24,10 @@ class ProProvider extends Provider
            return new Domain();
            return new Domain();
        }, ['useFactory' => true]);
        }, ['useFactory' => true]);


        $this->di->bind('Pro\SEO', function ($di) {
            return new SEO();
        }, ['useFactory' => true]);

        $this->di->bind('Pro\Channel\Manager', function ($di) {
        $this->di->bind('Pro\Channel\Manager', function ($di) {
            return new Channel\Manager();
            return new Channel\Manager();
        }, ['useFactory' => true]);
        }, ['useFactory' => true]);
+24 −6
Original line number Original line Diff line number Diff line
@@ -5,6 +5,7 @@


namespace Minds\Core\Pro;
namespace Minds\Core\Pro;


use Exception;
use Minds\Core\Config;
use Minds\Core\Config;
use Minds\Core\Di\Di;
use Minds\Core\Di\Di;
use Minds\Core\EntitiesBuilder;
use Minds\Core\EntitiesBuilder;
@@ -21,31 +22,48 @@ class SEO
    /** @var Config */
    /** @var Config */
    protected $config;
    protected $config;


    /** @var User */
    protected $user;

    public function __construct(EntitiesBuilder $entitiesBuilder = null, Config $config = null)
    public function __construct(EntitiesBuilder $entitiesBuilder = null, Config $config = null)
    {
    {
        $this->entitiesBuilder = $entitiesBuilder ?: Di::_()->get('EntitiesBuilder');
        $this->entitiesBuilder = $entitiesBuilder ?: Di::_()->get('EntitiesBuilder');
        $this->config = $config ?: Di::_()->get('Config');
        $this->config = $config ?: Di::_()->get('Config');
    }
    }


    /**
     * @param User $user
     * @return SEO
     */
    public function setUser(User $user)
    {
        $this->user = $user;
        return $this;
    }

    /**
     * @param Settings $proSettings
     * @throws Exception
     */
    public function setup(Settings $proSettings)
    public function setup(Settings $proSettings)
    {
    {
        Manager::reset();
        Manager::reset();


        $channel = new User($proSettings->getUserGuid());
        $title = $proSettings->getTitle() ?: $this->user->name;


        $title = $proSettings->getOneLineHeadline() ?? $channel->name;
        $tagList = array_map(function ($tag) {
            return $tag['tag'];
        }, $proSettings->getTagList());


        Manager::setDefaults([
        Manager::setDefaults([
            'title' => $title,
            'title' => $title,
            'description' => $proSettings->getOneLineHeadline(),
            'description' => $proSettings->getOneLineHeadline(),
            'keywords' => $channel->getTags(),
            'keywords' => implode(',', $tagList),
            'og:title' => $title,
            'og:title' => $title,
            'og:url' => $proSettings->getDomain(),
            'og:url' => $proSettings->getDomain(),
            'og:description' => $proSettings->getOneLineHeadline(),
            'og:description' => $proSettings->getOneLineHeadline(),
            'og:type' => 'website',
            'og:type' => 'website',
            'og:image' => $proSettings->getLogoImage() ?? $this->config->cdn_assets_url . 'assets/logos/placeholder.jpg',
            'og:image' => $this->user->getIconURL('large'),
            'og:image:width' => 471,
            'og:image:height' => 199,
        ]);
        ]);


        Manager::add('/feed', [$this, 'activityHandler']);
        Manager::add('/feed', [$this, 'activityHandler']);
+46 −11
Original line number Original line Diff line number Diff line
@@ -6,26 +6,46 @@


namespace Minds\Core\Router\Middleware;
namespace Minds\Core\Router\Middleware;


use Minds\Core\EntitiesBuilder;
use Minds\Core\Pro\Manager;
use Minds\Core\Di\Di;
use Minds\Core\Di\Di;
use Minds\Core\Pro\Domain;
use Minds\Core\Pro\Domain;
use Minds\Core\Pro\SEO;
use Zend\Diactoros\Response\JsonResponse;
use Zend\Diactoros\Response\JsonResponse;
use Zend\Diactoros\ServerRequest;
use Zend\Diactoros\ServerRequest;
use Minds\Core\Pro\SEO;


class ProMiddleware implements RouterMiddleware
class ProMiddleware implements RouterMiddleware
{
{
    /** @var Domain */
    /** @var Domain */
    protected $proDomain;
    protected $domain;

    /** @var Manager */
    protected $manager;

    /** @var SEO */
    protected $seo;

    /** @var EntitiesBuilder */
    protected $entitiesBuilder;


    /**
    /**
     * ProMiddleware constructor.
     * ProMiddleware constructor.
     * @param Domain $proDomain
     * @param Domain $domain
     * @param Manager $manager
     * @param SEO $seo
     * @param EntitiesBuilder $entitiesBuilder
     */
     */
    public function __construct(
    public function __construct(
        $proDomain = null
        $domain = null,
        $manager = null,
        $seo = null,
        $entitiesBuilder = null
    )
    )
    {
    {
        $this->proDomain = $proDomain ?: Di::_()->get('Pro\Domain');
        $this->domain = $domain ?: Di::_()->get('Pro\Domain');
        $this->manager = $manager ?: Di::_()->get('Pro\Manager');
        $this->seo = $seo ?: Di::_()->get('Pro\SEO');
        $this->entitiesBuilder = $entitiesBuilder ?: Di::_()->get('EntitiesBuilder');
    }
    }


    /**
    /**
@@ -35,22 +55,21 @@ class ProMiddleware implements RouterMiddleware
     */
     */
    public function onRequest(ServerRequest $request, JsonResponse &$response)
    public function onRequest(ServerRequest $request, JsonResponse &$response)
    {
    {
        $origin = $request->getServerParams()['HTTP_ORIGIN'];
        $serverParams = $request->getServerParams() ?? [];
        $host = parse_url($origin, PHP_URL_HOST);

        $host = parse_url($serverParams['HTTP_ORIGIN'] ?? '', PHP_URL_HOST) ?: $serverParams['HTTP_HOST'];


        if (!$host) {
        if (!$host) {
            return;
            return;
        }
        }


        $settings = $this->proDomain->lookup($host);
        $settings = $this->domain->lookup($host);


        if (!$settings) {
        if (!$settings) {
            return;
            return;
        }
        }


        (new SEO())->setup($settings);
        header(sprintf("Access-Control-Allow-Origin: %s", $host));

        header(sprintf("Access-Control-Allow-Origin: %s", $origin));
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');
        header('Access-Control-Max-Age: 86400');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
@@ -59,5 +78,21 @@ class ProMiddleware implements RouterMiddleware
        if ($request->getMethod() === 'OPTIONS') {
        if ($request->getMethod() === 'OPTIONS') {
            return false;
            return false;
        }
        }

        // Get Pro channel

        $user = $this->entitiesBuilder->single($settings->getUserGuid());

        // Hydrate with asset URLs

        $settings = $this->manager
            ->setUser($user)
            ->hydrate($settings);

        // Setup SEO

        $this->seo
            ->setUser($user)
            ->setup($settings);
    }
    }
}
}