From 2251045901875aa815dee43ec467fb1af8d416d0 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 29 Apr 2017 19:22:50 +0200 Subject: [PATCH] WIP Signed-off-by: Thomas Citharel --- .../Controller/UserRestController.php | 98 +++++++++++++++++++ .../Resources/config/routing_rest.yml | 5 + src/Wallabag/UserBundle/Entity/User.php | 5 + 3 files changed, 108 insertions(+) create mode 100644 src/Wallabag/ApiBundle/Controller/UserRestController.php diff --git a/src/Wallabag/ApiBundle/Controller/UserRestController.php b/src/Wallabag/ApiBundle/Controller/UserRestController.php new file mode 100644 index 00000000..c5ffbdf1 --- /dev/null +++ b/src/Wallabag/ApiBundle/Controller/UserRestController.php @@ -0,0 +1,98 @@ +validateAuthentication(); + + $serializationContext = SerializationContext::create()->setGroups(['user_api']); + $json = $this->get('serializer')->serialize($this->getUser(), 'json', $serializationContext); + + return (new JsonResponse())->setJson($json); + } + + /** + * Register an user + * + * @ApiDoc( + * requirements={ + * {"name"="username", "dataType"="string", "required"=true, "description"="The user's username"}, + * {"name"="password", "dataType"="string", "required"=true, "description"="The user's password"} + * {"name"="email", "dataType"="string", "required"=true, "description"="The user's email"} + * } + * ) + * @return JsonResponse + */ + // TODO : Make this method (or the whole API) accessible only through https + public function putUserAction($username, $password, $email) + { + if (!$this->container->getParameter('fosuser_registration')) { + $json = $this->get('serializer')->serialize(['error' => "Server doesn't allow registrations"], 'json'); + return (new JsonResponse())->setJson($json)->setStatusCode(403); + } + + if ($password === '') { // TODO : might be a good idea to enforce restrictions here + $json = $this->get('serializer')->serialize(['error' => 'Password is blank'], 'json'); + return (new JsonResponse())->setJson($json)->setStatusCode(400); + } + + + // TODO : Make only one call to database by using a custom repository method + if ($this->getDoctrine() + ->getRepository('WallabagUserBundle:User') + ->findOneByUserName($username)) { + $json = $this->get('serializer')->serialize(['error' => 'Username is already taken'], 'json'); + return (new JsonResponse())->setJson($json)->setStatusCode(409); + } + + if ($this->getDoctrine() + ->getRepository('WallabagUserBundle:User') + ->findOneByEmail($email)) { + $json = $this->get('serializer')->serialize(['error' => 'An account with this email already exists'], 'json'); + return (new JsonResponse())->setJson($json)->setStatusCode(409); + } + + $em = $this->get('doctrine.orm.entity_manager'); + + $userManager = $this->get('fos_user.user_manager'); + $user = $userManager->createUser(); + + $user->setUsername($username); + + $user->setPlainPassword($password); + + $user->setEmail($email); + + $user->setEnabled(true); + $user->addRole('ROLE_USER'); + + $em->persist($user); + + // dispatch a created event so the associated config will be created + $event = new UserEvent($user); + $this->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event); + + $serializationContext = SerializationContext::create()->setGroups(['user_api']); + $json = $this->get('serializer')->serialize($user, 'json', $serializationContext); + + return (new JsonResponse())->setJson($json); + + } + +} diff --git a/src/Wallabag/ApiBundle/Resources/config/routing_rest.yml b/src/Wallabag/ApiBundle/Resources/config/routing_rest.yml index 57d37f4b..c0283e71 100644 --- a/src/Wallabag/ApiBundle/Resources/config/routing_rest.yml +++ b/src/Wallabag/ApiBundle/Resources/config/routing_rest.yml @@ -17,3 +17,8 @@ misc: type: rest resource: "WallabagApiBundle:WallabagRest" name_prefix: api_ + +user: + type: rest + resource: "WallabagApiBundle:UserRest" + name_prefix: api_ diff --git a/src/Wallabag/UserBundle/Entity/User.php b/src/Wallabag/UserBundle/Entity/User.php index 3a167de7..1863c966 100644 --- a/src/Wallabag/UserBundle/Entity/User.php +++ b/src/Wallabag/UserBundle/Entity/User.php @@ -4,6 +4,7 @@ namespace Wallabag\UserBundle\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; +use JMS\Serializer\Annotation\Groups; use Scheb\TwoFactorBundle\Model\Email\TwoFactorInterface; use Scheb\TwoFactorBundle\Model\TrustedComputerInterface; use FOS\UserBundle\Model\User as BaseUser; @@ -35,6 +36,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") + * @Groups({"user_api"}) */ protected $id; @@ -42,6 +44,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf * @var string * * @ORM\Column(name="name", type="text", nullable=true) + * @Groups({"user_api"}) */ protected $name; @@ -49,6 +52,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf * @var date * * @ORM\Column(name="created_at", type="datetime") + * @Groups({"user_api"}) */ protected $createdAt; @@ -56,6 +60,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf * @var date * * @ORM\Column(name="updated_at", type="datetime") + * @Groups({"user_api"}) */ protected $updatedAt; -- 2.41.0