...
 
Commits (3)
......@@ -16,14 +16,20 @@ class InitializeSettingsDelegate
/** @var Repository */
protected $repository;
/** @var SetupRoutingDelegate */
protected $setupRoutingDelegate;
/**
* InitializeSettingsDelegate constructor.
* @param Repository $repository
* @param SetupRoutingDelegate $setupRoutingDelegate
*/
public function __construct(
$repository = null
$repository = null,
$setupRoutingDelegate = null
) {
$this->repository = $repository ?: new Repository();
$this->setupRoutingDelegate = $setupRoutingDelegate ?: new SetupRoutingDelegate();
}
/**
......@@ -43,14 +49,13 @@ class InitializeSettingsDelegate
->setUserGuid($user->guid);
}
if (!$settings->getDomain()) {
$settings->setDomain("pro-{$user->guid}.minds.com");
}
if (!$settings->getTitle()) {
$settings->setTitle($user->name ?: $user->username);
}
$this->setupRoutingDelegate
->onUpdate($settings);
$this->repository
->add($settings);
}
......
<?php
/**
* SetupRoutingDelegate
* @author edgebal
*/
namespace Minds\Core\Pro\Delegates;
use Minds\Core\Config;
use Minds\Core\Di\Di;
use Minds\Core\Pro\Domain\EdgeRouters\EdgeRouterInterface;
use Minds\Core\Pro\Domain\EdgeRouters\TraefikDynamoDb;
use Minds\Core\Pro\Settings;
class SetupRoutingDelegate
{
/** @var Config */
protected $config;
/** @var EdgeRouterInterface */
protected $edgeRouter;
/**
* SetupRoutingDelegate constructor.
* @param Config $config
* @param EdgeRouterInterface $edgeRouter
*/
public function __construct(
$config = null,
$edgeRouter = null
) {
$this->config = $config ?: Di::_()->get('Config');
$this->edgeRouter = $edgeRouter ?: new TraefikDynamoDb();
}
public function onUpdate(Settings $settings)
{
$userGuid = $settings->getUserGuid();
if (!$settings->getDomain()) {
$settings->setDomain(sprintf("pro-%s.%s", $userGuid, $this->config->get('pro')['subdomain_prefix'] ?? 'minds.com'));
}
$success = $this->edgeRouter
->initialize()
->putEndpoint($settings);
if (!$success) {
// TODO: Issue a warning based on $success
}
}
}
......@@ -38,7 +38,7 @@ class Domain
*/
public function lookup(string $domain)
{
$rootDomains = $this->config->get('root_domains') ?: [];
$rootDomains = $this->config->get('pro')['root_domains'] ?? [];
if (in_array(strtolower($domain), $rootDomains, true)) {
return null;
......
<?php
/**
* EdgeRouterInterface
* @author edgebal
*/
namespace Minds\Core\Pro\Domain\EdgeRouters;
use Minds\Core\Pro\Settings;
interface EdgeRouterInterface
{
public function initialize(): EdgeRouterInterface;
public function putEndpoint(Settings $settings): bool;
}
<?php
/**
* TraefikDynamoDb
* @author edgebal
*/
namespace Minds\Core\Pro\Domain\EdgeRouters;
use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
use Minds\Core\Config;
use Minds\Core\Di\Di;
use Minds\Core\Pro\Settings;
class TraefikDynamoDb implements EdgeRouterInterface
{
/** @var Config */
protected $config;
/** @var DynamoDbClient */
protected $dynamoDb;
/**
* TraefikDynamoDb constructor.
* @param Config $config
*/
public function __construct(
$config = null
) {
$this->config = $config ?: Di::_()->get('Config');
}
public function initialize(): EdgeRouterInterface
{
$awsConfig = $this->config->get('aws');
$opts = [
'region' => $awsConfig['region']
];
if (!isset($awsConfig['useRoles']) || !$awsConfig['useRoles']) {
$opts['credentials'] = [
'key' => $awsConfig['key'],
'secret' => $awsConfig['secret'],
];
}
if (isset($awsConfig['dynamoDbEndpoint'])) {
$opts['endpoint'] = $awsConfig['dynamoDbEndpoint'];
}
$this->dynamoDb = new DynamoDbClient(array_merge([
'version' => '2012-08-10',
], $opts));
return $this;
}
public function putEndpoint(Settings $settings): bool
{
$domain = $settings->getDomain();
if (!$domain) {
return false;
}
$userGuid = $settings->getUserGuid();
$marshaler = new Marshaler();
$entry = $marshaler->marshalJson(json_encode([
'id' => "minds-pro-frontend-{$userGuid}",
'name' => "minds-pro-{$userGuid}",
'frontend' => [
'backend' => 'minds-pro',
'routes' => [
'pro' => [
'rule' => "Host: {$domain}"
]
]
]
]));
try {
$this->dynamoDb->putItem([
'TableName' => $this->config->get('pro')['dynamodb_table_name'],
'Item' => $entry,
]);
return true;
} catch (DynamoDbException $e) {
error_log($e);
return false;
}
}
}
......@@ -21,41 +21,47 @@ class Manager
/** @var Save */
protected $saveAction;
/** @var EntitiesBuilder */
protected $entitiesBuilder;
/** @var Delegates\InitializeSettingsDelegate */
protected $initializeSettingsDelegate;
/** @var Delegates\HydrateSettingsDelegate */
protected $hydrateSettingsDelegate;
/** @var Delegates\SetupRoutingDelegate */
protected $setupRoutingDelegate;
/** @var User */
protected $user;
/** @var User */
protected $actor;
/** @var EntitiesBuilder */
protected $entitiesBuilder;
/**
* Manager constructor.
* @param Repository $repository
* @param Save $saveAction
* @param EntitiesBuilder $entitiesBuilder
* @param Delegates\InitializeSettingsDelegate $initializeSettingsDelegate
* @param Delegates\HydrateSettingsDelegate $hydrateSettingsDelegate
* @param EntitiesBuilder $entitiesBuilder
* @param Delegates\SetupRoutingDelegate $setupRoutingDelegate
*/
public function __construct(
$repository = null,
$saveAction = null,
$entitiesBuilder = null,
$initializeSettingsDelegate = null,
$hydrateSettingsDelegate = null,
$entitiesBuilder = null
$setupRoutingDelegate = null
) {
$this->repository = $repository ?: new Repository();
$this->saveAction = $saveAction ?: new Save();
$this->entitiesBuilder = $entitiesBuilder ?: Di::_()->get('EntitiesBuilder');
$this->initializeSettingsDelegate = $initializeSettingsDelegate ?: new Delegates\InitializeSettingsDelegate();
$this->hydrateSettingsDelegate = $hydrateSettingsDelegate ?: new Delegates\HydrateSettingsDelegate();
$this->entitiesBuilder = $entitiesBuilder ?: Di::_()->get('EntitiesBuilder');
$this->setupRoutingDelegate = $setupRoutingDelegate ?: new Delegates\SetupRoutingDelegate();
}
/**
......@@ -316,6 +322,9 @@ class Manager
->setCustomHead($values['custom_head']);
}
$this->setupRoutingDelegate
->onUpdate($settings);
return $this->repository->update($settings);
}
}
......@@ -574,4 +574,8 @@ $CONFIG->set('gitlab', [
'private_key' => ''
]);
$CONFIG->set('root_domains', [ 'minds.com', 'www.minds.com', 'localhost' ]);
$CONFIG->set('pro', [
'root_domains' => ['minds.com', 'www.minds.com', 'localhost'],
'subdomain_prefix' => 'minds.com',
'dynamodb_table_name' => 'traefik',
]);