]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Create a client when creating a user using the api
authorJeremy Benoist <jeremy.benoist@gmail.com>
Wed, 7 Jun 2017 21:23:28 +0000 (23:23 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Wed, 7 Jun 2017 21:23:28 +0000 (23:23 +0200)
While creating a new user using the API, we also create a new client for the current user.
So the app which just create the user can use its newly created client to configure the app.

That new client is only return after creating the user.
When calling the endpoint /api/user to get user information, the new client information won’t be return.

src/Wallabag/ApiBundle/Controller/UserRestController.php
src/Wallabag/ApiBundle/Entity/Client.php
src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig
src/Wallabag/UserBundle/Entity/User.php
tests/Wallabag/ApiBundle/Controller/UserRestControllerTest.php

index 8f675b8df9431c93f64ef23fc45319c3f23e5f19..becbbb9ef4c0d77f5f024fe06cef1ba81e885f47 100644 (file)
@@ -9,6 +9,7 @@ use Nelmio\ApiDocBundle\Annotation\ApiDoc;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Wallabag\UserBundle\Entity\User;
+use Wallabag\ApiBundle\Entity\Client;
 
 class UserRestController extends WallabagRestController
 {
@@ -97,29 +98,38 @@ class UserRestController extends WallabagRestController
                 ->setStatusCode(JsonResponse::HTTP_BAD_REQUEST);
         }
 
+        // create a default client
+        $client = new Client($user);
+        $client->setName('Default client');
+
+        $this->getDoctrine()->getManager()->persist($client);
+
+        $user->addClient($client);
+
         $userManager->updateUser($user);
 
         // dispatch a created event so the associated config will be created
         $event = new UserEvent($user, $request);
         $this->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event);
 
-        return $this->sendUser($user, JsonResponse::HTTP_CREATED);
+        return $this->sendUser($user, 'user_api_with_client', JsonResponse::HTTP_CREATED);
     }
 
     /**
      * Send user response.
      *
-     * @param User $user
-     * @param int  $status HTTP Status code to send
+     * @param User   $user
+     * @param string $group  Used to define with serialized group might be used
+     * @param int    $status HTTP Status code to send
      *
      * @return JsonResponse
      */
-    private function sendUser(User $user, $status = JsonResponse::HTTP_OK)
+    private function sendUser(User $user, $group = 'user_api', $status = JsonResponse::HTTP_OK)
     {
         $json = $this->get('serializer')->serialize(
             $user,
             'json',
-            SerializationContext::create()->setGroups(['user_api'])
+            SerializationContext::create()->setGroups([$group])
         );
 
         return (new JsonResponse())
index 9ed9f980edb466d2ab696055152c8b5dc088d67d..c15fd3faa71ad6d163c9401dc890994895eb30e5 100644 (file)
@@ -5,6 +5,9 @@ namespace Wallabag\ApiBundle\Entity;
 use Doctrine\ORM\Mapping as ORM;
 use FOS\OAuthServerBundle\Entity\Client as BaseClient;
 use Wallabag\UserBundle\Entity\User;
+use JMS\Serializer\Annotation\Groups;
+use JMS\Serializer\Annotation\SerializedName;
+use JMS\Serializer\Annotation\VirtualProperty;
 
 /**
  * @ORM\Table("oauth2_clients")
@@ -23,6 +26,8 @@ class Client extends BaseClient
      * @var string
      *
      * @ORM\Column(name="name", type="text", nullable=false)
+     *
+     * @Groups({"user_api_with_client"})
      */
     protected $name;
 
@@ -36,6 +41,14 @@ class Client extends BaseClient
      */
     protected $accessTokens;
 
+    /**
+     * @var string
+     *
+     * @SerializedName("client_secret")
+     * @Groups({"user_api_with_client"})
+     */
+    protected $secret;
+
     /**
      * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="clients")
      */
@@ -78,4 +91,14 @@ class Client extends BaseClient
     {
         return $this->user;
     }
+
+    /**
+     * @VirtualProperty
+     * @SerializedName("client_id")
+     * @Groups({"user_api_with_client"})
+     */
+    public function getClientId()
+    {
+        return $this->getId().'_'.$this->getRandomId();
+    }
 }
index b3f0affb5678b3a953753a69575e5832b845c913..528b055cc04422bfc4444d6e4b43cfdd949f79ad 100644 (file)
@@ -33,7 +33,7 @@
                                     <table class="striped">
                                         <tr>
                                             <td>{{ 'developer.existing_clients.field_id'|trans }}</td>
-                                            <td><strong><code>{{ client.id }}_{{ client.randomId }}</code></strong></td>
+                                            <td><strong><code>{{ client.clientId }}</code></strong></td>
                                         </tr>
                                         <tr>
                                             <td>{{ 'developer.existing_clients.field_secret'|trans }}</td>
index ed6ce3319c5b89f47781c40961e860a4e71a3f68..5c75846f85993f8bf677fa0110bee9516400f9bf 100644 (file)
@@ -6,6 +6,7 @@ use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\ORM\Mapping as ORM;
 use JMS\Serializer\Annotation\Groups;
 use JMS\Serializer\Annotation\XmlRoot;
+use JMS\Serializer\Annotation\Accessor;
 use Scheb\TwoFactorBundle\Model\Email\TwoFactorInterface;
 use Scheb\TwoFactorBundle\Model\TrustedComputerInterface;
 use FOS\UserBundle\Model\User as BaseUser;
@@ -36,7 +37,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      *
-     * @Groups({"user_api"})
+     * @Groups({"user_api", "user_api_with_client"})
      */
     protected $id;
 
@@ -45,21 +46,21 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
      *
      * @ORM\Column(name="name", type="text", nullable=true)
      *
-     * @Groups({"user_api"})
+     * @Groups({"user_api", "user_api_with_client"})
      */
     protected $name;
 
     /**
      * @var string
      *
-     * @Groups({"user_api"})
+     * @Groups({"user_api", "user_api_with_client"})
      */
     protected $username;
 
     /**
      * @var string
      *
-     * @Groups({"user_api"})
+     * @Groups({"user_api", "user_api_with_client"})
      */
     protected $email;
 
@@ -68,7 +69,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
      *
      * @ORM\Column(name="created_at", type="datetime")
      *
-     * @Groups({"user_api"})
+     * @Groups({"user_api", "user_api_with_client"})
      */
     protected $createdAt;
 
@@ -77,7 +78,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
      *
      * @ORM\Column(name="updated_at", type="datetime")
      *
-     * @Groups({"user_api"})
+     * @Groups({"user_api", "user_api_with_client"})
      */
     protected $updatedAt;
 
@@ -97,7 +98,8 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
     private $authCode;
 
     /**
-     * @var bool Enabled yes/no
+     * @var bool
+     *
      * @ORM\Column(type="boolean")
      */
     private $twoFactorAuthentication = false;
@@ -112,6 +114,14 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
      */
     protected $clients;
 
+    /**
+     * @see getFirstClient() below
+     *
+     * @Groups({"user_api_with_client"})
+     * @Accessor(getter="getFirstClient")
+     */
+    protected $default_client;
+
     public function __construct()
     {
         parent::__construct();
@@ -288,4 +298,18 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
     {
         return $this->clients;
     }
+
+    /**
+     * Only used by the API when creating a new user it'll also return the first client (which was also created at the same time).
+     *
+     * @return Client
+     */
+    public function getFirstClient()
+    {
+        if (empty($this->clients)) {
+            return $this->clients;
+        }
+
+        return $this->clients->first();
+    }
 }
index 5735bc5819e78cdf2e79db188f8d3d907da1a127..9f01a976020b7e7e6a1d0a4c2ea008de87df6a12 100644 (file)
@@ -61,10 +61,16 @@ class UserRestControllerTest extends WallabagApiTestCase
         $this->assertArrayHasKey('username', $content);
         $this->assertArrayHasKey('created_at', $content);
         $this->assertArrayHasKey('updated_at', $content);
+        $this->assertArrayHasKey('default_client', $content);
 
         $this->assertEquals('wallabag@google.com', $content['email']);
         $this->assertEquals('google', $content['username']);
 
+        $this->assertArrayHasKey('client_secret', $content['default_client']);
+        $this->assertArrayHasKey('client_id', $content['default_client']);
+
+        $this->assertEquals('Default client', $content['default_client']['name']);
+
         $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
 
         $this->client->getContainer()->get('craue_config')->set('api_user_registration', 0);
@@ -90,10 +96,16 @@ class UserRestControllerTest extends WallabagApiTestCase
         $this->assertArrayHasKey('username', $content);
         $this->assertArrayHasKey('created_at', $content);
         $this->assertArrayHasKey('updated_at', $content);
+        $this->assertArrayHasKey('default_client', $content);
 
         $this->assertEquals('wallabag@google.com', $content['email']);
         $this->assertEquals('google', $content['username']);
 
+        $this->assertArrayHasKey('client_secret', $content['default_client']);
+        $this->assertArrayHasKey('client_id', $content['default_client']);
+
+        $this->assertEquals('Default client', $content['default_client']['name']);
+
         $this->assertEquals('application/json', $client->getResponse()->headers->get('Content-Type'));
 
         $client->getContainer()->get('craue_config')->set('api_user_registration', 0);