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

(wip): SEO

1 merge request!308WIP: (feat): Minds Pro
Pipeline #80771856 failed with stages
in 4 minutes and 51 seconds
......@@ -133,6 +133,11 @@ class Manager
return null;
}
return $this->hydrate($settings);
}
public function hydrate($settings)
{
return $this->hydrateSettingsDelegate
->onGet($this->user, $settings);
}
......
......@@ -24,6 +24,10 @@ class ProProvider extends Provider
return new Domain();
}, ['useFactory' => true]);
$this->di->bind('Pro\SEO', function ($di) {
return new SEO();
}, ['useFactory' => true]);
$this->di->bind('Pro\Channel\Manager', function ($di) {
return new Channel\Manager();
}, ['useFactory' => true]);
......
......@@ -5,6 +5,7 @@
namespace Minds\Core\Pro;
use Exception;
use Minds\Core\Config;
use Minds\Core\Di\Di;
use Minds\Core\EntitiesBuilder;
......@@ -21,31 +22,48 @@ class SEO
/** @var Config */
protected $config;
/** @var User */
protected $user;
public function __construct(EntitiesBuilder $entitiesBuilder = null, Config $config = null)
{
$this->entitiesBuilder = $entitiesBuilder ?: Di::_()->get('EntitiesBuilder');
$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)
{
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([
'title' => $title,
'description' => $proSettings->getOneLineHeadline(),
'keywords' => $channel->getTags(),
'keywords' => implode(',', $tagList),
'og:title' => $title,
'og:url' => $proSettings->getDomain(),
'og:description' => $proSettings->getOneLineHeadline(),
'og:type' => 'website',
'og:image' => $proSettings->getLogoImage() ?? $this->config->cdn_assets_url . 'assets/logos/placeholder.jpg',
'og:image:width' => 471,
'og:image:height' => 199,
'og:image' => $this->user->getIconURL('large'),
]);
Manager::add('/feed', [$this, 'activityHandler']);
......
......@@ -6,26 +6,46 @@
namespace Minds\Core\Router\Middleware;
use Minds\Core\EntitiesBuilder;
use Minds\Core\Pro\Manager;
use Minds\Core\Di\Di;
use Minds\Core\Pro\Domain;
use Minds\Core\Pro\SEO;
use Zend\Diactoros\Response\JsonResponse;
use Zend\Diactoros\ServerRequest;
use Minds\Core\Pro\SEO;
class ProMiddleware implements RouterMiddleware
{
/** @var Domain */
protected $proDomain;
protected $domain;
/** @var Manager */
protected $manager;
/** @var SEO */
protected $seo;
/** @var EntitiesBuilder */
protected $entitiesBuilder;
/**
* ProMiddleware constructor.
* @param Domain $proDomain
* @param Domain $domain
* @param Manager $manager
* @param SEO $seo
* @param EntitiesBuilder $entitiesBuilder
*/
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)
{
$origin = $request->getServerParams()['HTTP_ORIGIN'];
$host = parse_url($origin, PHP_URL_HOST);
$serverParams = $request->getServerParams() ?? [];
$host = parse_url($serverParams['HTTP_ORIGIN'] ?? '', PHP_URL_HOST) ?: $serverParams['HTTP_HOST'];
if (!$host) {
return;
}
$settings = $this->proDomain->lookup($host);
$settings = $this->domain->lookup($host);
if (!$settings) {
return;
}
(new SEO())->setup($settings);
header(sprintf("Access-Control-Allow-Origin: %s", $origin));
header(sprintf("Access-Control-Allow-Origin: %s", $host));
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
......@@ -59,5 +78,21 @@ class ProMiddleware implements RouterMiddleware
if ($request->getMethod() === 'OPTIONS') {
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);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment