Skip to content

Commit

Permalink
IBX-3514: Extracted isExpired method (#47)
Browse files Browse the repository at this point in the history
* IBX-3421: Added InvitationType form

* IBX-3514: Extraced isExpired method with twig helper

* Changed type to hidden

* Update src/lib/Templating/Twig/InvitationExtension.php

Co-authored-by: Konrad Oboza <konrad.oboza@ibexa.co>

Co-authored-by: Konrad Oboza <konrad.oboza@ibexa.co>
  • Loading branch information
ViniTou and konradoboza authored Aug 8, 2022
1 parent ebe1829 commit 565cac0
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 2 deletions.
4 changes: 4 additions & 0 deletions src/bundle/Resources/config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ services:
tags:
- { name: twig.extension }

Ibexa\User\Templating\Twig\InvitationExtension:
tags:
- { name: twig.extension }

Ibexa\User\ExceptionHandler\NullActionResultHandler: ~
Ibexa\User\ExceptionHandler\ActionResultHandler: '@Ibexa\User\ExceptionHandler\NullActionResultHandler'

Expand Down
2 changes: 2 additions & 0 deletions src/contracts/Invitation/InvitationService.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public function createInvitation(

public function isValid(Invitation $invitation): bool;

public function isExpired(Invitation $invitation): bool;

public function getInvitation(string $hash): Invitation;

public function getInvitationByEmail(string $email): Invitation;
Expand Down
55 changes: 55 additions & 0 deletions src/lib/Form/DataTransformer/InvitationTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace Ibexa\User\Form\DataTransformer;

use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException;
use Ibexa\Contracts\User\Invitation\Invitation;
use Ibexa\Contracts\User\Invitation\InvitationService;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class InvitationTransformer implements DataTransformerInterface
{
private InvitationService $invitationService;

public function __construct(InvitationService $invitationService)
{
$this->invitationService = $invitationService;
}

public function transform($value): ?string
{
if (null === $value) {
return null;
}

if (!$value instanceof Invitation) {
throw new TransformationFailedException('Expected a ' . Invitation::class . ' object.');
}

return $value->getHash();
}

public function reverseTransform($value): ?Invitation
{
if (empty($value)) {
return null;
}

if (!is_string($value)) {
throw new TransformationFailedException('Expected a hash string.');
}

try {
return $this->invitationService->getInvitation($value);
} catch (NotFoundException $e) {
throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
}
}
}
33 changes: 33 additions & 0 deletions src/lib/Form/Type/Invitation/InvitationType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
namespace Ibexa\User\Form\Type\Invitation;

use Ibexa\Contracts\User\Invitation\InvitationService;
use Ibexa\User\Form\DataTransformer\InvitationTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;

final class InvitationType extends AbstractType
{
private InvitationService $invitationService;

public function __construct(InvitationService $invitationService)
{
$this->invitationService = $invitationService;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addViewTransformer(new InvitationTransformer($this->invitationService));
}

public function getParent(): ?string
{
return HiddenType::class;
}
}
9 changes: 7 additions & 2 deletions src/lib/Invitation/InvitationService.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public function createInvitation(
return $this->domainMapper->buildDomainObject($invitation);
}

public function isValid(Invitation $invitation): bool
public function isExpired(Invitation $invitation): bool
{
$current = new DateTime();
$expirationTime = $this->configResolver->getParameter(
Expand All @@ -138,7 +138,12 @@ public function isValid(Invitation $invitation): bool
$invitation->getSiteAccessIdentifier()
);

if ($invitation->createdAt()->add(new DateInterval($expirationTime)) <= $current) {
return $current >= $invitation->createdAt()->add(new DateInterval($expirationTime));
}

public function isValid(Invitation $invitation): bool
{
if ($this->isExpired($invitation)) {
return false;
}

Expand Down
38 changes: 38 additions & 0 deletions src/lib/Templating/Twig/InvitationExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace Ibexa\User\Templating\Twig;

use Ibexa\Contracts\User\Invitation\Invitation;
use Ibexa\Contracts\User\Invitation\InvitationService;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class InvitationExtension extends AbstractExtension
{
private InvitationService $invitationService;

public function __construct(
InvitationService $invitationService
) {
$this->invitationService = $invitationService;
}

/**
* {@inheritdoc}
*/
public function getFunctions(): array
{
return [
new TwigFunction(
'ibexa_is_invitation_expired',
fn (Invitation $invitation): bool => $this->invitationService->isExpired($invitation)
),
];
}
}

0 comments on commit 565cac0

Please sign in to comment.