<?php
namespace App\Controller\api\User;
use App\Entity\User;
use App\Service\Api\User\UserService;
use Doctrine\Common\Collections\Criteria;
use Doctrine\DBAL\Exception;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\ORMException;
use Stripe\Exception\ApiErrorException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use SymfonyBundles\RedisBundle\Redis\ClientInterface;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
/**
* utilisateur.
*
* @Route("api/immo/v2")
*/
class UserController extends AbstractController
{
/**
* @var UserService
*/
protected $userService;
// protected $mailMessageService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
// $this->mailMessageService = $mailMessageService;
}
/**
* @Route(
* name="signup" ,
* path="/auth/signup" ,
* methods={"POST"},
* defaults={
* "_controller"="src\Controller\api\UserController::signUp",
* "_api_collection_operation_name"="signup"
* }
* )
*
* @throws ApiErrorException
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function signUp(Request $request): JsonResponse
{
return $this->userService->signUp($request);
}
/**
* @Route(
* name="subscribe" ,
* path="/subscribe" ,
* methods={"POST"},
* defaults={
* "_controller"="src\Controller\api\UserController::subscribe",
* "_api_collection_operation_name"="subscribe"
* }
* )
*
* @throws \Exception
*/
public function subscribe(Request $request): JsonResponse
{
return $this->userService->subscribe($request);
}
/**
* @Route(
* name="validate_account",
* path="/auth/validate/account/{token}",
* methods={"POST"},
* defaults={
* "_controller"="src\Controller\api\UserController::validateAccount",
* "_api_collection_operation_name"="validate_account"
* }
* )
*
* @throws ORMException
*/
public function validateAccount(Request $request): JsonResponse
{
return $this->userService->validateAccount($request);
}
/**
* forgot password.
*
* @Route(
* name="forgot_password",
* path="/auth/forgotpassword",
* methods={"POST"},
* defaults={
* "_controller"="src\Controller\api\UserApiController::forgotPassword",
* "_api_collection_operation_name"="forgot_password"
* }
* )
*
* @throws ORMException
*/
public function forgotPassword(Request $request): JsonResponse
{
return $this->userService->forgotPassword($request);
}
/**
* reinitialise password.
*
* @Route(
* name="reinitialise_password",
* path="/auth/reinitialisepassword",
* methods={"POST" , "GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::reinitialisePassword",
* "_api_collection_operation_name"="reinitialise_password"
* }
* )
*
* @throws ORMException
*/
public function reinitialisePassword(Request $request): JsonResponse
{
return $this->userService->reinitialisePassword($request);
}
/**
* Edit Password.
*
* @Route(
* name="edit_password",
* path="/auth/editpassword",
* methods={"POST" , "GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::editPassword",
* "_api_collection_operation_name"="edit_password"
* }
* )
*
* @throws ORMException
*/
public function editPassword(Request $request): JsonResponse
{
return $this->userService->editPassword($request);
}
/**
* Edit Profile.
*
* @Route(
* name="edit_profile_by_token",
* path="/user/profile/edit",
* methods={"POST" , "GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::editPortfolioUser",
* "_api_collection_operation_name"="edit_profile_by_token"
* }
* )
*
* @throws ORMException
* @throws Exception
*/
public function editPortfolioUser(Request $request): JsonResponse
{
return $this->userService->editPortfolioUser($request);
}
/**
* @param Security $security
* @return JsonResponse
*/
public function detailUser(Security $security): JsonResponse
{
return $this->userService->detailUser($security->getUser());
}
/**
* @Route(
* name="user_active_subscription",
* path="/user/active_subscription",
* methods={"GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::getActiveSubscription",
* "_api_collection_operation_name"="user_active_subscription"
* }
* )
*/
public function getActiveSubscription(): JsonResponse
{
return $this->userService->getActiveSubscription($this->getUser());
}
/**
* Return the authenticated user's default payment card info.
*
* @Route(
* name="user_get_card",
* path="/user/card",
* methods={"GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::getCard",
* "_api_collection_operation_name"="user_get_card"
* }
* )
*/
public function getCard(): JsonResponse
{
return $this->userService->getCard($this->getUser());
}
/**
* Update the authenticated user's default payment card.
*
* Expects a JSON body: { "token": "tok_xxxx" }
* The token is a Stripe card token generated client-side via Stripe.js.
*
* @Route(
* name="user_update_card",
* path="/user/card/update",
* methods={"POST"},
* defaults={
* "_controller"="src\Controller\api\UserController::updateCard",
* "_api_collection_operation_name"="user_update_card"
* }
* )
*/
public function updateCard(Request $request): JsonResponse
{
return $this->userService->updateCard($this->getUser(), $request);
}
/**
*
* @Route(
* name="user_availability_add",
* path="/user/availability/add",
* methods={"POST"},
* defaults={
* "_controller"="src\Controller\api\UserController::addAvailability",
* "_api_collection_operation_name"="user_availability_add"
* }
* )
*/
public function addAvailability(Request $request): JsonResponse
{
return $this->userService->addAvailability($request);
}
/**
* User availability list.
*
* @Route(
* name="user_availability_list",
* path="/user/availability/list",
* methods={"GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::availabilityList",
* "_api_collection_operation_name"="user_availability_list"
* }
* )
*/
public function availabilityList(Request $request): JsonResponse
{
return $this->userService->availabilityList($request);
}
/**
* User logout.
*
* @Route(
* name="user_logout",
* path="/user/logout",
* methods={"POST"},
* defaults={
* "_controller"="src\Controller\api\UserController::logout",
* "_api_collection_operation_name"="user_logout"
* }
* )
*/
public function logout(Request $request): JsonResponse
{
return $this->userService->logout($request);
}
/**
* Provider List : Entrepreneur.
*
* @Route(
* name="external_provider_list",
* path="/user/provider/work/list",
* methods={"GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::workProviderList",
* "_api_collection_operation_name"="external_provider_list"
* }
* )
*/
public function workProviderList(): JsonResponse
{
return $this->userService->workProviderList();
}
/**
* Liste user Role Prest-Ext.
*
* @Route(
* name="prest_user_list",
* path="/user/prestator/list",
* methods={"GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::prestatorList",
* "_api_collection_operation_name"="user_prestator_list"
* }
* )
*/
public function getUserPre(Request $request): JsonResponse
{
return $this->userService->getUserPresExt($request);
}
/**
* @return mixed
*
* @throws NonUniqueResultException
*/
public function getUserByRole(Request $request, string $role)
{
return $this->userService->getUserByRole($request, $role);
}
public function getUserBySpeciality(Request $request, ClientInterface $redis): JsonResponse
{
return $this->userService->getUserBySpeciality(
$request->query->get('page', 1),
$request->query->get('itemsPerPage', 10),
$request->query->get('speciality'),
$request->query->get('keyword')
);
}
/**
* @Route(
* name="user_exist_by_mail",
* path="/user/by/mail",
* methods={"GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::getUserByMailExis",
* "_api_collection_operation_name"="user_exist_by_mail"
* }
* )
*/
public function getUserByMailExist(Request $request): JsonResponse
{
$email = $request->query->get('email');
$exists = $this->userService->checkUserEmailExists($email);
return new JsonResponse($exists ? 'true' : 'false', Response::HTTP_OK, [], true);
}
/**
* @Route(
* name="user_exist_by_pseudonym",
* path="/user/by/pseudonym",
* methods={"GET"},
* defaults={
* "_controller"="src\\Controller\\api\\UserController::getUserByPseudonymExist",
* "_api_collection_operation_name"="user_exist_by_pseudonym"
* }
* )
*/
public function getUserByPseudonymExist(Request $request): JsonResponse
{
$pseudonym = $request->query->get('pseudonym');
$exists = $this->userService->checkUserPseudonymExists($pseudonym);
return new JsonResponse($exists ? 'true' : 'false', Response::HTTP_OK, [], true);
}
/**
* @Route(
* name="search_by_keywords",
* path="/users/by/key",
* methods={"GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::searchUserByKeyword",
* "_api_collection_operation_name"="search_by_keywords"
* }
* )
*/
public function searchUserByKeyword(Request $request): JsonResponse
{
return $this->userService->searchUserByKeyword($request);
}
public function miniMailUserSuggestion(Request $request): JsonResponse
{
$user = $this->getUser();
$keyword = $request->query->get("keyword");
$limit = $request->query->getInt("limit", 10);
return $this->userService->miniMailUserSuggestion($user, $limit, $keyword);
}
/**
* @Route(
* name="update_all_users",
* path="/users/all/update",
* methods={"GET"},
* defaults={
* "_controller"="src\Controller\api\UserController::updateAllUser",
* "_api_collection_operation_name"="update_all_users"
* }
* )
*/
public function updateAllUser(): JsonResponse
{
return $this->userService->updateAllUser();
}
public function getAllTypeOfServices(): JsonResponse
{
return $this->userService->getAllTypeOfServices();
}
public function checkAuthorizationForFiguration(Security $security, Request $request): JsonResponse
{
return $this->userService->checkAuthorizationForFiguration($security, $request);
}
public function becomeProfessionalUser(Request $request): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
if (!$user->getActiveSubscription() || $user->getActiveSubscription()->getPlan()->isFree()) {
return new JsonResponse(['message' => 'Access denied'], 403);
}
return $this->userService->becomeProfessionalUser($request, $user);
}
public function detailProOfUser(): JsonResponse
{
return $this->userService->detailProOfUser($this->getUser());
}
}