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
33 changes: 19 additions & 14 deletions .github/workflows/tests-functional.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,21 @@ jobs:
php-version:
- "8.3"
dependencies: [ highest ]
operating-system: [ ubuntu-latest]
operating-system: [ ubuntu-latest ]
services:
bitrix24-php-lib-test-database:
image: postgres:16
image: postgres:16-alpine
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U postgres"
--health-cmd="pg_isready -U b24phpLibTest"
--health-interval=10s
--health-timeout=5s
--health-retries=5
env:
POSTGRES_USER: b24phpLibTest
POSTGRES_PASSWORD: b24phpLibTest
POSTGRES_DB: b24phpLibTest
DATABASE_HOST: localhost

steps:
- name: "Checkout code"
Expand All @@ -55,20 +54,26 @@ jobs:
run: |
composer update ${{ env.COMPOSER_FLAGS }}

- name: "Install PostgreSQL client"
run: |
sudo apt-get update
sudo apt-get install -y postgresql-client

- name: "Wait for PostgreSQL to be ready"
run: |
until pg_isready -h localhost -p 5432 -U user; do
echo "Waiting for PostgreSQL to start..."
sleep 2
done
until pg_isready -h localhost -p 5432 -U b24phpLibTest; do
echo "Waiting for PostgreSQL to start..."
sleep 2
done

- name: "Run functional tests"
run: |
php bin/doctrine orm:schema-tool:drop --force
php bin/doctrine orm:schema-tool:create --dump-sql
php bin/doctrine orm:schema-tool:update --dump-sql
php bin/doctrine orm:info
php vendor/bin/phpunit --testsuite=functional_tests --display-warnings --testdox
php bin/doctrine orm:schema-tool:drop --force
php bin/doctrine orm:schema-tool:create --dump-sql
php bin/doctrine orm:schema-tool:update --force
php bin/doctrine orm:info
# Запуск тестов с очисткой состояния между тестами
php vendor/bin/phpunit --testsuite=functional_tests --display-warnings --testdox --process-isolation

- name: "is functional tests succeeded"
if: ${{ success() }}
Expand All @@ -78,4 +83,4 @@ jobs:
- name: "is functional tests failed"
if: ${{ failure() }}
run: |
echo '::error:: ❗️ functional tests failed (╯°益°)╯彡┻━┻'
echo '::error:: ❗️ functional tests failed (╯°益°)╯彡┻━┻'
2 changes: 1 addition & 1 deletion docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ services:
PGDATA: "/var/lib/postgresql/data/pgdata"
container_name: bitrix24-php-lib-test-database
ports:
- '5432:5432'
- '5438:5432'
volumes:
- ./docker/init_database/:/docker-entrypoint-initdb.d
- ./docker/db:/var/lib/postgresql/data
4 changes: 2 additions & 2 deletions src/Bitrix24Accounts/Entity/Bitrix24Account.php
Original file line number Diff line number Diff line change
Expand Up @@ -309,14 +309,14 @@ public function getComment(): ?string
return $this->comment;
}

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

private function guardTokenMismatch($applicationToken): void
private function guardTokenMismatch(string $applicationToken): void
{
if ($this->applicationToken !== $applicationToken) {
throw new InvalidArgumentException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ public function getById(Uuid $uuid): Bitrix24AccountInterface
->setParameter('id', $uuid)
->setParameter('status', Bitrix24AccountStatus::deleted)
->getQuery()
->getOneOrNullResult();
->getOneOrNullResult()
;

if (null === $account) {
throw new Bitrix24AccountNotFoundException(
Expand All @@ -58,13 +59,10 @@ public function existsById(Uuid $uuid): bool
->setParameter('id', $uuid)
->setParameter('status', Bitrix24AccountStatus::deleted)
->getQuery()
->getOneOrNullResult();
->getOneOrNullResult()
;

if ($account) {
return true;
}

return false;
return (bool) $account;
}

#[\Override]
Expand All @@ -84,8 +82,7 @@ public function findByMemberId(
?Bitrix24AccountStatus $bitrix24AccountStatus = null,
?int $bitrix24UserId = null,
?bool $isAdmin = null
): array
{
): array {
if ('' === trim($memberId)) {
throw new InvalidArgumentException('memberId cannot be empty');
}
Expand Down Expand Up @@ -198,15 +195,13 @@ public function findByDomain(
string $domainUrl,
?Bitrix24AccountStatus $bitrix24AccountStatus = null,
?bool $isAdmin = null
): array
{
): array {
if ('' === trim($domainUrl)) {
throw new InvalidArgumentException('domainUrl cannot be an empty string');
}

$criteria = [
'domainUrl' => $domainUrl,
];
$criteria = ['domainUrl' => $domainUrl];

if ($bitrix24AccountStatus instanceof Bitrix24AccountStatus) {
$criteria['status'] = $bitrix24AccountStatus->name;
}
Expand Down
37 changes: 0 additions & 37 deletions src/Bitrix24Accounts/ReadModel/Bitrix24AccountFetcher.php

This file was deleted.

25 changes: 18 additions & 7 deletions src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,32 @@
{
public function __construct(
/**
* @var non-empty-string $oldDomainUrlHost
* @var non-empty-string $oldDomain
*/
public string $oldDomainUrlHost,
public string $oldDomain,
/**
* @var non-empty-string $newDomainUrlHost
* @var non-empty-string $newDomain
*/
public string $newDomainUrlHost
public string $newDomain
) {
$this->validateDomain($oldDomainUrlHost, 'oldDomainUrlHost');
$this->validateDomain($newDomainUrlHost, 'newDomainUrlHost');
$this->validateDomain($oldDomain, 'oldDomainUrlHost');
$this->validateDomain($newDomain, 'newDomainUrlHost');
}

private function validateDomain(string $domain, string $parameterName): void
{
if (empty($domain) || !filter_var($domain, FILTER_VALIDATE_URL)) {
// Регулярное выражение для проверки допустимых символов (латиница и кириллица)
$patternValidChars = '/^((?!-)[A-Za-zА-Яа-яЁё0-9-]{1,63}(?<!-)\.)+[A-Za-zА-Яа-яЁё]{2,6}$/u';

// Проверка общей длины (1-253 символа)
$patternLengthCheck = '/^.{1,253}$/';

// Проверка длины каждой метки (1-63 символа, включая кириллицу)
$patternLengthEachLabel = '/^[A-Za-zА-Яа-яЁё0-9-]{1,63}(\.[A-Za-zА-Яа-яЁё0-9-]{1,63})*$/u';
if (
in_array(preg_match($patternValidChars, $domain), [0, false], true)
|| in_array(preg_match($patternLengthCheck, $domain), [0, false], true)
|| in_array(preg_match($patternLengthEachLabel, $domain), [0, false], true)) {
throw new \InvalidArgumentException(sprintf('Invalid value for %s: %s', $parameterName, $domain));
}
}
Expand Down
12 changes: 6 additions & 6 deletions src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ public function __construct(
public function handle(Command $command): void
{
$this->logger->info('Bitrix24Accounts.ChangeDomainUrl.start', [
'b24_domain_url_old' => $command->oldDomainUrlHost,
'b24_domain_url_new' => $command->newDomainUrlHost,
'b24_domain_url_old' => $command->oldDomain,
'b24_domain_url_new' => $command->newDomain,
]);

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

Expand All @@ -38,8 +38,8 @@ public function handle(Command $command): void
$this->logger->info(
'Bitrix24Accounts.ChangeDomainUrl.Finish',
[
'b24_domain_url_old' => $command->oldDomainUrlHost,
'b24_domain_url_new' => $command->newDomainUrlHost,
'b24_domain_url_old' => $command->oldDomain,
'b24_domain_url_new' => $command->newDomain,
]
);
}
Expand Down
30 changes: 26 additions & 4 deletions src/Bitrix24Accounts/UseCase/InstallFinish/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,42 @@ public function __construct(
public string $applicationToken,
public string $memberId,
public string $domainUrl,
public ?int $bitrix24UserId,
public int $bitrix24UserId,
) {
$this->validate();
}

private function validate(): void
{
if (empty($this->applicationToken)) {
if ('' === $this->applicationToken || '0' === $this->applicationToken) {
throw new \InvalidArgumentException('Application token cannot be empty.');
}
if (empty($this->memberId)) {

if ('' === $this->memberId || '0' === $this->memberId) {
throw new \InvalidArgumentException('Member ID cannot be empty.');
}
if (!filter_var($this->domainUrl, FILTER_VALIDATE_URL)) {

$this->validateDomain($this->domainUrl);

if ($this->bitrix24UserId <= 0) {
throw new \InvalidArgumentException('Bitrix24 User ID must be a positive integer.');
}
}

private function validateDomain(string $domain): void
{
// Регулярное выражение для проверки допустимых символов (латиница и кириллица)
$patternValidChars = '/^((?!-)[A-Za-zА-Яа-яЁё0-9-]{1,63}(?<!-)\.)+[A-Za-zА-Яа-яЁё]{2,6}$/u';

// Проверка общей длины (1-253 символа)
$patternLengthCheck = '/^.{1,253}$/';

// Проверка длины каждой метки (1-63 символа, включая кириллицу)
$patternLengthEachLabel = '/^[A-Za-zА-Яа-яЁё0-9-]{1,63}(\.[A-Za-zА-Яа-яЁё0-9-]{1,63})*$/u';
if (
in_array(preg_match($patternValidChars, $domain), [0, false], true)
|| in_array(preg_match($patternLengthCheck, $domain), [0, false], true)
|| in_array(preg_match($patternLengthEachLabel, $domain), [0, false], true)) {
throw new \InvalidArgumentException('Domain URL is not valid.');
}
}
Expand Down
24 changes: 20 additions & 4 deletions src/Bitrix24Accounts/UseCase/InstallStart/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,32 @@ private function validate(): void
throw new \InvalidArgumentException('Bitrix24 User ID must be a positive integer.');
}

if (!is_string($this->memberId) || empty($this->memberId)) {
if (!is_string($this->memberId) || ('' === $this->memberId || '0' === $this->memberId)) {
throw new \InvalidArgumentException('Member ID must be a non-empty string.');
}

if (!filter_var($this->domainUrl, FILTER_VALIDATE_URL)) {
throw new \InvalidArgumentException('Domain URL is not valid.');
}
$this->validateDomain($this->domainUrl);

if ($this->applicationVersion <= 0) {
throw new \InvalidArgumentException('Application version must be a positive integer.');
}
}

private function validateDomain(string $domain): void
{
// Регулярное выражение для проверки допустимых символов (латиница и кириллица)
$patternValidChars = '/^((?!-)[A-Za-zА-Яа-яЁё0-9-]{1,63}(?<!-)\.)+[A-Za-zА-Яа-яЁё]{2,6}$/u';

// Проверка общей длины (1-253 символа)
$patternLengthCheck = '/^.{1,253}$/';

// Проверка длины каждой метки (1-63 символа, включая кириллицу)
$patternLengthEachLabel = '/^[A-Za-zА-Яа-яЁё0-9-]{1,63}(\.[A-Za-zА-Яа-яЁё0-9-]{1,63})*$/u';
if (
in_array(preg_match($patternValidChars, $domain), [0, false], true)
|| in_array(preg_match($patternLengthCheck, $domain), [0, false], true)
|| in_array(preg_match($patternLengthEachLabel, $domain), [0, false], true)) {
throw new \InvalidArgumentException('Domain URL is not valid.');
}
}
}
2 changes: 1 addition & 1 deletion src/Bitrix24Accounts/UseCase/Uninstall/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public function __construct(

private function validate(): void
{
if (empty($this->applicationToken)) {
if ('' === $this->applicationToken || '0' === $this->applicationToken) {
throw new \InvalidArgumentException('Empty application token application token.');
}
}
Expand Down
1 change: 1 addition & 0 deletions src/Bitrix24Accounts/UseCase/Uninstall/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public function handle(Command $command): void
$account->applicationUninstalled($command->applicationToken);
$this->bitrix24AccountRepository->save($account);
}

$this->flusher->flush(...$accounts);

$this->logger->info(
Expand Down
15 changes: 4 additions & 11 deletions src/Services/Flusher.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,13 @@

class Flusher
{
private $em;
private $eventDispatcher;
public function __construct(private readonly EntityManagerInterface $em, private readonly EventDispatcherInterface $eventDispatcher) {}

public function __construct(EntityManagerInterface $em, EventDispatcherInterface $eventDispatcher)
{
$this->em = $em;
$this->eventDispatcher = $eventDispatcher;
}

public function flush(AggregateRootEventsEmitterInterface ...$roots): void
public function flush(AggregateRootEventsEmitterInterface ...$aggregateRootEventsEmitter): void
{
$this->em->flush();
foreach ($roots as $root) {
$events = $root->emitEvents();
foreach ($aggregateRootEventsEmitter as $aggregateRootEventEmitter) {
$events = $aggregateRootEventEmitter->emitEvents();
foreach ($events as $event) {
$this->eventDispatcher->dispatch($event);
}
Expand Down
Loading
Loading