Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
2.2 kB
2
Indexable
Never
<?php

declare(strict_types=1);

namespace App\Controller\RequestTransferPerson;

use App\Domain\Acl\Enum\Module;
use App\Domain\Acl\Enum\Permission;
use App\Domain\Manager\Enum\Role;
use App\Domain\PersonalJournal\Action\CreateAction;
use App\Domain\PersonalJournal\Api\Request\RequestOnTransferPerson;
use App\Domain\PersonalJournal\Api\Response\RequestTransferPerson;
use App\Service\CommandQuery\ActionCommand;
use App\Domain\Core\Context\ActionContext;
use App\Domain\Manager\Entity\Manager;
use App\Tool\ControllerHelper;
use League\Tactician\CommandBus;
use Nelmio\ApiDocBundle\Annotation\Model;
use OpenApi\Attributes as OA;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

#[OA\Tag('person: request transfer')]
class CreateRequestEndpoint extends AbstractController
{
    use ControllerHelper;

    /**
     * Создать запрос на передачу дел о персоне.
     */
    #[Route('/request/transfer', name: CreateRequestEndpoint::class, methods: ['POST'])]
    #[OA\RequestBody(
        description: 'Запрос на перевод персоны ',
        content: new OA\JsonContent(ref: new Model(type: RequestOnTransferPerson::class, groups: ['post']))
    )
    ]
    #[OA\Response(
        response: 200,
        description: 'new transfer entity',
        content: new OA\JsonContent(ref: new Model(type: RequestTransferPerson::class, groups: ['get', 'short']))
    )
    ]
    public function __invoke(ActionContext $context, Manager $manager, RequestOnTransferPerson $data, CreateAction $createAction, CommandBus $bus): \Symfony\Component\HttpFoundation\JsonResponse
    {
        $context->setCustomChecker(fn () => !$manager->hasRole(Role::EDITOR) && !$manager->hasRole(Role::ADMIN));

        $transfer = $bus->handle(new ActionCommand(
            static fn (ActionContext $context) => ($createAction)($context, $manager, $data),
            $manager,
            Module::PERSONAL_FILE_TRANSFER_LOG,
            Permission::ADD,
            isCustomCheck: true,
        ));

        return $this->jsonGroups($transfer, ['get', 'short']);
    }
}