<?php
namespace Aqarmap\Bundle\UserBundle\Controller\Api;
use App\Entity\Lead\Lead;
use App\Exception\BadRequestHttpException;
use App\Message\User\UpdateProfileMessage;
use App\Service\Security\AuthServer;
use App\Service\User\SubAccountService;
use Aqarmap\Bundle\CreditBundle\Contract\CreditManagerInterface;
use Aqarmap\Bundle\CreditBundle\Repository\CreditRepository;
use Aqarmap\Bundle\FeatureToggleBundle\Service\FeatureToggleManager;
use Aqarmap\Bundle\ListingBundle\Constant\LeadTypes;
use Aqarmap\Bundle\ListingBundle\Constant\ListingRateConstant;
use Aqarmap\Bundle\ListingBundle\Contracts\PhoneManagerInterface;
use Aqarmap\Bundle\ListingBundle\Entity\Listing;
use Aqarmap\Bundle\ListingBundle\Entity\ListingLead;
use Aqarmap\Bundle\ListingBundle\Entity\Phone;
use Aqarmap\Bundle\ListingBundle\Entity\UserPhone;
use Aqarmap\Bundle\ListingBundle\Repository\ListingRepository;
use Aqarmap\Bundle\ListingBundle\Service\FavouriteService;
use Aqarmap\Bundle\ListingBundle\Service\LeadService;
use Aqarmap\Bundle\ListingBundle\Service\ListingManager;
use Aqarmap\Bundle\ListingBundle\Service\ListingRateService;
use Aqarmap\Bundle\ListingBundle\Service\TopCustomerService;
use Aqarmap\Bundle\MainBundle\Contract\ProducerFactoryInterface;
use Aqarmap\Bundle\MainBundle\Controller\Api\BaseController;
use Aqarmap\Bundle\UserBundle\Constant\Age;
use Aqarmap\Bundle\UserBundle\Constant\Education;
use Aqarmap\Bundle\UserBundle\Constant\Gender;
use Aqarmap\Bundle\UserBundle\Constant\Industry;
use Aqarmap\Bundle\UserBundle\Constant\MaritalStatus;
use Aqarmap\Bundle\UserBundle\Constant\Position;
use Aqarmap\Bundle\UserBundle\Constant\PurchaseInfo;
use Aqarmap\Bundle\UserBundle\Constant\UserCheckinSource;
use Aqarmap\Bundle\UserBundle\Entity\PersonalInfo;
use Aqarmap\Bundle\UserBundle\Entity\SavedSearch;
use Aqarmap\Bundle\UserBundle\Entity\User;
use Aqarmap\Bundle\UserBundle\Entity\UserNote;
use Aqarmap\Bundle\UserBundle\Entity\UserPackages;
use Aqarmap\Bundle\UserBundle\Form\AddUserPhoneFormType;
use Aqarmap\Bundle\UserBundle\Form\PersonalInfoType;
use Aqarmap\Bundle\UserBundle\Form\QuickRegistrationFormType;
use Aqarmap\Bundle\UserBundle\Form\RegistrationFormType;
use Aqarmap\Bundle\UserBundle\Form\UpdateCompanyInfoFormType;
use Aqarmap\Bundle\UserBundle\Form\UpdateProfileBasicInfoFormType;
use Aqarmap\Bundle\UserBundle\Form\UpdateProfileFormType;
use Aqarmap\Bundle\UserBundle\Form\UserPhoneType;
use Aqarmap\Bundle\UserBundle\Repository\UserPackagesRepository;
use Aqarmap\Bundle\UserBundle\Repository\UserRepository;
use Aqarmap\Bundle\UserBundle\Services\Contracts\UserCheckinHistoryServiceInterface;
use Aqarmap\Bundle\UserBundle\Services\Contracts\UserIpInfoServiceInterface;
use Aqarmap\Bundle\UserBundle\Services\Contracts\UserPhoneManagerInterface;
use Aqarmap\Bundle\UserBundle\Services\SavedSearchManager;
use Aqarmap\Bundle\UserBundle\Services\UserActivityService;
use Aqarmap\Bundle\UserBundle\Services\UserManager;
use Aqarmap\Bundle\UserBundle\Services\V3\UserInfoService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\QueryBuilder;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\View\View;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Mailer\MailerInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\SerializerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Nelmio\ApiDocBundle\Annotation\Model;
use Nelmio\ApiDocBundle\Annotation\Operation;
use OpenApi\Annotations as OA;
use Predis\ClientInterface as RedisClient;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class UserController extends BaseController
{
public const FIRST_PAGE_NUMBER = 1;
public const SUB_ACCOUNTS_LIMIT = 20;
private UserManager $userManager;
/**
* @var ListingManager
*/
private $listingManager;
/**
* @var CreditManagerInterface
*/
private $creditManager;
/**
* @var PhoneManagerInterface
*/
private $phoneManager;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var PaginatorInterface
*/
private $paginator;
/**
* @var ListingRateService
*/
private $listingRateService;
/**
* @var LeadService
*/
private $leadService;
/**
* @var SavedSearchManager
*/
private $savedSearchManager;
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @var FavouriteService
*/
private $favouriteService;
/**
* @var UserCheckinHistoryServiceInterface
*/
private $userCheckinHistoryServiceInterface;
/**
* @var UserManagerInterface
*/
private $fosUserManager;
/** @var TokenStorageInterface */
private $tokenStorage;
/** @var CreditRepository */
private $creditRepository;
/** @var UserRepository */
private $userRepository;
private UserPhoneManagerInterface $userPhoneManager;
private $listingRepository;
/** @var UserPackagesRepository */
private $userPackagesRepository;
private UserInfoService $userInfoService;
public function __construct(
EntityManagerInterface $entityManager,
PaginatorInterface $paginator,
EventDispatcherInterface $eventDispatcher,
TokenGeneratorInterface $tokenGenerator,
FormFactoryInterface $fosFormFactory,
SerializerInterface $jmsSerializer,
RedisClient $redis,
FeatureToggleManager $featureToggleManager,
TranslatorInterface $translator,
ProducerFactoryInterface $producerFactory,
TopCustomerService $topCustomerService,
ListingManager $listingManager,
LeadService $leadService,
CreditManagerInterface $creditManager,
SavedSearchManager $savedSearchManager,
FavouriteService $favouriteService,
ListingRateService $listingRateService,
UserCheckinHistoryServiceInterface $userCheckinHistoryServiceInterface,
PhoneManagerInterface $phoneManager,
MailerInterface $fosUserMailer,
UserActivityService $userActivityService,
UserManagerInterface $fosUserManager,
UserManager $userManager,
TokenStorageInterface $tokenStorage,
CreditRepository $creditRepository,
UserRepository $userRepository,
ParameterBagInterface $parameterBag,
UserPhoneManagerInterface $userPhoneManager,
ListingRepository $listingRepository,
UserPackagesRepository $userPackagesRepository, UserInfoService $userInfoService
) {
$this->entityManager = $entityManager;
$this->paginator = $paginator;
$this->eventDispatcher = $eventDispatcher;
$this->userManager = $userManager;
$this->favouriteService = $favouriteService;
$this->leadService = $leadService;
$this->savedSearchManager = $savedSearchManager;
$this->listingManager = $listingManager;
$this->creditManager = $creditManager;
$this->phoneManager = $phoneManager;
$this->translator = $translator;
$this->listingRateService = $listingRateService;
$this->fosUserManager = $fosUserManager;
$this->userCheckinHistoryServiceInterface = $userCheckinHistoryServiceInterface;
$this->tokenStorage = $tokenStorage;
$this->creditRepository = $creditRepository;
$this->userRepository = $userRepository;
$this->userPhoneManager = $userPhoneManager;
$this->listingRepository = $listingRepository;
$this->userPackagesRepository = $userPackagesRepository;
$this->userInfoService = $userInfoService;
}
/**
* Get User.
*
* @Operation(
* tags={"User"},
* summary="Get User.",
*
* )
*
* @Rest\Get("/api/v2/user", options={"i18n" = false, "expose"=true}, name="aqarmap_api_get_current_user_v2")
*
* @Rest\View(serializerGroups={"Default", "Details", "UpdateProfile"})
*
* @Security("is_granted('ROLE_USER')")
*/
public function user(): array
{
return [
'user' => $this->getUser(),
'balance' => (string) $this->userPackagesRepository->getTotalCreditsByUser($this->getUser()),
];
}
/**
* @Rest\Get("/api/users", requirements={"id":"\d+"}, options={"expose" = true, "i18n" = false}, name="aqarmap_api_get_all_users")
*
* @Rest\View(serializerGroups={"Default", "Details"})
*
* @Security("is_granted('ROLE_ADMIN')")
*
* @return View
*/
public function getUsers(Request $request)
{
if (empty($request->query->get('term'))) {
return View::create()->setData(['users' => []]);
}
/** @var QueryBuilder $query */
$query = $this->entityManager->getRepository(User::class)->search([
'q' => $request->query->get('term'),
'search' => 'listing_owner_menu',
]);
$query->setMaxResults(5);
$users = $query->getQuery()->getResult();
$usersData = [];
/** @var User $user */
foreach ($users as $user) {
@array_push($usersData, ['title' => $user->getEmailCanonical(), 'id' => $user->getId(), 'username' => $user->getUsername()]);
}
return View::create()->setData(['users' => $usersData]);
}
/**
* Create an account.
*
* @Operation(
* tags={"User"},
* summary="Create an account.",
*
* @OA\Parameter(
* name="register",
* in="query",
* description="",
* required=false,
* ),
*
* )
*
* @Rest\Post("/api/v2/user/quick-registration", options={"i18n" = false}, name="aqarmap_api_create_user_v2")
*
* @Rest\View(serializerGroups = {"Default", "Details"})
*/
public function createUser(Request $request)
{
$userManager = $this->fosUserManager;
$user = $userManager->createUser();
$form = $this->createForm(QuickRegistrationFormType::class, $user, [
'method' => 'POST',
'csrf_protection' => false,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Register user
$user = $this->userManager->quickRegistration($form, $user, $request);
// Return user
return ['user' => $user];
} elseif ($userEntity = $userManager->findUserByEmail($form->get('email')->getData())) {
// If user has 00000 as a phone number, then update his data, otherwise don't update anything
if (preg_match('/^[0]+$/', $userEntity->getPhoneNumber())) {
$userEntity->setPhoneNumber($form->get('phoneNumber')->getData());
$userEntity->setFullName($form->get('fullName')->getData());
$userManager->updateUser($userEntity);
}
return ['user' => $userEntity];
}
return $form;
}
/**
* Create a full user account.
*
* @Operation(
* tags={"User"},
* summary="Create a full user account.",
*
* @OA\Parameter(
* name="register",
* in="query",
* description="",
* required=false,
* ),
*
* )
*
* @Rest\Post("/api/v2/user", options={"i18n" = false}, name="aqarmap_api_create_new_user_v2")
*
* @Security("is_granted('ROLE_USER')")
*
* @Rest\View(serializerGroups = {"Default", "Details"})
*/
public function createNewUser(Request $request)
{
$userManager = $this->fosUserManager;
$dispatcher = $this->eventDispatcher;
/** @var $user \Aqarmap\Bundle\UserBundle\Entity\User */
$user = $userManager->createUser();
$form = $this->createForm(RegistrationFormType::class, $user, [
'method' => 'POST',
'csrf_protection' => false,
]);
$dispatcher->dispatch(new GetResponseUserEvent($user, $request), FOSUserEvents::REGISTRATION_INITIALIZE);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setEnabled(true);
$dispatcher->dispatch(new FormEvent($form, $request), FOSUserEvents::REGISTRATION_SUCCESS);
$userManager->updateUser($user);
return ['user' => $user];
}
return $form;
}
/**
* Get User Listings.
*
* @Operation(
* tags={"User"},
* summary="Get User Listings.",
*
* @OA\Parameter(
* name="page",
* in="query",
* description="Page number, starting from 1.",
* required=false,
* ),
* @OA\Parameter(
* name="limit",
* in="query",
* description="Number of items per page.",
* required=false,
* ),
* @OA\Parameter(
* name="orderBy",
* in="query",
* description="Sort search result by",
* required=false,
* ),
* @OA\Parameter(
* name="orderDirection",
* in="query",
* description="Ascending (A to Z, 0 to 9), Descending (Z to A, 9 to 0)",
* required=false,
* ),
*
* )
*
* @Rest\Get("/api/v2/user/{id}/listing", options={"i18n" = false}, name="aqarmap_api_get_user_lisings")
*
* @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
* @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=10, description="Number of items per page.")
* @Rest\QueryParam(
* name="orderBy", requirements="createdAt|publishedAt",
* nullable=true, default="createdAt", description="Sort search result by"
* )
* @Rest\QueryParam(
* name="orderDirection", requirements="ASC|DESC", nullable=true,
* default="DESC", description="Ascending (A to Z, 0 to 9), Descending (Z to A, 9 to 0)"
* )
*
* @Rest\View(serializerGroups={"Default", "Details"})
*
* @return array
*/
public function getUserListings(User $user, Request $request)
{
$em = $this->entityManager;
$criteria = [];
$orderDirection = 'ASC' == strtoupper($request->query->get('orderDirection')) ? 'ASC' : 'DESC';
$orderByParam = $request->query->get('orderBy');
$orderBy = (
\in_array(
$orderByParam,
[
'createdAt',
'publishedAt',
]
)
)
? $orderByParam
: 'createdAt';
if (!empty($orderByParam)) {
$criteria['orderBy'] = [
'l.'.$orderBy => $orderDirection,
];
}
$query = $em->getRepository(Listing::class)->getUserListings($user, $criteria);
// Creating pagination
$listings = $this->paginator->paginate(
$query,
$request->query->get('page', 1),
$request->query->get('limit', 10)
);
return [
'listings' => $listings,
'user' => $user,
];
}
/**
* Get My Listings Tabs.
*
* @Operation(
* tags={"User"},
* summary="Get My Listings Tabs.",
*
* )
*
* @Rest\Get("/api/v2/user/listing/tabs", options={"i18n" = false}, name="aqarmap_api_get_listings_tabs")
*
* @Rest\View(serializerGroups={"Default", "Details", "Api"})
*
* @Security("is_granted('ROLE_USER')")
*
* @return array
*/
public function getListingsTabs(Request $request)
{
$version = (float) ltrim((string) $request->headers->get('X-Accept-Version'), 'v');
$tabs = $this->listingManager->myListingsTabs($version, $this->getUser());
return [
'tabs' => $tabs,
];
}
/**
* Get My Credit.
*
* @Operation(
* tags={"User"},
* summary="Get My Credit.",
*
* @OA\Parameter(
* name="page",
* in="query",
* description="Page number, starting from 1.",
* required=false,
* ),
* @OA\Parameter(
* name="limit",
* in="query",
* description="Number of items per page.",
* required=false,
* ),
*
* )
*
* @Rest\Get("/api/v2/user/credit", options={"i18n" = false}, name="aqarmap_api_get_my_credit")
*
* @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
* @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=10, description="Number of items per page.")
*
* @Rest\View(serializerGroups={"Default", "List"})
*
* @Security("is_granted('ROLE_USER')")
*
* @return array
*/
public function getMyCredit(Request $request)
{
$user = $this->getUser();
return [
'credits' => $this->paginator->paginate(
$this->creditRepository->listUserCreditQuery($user),
$request->query->get('page', self::FIRST_PAGE_NUMBER),
$request->query->get('limit', self::FIRST_PAGE_NUMBER)
),
'balance' => (string) $this->userPackagesRepository->getTotalCreditsByUser($user),
];
}
/**
* Get My Account.
*
* @Operation(
* tags={"User"},
* summary="Get My Account.",
*
* )
*
* @Rest\Get("/api/v2/user/account", options={"i18n" = false}, name="aqarmap_api_get_my_account")
*
* @Rest\View(serializerGroups={"Api", "List"})
*
* @Security("is_granted('ROLE_BROKER')")
*
* @Cache(expires="+1 days", maxage="+1 days", smaxage="+1 days", public=false, vary={"Accept-Language", "X-Accept-Version", "Accept"})
*/
public function getMyAccount(EntityManagerInterface $em, UserRepository $userRepo, ListingRepository $listingRepo): array
{
/** @var User $user */
$user = $this->getUser();
$this->disableSoftDelete();
// Number of leads
$account['leads'] = [
'user' => $user,
'total_leads' => $em->getRepository(Lead::class)->getLeadsCount([$user->getId()]),
'show_phone' => $em->getRepository(Lead::class)->getLeadsCount([$user->getId()], LeadTypes::SHOW_PHONE),
'call_request' => $em->getRepository(Lead::class)->getLeadsCount([$user->getId()], LeadTypes::CALL_REQUEST),
'messages' => $em->getRepository(Lead::class)->getLeadsCount([$user->getId()], LeadTypes::SEND_MESSAGE),
];
$this->enableSoftDelete();
// Number of customers
$account['customers'] = $userRepo->getUserCustomersCount($user);
// Number of Active listings [None draft or deleted]
$account['listings'] = (string) $listingRepo->getActiveUserListingsCount($user);
// Latest Credit
$account['credit'] = (string) $this->userPackagesRepository->getTotalCreditsByUser($user);
// My Account Managers
$account['account_managers'] = !empty($user->getCompany()) ? $user->getCompany()->getAccountManagers() : null;
$userTotalRate = $this->listingRateService->getSellerTotalRate([
'userId' => $user->getId(),
'timespan' => ListingRateConstant::DATE_RANGE_START,
]);
$account['userTotalRate'] = $userTotalRate['rate'] ?? null;
return $account;
}
/**
* Get User Account.
*
* @Operation(
* tags={"User"},
* summary="Get User Account.",
*
* )
*
* @Rest\Get("/api/v2/user/{user}/account", options={"i18n" = false}, name="aqarmap_api_get_user_account")
*
* @Rest\View(serializerGroups={"Default", "SuiteCrm"})
*
* @return array
*/
public function getUserAccount(User $user)
{
ini_set('memory_limit', '512M');
return $this->respond($user);
}
/**
* Get User Apps Last Checked Date.
*
* @Operation(
* tags={"User"},
* summary="Get User Apps Last Checked Date.",
*
* @OA\Parameter(
* name="source",
* in="query",
* description="Add Source for any kind of application (1 maps to live) is the available options",
* required=false,
* ),
*
* )
*
* @Rest\Get("/api/v2/user/checkins", options={"i18n" = false}, name="aqarmap_api_checkins")
*
* @Rest\QueryParam(name="source", default=1, description="Add Source for any kind of application (1 maps to live) is the available options")
*
* @Rest\View(serializerGroups={"Default", "SuiteCrm"})
*
* @Security("is_granted('ROLE_USER')")
*
* @return array
*/
public function checkin(Request $request)
{
/** @var User $user */
$user = $this->getUser();
$source = $request->query->get('source');
if (UserCheckinSource::LIVE_LABEL == strtolower($source)) {
$source = UserCheckinSource::LIVE;
}
if (!\in_array($source, UserCheckinSource::getSources())) {
return $this->respond('Not Implemented source', Response::HTTP_NOT_IMPLEMENTED);
}
$this->userManager->checkinUser($user, $source);
$this->userCheckinHistoryServiceInterface->create($user->getId(), $source);
return $this->respond([], Response::HTTP_NO_CONTENT);
}
/**
* Get My Leads.
*
* @Operation(
* tags={"User"},
* summary="Get My Leads.",
*
* @OA\Parameter(
* name="page",
* in="query",
* description="Page number, starting from 1.",
* required=false,
* ),
* @OA\Parameter(
* name="limit",
* in="query",
* description="Number of items per page.",
* required=false,
* ),
* @OA\Parameter(
* name="user_id",
* in="query",
* description="Filter Leads with the given user id",
* required=false,
* ),
* @OA\Parameter(
* name="quality",
* in="query",
* description="Filter Leads with the given quality",
* required=false,
* ),
*
* )
*
* @Rest\Get("/api/v2/user/leads", options={"i18n" = false}, name="aqarmap_api_get_my_leads")
*
* @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
* @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=10, description="Number of items per page.")
* @Rest\QueryParam(name="user_id", requirements="\d+", nullable=true, description="Filter Leads with the given user id")
* @Rest\QueryParam(name="quality", requirements="\d+", nullable=true, description="Filter Leads with the given quality")
*
* @Rest\View(serializerGroups={"Default", "MyLeads", "LeadQuality"})
*
* @Security("is_granted('ROLE_BROKER')")
*
* @return array
*/
public function getMyLeads(Request $request, EntityManagerInterface $entityManager, SubAccountService $subAccountService)
{
$leadRepo = $entityManager->getRepository(ListingLead::class);
$entityManager->getFilters()->disable('softdeleteable');
$criteria = [
'user_id' => $request->query->get('user_id'),
'quality' => $request->query->get('quality'),
];
$users = $subAccountService->getActiveSubAccountsIds($request->get('users', []), $this->getUser()->getId());
$pagination = $this->paginator->paginate(
$leadRepo->getUserLeads($users, $criteria, null, null, true),
$request->query->get('page', 1),
$request->query->get('limit', 10)
);
$types = [];
foreach (LeadTypes::getChoices() as $key => $type) {
$types[] = [
$key => $this->translator->trans($type),
];
}
return [
'leads' => $pagination,
'types' => $types,
];
}
/**
* Get My Customers.
*
* @Operation(
* tags={"User"},
* summary="Get My Customers.",
*
* @OA\Parameter(
* name="page",
* in="query",
* description="Page number, starting from 1.",
* required=false,
* ),
* @OA\Parameter(
* name="limit",
* in="query",
* description="Number of items per page.",
* required=false,
* ),
*
* )
*
* @Rest\Get("/api/v2/user/customers", options={"i18n" = false}, name="aqarmap_api_get_my_customers")
*
* @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
* @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=10, description="Number of items per page.")
*
* @Rest\View(serializerGroups={"Default","List"})
*
* @Security("is_granted('ROLE_BROKER')")
*
* @return array
*/
public function getMyCustomers(Request $request)
{
/** @var User $user */
$user = $this->getUser();
$leadRepo = $this->entityManager->getRepository(User::class);
$pagination = $this->paginator->paginate(
$leadRepo->getUserCustomers($user),
$request->query->get('page', 1),
$request->query->get('limit', 10),
['wrap-queries' => true]
);
return [
'customers' => $pagination,
];
}
/**
* Get User Note.
*
* @Operation(
* tags={"User"},
* summary="Returns a Note for a specific user",
*
* @OA\Response(
* response="404",
* description="Returned when the user is not found"
* )
* )
*
* @Rest\Get("/api/v2/user/{id}/note", options={"i18n" = false}, name="aqarmap_api_get_user_note")
*
* @Rest\View()
*
* @Security("is_granted('ROLE_USER')")
*/
public function getListingNote(User $user): View
{
$userNoteRepo = $this->entityManager->getRepository(UserNote::class);
return $this->respond($userNoteRepo->findOneBy([
'notedBy' => $this->getUser(),
'user' => $user,
]));
}
/**
* Create User Note.
*
* @Operation(
* tags={"User"},
* summary="Creates a Note for a specific User (Overrides previous note)",
*
* @OA\Parameter(
* name="body",
* in="query",
* description="Note Body",
* required=false,
* ),
* @OA\Parameter(
* name="source",
* in="query",
* description="Supported sources: 1 = Website, 2 = Consumer App, 3 = Live App",
* required=false,
* ),
* @OA\Parameter(
* name="last_modified_at",
* in="query",
* description="dateTime",
* required=false,
* ),
* @OA\Parameter(
* name="created_at",
* in="query",
* description="dateTime",
* required=false,
* ),
*
* @OA\Response(
* response="201",
* description="Returned when successfully Created"
* ),
* @OA\Response(
* response="404",
* description="Returned when the listing is not found"
* )
* )
*
* @Rest\Post("/api/v2/user/{id}/note", options={"i18n" = false}, name="aqarmap_api_post_user_note")
*
* @Rest\RequestParam(name="body", description="Note Body")
* @Rest\RequestParam(name="source", description="Supported sources: 1 = Website, 2 = Consumer App, 3 = Live App")
* @Rest\RequestParam(name="last_modified_at", description="dateTime")
* @Rest\RequestParam(name="created_at", description="dateTime")
*
* @Security("is_granted('ROLE_USER')")
*
* @return array
*/
public function postUserNote(User $user, Request $request)
{
$em = $this->entityManager;
$userNoteRepo = $em->getRepository(UserNote::class);
// Trying to find old note
$userNote = $userNoteRepo->findOneBy([
'notedBy' => $this->getUser(),
'user' => $user,
]);
if (empty($userNote)) {
$userNote = new UserNote();
}
$userNote->setBody($request->request->get('body'));
$userNote->setNotedBy($this->getUser());
$userNote->setUser($user);
if ($request->request->get('source')) {
$userNote->setSource($request->request->get('source'));
}
if ($request->request->get('last_modified_at')) {
$userNote->setLastModifiedAt($request->request->get('last_modified_at'));
}
if ($request->request->get('created_at')) {
$userNote->setCreatedAt($request->request->get('created_at'));
}
$em->persist($userNote);
$em->flush();
return $this->respond($userNote, Response::HTTP_CREATED);
}
/**
* Check User Role.
*
* @Operation(
* tags={"User"},
* summary="Attempet to update user profile.",
*
* )
*
* @Rest\Get("/api/v2/user/roles", options={"i18n" = false}, name="aqarmap_api_check_user_roles")
*
* @Rest\QueryParam(name="has", description="Provide a user role to be checked [ broker ] for now. ")
*
* @Rest\View()
*
* @return array
*/
public function checkUserRoles(Request $request)
{
/** @var User $user */
$user = $this->getUser();
if ('broker' == $request->query->get('has')) {
if (!\in_array('ROLE_BROKER', $user->getRoles())) {
throw new AccessDeniedHttpException("Forbidden, user don't have this permession.");
}
} elseif ('dashboard' == $request->query->get('has')) {
if (!\in_array('ROLE_DASHBOARD', $user->getRoles())) {
throw new AccessDeniedHttpException("Forbidden, user don't have this permession.");
}
} else {
throw new BadRequestHttpException('Please provide a valide "has" query parameter.');
}
return ['code' => '200'];
}
/**
* Attempet to check email existance.
*
* @Operation(
* tags={"User"},
* summary="Attempet to check email existance.",
*
* @OA\Parameter(
* name="_username",
* in="query",
* description="Username or Email..",
* required=false,
* ),
*
* )
*
* @Rest\Post("/api/user/attempt", options={"i18n" = false}, name="aqarmap_user_email_checker", options={"expose"=true})
* @Rest\Post("/api/v2/user/check", options={"i18n" = false}, name="aqarmap_v2_user_email_checker")
*
* @Rest\RequestParam(name="_username", description="Username or Email..")
*
* @return View
*/
public function attempt(Request $request)
{
$email = $request->request->get('_username');
$data = ['exists' => false];
/** @var User $user */
$user = $this->fosUserManager->findUserByUsernameOrEmail($email);
$userExistsAndEnabled = ($user && $user->isEnabled());
if ($userExistsAndEnabled) {
$data = [
'exists' => true,
];
if ('aqarmap_v2_user_email_checker' != $request->get('_route')) {
$data['quickRegistered'] = true == $user->isIsQucikRegistered() ? true : false;
}
}
return View::create()->setData($data);
}
/**
* Getting the current user data.
*
* @Rest\Get("/api/user", options={"i18n" = false}, name="aqarmap_user_data", options={"expose"=true})
*
* @Rest\View(serializerGroups={"List"})
*/
public function getCurrentUser()
{
/** @var User $user */
$user = $this->getUser();
$update = false;
if ($user) {
$now = new \DateTime();
$diff = $now->diff($user->getLastUpdate());
if ($diff->days >= 90 || !$user->getCountryCode()) {
$update = true;
}
}
return $this->respond(['user' => $user, 'update' => $update]);
}
/**
* Update the current user data.
*
* @Rest\Post("/api/user", options={"i18n" = false}, name="aqarmap_user_update", options={"expose"=true})
*
* @Rest\View(serializerGroups={"List"})
*
* @return View
*/
public function update(Request $request)
{
$userManager = $this->fosUserManager;
/** @var User $user */
$user = $this->getUser();
$formInputs = $request->request->get('register');
$user->setPhoneNumber($formInputs['phoneNumber']);
$form = $this->createForm(QuickRegistrationFormType::class, $user, [
'method' => 'POST',
'action' => $this->generateUrl('aqarmap_user_update'),
'validation_groups' => ['lead'],
'onlyLeadData' => true,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$phoneManager = $this->phoneManager;
$originalPhoneNumber = $form->get('phoneNumber')->getData();
$phone = $phoneManager->trimZero($form->get('phoneNumber')->getData(), $form->get('countryCode')->getData());
$user->setLastUpdate(new \DateTime());
$phoneManager->addNewUserPhone(
$phone,
$form->get('countryCode')->getData(),
$user,
true,
true,
null,
$originalPhoneNumber
);
$user->setMigratedPhone(true);
$user->setPhoneNumber(null);
$userManager->updateUser($user);
return $this->respond([
'status' => 'ok',
'message' => $this->translator->trans('popup_form.profile_updated'),
]);
}
return $this->respond($form, Response::HTTP_BAD_REQUEST);
}
/**
* Attempet to update user profile.
*
* @Operation(
* tags={"User"},
* summary="get sub-users Accounts.",
*
* @OA\Parameter(
* name="page",
* in="query",
* description="Page number, starting from 1.",
* required=false,
* ),
* @OA\Parameter(
* name="limit",
* in="query",
* description="Number of items per page.",
* required=false,
* ),
*
* )
*
* @Rest\Put("/api/v2/user", options={"i18n" = false}, name="aqarmap_user_profile_update")
*
* @Security("is_granted('ROLE_USER')")
*
* @Rest\View(serializerGroups = {"Default", "Details"})
*/
public function updateUserProfile(Request $request)
{
$userManager = $this->fosUserManager;
/** @var User $user */
$user = $this->getUser();
$formInputs = $request->request->get('updateProfile');
$user->setPhoneNumber($formInputs['phoneNumber']);
$form = $this->createForm(UpdateProfileFormType::class, $user, [
'method' => 'PUT',
'action' => $this->generateUrl('aqarmap_user_profile_update'),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$phoneManager = $this->phoneManager;
$originalPhoneNumber = $form->get('phoneNumber')->getData();
$phone = $phoneManager->trimZero($form->get('phoneNumber')->getData(), $form->get('countryCode')->getData());
$user->setLastUpdate(new \DateTime());
$phoneManager->addNewUserPhone(
$phone,
$form->get('countryCode')->getData(),
$user,
true,
true,
null,
$originalPhoneNumber
);
$user->setMigratedPhone(true);
$user->setPhoneNumber(null);
$userManager->updateUser($user);
return $this->respond([
'status' => 'ok',
'message' => $this->translator->trans('popup_form.profile_updated'),
]);
}
return $this->respond($form, Response::HTTP_BAD_REQUEST);
}
/**
* update user profile basic info.
*
* @Rest\Post("/api/v2/user/update-profile-basic-info", options={"i18n" = false}, name="aqarmap_user_profile_update-basic-info")
*
* @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
*
* @OA\Tag(name="User")
*
* @OA\RequestBody(
* description="Request content",
*
* @Model(type=UpdateProfileBasicInfoFormType::class)
* )
*/
public function updateProfileBasicInfo(Request $request, MessageBusInterface $bus): View
{
/** @var User $user */
$user = $this->getUser();
$form = $this->createForm(UpdateProfileBasicInfoFormType::class, $user, [
'csrf_protection' => false,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setIsValidPersonalPhoto(false);
$this->fosUserManager->updateUser($user);
$bus->dispatch(new UpdateProfileMessage($user->getAuthIdentifier(), (string) $user->getFullName()));
return $this->respond([
'user' => $user,
]);
}
return $this->respond($form, Response::HTTP_BAD_REQUEST);
}
/**
* update user phones.
*
* @Rest\Post("/api/v2/user/update-user-phone/{id}", options={"i18n" = false}, name="aqarmap_user_update_phone")
*
* @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
*/
public function updateUserPhone(Request $request, UserPhone $userPhone): View
{
$form = $this->createForm(UserPhoneType::class, $userPhone);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->userPhoneManager->saveUserPhone($userPhone);
if ($userPhone->isWhatsApp()) {
$this->userPhoneManager->disablePhonesWhatsApp($userPhone);
}
return $this->respond([
'phone' => $userPhone,
], Response::HTTP_OK);
}
return $this->respond($form, Response::HTTP_BAD_REQUEST);
}
/**
* remove user phones.
*
* @Rest\Delete("/api/v2/user/remove-user-phone/{id}", options={"i18n" = false}, name="aqarmap_user_remove_phone")
*
* @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
*/
public function removeUserPhone(UserPhone $userPhone): View
{
$this->userPhoneManager->removeUserPhone($userPhone);
return $this->respond([
'message' => 'Phone removed successfully',
], Response::HTTP_OK);
}
/**
* update user company info.
*
* @Rest\Post("/api/v2/user/update-company-info", options={"i18n" = false}, name="aqarmap_user_update-company-info")
*
* @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
*/
public function updateCompanyInfo(Request $request): View
{
/** @var User $user */
$user = $this->getUser();
$form = $this->createForm(UpdateCompanyInfoFormType::class, $user, [
'csrf_protection' => false,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->fosUserManager->updateUser($user);
return $this->respond([
'user' => $user,
], Response::HTTP_OK);
}
return $this->respond($form, Response::HTTP_BAD_REQUEST);
}
/**
* update user company info.
*
* @Rest\Post("/api/v2/user/remove-photo", options={"i18n" = false}, name="aqarmap_user_remove-photo")
*
* @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
*/
public function removePhoto(Request $request): View
{
/** @var User $user */
$user = $this->getUser();
$this->userManager->removePhoto($request->request->get('type'), $user);
return $this->respond([
'user' => $user,
], Response::HTTP_OK);
}
/**
* update user profile personal info.
*
* @Rest\Post("/api/v2/user/update-profile-personal-info", options={"i18n" = false}, name="aqarmap_user_profile_update-personal-info")
*
* @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
*/
public function updateProfilePersonalInfo(Request $request): View
{
/** @var User $user */
$user = $this->getUser();
$personalInfo = $user->getActivePersonalInfo();
if (null === $personalInfo) {
$personalInfo = new PersonalInfo();
$personalInfo->setUser($user);
}
$form = $this->createForm(PersonalInfoType::class, $personalInfo, [
'csrf_protection' => false,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->userManager->updateProfilePersonalInfo($user, $personalInfo);
return $this->respond([
'user' => $user,
], Response::HTTP_OK);
}
return $this->respond($form, Response::HTTP_BAD_REQUEST);
}
/**
* get user profile personal info options data.
*
* @Rest\Get("/api/v2/user/get-profile-personal-info-options-data", options={"i18n" = false}, name="aqarmap_user_get_profile_personal_info_options_data")
*/
public function getPersonalInfoOptionsData(): View
{
return $this->respond([
'age' => array_flip(Age::$AGES),
'gender' => array_flip(Gender::$GENDER),
'maritalStatus' => array_flip(MaritalStatus::$MaritalStatus),
'education' => array_flip(Education::$EDUCATION),
'industry' => array_flip(Industry::$INDUSTRY),
'position' => array_flip(Position::$POSITION),
'purchaseInfo' => array_flip(PurchaseInfo::$PURCHASE_INFO),
]);
}
/**
* Sending password reset link.
*
* @Operation(
* tags={"User"},
* summary="Sending password reset link.",
*
* @OA\Parameter(
* name="username",
* in="query",
* description="Username or Email..",
* required=false,
* ),
*
* )
*
* @Rest\Post("/api/user/reset", options={"i18n" = false}, name="aqarmap_user_reset_email")
*
* @Rest\QueryParam(name="username", description="Username or Email..")
*
* @return View|Response
*/
public function sendResetPasswordEmail(Request $request, AuthServer $authServer)
{
$username = $request->request->get('username');
$translator = $this->translator;
/** @var $user User */
$user = $this->fosUserManager->findUserByUsernameOrEmail($username);
if (null === $user) {
throw $this->createNotFoundException('Unable to find this user.');
}
$authServer->resetPassword($user->getEmailCanonical());
return View::create()->setData(['status' => 'ok', 'message' => $translator->trans('resetting.check_email', ['%email%' => $user->getEmail()], 'FOSUserBundle')]);
}
/**
* Count user listings.
*
* @Operation(
* tags={"User"},
* summary="Count user listings.",
*
* )
*
* @Rest\Post("/api/user/listings/count", options={"i18n" = false, "expose"=true}, name="aqarmap_user_listings_counter")
*
* @return View
*/
public function countUserListings()
{
/** @var User $user */
$user = $this->getUser();
$email = $user->getEmail();
$data = [];
/** @var User $user */
$user = $this->fosUserManager->findUserByUsernameOrEmail($email);
if ($user) {
$data = [
'drafts' => $user->getDraftListings()->count(),
'all' => $user->getNotDraftListings()->count(),
];
}
return $this->respond($data);
}
/**
* Get users based on keyword.
*
* @Operation(
* tags={"User"},
* summary="Get users based on keyword.",
*
* )
*
* @Rest\Get("/api/user", options={"i18n"=false, "expose"=true}, name="api_aqarmap_keyword_users")
*
* @return View
*/
public function getUserByKeyword(Request $request)
{
/** @var QueryBuilder $query */
$query = $this->entityManager->getRepository(User::class)->search([
'q' => $request->query->get('keyword'),
'search' => $request->query->get('searchBy'),
'limit' => 5,
]);
$users = $query->getQuery()->getResult();
if (0 == \count($users)) {
throw $this->createNotFoundException('Unable to find this user.');
}
$data = [];
foreach ($users as $user) {
$data[] = [
'userId' => $user->getId(),
'username' => $user->getfullName(),
'userEmail' => $user->getEmail(),
'phoneNumber' => $user->getPhoneNumber(),
];
}
return $this->respond($data);
}
/**
* List Team associates.
*
* @Operation(
* tags={"User"},
* summary="List Team associates.",
*
* )
*
* @Rest\Get("/api/user/team/associates", options={"i18n" = false, "expose"=true}, name="api_aqarmap_team_users")
*
* @return View
*/
public function getTeamUsers(Request $request)
{
$team = $this->entityManager
->getRepository(\Aqarmap\Bundle\UserBundle\Entity\Team::class)
->find((int) $request->query->get('teamId'));
$data = [];
foreach ($team->getUsers() as $user) {
$data[] = [
'id' => $user->getId(),
'username' => $user->getUsername(),
];
}
return $this->respond($data);
}
/**
* get sub-users Accounts.
*
* @Operation(
* tags={"Oauth2"},
* summary="",
*
* @OA\Parameter(
* name="client_id",
* in="query",
* description="Client ID",
* required=false,
* ),
* @OA\Parameter(
* name="client_secret",
* in="query",
* description="Client Secret",
* required=false,
* ),
* @OA\Parameter(
* name="subAccount_id",
* in="query",
* description="User Sub-account Id",
* required=false,
*
* @OA\Schema(type="")
* ),
*
* )
*
* statusCodes={
* 200 = "Returned when successful",
* 404="Returned when the parent account is not found"
* }
* )
*
* @Rest\Get("/api/v2/sub-accounts", options={"i18n" = false}, name="aqarmap_api_get_sub-accounts_v2")
* @Rest\Get("/api/v2/sub-acccounts", options={"i18n" = false}, name="aqarmap_api_get_sub-acccounts_v2")
*
* @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
* @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=20, description="Number of items per page.")
*
* @Rest\View(serializerGroups={"Default", "Details"})
*
* @return array
*/
public function getSubAccounts(Request $request)
{
ini_set('memory_limit', '512M');
/** @var User $user */
$user = $this->getUser();
$subAccounts = $this->entityManager
->getRepository(User::class)
->findBy(['parent' => $user->getId()]);
$creditManager = $this->creditManager;
$listingManager = $this->listingManager;
if (\count($subAccounts)) {
$startDate = null;
$period = null;
$subAccountsData = [];
/** @var User $subAccount */
foreach ($subAccounts as $subAccount) {
@array_push($subAccountsData, [
'id' => $subAccount->getId(),
'referenceId' => $subAccount->getId(),
'username' => $subAccount->getUsername(),
'logo' => $subAccount->getLogo(),
'listingsCount' => $subAccount->getListings()->count(),
'hasValidCredit' => $subAccount->hasValidCredit(),
'credit' => $creditManager->getBalance($subAccount),
'rates' => $listingManager->getUserListingsRatesCounts((object) $subAccount, $startDate, $period, false),
]);
}
return [
'sub-accounts' => $this->paginator->paginate(
$subAccountsData,
$request->query->get('page', self::FIRST_PAGE_NUMBER),
$request->query->get('limit', self::SUB_ACCOUNTS_LIMIT)
),
];
}
return $this->respond([], Response::HTTP_NOT_FOUND);
}
/**
* @Operation(
* tags={"User"},
* summary="",
*
* )
*
* @Rest\Get("api/v2/oauth/switchAccounts", options={"i18n" = false}, name="aqarmap_api_oauth_switchAccounts")
*
* @Rest\QueryParam(name="client_id", description="Client ID",)
* @Rest\QueryParam(name="client_secret", description="Client Secret")
*
* @Rest\RequestParam(name="subAccount_id", description="User Sub-account Id")
*
* @Rest\View()
*
* @return Response
*/
public function switchAccount(Request $request)
{
$accessToken = $request->get('access_token');
try {
$this->userManager->authenticateWithToken($accessToken);
} catch (\Exception $exception) {
throw new AccessDeniedHttpException('Forbidden, User is not logged in');
}
$subAccountId = $request->get('subAccount_id');
if (!$subAccountId) {
throw new BadRequestHttpException('Missing sub-account ID');
}
if ($request->get('subAccount_id')) {
/** @var User $user */
$user = $this->getUser();
}
$getParentOfSubAccount = $this->userRepository->find($subAccountId)->getParent();
if ($getParentOfSubAccount != $user) {
throw new AccessDeniedHttpException("Forbidden, sub-account parent doesn't match logged in user");
}
// @todo remove/replace this after refactoring
$subAccountsTokens = $this->oAuthTokenService->getToken($request);
return $subAccountsTokens;
}
/**
* Get company info of a user.
*
* @Operation(
* tags={"User"},
* summary="Get company info of a user",
*
* )
*
* @Rest\Get("/api/user/{user}/company", options={"i18n" = false, "expose"=true}, name="aqarmap_api_user_company")
*
* @Security("is_granted('ROLE_ADMIN')")
*
* @return View
*/
public function getUserCompanyInfo(User $user)
{
$company = $user->getCompany();
if (null == $company) {
throw $this->createNotFoundException('This user is not linked to any company.');
}
$companyLocation = $company->getLocation();
$referal = $company->getReferedBy();
$accountManagers = $company->getAccountManagers();
$staff = !$accountManagers->isEmpty() ?
$accountManagers->last()
: null;
$data = [
'hqTerritoryId' => $companyLocation ? $companyLocation->getId() : null,
'hqTerritoryText' => $companyLocation ? $companyLocation->getTitleFullPath() : null,
'sellerType' => $company->getSellerType() ? $company->getSellerType() : '',
'companyName' => $company->getName() ? $company->getName() : null,
'companyEmail' => $company->getEmail() ? $company->getEmail() : null,
'referedBy' => $referal ? $referal->getId() : null,
'userEmail' => $referal ? $referal->getEmail() : null,
'userPhone' => $referal ? $referal->getPhoneNumber() : null,
'username' => $referal ? $referal->getUsername() : null,
'accountManagerId' => $staff ? $staff->getId() : null,
'accountManagerEmail' => $staff ? $staff->getEmail() : null,
'accountManagerPhoneNumber' => $staff ? $staff->getPhone() : null,
'accountManagerName' => $staff ? $staff->getName() : null,
];
return $this->respond($data);
}
/**
* Get User total rate.
*
* @Operation(
* tags={"User"},
* summary="Get User total rate.",
*
* @OA\Parameter(
* name="timespan",
* in="query",
* description="Timespan",
* required=false,
* ),
*
* )
*
* @Rest\Get("/api/v2/user/{id}/rates", options={"i18n" = false})
* @Rest\Get("/api/user/{id}/rates", options={"i18n" = false, "expose"=true}, name="aqarmap_api_get_user_rates")
*
* @Rest\QueryParam(
* name="timespan",
* nullable=true, description="Timespan"
* )
*
* @Rest\View(serializerGroups={"rate"})
*
* @return array
*/
public function getRate(Request $request, User $user)
{
$criteria = [
'userId' => $user->getId(),
'timespan' => $request->query->get('timespan', ListingRateConstant::DATE_RANGE_START),
];
return $this->listingRateService->getWeeklySellerRateDetails($criteria);
}
/**
* @Operation(
* tags={"User"},
* summary="",
*
* )
*
* @Rest\Post("/api/v2/user/search", options={"i18n" = false})
* @Rest\Post("/api/user/search", options={"i18n" = false, "expose"=true}, name="aqarmap_api_post_user_search")
*
* @Security("is_granted('ROLE_USER')")
*
* @return array
*/
public function postUserSearch(Request $request)
{
$this->savedSearchManager->create($request->request->get('search'));
return $this->respond('Search Added Successfully');
}
/**
* @Operation(
* tags={"User"},
* summary="",
*
* )
*
* @Rest\Delete("/api/v2/user/search/{search}/delete", options={"i18n" = false})
* @Rest\Delete("/api/user/search/{search}/delete", options={"i18n" = false, "expose"=true}, name="aqarmap_api_delete_user_search")
*
* @Security("is_granted('ROLE_OWNER', search)")
*
* @return array
*/
public function deleteUserSearch(SavedSearch $search)
{
$this->savedSearchManager->delete($search);
return $this->respond('Search Deleted Successfully');
}
/**
* @Operation(
* tags={"User"},
* summary="",
*
* )
*
* @Rest\Get("/api/v2/user/{user}/search/", options={"i18n" = false})
* @Rest\Get("/api/user/{user}/search/", options={"i18n" = false, "expose"=true}, name="aqarmap_api_read_user_search")
*
* @Security("is_granted('ROLE_USER')")
*
* @Rest\View()
*/
public function searchRead(Request $request): array
{
$criteria = ['userId' => $request->attributes->get('user')];
$savedSearchtRepository = $this->container->get('doctrine')->getRepository(SavedSearch::class);
$pagination = $this->paginator->paginate(
$savedSearchtRepository->findSearchQuery($criteria)->getResult(),
$request->query->get('page', 1),
$request->query->get('limit', 10)
);
$mappedItems = $this->savedSearchManager->getWithLocations($pagination->getItems(), $request->query->get('hl'));
$context = SerializationContext::create()->setGroups(['Search']);
$pagination->setItems(
json_decode($this->container->get('jms_serializer')->serialize($mappedItems, 'json', $context), true)
);
return ['search' => $pagination];
}
/**
* @Operation(
* tags={"User"},
* summary="Read favourite",
*
* @OA\Parameter(
* name="user_key",
* in="query",
* description="user key",
* required=false,
* ),
*
* )
*
* @Rest\Get("/api/v2/user/{user}/favourite", options={"i18n" = false})
* @Rest\Get("/api/user/{user}/favourite", options={"i18n" = false, "expose" = true}, name="aqarmap_api_read_listing_favourite")
* @Rest\Get("/api/user/favourite", options={"i18n" = false, "expose" = true}, name="aqarmap_api_read_listing_favourite_without_user_id")
*
* @Rest\QueryParam(name="user_key", description="user key")
*
* @Rest\View(serializerGroups={"Default", "List"})
*
* @return array
*/
public function favouriteRead(Request $request)
{
$pagination = $this->paginator->paginate(
$this->favouriteService->getUserFavourite($request),
$request->query->get('page', 1),
$request->query->get('limit', 10)
);
return ['favourite' => $this->listingManager->setUserActivitiesFromPagination($pagination)];
}
/**
* @Operation(
* tags={"User"},
* summary="Read favourite",
*
* )
*
* @Rest\Get("/api/v2/user/{user}/notes", options={"i18n" = false}, name="aqarmap_api_v2_read_user_note")
* @Rest\Get("/api/user/{user}/note", options={"i18n" = false, "expose" = true}, name="aqarmap_api_read_user_note")
*
* @Rest\View(serializerGroups={"Default", "List"})
*
* @return array
*/
public function noteRead(Request $request)
{
$criteria = ['userId' => $request->attributes->get('user')];
$listingNoteRepository = $this->entityManager->getRepository(\Aqarmap\Bundle\ListingBundle\Entity\ListingNote::class);
$pagination = $this->paginator->paginate(
$listingNoteRepository->findQuery($criteria),
$request->query->get('page', 1),
$request->query->get('limit', 10)
);
return ['note' => $this->listingManager->setUserActivitiesFromPagination($pagination)];
}
/**
* @Operation(
* tags={"User"},
* summary="Show Phone Number",
*
* )
*
* @Rest\Get("/api/user/{user}/phone", options={"i18n" = false, "expose" = true}, name="aqarmap_api_show_user_phone")
*
* @Rest\View()
*
* @return array
*/
public function showPhoneNumber(Request $request)
{
$criteria = ['userId' => $request->attributes->get('user')];
/** @var User $user */
$user = $this
->entityManager
->getRepository(User::class)
->findOneById($criteria['userId']);
if (!$user) {
return $this->respond('User Not Found', Response::HTTP_NOT_FOUND);
}
$phone = sprintf('%s%s', $user->getCountryCode(), $this->userPhoneManager->extractPhoneWithoutCountryCode($user));
return $this->respond(['phone' => $phone], Response::HTTP_OK);
}
/**
* Get leads that user generates.
*
* @Operation(
* tags={"User"},
* summary="Get leads that user generates.",
*
* @OA\Parameter(
* name="sort",
* in="query",
* description="Sort leads by creation date",
* required=false,
* ),
* @OA\Parameter(
* name="direction",
* in="query",
* description="Ascending (A to Z, 0 to 9), Descending (Z to A, 9 to 0)",
* required=false,
* ),
*
* )
*
* @Rest\Get("/api/v2/user/my-lead", options={"i18n" = false})
* @Rest\Get("/api/user/my-lead", options={"i18n" = false, "expose"=true}, name="aqarmap_api_read_user_generated_leads")
*
* @Rest\QueryParam(
* name="sort", requirements="createdAt", nullable=true,
* default=null, description="Sort leads by creation date"
* )
* @Rest\QueryParam(
* name="direction", requirements="asc|desc", nullable=true,
* default="asc", description="Ascending (A to Z, 0 to 9), Descending (Z to A, 9 to 0)"
* )
*
* @Security("is_granted('ROLE_USER')")
*
* @Rest\View(serializerGroups={"Default", "List"})
*
* @return array
*/
public function myGeneratedLeads(Request $request)
{
$pagination = $this->paginator->paginate(
$this->leadService->getGeneratedLeads(),
$request->query->get('page', 1),
$request->query->get('limit', 10)
);
return ['lead' => $this->listingManager->setUserActivitiesFromPagination($pagination)];
}
/**
* update listing fields.
*
* @Rest\Post("api/user/phone/{id}/edit", options={"i18n" = false, "expose" = true}, name="update_user_phone_field")
*
* @Rest\View(serializerGroups={"Default", "Details"})
*
* @Security("is_granted('ROLE_ADMIN')")
*
* @return Response
*/
public function updatePhone(Phone $phone, Request $request)
{
$this->phoneManager->updateNumber($phone, $request->request->get('number'));
return $this->respond([
'phone' => $phone,
'msg' => 'Phone was updated successfully',
]);
}
/**
* Get Account NPS Data.
*
* @Operation(
* tags={"User"},
* summary="Get Account NPS Data.",
*
* )
*
* @Rest\Get("/api/stateful/user/nps-data", options={"i18n" = false}, name="aqarmap_api_get_nps_data_stateful")
* @Rest\Get("/api/v2/user/nps-data", options={"i18n" = false}, name="aqarmap_api_get_nps_data")
*
* @Rest\View()
*
* @Security("is_granted('ROLE_USER')")
*/
public function getNpsData(ListingManager $listingManager, EntityManagerInterface $entityManager): array
{
/** @var User $user */
$user = $this->getUser();
/** @var ListingRepository $listingRepo */
$listingRepo = $entityManager->getRepository(Listing::class);
$totalLiveListings = $listingRepo->countLiveListingsByUser($user)->getQuery()->enableResultCache()->getSingleScalarResult();
/** @var UserPackagesRepository $userPackageRepository */
$userPackageRepository = $entityManager->getRepository(UserPackages::class);
$hasActivePackage = (bool) $userPackageRepository->hasActivePackageQueryBuilder($user)->getQuery()->enableResultCache()->getOneOrNullResult();
// Define the user type (userType is not enough to determine the account type)
if (!$hasActivePackage && 0 == $totalLiveListings) {
$accountType = 'CONSUMER';
} elseif ($totalLiveListings > 10) {
$accountType = 'CUSTOMER';
} else {
$accountType = 'PRIVATE_OWNER';
}
return [
'userEmail' => $user->getEmailCanonical(),
'accountType' => $accountType,
'createdAt' => $user->getCreatedAt(),
];
}
/**
* Disable softdeleteable.
*/
private function disableSoftDelete(): void
{
if ($this->entityManager->getFilters()->isEnabled('softdeleteable')) {
$this->entityManager->getFilters()->disable('softdeleteable');
}
}
/**
* enable softdeleteable.
*/
private function enableSoftDelete(): void
{
$this->entityManager->getFilters()->enable('softdeleteable');
}
/**
* Add new UserPhone.
*
* @Rest\Post("/api/v2/user/phone/add", options={"i18n" = false}, name="aqarmap_phone_add")
*/
public function addUserPhone(Request $request, UserIpInfoServiceInterface $userInfoService): View
{
/** @var User $user */
$user = $this->getUser();
$form = $this->createForm(AddUserPhoneFormType::class, $phone = new Phone(), [
'csrf_protection' => false,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$phone->setCountry($userInfoService->getUserCountryFromIp($request->getClientIp()));
$phoneNumber = $this->phoneManager->trimZero($phone->getNumber(), $phone->getCountryCode());
$userPhone = $this->phoneManager->addNewUserPhone(
$phoneNumber,
$phone->getCountryCode(),
$user,
true,
false,
$phone->getCountry(),
null
);
return $this->respond([
'userPhone' => $userPhone,
], Response::HTTP_OK);
}
return $this->respond($form, Response::HTTP_BAD_REQUEST);
}
/**
* Get All UserPhones.
*
* @Rest\Get("/api/v2/user/phones", options={"i18n" = false}, name="aqarmap_user_phones")
*/
public function getUserPhones(Request $request)
{
/** @var User $user */
$user = $this->getUser();
return $this->respond($user->getAllPhones(), Response::HTTP_OK);
}
}