Skip to content

Commit

Permalink
Allow to configure hostname for redirect (#53)
Browse files Browse the repository at this point in the history
  • Loading branch information
choonge authored Jan 15, 2021
1 parent b1bbe8b commit bbbb637
Show file tree
Hide file tree
Showing 22 changed files with 163 additions and 46 deletions.
29 changes: 28 additions & 1 deletion Entity/RedirectRoute.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ class RedirectRoute implements RedirectRouteInterface, AuditableInterface
*/
protected $source;

/**
* @var string|null
*/
protected $sourceHost;

/**
* @var string
*/
Expand Down Expand Up @@ -114,7 +119,29 @@ public function getSource()
*/
public function setSource($source)
{
$this->source = $source;
$this->source = '/' . ltrim($source, '/');

return $this;
}

/**
* {@inheritdoc}
*/
public function getSourceHost()
{
return $this->sourceHost;
}

/**
* {@inheritdoc}
*/
public function setSourceHost($sourceHost)
{
if (empty($sourceHost)) {
$sourceHost = null;
}

$this->sourceHost = $sourceHost;

return $this;
}
Expand Down
52 changes: 30 additions & 22 deletions Entity/RedirectRouteRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

namespace Sulu\Bundle\RedirectBundle\Entity;

use Doctrine\ORM\NoResultException;
use Sulu\Bundle\RedirectBundle\Model\RedirectRouteInterface;
use Sulu\Bundle\RedirectBundle\Model\RedirectRouteRepositoryInterface;
use Sulu\Component\Persistence\Repository\ORM\EntityRepository;
Expand All @@ -32,36 +31,22 @@ public function findById($id)
/**
* {@inheritdoc}
*/
public function findEnabledBySource($source)
public function findEnabledBySource($source, $sourceHost = null)
{
$query = $this->createQueryBuilder('redirect_route')
->andWhere('redirect_route.source = :source')
->andWhere('redirect_route.enabled = true')
->setParameter('source', $source)
->getQuery();
$queryBuilder = $this->createFindBySourceQueryBuilder($source, $sourceHost);
$queryBuilder->andWhere('redirect_route.enabled = true');

try {
return $query->getSingleResult();
} catch (NoResultException $exception) {
return;
}
return $queryBuilder->getQuery()->getOneOrNullResult();
}

/**
* {@inheritdoc}
*/
public function findBySource($source)
public function findBySource($source, $sourceHost = null)
{
$query = $this->createQueryBuilder('redirect_route')
->andWhere('redirect_route.source = :source')
->setParameter('source', $source)
->getQuery();
$queryBuilder = $this->createFindBySourceQueryBuilder($source, $sourceHost);

try {
return $query->getSingleResult();
} catch (NoResultException $exception) {
return;
}
return $queryBuilder->getQuery()->getOneOrNullResult();
}

/**
Expand All @@ -79,4 +64,27 @@ public function remove(RedirectRouteInterface $entity)
{
$this->_em->remove($entity);
}

private function createFindBySourceQueryBuilder($source, $sourceHost = null)
{
$queryBuilder = $this->createQueryBuilder('redirect_route')
->andWhere('redirect_route.source = :source')
->setParameter('source', $source)
->orderBy('redirect_route.sourceHost', 'DESC')
->setMaxResults(1);

if (!empty($sourceHost)) {
$queryBuilder->andWhere(
$queryBuilder->expr()->orX(
$queryBuilder->expr()->eq('redirect_route.sourceHost', ':sourceHost'),
$queryBuilder->expr()->eq('redirect_route.sourceHost', "''"),
$queryBuilder->expr()->isNull('redirect_route.sourceHost')
)
);

$queryBuilder->setParameter('sourceHost', $sourceHost);
}

return $queryBuilder;
}
}
10 changes: 7 additions & 3 deletions Manager/RedirectRouteManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,18 @@ public function __construct(RedirectRouteRepositoryInterface $redirectRouteRepos
*/
public function save(RedirectRouteInterface $redirectRoute)
{
$otherRoute = $this->redirectRouteRepository->findBySource($redirectRoute->getSource());
$otherRoute = $this->redirectRouteRepository->findBySource($redirectRoute->getSource(), $redirectRoute->getSourceHost());

if (!$redirectRoute->getId()) {
$redirectRoute->setId(Uuid::uuid4()->toString());
}

if ($otherRoute && $otherRoute->getId() !== $redirectRoute->getId()) {
throw new RedirectRouteNotUniqueException($redirectRoute->getSource());
if (
$otherRoute &&
$otherRoute->getId() !== $redirectRoute->getId() &&
$otherRoute->getSourceHost() === $redirectRoute->getSourceHost()
) {
throw new RedirectRouteNotUniqueException($redirectRoute->getSource(), $redirectRoute->getSourceHost());
}

if (410 === $redirectRoute->getStatusCode()) {
Expand Down
5 changes: 3 additions & 2 deletions Manager/RedirectRouteNotUniqueException.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ class RedirectRouteNotUniqueException extends \Exception

/**
* @param string $source
* @param string|null $sourceHost
*/
public function __construct($source)
public function __construct($source, $sourceHost)
{
parent::__construct(sprintf('The source "%s" is already in use.', $source));
parent::__construct(sprintf('The source "%s" with sourceHost "%s" is already in use.', $source, $sourceHost));

$this->source = $source;
}
Expand Down
16 changes: 16 additions & 0 deletions Model/RedirectRouteInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,22 @@ public function getSource();
*/
public function setSource($source);

/**
* Set source host.
*
* @param string|null $sourceHost
*
* @return $this
*/
public function setSourceHost($sourceHost);

/**
* Returns source host.
*
* @return string|null
*/
public function getSourceHost();

/**
* Returns target.
*
Expand Down
3 changes: 2 additions & 1 deletion Model/RedirectRouteRepositoryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ public function findById($id);
* Find enabled redirect-routes for given source.
*
* @param string $source
* @param string|null $host
*
* @return RedirectRouteInterface
*/
public function findEnabledBySource($source);
public function findEnabledBySource($source, $sourceHost = null);

/**
* Find redirect-routes for given source.
Expand Down
3 changes: 2 additions & 1 deletion Resources/config/doctrine/RedirectRoute.orm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<mapped-superclass name="Sulu\Bundle\RedirectBundle\Entity\RedirectRoute"
repository-class="Sulu\Bundle\RedirectBundle\Entity\RedirectRouteRepository" table="re_redirect_routes">
<unique-constraints>
<unique-constraint columns="source"/>
<unique-constraint columns="source,sourceHost"/>
</unique-constraints>

<id name="id" type="string">
Expand All @@ -16,6 +16,7 @@
<field name="statusCode" type="integer" column="statusCode" nullable="false"/>

<field name="source" type="string" column="source" nullable="false"/>
<field name="sourceHost" type="string" column="sourceHost" nullable="true"/>
<field name="target" type="string" column="target" nullable="false"/>
</mapped-superclass>
</doctrine-mapping>
5 changes: 5 additions & 0 deletions Resources/config/list-builder/RedirectRoute.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@
<orm:entity-name>%sulu.model.redirect_route.class%</orm:entity-name>
</property>

<property name="sourceHost" display="always" list:translation="sulu_redirect.source-host">
<orm:field-name>sourceHost</orm:field-name>
<orm:entity-name>%sulu.model.redirect_route.class%</orm:entity-name>
</property>

<property name="target" display="always" list:translation="sulu_redirect.target">
<orm:field-name>target</orm:field-name>
<orm:entity-name>%sulu.model.redirect_route.class%</orm:entity-name>
Expand Down
1 change: 1 addition & 0 deletions Resources/config/serializer/RedirectRoute.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<property name="enabled" type="boolean"/>
<property name="statusCode" type="integer"/>
<property name="source" type="string"/>
<property name="sourceHost" type="string"/>
<property name="target" type="string"/>

<property name="creator" exclude="true"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,16 @@
data-mapper-property="source" data-validation-required="true" placeholder="/source"/>
</div>

<div class="form-group grid-row">
<label for="redirect-routes-sourceHost"><%= translations.sourceHost %></label>
<input type="text" id="redirect-routes-sourceHost" name="sourceHost" class="form-element"
data-mapper-property="sourceHost" data-validation-required="false" placeholder="www.example.com"/>
</div>

<% if (data.statusCode !== 410) { %>
<div class="form-group grid-row">
<label for="redirect-routes-target" class="required"><%= translations.target %></label>
<input type="text" id="redirect-routes-target" name="target" class="form-element required"
<input type="text" id="redirect-routes-target" name="target" class="form-element input-bold required"
data-mapper-property="target" data-validation-required="true" placeholder="/target"/>
</div>
<% } %>
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Resources/public/dist/components/redirects/list/main.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,16 @@
data-mapper-property="source" data-validation-required="true" placeholder="/source"/>
</div>

<div class="form-group grid-row">
<label for="redirect-routes-sourceHost"><%= translations.sourceHost %></label>
<input type="text" id="redirect-routes-sourceHost" name="sourceHost" class="form-element"
data-mapper-property="sourceHost" data-validation-required="false" placeholder="www.example.com"/>
</div>

<% if (data.statusCode !== 410) { %>
<div class="form-group grid-row">
<label for="redirect-routes-target" class="required"><%= translations.target %></label>
<input type="text" id="redirect-routes-target" name="target" class="form-element required"
<input type="text" id="redirect-routes-target" name="target" class="form-element input-bold required"
data-mapper-property="target" data-validation-required="true" placeholder="/target"/>
</div>
<% } %>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ define([
},
translations: {
source: 'sulu_redirect.source',
sourceHost: 'sulu_redirect.source-host',
target: 'sulu_redirect.target',
conflict: 'sulu_redirect.errors.conflict',
}
Expand Down
Loading

0 comments on commit bbbb637

Please sign in to comment.