<?php
namespace App\Service\User;
use App\Core\Persistence\BaseEntityService;
use App\Entity\User;
use App\Entity\UserSettings;
use App\Service\AccessToken\AccessTokenService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Container\ContainerInterface;
class UserService extends BaseEntityService
{
/**
* @var ContainerInterface
*/
private $container;
/**
* @var \App\Entity\User|null
*/
private $currentReviewer;
private AccessTokenService $accessTokenService;
public function __construct(EntityManagerInterface $em,
ContainerInterface $container,
AccessTokenService $accessTokenService)
{
parent::__construct($em);
$this->initialize(User::class);
$this->container = $container;
$this->accessTokenService = $accessTokenService;
}
public function getOrlovAvUser(): ?User
{
return $this->getBaseService()->getFirst([
"firstName" => "Александр",
"lastName" => "Орлов",
]);
}
public function getUchitelUser(): ?User
{
return $this->getBaseService()->getFirst([
"firstName" => "Учитель",
]);
}
/**
* Возвращает набор вариантов для поля User при редактировании TelegramDelayedMessage
* @param mixed $telegramDelayedMessage
* @return User[]
*/
public function getTelegramDelayedMessageChoices($telegramDelayedMessage = null): array
{
return $this->getBaseService()->getAll();
}
/**
* Возвращает текст метки для выбора User.
* Поддерживаем сигнатуру с 1 или 2 параметрами, чтобы AbstractBaseType мог вызывать любую из них.
*/
public function getChoiceLabel(User $user, $entity = null): string
{
return $user->getFirstName() . ($user->getLastName() ? ' ' . $user->getLastName() : '');
}
/**
* Возвращает всех кураторов
* @return User[]
*/
public function getCurators(): array
{
/** @var User[] $users */
$users = $this->getBaseService()->getAll();
$curators = [];
foreach ($users as $user) {
if ($user->getSettings()->isIsCurator()) {
$curators[] = $user;
}
}
return $curators;
}
public function getReviewers(): array
{
/** @var User[] $users */
$users = $this->getBaseService()->getAll();
$reviewers = [];
foreach ($users as $user) {
if ($user->getSettings()->isCanReviewCandidates()) {
$reviewers[] = $user;
}
}
return $reviewers;
}
/**
* Возвращает варианты User для поля createdBy при редактировании Payment
* Вызывается динамически из AbstractBaseType::addEntityField при построении формы PaymentType
* @param mixed $payment
* @return User[]
*/
public function getPaymentChoices($payment = null): array
{
// По умолчанию возвращаем всех пользователей. При необходимости можно добавить фильтрацию.
return $this->getBaseService()->getAll();
}
/**
* Варианты пользователей для поля Candidate::curator.
* Вызывается динамически из AbstractBaseType::addEntityField как getCandidateChoices
* @param mixed $candidate
* @return User[]
*/
public function getCandidateChoices($candidate = null): array
{
// Используем список кураторов — это логичный набор для выбора кураторов кандидата.
return $this->getCurators();
}
public function getLoggedInUser(): ?User
{
if (!$this->container->has('security.token_storage')) {
throw new \LogicException('The SecurityBundle is not registered in your application. Try running "composer require symfony/security-bundle".');
}
$token = $this->container->get('security.token_storage')->getToken();
// @deprecated since 5.4, $user will always be a UserInterface instance
if (!$token || !\is_object($user = $token->getUser())) {
// e.g. anonymous authentication
$user = $this->getLoggedInUserByCookiesAccessToken();
}
return $user;
}
public function getLoggedInUserSettings(): ?UserSettings
{
$user = $this->getLoggedInUser();
return $user ? $user->getSettings() : null;
}
public function getAvailableReviewer(): ?User
{
$user = $this->getLoggedInUser();
if ($user && $user->getSettings()->isCanReviewCandidates()) {
return $user;
}
$reviewers = $this->getReviewers();
return count($reviewers) > 0 ? $reviewers[0] : null;
}
public function getCurrentReviewer(): ?\App\Entity\User
{
if (!$this->currentReviewer) {
$this->currentReviewer = $this->getUchitelUser();
}
return $this->currentReviewer;
}
public function getStarCurator(): ?User
{
return $this->getBaseService()->getFirst([
"firstName" => "*",
]);
}
/**
* @param string $string
* @return array|User[]
*/
public function findUsersByPhone(string $string): array
{
if (strpos($string, "8") === 0) {
$string = substr($string, 1);
}
$string2 = "%" . $string . "%";
$stringArr = preg_split("/[\s]+/", $string);
$stringArr = array_map(function ($item) {
return "%" . trim($item) . "%";
}, $stringArr);
$fieldsArr = ["firstName", "lastName", 'patronymic'];
$requestPart2 = "";
foreach ($fieldsArr as $field) {
foreach ($stringArr as $item) {
$requestPart2 .= ($requestPart2 ? " or" : "" ) . " item.$field like '$item'";
}
}
$requestPart2 =" ($requestPart2)";
$stringRequests = $requestPart2 ? " or ($requestPart2)" : "";
$q = $this->em->getRepository(User::class)->createQueryBuilder('item');
$q
->andWhere("item.phone = '$string' or item.phone = '+$string'"
. " or item.phone = '+7$string' or item.phone = '8$string' or item.lastName like :string2 or item.firstName like :string2"
. $stringRequests
)
->setParameter('string2', $string2);
;
$result = $q->getQuery()->getResult();
return $result;
}
public function toArray(User $user): array
{
$userData = $user->toArray();
$keysFilter = ["id", "username", 'firstName', 'lastName', 'patronymic', 'phone'];
foreach ($userData as $key => $value) {
if (!in_array($key, $keysFilter)) {
unset($userData[$key]);
}
}
$userData["name"] = $user->getName();
return $userData;
}
public function getLoggedInUserByCookiesAccessToken(): ?User
{
$token = $this->accessTokenService->getByCookies();
if ($token) {
return $token->getUser();
}
return null;
}
}