Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ include $(ENV)
-include $(ENV_LOCAL)



coding-standards: vendor
vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php --diff --verbose

default:
@echo "make needs target:"
@egrep -e '^\S+' ./Makefile | grep -v default | sed -r 's/://' | sed -r 's/^/ - /'
Expand Down Expand Up @@ -106,7 +110,7 @@ test-run-functional: debug-print-env

# Запустить один функциональный тест с дебагером
run-one-functional-test: debug-print-env
docker-compose run --rm php-cli php -dxdebug.start_with_request=yes vendor/bin/phpunit --filter 'testUninstallWithHappyPath' tests/Functional/Bitrix24Accounts/UseCase/Uninstall/HandlerTest.php
docker-compose run --rm php-cli php -dxdebug.start_with_request=yes vendor/bin/phpunit --filter 'testCreateExistingAccount' tests/Functional/Bitrix24Accounts/UseCase/InstallStart/HandlerTest.php

schema-drop:
docker-compose run --rm php-cli php bin/doctrine orm:schema-tool:drop --force
Expand Down
98 changes: 48 additions & 50 deletions src/Bitrix24Accounts/Entity/Bitrix24Account.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,20 @@ class Bitrix24Account extends AggregateRoot implements Bitrix24AccountInterface
private ?string $comment = null;

public function __construct(
private readonly Uuid $id,
private readonly int $bitrix24UserId,
private readonly bool $isBitrix24UserAdmin,
private readonly Uuid $id,
private readonly int $bitrix24UserId,
private readonly bool $isBitrix24UserAdmin,
/** bitrix24 portal unique id */
private readonly string $memberId,
private string $domainUrl,
private Bitrix24AccountStatus $status,
private AuthToken $authToken,
private readonly string $memberId,
private string $domainUrl,
private Bitrix24AccountStatus $status,
private AuthToken $authToken,
private readonly CarbonImmutable $createdAt,
private CarbonImmutable $updatedAt,
private int $applicationVersion,
private Scope $applicationScope,
bool $isEmitBitrix24AccountCreatedEvent = false,
)
{
private CarbonImmutable $updatedAt,
private int $applicationVersion,
private Scope $applicationScope,
bool $isEmitBitrix24AccountCreatedEvent = false,
) {
$this->addAccountCreatedEventIfNeeded($isEmitBitrix24AccountCreatedEvent);
}

Expand Down Expand Up @@ -195,50 +194,15 @@ public function applicationInstalled(string $applicationToken): void
);
}

private function guardEmpty($applicationToken)
{
if ('' === $applicationToken) {
throw new InvalidArgumentException('application token cannot be empty');
}
}

private function guardTokenMismatch($applicationToken)
{
if ($this->applicationToken !== $applicationToken) {
throw new InvalidArgumentException(
sprintf(
'application token «%s» mismatch with application token «%s» for bitrix24 account %s for domain %s',
$applicationToken,
$this->applicationToken,
$this->id->toRfc4122(),
$this->domainUrl
)
);
}
}

private function guardStatusIsActive()
{
if (Bitrix24AccountStatus::active !== $this->status) {
throw new InvalidArgumentException(
sprintf(
'for uninstall account must be in status «active», current status - «%s»',
$this->status->name
)
);
}
}

/**
* @throws InvalidArgumentException
*/
#[\Override]
public function applicationUninstalled(string $applicationToken): void
{

$this->guardEmpty($applicationToken);
$this->guardEmptyToken($applicationToken);
$this->guardTokenMismatch($applicationToken);
$this->guardStatusIsActive();
$this->guardApplicationIsActive();
$this->status = Bitrix24AccountStatus::deleted;
$this->updatedAt = new CarbonImmutable();
$this->events[] = new Bitrix24AccountApplicationUninstalledEvent(
Expand Down Expand Up @@ -345,6 +309,40 @@ public function getComment(): ?string
return $this->comment;
}

private function guardEmptyToken($applicationToken)
{
if ('' === $applicationToken) {
throw new InvalidArgumentException('application token cannot be empty');
}
}

private function guardTokenMismatch($applicationToken): void
{
if ($this->applicationToken !== $applicationToken) {
throw new InvalidArgumentException(
sprintf(
'application token «%s» mismatch with application token «%s» for bitrix24 account %s for domain %s',
$applicationToken,
$this->applicationToken,
$this->id->toRfc4122(),
$this->domainUrl
)
);
}
}

private function guardApplicationIsActive(): void
{
if (Bitrix24AccountStatus::active !== $this->status) {
throw new InvalidArgumentException(
sprintf(
'for uninstall account must be in status «active», current status - «%s»',
$this->status->name
)
);
}
}

private function addAccountCreatedEventIfNeeded(bool $isEmitCreatedEvent): void
{
if ($isEmitCreatedEvent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
use Bitrix24\SDK\Application\Contracts\Bitrix24Accounts\Repository\Bitrix24AccountRepositoryInterface;
use Bitrix24\SDK\Application\Contracts\Events\AggregateRootEventsEmitterInterface;
use Bitrix24\SDK\Core\Exceptions\InvalidArgumentException;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Uid\Uuid;
Expand All @@ -20,8 +19,7 @@ class Bitrix24AccountRepository extends EntityRepository implements Bitrix24Acco
{
public function __construct(
EntityManagerInterface $entityManager
)
{
) {
parent::__construct($entityManager, $entityManager->getClassMetadata(Bitrix24Account::class));
}

Expand All @@ -33,16 +31,15 @@ public function __construct(
#[\Override]
public function getById(Uuid $uuid): Bitrix24AccountInterface
{

$account = $this->getEntityManager()->getRepository(Bitrix24Account::class)
->createQueryBuilder('b24')
->where('b24.id = :id')
->andWhere('b24.status != :status')
->setParameter('id', $uuid)
->setParameter('status', Bitrix24AccountStatus::deleted)
->getQuery()
->getOneOrNullResult();
// $account = $this->getEntityManager()->getRepository(Bitrix24Account::class)->find($uuid);
->getOneOrNullResult();

if (null === $account) {
throw new Bitrix24AccountNotFoundException(
sprintf('bitrix24 account not found by id %s', $uuid->toRfc4122())
Expand Down Expand Up @@ -83,10 +80,10 @@ public function save(Bitrix24AccountInterface $bitrix24Account): void
*/
#[\Override]
public function findByMemberId(
string $memberId,
string $memberId,
?Bitrix24AccountStatus $bitrix24AccountStatus = null,
?int $bitrix24UserId = null,
?bool $isAdmin = null
?int $bitrix24UserId = null,
?bool $isAdmin = null
): array
{
if ('' === trim($memberId)) {
Expand Down Expand Up @@ -198,9 +195,9 @@ public function findOneAdminByMemberId(string $memberId): ?Bitrix24AccountInterf
*/
#[\Override]
public function findByDomain(
string $domainUrl,
string $domainUrl,
?Bitrix24AccountStatus $bitrix24AccountStatus = null,
?bool $isAdmin = null
?bool $isAdmin = null
): array
{
if ('' === trim($domainUrl)) {
Expand Down
28 changes: 14 additions & 14 deletions src/Bitrix24Accounts/ReadModel/Bitrix24AccountFetcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\Pagination\PaginationInterface;
use Knp\Component\Pager\PaginatorInterface;

class Bitrix24AccountFetcher
{

public function __construct(
private readonly EntityManagerInterface $em,
private readonly PaginatorInterface $paginator
Expand All @@ -19,19 +19,19 @@ public function list(
int $page,
int $size
): PaginationInterface {
$qb = $this->em->createQueryBuilder()
->select(
'b24account.id as id',
'b24account.status as status',
'b24account.memberId as member_id',
'b24account.domainUrl as domain_url',
'b24account.applicationVersion as application_version',
'b24account.createdAt as created_at_utc',
'b24account.updatedAt as updated_at_utc',
)
->from('Bitrix24\Lib\Bitrix24Accounts\Entity\Bitrix24Account', 'b24account')
->orderBy('b24account.createdAt', 'DESC');
$qb = $this->em->createQueryBuilder()
->select(
'b24account.id as id',
'b24account.status as status',
'b24account.memberId as member_id',
'b24account.domainUrl as domain_url',
'b24account.applicationVersion as application_version',
'b24account.createdAt as created_at_utc',
'b24account.updatedAt as updated_at_utc',
)
->from('Bitrix24\Lib\Bitrix24Accounts\Entity\Bitrix24Account', 'b24account')
->orderBy('b24account.createdAt', 'DESC');

return $this->paginator->paginate($qb, $page, $size);
return $this->paginator->paginate($qb, $page, $size);
}
}
7 changes: 2 additions & 5 deletions src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

namespace Bitrix24\Lib\Bitrix24Accounts\UseCase\ChangeDomainUrl;

use InvalidArgumentException;
readonly class Command
{
public function __construct(
Expand All @@ -16,17 +15,15 @@ public function __construct(
* @var non-empty-string $newDomainUrlHost
*/
public string $newDomainUrlHost
)
{

) {
$this->validateDomain($oldDomainUrlHost, 'oldDomainUrlHost');
$this->validateDomain($newDomainUrlHost, 'newDomainUrlHost');
}

private function validateDomain(string $domain, string $parameterName): void
{
if (empty($domain) || !filter_var($domain, FILTER_VALIDATE_URL)) {
throw new InvalidArgumentException(sprintf('Invalid value for %s: %s', $parameterName, $domain));
throw new \InvalidArgumentException(sprintf('Invalid value for %s: %s', $parameterName, $domain));
}
}
}
17 changes: 9 additions & 8 deletions src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
use Bitrix24\SDK\Application\Contracts\Bitrix24Accounts\Repository\Bitrix24AccountRepositoryInterface;
use Bitrix24\SDK\Application\Contracts\Events\AggregateRootEventsEmitterInterface;
use Psr\Log\LoggerInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

readonly class Handler
{
Expand All @@ -26,20 +25,22 @@ public function handle(Command $command): void
'b24_domain_url_new' => $command->newDomainUrlHost,
]);

/** @var Bitrix24AccountInterface[]|AggregateRootEventsEmitterInterface[] $accounts */
/** @var AggregateRootEventsEmitterInterface[]|Bitrix24AccountInterface[] $accounts */
$accounts = $this->bitrix24AccountRepository->findByDomain($command->oldDomainUrlHost);
foreach ($accounts as $account) {
$account->changeDomainUrl($command->newDomainUrlHost);
$this->bitrix24AccountRepository->save($account);
}

//используется как оператор распаковки (splat operator) для передачи массива как отдельных аргументов:
// используется как оператор распаковки (splat operator) для передачи массива как отдельных аргументов:
$this->flusher->flush(...$accounts);

$this->logger->info('Bitrix24Accounts.ChangeDomainUrl.Finish',
[
'b24_domain_url_old' => $command->oldDomainUrlHost,
'b24_domain_url_new' => $command->newDomainUrlHost,
]);
$this->logger->info(
'Bitrix24Accounts.ChangeDomainUrl.Finish',
[
'b24_domain_url_old' => $command->oldDomainUrlHost,
'b24_domain_url_new' => $command->newDomainUrlHost,
]
);
}
}
8 changes: 3 additions & 5 deletions src/Bitrix24Accounts/UseCase/InstallFinish/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
declare(strict_types=1);

namespace Bitrix24\Lib\Bitrix24Accounts\UseCase\InstallFinish;
use InvalidArgumentException;

readonly class Command
{
Expand All @@ -19,14 +18,13 @@ public function __construct(
private function validate(): void
{
if (empty($this->applicationToken)) {
throw new InvalidArgumentException('Application token cannot be empty.');
throw new \InvalidArgumentException('Application token cannot be empty.');
}

if (empty($this->memberId)) {
throw new InvalidArgumentException('Member ID cannot be empty.');
throw new \InvalidArgumentException('Member ID cannot be empty.');
}
if (!filter_var($this->domainUrl, FILTER_VALIDATE_URL)) {
throw new InvalidArgumentException('Domain URL is not valid.');
throw new \InvalidArgumentException('Domain URL is not valid.');
}
}
}
20 changes: 10 additions & 10 deletions src/Bitrix24Accounts/UseCase/InstallFinish/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
use Bitrix24\SDK\Application\Contracts\Events\AggregateRootEventsEmitterInterface;
use Bitrix24\SDK\Core\Exceptions\InvalidArgumentException;
use Psr\Log\LoggerInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

readonly class Handler
{
Expand All @@ -37,22 +36,23 @@ public function handle(Command $command): void
'b24_user_id' => $command->bitrix24UserId,
]);

/** @var Bitrix24AccountInterface|AggregateRootEventsEmitterInterface $bitrix24Account */
/** @var AggregateRootEventsEmitterInterface|Bitrix24AccountInterface $bitrix24Account */
$bitrix24Account = $this->getSingleAccountByMemberId($command->domainUrl, $command->memberId, $command->bitrix24UserId);

$bitrix24Account->applicationInstalled($command->applicationToken);

$this->bitrix24AccountRepository->save($bitrix24Account);
$this->flusher->flush($bitrix24Account);


$this->logger->info('Bitrix24Accounts.InstallFinish.Finish',
[
'b24_domain_url' => $command->domainUrl,
'b24_member_id' => $command->memberId,
'b24_application_id' => $command->applicationToken,
'b24_user_id' => $command->bitrix24UserId,
]);
$this->logger->info(
'Bitrix24Accounts.InstallFinish.Finish',
[
'b24_domain_url' => $command->domainUrl,
'b24_member_id' => $command->memberId,
'b24_application_id' => $command->applicationToken,
'b24_user_id' => $command->bitrix24UserId,
]
);
}

private function getSingleAccountByMemberId(string $domainUrl, string $memberId, ?int $bitrix24UserId): Bitrix24AccountInterface
Expand Down
Loading
Loading