<?php
namespace App\Controller;
use App\Services\UserService;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Webmozart\Assert\Assert;
/**
* Class UserApiController
* @package App\Controller
*/
class UserApiController extends AbstractController
{
private UserService $userService;
private UserPasswordEncoderInterface $passwordEncoder;
/** @var TranslatorInterface */
private TranslatorInterface $translator;
public function __construct(UserService $userService, UserPasswordEncoderInterface $passwordEncoder, TranslatorInterface $translator)
{
$this->userService = $userService;
$this->passwordEncoder = $passwordEncoder;
$this->translator = $translator;
}
/**
* @Route(path="/api/{version}/user/", methods={"GET"})
* @param Request $request
* @return JsonResponse
*/
public function checkRemoteUser(Request $request): JsonResponse
{
$response = [
"success" => false,
];
try {
$username = $request->request->get("username", "");
$password = $request->request->get("password", "");
Assert::notEmpty($username, $this->translator->trans("username is required"));
Assert::notEmpty($password, $this->translator->trans("password is required"));
$user = $this->userService->getByUsername($username);
Assert::notNull($user, $this->translator->trans("User not found"));
Assert::false($user->getIsDeleted(), $this->translator->trans("User is deleted"));
Assert::false($user->getIsBlocked(), $this->translator->trans("User is blocked"));
$isPasswordValid = $this->passwordEncoder->isPasswordValid($user, $password);
Assert::true($isPasswordValid, $this->translator->trans("Password not valid"));
$response = [
"success" => true,
"data" => [
"username" => $user->getUsername(),
"roles" => $user->getRoles(),
],
];
} catch (Exception $e) {
$response["message"] = $e->getMessage();
}
return new JsonResponse($response);
}
/**
* @Route(path="/api/{version}/user/byToken", methods={"GET", "POST"})
* @param Request $request
* @return JsonResponse
*/
public function checkRemoteUserByToken(Request $request): JsonResponse
{
$response = [
"success" => false,
];
try {
if ($request->query->has("user_id")) {
$userId = $request->query->get("user_id", "");
}
if ($request->request->has("user_id")) {
$userId = $request->request->get("user_id", "");
}
$user = $this->userService->getById($userId);
Assert::notNull($user, $this->translator->trans("User not found"));
Assert::false($user->getIsDeleted(), $this->translator->trans("User is deleted"));
Assert::false($user->getIsBlocked(), $this->translator->trans("User is blocked"));
$cashdesk = [];
if (!empty($user->getCurrentCashdesk())) {
$cashdesk = [
"id" => $user->getCurrentCashdesk()->getId(),
"title" => $user->getCurrentCashdesk()->getTitle(),
];
}
$response = [
"success" => true,
"data" => [
"id" => $user->getId(),
"username" => $user->getUsername(),
"roles" => $user->getRoles(),
"balance" => 0,
"cashdesk" => $cashdesk,
],
];
if (!is_null($user->getCurrentCashdesk())) {
$response["data"]["balance"] = $user->getCurrentCashdesk()->getBalance();
}
} catch (Exception $e) {
$response["message"] = $e->getMessage();
}
return new JsonResponse($response);
}
}