src/Controller/User/PublicMemberController.php line 98

Open in your IDE?
  1. <?php
  2. namespace App\Controller\User;
  3. use App\Entity\Account;
  4. use App\Entity\Member;
  5. use App\Exception\AlreadyHasMemberException;
  6. use App\Service\MemberService;
  7. use App\Service\User\Layer\RegistrationLayer;
  8. use App\Service\User\LoginService;
  9. use App\StructSerializer\Main\StructGroup;
  10. use App\StructSerializer\Main\StructOptions;
  11. use App\StructSerializer\Main\StructSerializer;
  12. use App\Subscriber\User\Registration\EmailSubscriber;
  13. use Doctrine\ORM\Tools\Pagination\Paginator;
  14. use Doctrine\Persistence\ManagerRegistry;
  15. use Nelmio\ApiDocBundle\Annotation\Model;
  16. use Swagger\Annotations as SWG;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. /**
  24.  * @Route("/api/public/user/member")
  25.  */
  26. class PublicMemberController extends AbstractController
  27. {
  28.     protected MemberService $service;
  29.     protected RegistrationLayer $layer;
  30.     protected LoginService $loginService;
  31.     protected StructSerializer $structSerializer;
  32.     public function __construct(MemberService $serviceStructSerializer $structSerializer,
  33.         RegistrationLayer $layerLoginService $loginService)
  34.     {
  35.         $this->service $service;
  36.         $this->layer $layer;
  37.         $this->loginService $loginService;
  38.         $this->structSerializer $structSerializer;
  39.     }
  40.     /**
  41.      * @SWG\Get(
  42.      *    tags={"User", "Member"},
  43.      *
  44.      *    @SWG\Response(response=200, description="Member details for the given ID",
  45.      *
  46.      *      @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"adminindex", "memberdetail", "memberfrontendindex", "membermainphoto"}))),
  47.      *
  48.      *    @SWG\Response(response=404, description="Member not found at all or inactive, if activeOnly param is set"),
  49.      *
  50.      *    @SWG\Parameter(name="member", in="path", type="integer", required=true, description="ID of the member in question"),
  51.      *    @SWG\Parameter(name="activeOnly", in="query", type="boolean", required=false, default=false, description="Check active flag of the member")
  52.      * )
  53.      *
  54.      * @Route("/{member}", methods={"GET"}, requirements={"member": "\d+"})
  55.      */
  56.     public function detail(Request $requestMember $member): JsonResponse
  57.     {
  58.         $activeOnly $request->query->getBoolean('activeOnly');
  59.         if ($activeOnly) {
  60.             if (!$member->getIsActive()) {
  61.                 throw $this->createNotFoundException('Member is inactive');
  62.             }
  63.         }
  64.         $options StructOptions::create();
  65.         $options->loadMemberLikes(true);
  66.         $options->loadMemberProfileValues(true);
  67.         $options->loadMemberPerson(true);
  68.         $options->loadMemberInfo($request->query->getBoolean('withMemberInfo'));
  69.         return new JsonResponse($this->structSerializer->toArray($options$member));
  70.     }
  71.     /**
  72.      * @SWG\Get(
  73.      *    tags={"User", "Member"},
  74.      *
  75.      *    @SWG\Response(response=200, description="Member details for the given username",
  76.      *
  77.      *      @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"adminindex", "memberdetail", "memberfrontendindex", "membermainphoto"}))),
  78.      *
  79.      *    @SWG\Response(response=404, description="Member not found at all or inactive, if activeOnly param is set"),
  80.      *
  81.      *    @SWG\Parameter(name="username", in="path", type="string", required=true, description="Exact username (case insensitive)"),
  82.      *    @SWG\Parameter(name="activeOnly", in="query", type="boolean", required=false, default=false, description="Check active flag of the member")
  83.      * )
  84.      *
  85.      * @Route("/username/{username}", methods={"GET"})
  86.      */
  87.     public function byusername(Request $requeststring $username): JsonResponse
  88.     {
  89.         if (!$member $this->service->getMemberByUsername($usernamefalse)) {
  90.             // does not exist at all
  91.             throw $this->createNotFoundException();
  92.         }
  93.         $activeOnly $request->query->getBoolean('activeOnly');
  94.         if ($activeOnly) {
  95.             if (!$this->service->getMemberByUsername($usernametrue)) {
  96.                 throw $this->createNotFoundException('Member is inactive');
  97.             }
  98.         }
  99.         $options StructOptions::create();
  100.         $options->loadMemberLikes(true);
  101.         $options->loadMemberProfileValues(true);
  102.         $options->loadMemberInfo(true);
  103.         $options->loadMemberPerson(true);
  104.         $options->loadMemberInfo($request->query->getBoolean('withMemberInfo'));
  105.         return new JsonResponse($this->structSerializer->toArray($options$member));
  106.     }
  107.     /**
  108.      * @SWG\Get(tags={"Account"},
  109.      *
  110.      *    @SWG\Response(response=201, description="A member was created successfully",
  111.      *    @SWG\Response(response=400, description="This account email is already confirmed"),
  112.      *    @SWG\Response(response=404, description="Unknown channel or confirmationToken"),
  113.      *
  114.      *     @SWG\Schema(ref=@Model(type=App\Entity\Member::class, groups={"memberfrontendindex", "commonids"}))),
  115.      *
  116.      *    @SWG\Parameter(name="confirmationToken", in="path", type="string", description="base64 encoded confirmationToken")
  117.      * )
  118.      *
  119.      * @Route("/confirm/{confirmationToken}", methods={"GET"}, requirements={"confirmationToken": ".{4,24}"})
  120.      */
  121.     public function confirm(ManagerRegistry $managerRegistrystring $confirmationToken)
  122.     {
  123.         if (!$accountIdToken base64_decode(urldecode($confirmationToken), true)) {
  124.             throw $this->createNotFoundException();
  125.         }
  126.         $accountIdToken explode(EmailSubscriber::ID_TOKEN_SEPARATOR$accountIdToken2);
  127.         if (!is_array($accountIdToken) || !== count($accountIdToken)) {
  128.             throw $this->createNotFoundException();
  129.         }
  130.         $account $managerRegistry->getRepository(Account::class)->findOneBy(['id' => $accountIdToken[0], 'email_token' => $accountIdToken[1]]);
  131.         if (!$account instanceof Account) {
  132.             throw $this->createNotFoundException();
  133.         }
  134.         try {
  135.             $member $this->layer->confirmEmail($account);
  136.         } catch (AlreadyHasMemberException $e) {
  137.             throw new BadRequestHttpException();
  138.         }
  139.         $options StructOptions::create(StructGroup::SHORT);
  140.         return new JsonResponse($this->structSerializer->toArray($options$member),
  141.             Response::HTTP_CREATED);
  142.     }
  143.     /**
  144.      * @SWG\Get(tags={"Login"},
  145.      *
  146.      *    @SWG\Response(
  147.      *     response=200, description="Last login data for given username.",
  148.      *     response=404, description="When user is not found, is not active or has no logins.",
  149.      *
  150.      *     @SWG\Schema(ref=@Model(type=App\Entity\Login::class, groups={"logindetails"})))
  151.      * )
  152.      *
  153.      * @Route("/lastlogin/{username}", methods={"GET"})
  154.      */
  155.     public function lastlogin(string $username): JsonResponse
  156.     {
  157.         if (!$user $this->service->getMemberByUsername($usernametrue)) {
  158.             return new JsonResponse([], Response::HTTP_NOT_FOUND);
  159.         }
  160.         /** @var Paginator $paginator */
  161.         $paginator $this->loginService->getAccountIndex($user->getAccount(), 11);
  162.         if ($paginator->count() < 1) {
  163.             return new JsonResponse([], Response::HTTP_NOT_FOUND);
  164.         }
  165.         $logins = [];
  166.         foreach ($paginator as $login) {
  167.             $logins[] = $login;
  168.         }
  169.         return new JsonResponse(
  170.             $this->structSerializer->multipleToArray(StructOptions::create(), $logins)
  171.         );
  172.     }
  173. }