Skip to content
Snippets Groups Projects
Commit 97d69d28 authored by Александр Плохих's avatar Александр Плохих :waxing_gibbous_moon:
Browse files

STA-1046 | reqyiered requests for fulRestApi news & restaurants

parent b544b828
No related branches found
No related tags found
1 merge request!18Sta 1046
......@@ -13,6 +13,7 @@
"doctrine/orm": "^3.1",
"phpdocumentor/reflection-docblock": "^5.3",
"phpstan/phpdoc-parser": "^1.28",
"ramsey/uuid": "^4.7",
"symfony/asset": "6.4.*",
"symfony/asset-mapper": "6.4.*",
"symfony/console": "6.4.*",
......
<?php
namespace App\News\Request;
use App\Shared\Abstraction\AbstractRequest;
use Ramsey\Collection\Collection;
use Symfony\Component\Validator\Constraints\All;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Validator\Constraints\Uuid;
use Symfony\Contracts\Service\Attribute\Required;
class NewsCreateRequest extends AbstractRequest
{
#[Required]
#[Type('string')]
public $name;
#[Required]
#[Type('string')]
public $code;
#[Required]
#[Type('bool')]
public $active;
#[Required]
#[Type('bool')]
public bool $main_page_render;
#[Uuid]
public ?string $preview_text;
#[Uuid]
public ?string $detail_text;
#[Uuid]
public ?string $type_id;
#[Type('array')]
#[All(
new Uuid()
)]
public$categories_id;
#[Uuid]
public ?string $detail_image;
#[Uuid]
public ?string $preview_image;
}
<?php
namespace App\News\Request;
use App\Shared\Abstraction\AbstractRequest;
use Ramsey\Collection\Collection;
use Symfony\Component\Validator\Constraints\All;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Validator\Constraints\Uuid;
use Symfony\Contracts\Service\Attribute\Required;
class NewsFullUpdateRequest extends AbstractRequest
{
#[Required]
#[Uuid]
public $uuid;
#[Required]
#[Type('string')]
public $name;
#[Required]
#[Type('string')]
public $code;
#[Required]
#[Type('bool')]
public $active;
#[Required]
#[Type('bool')]
public $main_page_render;
#[Uuid]
public $preview_text;
#[Uuid]
public $detail_text;
#[Uuid]
public $type_uuid;
/** @var Collection<string> */
#[All(
new Uuid()
)]
public $categories_uuid;
#[Uuid]
public $detail_image;
#[Uuid]
public $preview_image;
}
<?php
namespace App\News\Request;
use App\Shared\Abstraction\AbstractRequest;
use Ramsey\Collection\Collection;
use Symfony\Component\Validator\Constraints\All;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Validator\Constraints\Uuid;
use Symfony\Contracts\Service\Attribute\Required;
class NewsPartUpdateRequest extends AbstractRequest
{
#[Uuid]
public $uuid;
#[Type('string')]
public $name;
#[Type('string')]
public $code;
#[Type('bool')]
public $active;
#[Type('bool')]
public bool $main_page_render;
#[Uuid]
public $preview_text;
#[Uuid]
public $detail_text;
#[Uuid]
public $type_uuid;
#[All(
new Uuid()
)]
public $categories_uuid;
#[Uuid]
public $detail_image;
#[Uuid]
public $preview_image;
}
<?php
namespace App\Restaurants\Request;
use App\Shared\Abstraction\AbstractRequest;
use Symfony\Component\Validator\Constraints\All;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Validator\Constraints\Uuid;
use Symfony\Contracts\Service\Attribute\Required;
class RestaurantCreateRequest extends AbstractRequest
{
#[Type('bool')]
#[Required]
public $active;
#[Type('string')]
#[Required]
public $name;
#[Type('string')]
#[Required]
public $description;
#[Type('string')]
#[Required]
public $code;
#[Type('string')]
#[Required]
public $receipt;
#[Type('string')]
#[Required]
public $receipt_info;
#[Type('array')]
#[All(
new Type('string')
)]
#[Required]
public $phone;
#[Type('array')]
#[All(
new Type('string')
)]
#[Required]
public $email;
#[Type('array')]
#[All(
new Type('string')
)]
#[Required]
public $address;
#[Type('array')]
#[All([
new Type('array'),
new All(
new Type('string')
)
])]
#[Required]
public $tags;
#[Type('string')]
#[Required]
public $site;
#[Type('string')]
#[Required]
public $coordinates;
#[Type('string')]
#[Required]
public $how_to_find;
#[Uuid]
public $type_id;
#[Uuid]
public $settelement_id;
#[Uuid]
public $preview_image_id;
#[Uuid]
public $detail_inage_id;
#[Uuid]
public $kitchens_id;
#[Type('array')]
#[All(
new UUid(),
)]
public $gallery;
}
\ No newline at end of file
<?php
namespace App\Restaurants\Request;
use App\Shared\Abstraction\AbstractRequest;
use Symfony\Component\Validator\Constraints\All;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Validator\Constraints\Uuid;
use Symfony\Contracts\Service\Attribute\Required;
class RestaurantFullUpdateRequest extends AbstractRequest
{
#[Uuid]
#[Required]
public $uuid;
#[Type('bool')]
#[Required]
public $active;
#[Type('string')]
#[Required]
public $name;
#[Type('string')]
#[Required]
public $description;
#[Type('string')]
#[Required]
public $code;
#[Type('string')]
#[Required]
public $receipt;
#[Type('string')]
#[Required]
public $receipt_info;
#[Type('array')]
#[All(
new Type('string')
)]
#[Required]
public $phone;
#[Type('array')]
#[All(
new Type('string')
)]
#[Required]
public $email;
#[Type('array')]
#[All(
new Type('string')
)]
#[Required]
public $address;
#[Type('array')]
#[All([
new Type('array'),
new All(
new Type('string')
)
])]
#[Required]
public $tags;
#[Type('string')]
#[Required]
public $site;
#[Type('string')]
#[Required]
public $coordinates;
#[Type('string')]
#[Required]
public $how_to_find;
#[Uuid]
public $type_id;
#[Uuid]
public $settelement_id;
#[Uuid]
public $preview_image_id;
#[Uuid]
public $detail_inage_id;
#[Uuid]
public $kitchens_id;
#[Required]
#[Type('array')]
#[All(
new UUid(),
)]
public $gallery;
}
\ No newline at end of file
<?php
namespace App\Restaurants\Request;
use App\Shared\Abstraction\AbstractRequest;
use Symfony\Component\Validator\Constraints\All;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Validator\Constraints\Uuid;
use Symfony\Contracts\Service\Attribute\Required;
class RestaurantPartUpdateRequest extends AbstractRequest
{
#[Uuid]
public $uuid;
#[Type('bool')]
public $active;
#[Type('string')]
public $name;
#[Type('string')]
public $description;
#[Type('string')]
public $code;
#[Type('string')]
public $receipt;
#[Type('string')]
public $receipt_info;
#[Type('array')]
#[All(
new Type('string')
)]
public $phone;
#[Type('array')]
#[All(
new Type('string')
)]
public $email;
#[Type('array')]
#[All(
new Type('string')
)]
public $address;
#[Type('array')]
#[All([
new Type('array'),
new All(
new Type('string')
)
])]
public $tags;
#[Type('string')]
public $site;
#[Type('string')]
public $coordinates;
#[Type('string')]
public $how_to_find;
#[Uuid]
public $type_id;
#[Uuid]
public $settelement_id;
#[Uuid]
public $preview_image_id;
#[Uuid]
public $detail_inage_id;
#[Uuid]
public $kitchens_id;
#[Type('array')]
#[All(
new UUid(),
)]
public $gallery;
}
\ No newline at end of file
<?php
namespace App\Shared\Abstraction;
use App\Shared\Collection\ValidationErrorCollection;
use App\Shared\DtoFactory\ValidateErrorDtoFactory;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Validator\ValidatorInterface;
abstract class AbstractRequest
{
/**
* активация автовалидации
* перезаписать на false для отключение автовалидации
*/
protected bool $autoValidate = true;
public function __construct(
protected ValidatorInterface $validator,
protected readonly ValidateErrorDtoFactory $errorDtoFactory
) {
$this->populate();
if ($this->autoValidate) {
$this->validate();
}
}
protected function populate(): void
{
foreach ($this->getRequest()->toArray() as $property => $value) {
if (property_exists($this, $property)) {
$this->{$property} = $value;
}
}
}
public function validate(): void
{
$errors = $this->validator->validate($this);
$messages = new ValidationErrorCollection();
foreach ($errors as $error) {
$messages->add($this->errorDtoFactory->create($error));
}
if ($messages->count() > 0) {
$response = new JsonResponse($messages, 422);
$response->send();
throw new ValidatorException('Validation failed');
}
}
public function getRequest(): Request
{
return Request::createFromGlobals();
}
}
\ No newline at end of file
<?php
namespace App\Shared\Collection;
use App\Shared\Dto\ErrorDto;
use App\Shared\Dto\FileDto;
class ValidationErrorCollection extends DtoCollection
{
private string $collectionType = ErrorDto::class;
public function __construct(array $data = [])
{
parent::__construct($this->collectionType, $data);
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment