обработка uuid
This commit is contained in:
parent
324e57e5f5
commit
daa4a197c8
42
src/app/Domain/Shared/Casts/UuidCast.php
Normal file
42
src/app/Domain/Shared/Casts/UuidCast.php
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Domain\Shared\Casts;
|
||||||
|
|
||||||
|
use App\Domain\Shared\ValueObjects\Uuid;
|
||||||
|
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Ramsey\Uuid\UuidInterface;
|
||||||
|
use Spatie\LaravelData\Casts\Cast;
|
||||||
|
use Spatie\LaravelData\Support\Creation\CreationContext;
|
||||||
|
use Spatie\LaravelData\Support\DataProperty;
|
||||||
|
|
||||||
|
class UuidCast implements CastsAttributes, Cast
|
||||||
|
{
|
||||||
|
public function get(Model $model, string $key, mixed $value, array $attributes): ?Uuid
|
||||||
|
{
|
||||||
|
if (is_null($value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return Uuid::fromString($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function set(Model $model, string $key, mixed $value, array $attributes)
|
||||||
|
{
|
||||||
|
if (is_null($value)) {
|
||||||
|
return [$key => null];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($value instanceof UuidInterface) {
|
||||||
|
return [$key => $value->toString()];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$key => Uuid::fromString((string) $value)->toString()];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): mixed
|
||||||
|
{
|
||||||
|
return Uuid::fromString((string) $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -43,4 +43,3 @@ abstract class BaseRepository extends Model
|
|||||||
return $model->newQuery();
|
return $model->newQuery();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
59
src/app/Domain/Shared/ValueObjects/Uuid.php
Normal file
59
src/app/Domain/Shared/ValueObjects/Uuid.php
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Domain\Shared\ValueObjects;
|
||||||
|
|
||||||
|
use DomainException;
|
||||||
|
use Ramsey\Uuid\Uuid as RamseyUuid;
|
||||||
|
use Ramsey\Uuid\UuidInterface;
|
||||||
|
|
||||||
|
final readonly class Uuid
|
||||||
|
{
|
||||||
|
private function __construct(
|
||||||
|
private UuidInterface $value
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function generate(): self
|
||||||
|
{
|
||||||
|
return new self(RamseyUuid::uuid4());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function fromString(string $value): self
|
||||||
|
{
|
||||||
|
if (!RamseyUuid::isValid($value)) {
|
||||||
|
throw new DomainException(sprintf('Недопустимая строка UUID: %s', $value));
|
||||||
|
}
|
||||||
|
return new self(RamseyUuid::fromString($value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function toString(): string
|
||||||
|
{
|
||||||
|
return $this->value->toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function equals(self $other): bool
|
||||||
|
{
|
||||||
|
return $this->value->equals($other);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __toString(): string
|
||||||
|
{
|
||||||
|
return $this->toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function validate(string|array $uuid): bool
|
||||||
|
{
|
||||||
|
$uuids = is_array($uuid) ? $uuid : [$uuid];
|
||||||
|
|
||||||
|
foreach ($uuids as $u) {
|
||||||
|
if (!RamseyUuid::isValid($u)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -5,6 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace App\Domain\User\Actions;
|
namespace App\Domain\User\Actions;
|
||||||
|
|
||||||
use App\Domain\User\Data\ShowRequest;
|
use App\Domain\User\Data\ShowRequest;
|
||||||
|
use App\Domain\User\Data\ShowResponseData;
|
||||||
use App\Domain\User\Repositories\UserRepository;
|
use App\Domain\User\Repositories\UserRepository;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
|
||||||
@ -16,8 +17,9 @@ class ShowAction
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function execute(ShowRequest $request): User
|
public function execute(ShowRequest $request)
|
||||||
{
|
{
|
||||||
return $this->userRepository->whereUuid($request->user_uuid)->firstOrFail();
|
$result = $this->userRepository->whereUuid($request->user_uuid)->firstOrFail();
|
||||||
|
return ShowResponseData::fromModel($result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
31
src/app/Domain/User/Data/ShowResponseData.php
Normal file
31
src/app/Domain/User/Data/ShowResponseData.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Domain\User\Data;
|
||||||
|
|
||||||
|
use App\Domain\User\Data\ValueObjects\RoleData;
|
||||||
|
use App\Models\User;
|
||||||
|
use Spatie\LaravelData\Data;
|
||||||
|
|
||||||
|
class ShowResponseData extends Data
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public readonly string $uuid,
|
||||||
|
public readonly string $name,
|
||||||
|
public readonly RoleData $role,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function fromModel(User $model): self
|
||||||
|
{
|
||||||
|
return new self(
|
||||||
|
uuid: $model->uuid->toString(),
|
||||||
|
name: $model->name,
|
||||||
|
role: new RoleData(
|
||||||
|
uuid: $model->role->uuid->toString(),
|
||||||
|
name: $model->role->name,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/app/Domain/User/Data/ValueObjects/RoleData.php
Normal file
16
src/app/Domain/User/Data/ValueObjects/RoleData.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Domain\User\Data\ValueObjects;
|
||||||
|
|
||||||
|
use Spatie\LaravelData\Data;
|
||||||
|
|
||||||
|
class RoleData extends Data
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public readonly string $uuid,
|
||||||
|
public readonly string $name,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,8 +4,11 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Domain\Shared\Casts\UuidCast;
|
||||||
|
use App\Domain\Shared\ValueObjects\Uuid;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property string $uuid
|
* @property-read Uuid $uuid
|
||||||
* @property string $name
|
* @property string $name
|
||||||
* @property string $description
|
* @property string $description
|
||||||
* @property Carbon $created_at
|
* @property Carbon $created_at
|
||||||
@ -19,6 +22,12 @@ class Role extends BaseModel
|
|||||||
'description',
|
'description',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'uuid' => UuidCast::class,
|
||||||
|
'created_at' => 'datetime',
|
||||||
|
'updated_at' => 'datetime',
|
||||||
|
];
|
||||||
|
|
||||||
public function users()
|
public function users()
|
||||||
{
|
{
|
||||||
return $this->hasMany(User::class);
|
return $this->hasMany(User::class);
|
||||||
|
|||||||
@ -6,6 +6,9 @@ namespace App\Models;
|
|||||||
|
|
||||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Domain\Shared\Casts\UuidCast;
|
||||||
|
use App\Domain\Shared\ValueObjects\Uuid;
|
||||||
use Illuminate\Database\Eloquent\Concerns\HasUuids;
|
use Illuminate\Database\Eloquent\Concerns\HasUuids;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
@ -13,7 +16,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
|
|||||||
use Illuminate\Notifications\Notifiable;
|
use Illuminate\Notifications\Notifiable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property string $uuid
|
* @property Uuid $uuid
|
||||||
* @property string $name
|
* @property string $name
|
||||||
* @property string $email
|
* @property string $email
|
||||||
* @property string $password
|
* @property string $password
|
||||||
@ -59,6 +62,7 @@ class User extends Authenticatable
|
|||||||
protected function casts(): array
|
protected function casts(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
'uuid' => UuidCast::class,
|
||||||
'email_verified_at' => 'datetime',
|
'email_verified_at' => 'datetime',
|
||||||
'password' => 'hashed',
|
'password' => 'hashed',
|
||||||
];
|
];
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
@extends ('layouts.app')
|
@extends ('layouts.app')
|
||||||
|
|
||||||
@section ('content')
|
@section ('content')
|
||||||
<h1>{{ $data }}</h1>
|
<h1>{{ dd($data) }}</h1>
|
||||||
|
|
||||||
<x-common.page-breadcrumb pageTitle="User Profile" />
|
<x-common.page-breadcrumb pageTitle="User Profile" />
|
||||||
<div class="rounded-2xl border border-gray-200 bg-white p-5 dark:border-gray-800 dark:bg-white/[0.03] lg:p-6">
|
<div class="rounded-2xl border border-gray-200 bg-white p-5 dark:border-gray-800 dark:bg-white/[0.03] lg:p-6">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user