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
4 changes: 2 additions & 2 deletions src/Admin/src/Adapter/AuthenticationAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use Core\Admin\Entity\Admin;
use Core\Admin\Entity\AdminIdentity;
use Core\Admin\Entity\AdminRole;
use Core\App\Entity\RoleInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Exception\ORMException;
use Dot\DependencyInjection\Attribute\Inject;
Expand Down Expand Up @@ -139,7 +139,7 @@ public function authenticate(): Result
$identityClass->getUuid()->toString(),
$identityClass->getIdentity(),
$identityClass->getStatus(),
array_map(fn (AdminRole $role): string => $role->getName()->value, $identityClass->getRoles()),
array_map(fn (RoleInterface $role): string => $role->getName()->value, $identityClass->getRoles()),
[
'firstName' => $identityClass->getFirstName(),
'lastName' => $identityClass->getLastName(),
Expand Down
31 changes: 31 additions & 0 deletions src/Core/src/Admin/src/ConfigProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,35 @@
use Core\Admin\Repository\AdminRepository;
use Core\Admin\Repository\AdminRoleRepository;
use Doctrine\ORM\Mapping\Driver\AttributeDriver;
use Doctrine\Persistence\Mapping\Driver\MappingDriver;
use Dot\DependencyInjection\Factory\AttributedRepositoryFactory;

/**
* @phpstan-type DoctrineConfigType array{
* driver: array{
* orm_default: array{
* drivers: array<non-empty-string, non-empty-string>,
* },
* AdminEntities: array{
* class: class-string<MappingDriver>,
* cache: non-empty-string,
* paths: non-empty-string[],
* },
* },
* types: array<non-empty-string, class-string>,
* }
* @phpstan-type DependenciesType array{
* factories: array<class-string, class-string>,
* }
*/
class ConfigProvider
{
/**
* @return array{
* dependencies: DependenciesType,
* doctrine: DoctrineConfigType,
* }
*/
public function __invoke(): array
{
return [
Expand All @@ -22,6 +47,9 @@ public function __invoke(): array
];
}

/**
* @return DependenciesType
*/
private function getDependencies(): array
{
return [
Expand All @@ -33,6 +61,9 @@ private function getDependencies(): array
];
}

/**
* @return DoctrineConfigType
*/
private function getDoctrineConfig(): array
{
return [
Expand Down
42 changes: 36 additions & 6 deletions src/Core/src/Admin/src/Entity/Admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@
use Core\App\Entity\RoleInterface;
use Core\App\Entity\TimestampsTrait;
use Core\Setting\Entity\Setting;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use League\OAuth2\Server\Entities\UserEntityInterface;

use function array_map;

/**
* @phpstan-import-type RoleType from RoleInterface
*/
#[ORM\Entity(repositoryClass: AdminRepository::class)]
#[ORM\Table(name: 'admin')]
#[ORM\HasLifecycleCallbacks]
Expand All @@ -26,6 +30,7 @@ class Admin extends AbstractEntity implements UserEntityInterface
use PasswordTrait;
use TimestampsTrait;

/** @var non-empty-string|null $identity */
#[ORM\Column(name: 'identity', type: 'string', length: 191, unique: true)]
protected ?string $identity = null;

Expand All @@ -45,12 +50,14 @@ enumType: AdminStatusEnum::class,
)]
protected AdminStatusEnum $status = AdminStatusEnum::Active;

/** @var Collection<int, RoleInterface> $roles */
#[ORM\ManyToMany(targetEntity: AdminRole::class)]
#[ORM\JoinTable(name: 'admin_roles')]
#[ORM\JoinColumn(name: 'userUuid', referencedColumnName: 'uuid')]
#[ORM\InverseJoinColumn(name: 'roleUuid', referencedColumnName: 'uuid')]
protected Collection $roles;

/** @var Collection<int, Setting> $settings */
#[ORM\OneToMany(targetEntity: Setting::class, mappedBy: 'admin')]
protected Collection $settings;

Expand All @@ -73,6 +80,9 @@ public function hasIdentity(): bool
return $this->identity !== null;
}

/**
* @param non-empty-string $identity
*/
public function setIdentity(string $identity): self
{
$this->identity = $identity;
Expand Down Expand Up @@ -128,14 +138,22 @@ public function setStatus(AdminStatusEnum $status): self
return $this;
}

/**
* @return RoleInterface[]
*/
public function getRoles(): array
{
return $this->roles->toArray();
}

public function setRoles(ArrayCollection $roles): self
/**
* @param RoleInterface[] $roles
*/
public function setRoles(array $roles): self
{
$this->roles = $roles;
foreach ($roles as $role) {
$this->roles->add($role);
}

return $this;
}
Expand Down Expand Up @@ -196,9 +214,21 @@ public function isActive(): bool

public function getIdentifier(): string
{
return $this->identity;
}

return (string) $this->identity;
}

/**
* @return array{
* uuid: non-empty-string,
* identity: non-empty-string|null,
* firstName: string|null,
* lastName: string|null,
* status: non-empty-string,
* roles: iterable<RoleType>,
* created: DateTimeImmutable,
* updated: DateTimeImmutable|null,
* }
*/
public function getArrayCopy(): array
{
return [
Expand All @@ -207,7 +237,7 @@ public function getArrayCopy(): array
'firstName' => $this->firstName,
'lastName' => $this->lastName,
'status' => $this->status->value,
'roles' => array_map(fn (AdminRole $role): array => $role->getArrayCopy(), $this->roles->toArray()),
'roles' => array_map(fn (RoleInterface $role): array => $role->getArrayCopy(), $this->roles->toArray()),
'created' => $this->created,
'updated' => $this->updated,
];
Expand Down
6 changes: 5 additions & 1 deletion src/Core/src/Admin/src/Entity/AdminIdentity.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@

class AdminIdentity implements UserInterface
{
/**
* @param non-empty-string[] $roles
* @param array<non-empty-string, non-empty-string> $details
*/
public function __construct(
public string $uuid,
public string $identity,
public AdminStatusEnum $status,
public array $roles = [],
public array $details = []
public array $details = [],
) {
}

Expand Down
40 changes: 36 additions & 4 deletions src/Core/src/Admin/src/Entity/AdminLogin.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Core\App\Entity\TimestampsTrait;
use Core\App\Enum\SuccessFailureEnum;
use Core\App\Enum\YesNoEnum;
use DateTimeImmutable;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: AdminLoginRepository::class)]
Expand Down Expand Up @@ -43,7 +44,7 @@ class AdminLogin extends AbstractEntity
protected ?string $deviceModel = null;

#[ORM\Column(type: 'yes_no_enum', nullable: true, enumType: YesNoEnum::class)]
protected ?YesNoEnum $isMobile = null;
protected YesNoEnum $isMobile = YesNoEnum::No;

#[ORM\Column(name: 'osName', type: 'string', length: 191, nullable: true)]
protected ?string $osName = null;
Expand All @@ -67,7 +68,14 @@ class AdminLogin extends AbstractEntity
protected ?string $clientVersion = null;

#[ORM\Column(type: 'success_failure_enum', nullable: true, enumType: SuccessFailureEnum::class)]
protected ?SuccessFailureEnum $loginStatus = null;
protected SuccessFailureEnum $loginStatus = SuccessFailureEnum::Fail;

public function __construct()
{
parent::__construct();

$this->created();
}

public function getIdentity(): ?string
{
Expand Down Expand Up @@ -170,7 +178,7 @@ public function getIsMobile(): ?YesNoEnum
return $this->isMobile;
}

public function setIsMobile(?YesNoEnum $isMobile): self
public function setIsMobile(YesNoEnum $isMobile): self
{
$this->isMobile = $isMobile;

Expand Down Expand Up @@ -266,13 +274,37 @@ public function getLoginStatus(): ?SuccessFailureEnum
return $this->loginStatus;
}

public function setLoginStatus(?SuccessFailureEnum $loginStatus): self
public function setLoginStatus(SuccessFailureEnum $loginStatus): self
{
$this->loginStatus = $loginStatus;

return $this;
}

/**
* @return array{
* uuid: non-empty-string,
* identity: string|null,
* adminIp: string|null,
* country: string|null,
* continent: string|null,
* organization: string|null,
* deviceType: string|null,
* deviceBrand: string|null,
* deviceModel: string|null,
* isMobile: string,
* osName: string|null,
* osVersion: string|null,
* osPlatform: string|null,
* clientType: string|null,
* clientName: string|null,
* clientEngine: string|null,
* clientVersion: string|null,
* loginStatus: string,
* created: DateTimeImmutable,
* updated: DateTimeImmutable|null,
* }
*/
public function getArrayCopy(): array
{
return [
Expand Down
6 changes: 6 additions & 0 deletions src/Core/src/Admin/src/Entity/AdminRole.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
use Core\App\Entity\TimestampsTrait;
use Doctrine\ORM\Mapping as ORM;

/**
* @phpstan-import-type RoleType from RoleInterface
*/
#[ORM\Entity(repositoryClass: AdminRoleRepository::class)]
#[ORM\Table(name: 'admin_role')]
#[ORM\HasLifecycleCallbacks]
Expand Down Expand Up @@ -50,6 +53,9 @@ public function setName(BackedEnum $name): self
return $this;
}

/**
* @return RoleType
*/
public function getArrayCopy(): array
{
return [
Expand Down
3 changes: 3 additions & 0 deletions src/Core/src/Admin/src/Enum/AdminRoleEnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ enum AdminRoleEnum: string
case Admin = 'admin';
case Superuser = 'superuser';

/**
* @return non-empty-string[]
*/
public static function values(): array
{
return array_column(self::cases(), 'value');
Expand Down
6 changes: 6 additions & 0 deletions src/Core/src/Admin/src/Enum/AdminStatusEnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,17 @@ enum AdminStatusEnum: string
case Active = 'active';
case Inactive = 'inactive';

/**
* @return non-empty-string[]
*/
public static function values(): array
{
return array_column(self::cases(), 'value');
}

/**
* @return array<string, non-empty-string>
*/
public static function toArray(): array
{
return array_reduce(self::cases(), function (array $collector, self $enum): array {
Expand Down
7 changes: 7 additions & 0 deletions src/Core/src/Admin/src/Repository/AdminLoginRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
#[Entity(AdminLogin::class)]
class AdminLoginRepository extends AbstractRepository
{
/**
* @return non-empty-string[]
*/
public function getAdminLoginIdentities(): array
{
$results = $this->getQueryBuilder()
Expand All @@ -28,6 +31,10 @@ public function getAdminLoginIdentities(): array
return array_column($results, 'identity');
}

/**
* @param array<non-empty-string, mixed> $params
* @param array<non-empty-string, mixed> $filters
*/
public function getAdminLogins(array $params = [], array $filters = []): QueryBuilder
{
$queryBuilder = $this
Expand Down
4 changes: 4 additions & 0 deletions src/Core/src/Admin/src/Repository/AdminRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
#[Entity(name: Admin::class)]
class AdminRepository extends AbstractRepository
{
/**
* @param array<non-empty-string, mixed> $params
* @param array<non-empty-string, mixed> $filters
*/
public function getAdmins(array $params = [], array $filters = []): QueryBuilder
{
$queryBuilder = $this
Expand Down
4 changes: 4 additions & 0 deletions src/Core/src/Admin/src/Repository/AdminRoleRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
#[Entity(name: AdminRole::class)]
class AdminRoleRepository extends AbstractRepository
{
/**
* @param array<non-empty-string, mixed> $params
* @param array<non-empty-string, mixed> $filters
*/
public function getAdminRoles(array $params = [], array $filters = []): QueryBuilder
{
$queryBuilder = $this
Expand Down
Loading