diff options
author | Jeremy Benoist <jeremy.benoist@gmail.com> | 2017-06-07 23:23:28 +0200 |
---|---|---|
committer | Jeremy Benoist <jeremy.benoist@gmail.com> | 2017-06-07 23:23:28 +0200 |
commit | 0c00e5251671c3648eabb8888271c09137ad902d (patch) | |
tree | 2fe5de8701fa80ea9481e4098203b95d787ce576 | |
parent | 7bb3aa31776ffce2735a3b16f6ad80bb17946d4d (diff) | |
download | wallabag-0c00e5251671c3648eabb8888271c09137ad902d.tar.gz wallabag-0c00e5251671c3648eabb8888271c09137ad902d.tar.zst wallabag-0c00e5251671c3648eabb8888271c09137ad902d.zip |
Create a client when creating a user using the api
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.
5 files changed, 82 insertions, 13 deletions
diff --git a/src/Wallabag/ApiBundle/Controller/UserRestController.php b/src/Wallabag/ApiBundle/Controller/UserRestController.php index 8f675b8d..becbbb9e 100644 --- a/src/Wallabag/ApiBundle/Controller/UserRestController.php +++ b/src/Wallabag/ApiBundle/Controller/UserRestController.php | |||
@@ -9,6 +9,7 @@ use Nelmio\ApiDocBundle\Annotation\ApiDoc; | |||
9 | use Symfony\Component\HttpFoundation\Request; | 9 | use Symfony\Component\HttpFoundation\Request; |
10 | use Symfony\Component\HttpFoundation\JsonResponse; | 10 | use Symfony\Component\HttpFoundation\JsonResponse; |
11 | use Wallabag\UserBundle\Entity\User; | 11 | use Wallabag\UserBundle\Entity\User; |
12 | use Wallabag\ApiBundle\Entity\Client; | ||
12 | 13 | ||
13 | class UserRestController extends WallabagRestController | 14 | class UserRestController extends WallabagRestController |
14 | { | 15 | { |
@@ -97,29 +98,38 @@ class UserRestController extends WallabagRestController | |||
97 | ->setStatusCode(JsonResponse::HTTP_BAD_REQUEST); | 98 | ->setStatusCode(JsonResponse::HTTP_BAD_REQUEST); |
98 | } | 99 | } |
99 | 100 | ||
101 | // create a default client | ||
102 | $client = new Client($user); | ||
103 | $client->setName('Default client'); | ||
104 | |||
105 | $this->getDoctrine()->getManager()->persist($client); | ||
106 | |||
107 | $user->addClient($client); | ||
108 | |||
100 | $userManager->updateUser($user); | 109 | $userManager->updateUser($user); |
101 | 110 | ||
102 | // dispatch a created event so the associated config will be created | 111 | // dispatch a created event so the associated config will be created |
103 | $event = new UserEvent($user, $request); | 112 | $event = new UserEvent($user, $request); |
104 | $this->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event); | 113 | $this->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event); |
105 | 114 | ||
106 | return $this->sendUser($user, JsonResponse::HTTP_CREATED); | 115 | return $this->sendUser($user, 'user_api_with_client', JsonResponse::HTTP_CREATED); |
107 | } | 116 | } |
108 | 117 | ||
109 | /** | 118 | /** |
110 | * Send user response. | 119 | * Send user response. |
111 | * | 120 | * |
112 | * @param User $user | 121 | * @param User $user |
113 | * @param int $status HTTP Status code to send | 122 | * @param string $group Used to define with serialized group might be used |
123 | * @param int $status HTTP Status code to send | ||
114 | * | 124 | * |
115 | * @return JsonResponse | 125 | * @return JsonResponse |
116 | */ | 126 | */ |
117 | private function sendUser(User $user, $status = JsonResponse::HTTP_OK) | 127 | private function sendUser(User $user, $group = 'user_api', $status = JsonResponse::HTTP_OK) |
118 | { | 128 | { |
119 | $json = $this->get('serializer')->serialize( | 129 | $json = $this->get('serializer')->serialize( |
120 | $user, | 130 | $user, |
121 | 'json', | 131 | 'json', |
122 | SerializationContext::create()->setGroups(['user_api']) | 132 | SerializationContext::create()->setGroups([$group]) |
123 | ); | 133 | ); |
124 | 134 | ||
125 | return (new JsonResponse()) | 135 | return (new JsonResponse()) |
diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index 9ed9f980..c15fd3fa 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php | |||
@@ -5,6 +5,9 @@ namespace Wallabag\ApiBundle\Entity; | |||
5 | use Doctrine\ORM\Mapping as ORM; | 5 | use Doctrine\ORM\Mapping as ORM; |
6 | use FOS\OAuthServerBundle\Entity\Client as BaseClient; | 6 | use FOS\OAuthServerBundle\Entity\Client as BaseClient; |
7 | use Wallabag\UserBundle\Entity\User; | 7 | use Wallabag\UserBundle\Entity\User; |
8 | use JMS\Serializer\Annotation\Groups; | ||
9 | use JMS\Serializer\Annotation\SerializedName; | ||
10 | use JMS\Serializer\Annotation\VirtualProperty; | ||
8 | 11 | ||
9 | /** | 12 | /** |
10 | * @ORM\Table("oauth2_clients") | 13 | * @ORM\Table("oauth2_clients") |
@@ -23,6 +26,8 @@ class Client extends BaseClient | |||
23 | * @var string | 26 | * @var string |
24 | * | 27 | * |
25 | * @ORM\Column(name="name", type="text", nullable=false) | 28 | * @ORM\Column(name="name", type="text", nullable=false) |
29 | * | ||
30 | * @Groups({"user_api_with_client"}) | ||
26 | */ | 31 | */ |
27 | protected $name; | 32 | protected $name; |
28 | 33 | ||
@@ -37,6 +42,14 @@ class Client extends BaseClient | |||
37 | protected $accessTokens; | 42 | protected $accessTokens; |
38 | 43 | ||
39 | /** | 44 | /** |
45 | * @var string | ||
46 | * | ||
47 | * @SerializedName("client_secret") | ||
48 | * @Groups({"user_api_with_client"}) | ||
49 | */ | ||
50 | protected $secret; | ||
51 | |||
52 | /** | ||
40 | * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="clients") | 53 | * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="clients") |
41 | */ | 54 | */ |
42 | private $user; | 55 | private $user; |
@@ -78,4 +91,14 @@ class Client extends BaseClient | |||
78 | { | 91 | { |
79 | return $this->user; | 92 | return $this->user; |
80 | } | 93 | } |
94 | |||
95 | /** | ||
96 | * @VirtualProperty | ||
97 | * @SerializedName("client_id") | ||
98 | * @Groups({"user_api_with_client"}) | ||
99 | */ | ||
100 | public function getClientId() | ||
101 | { | ||
102 | return $this->getId().'_'.$this->getRandomId(); | ||
103 | } | ||
81 | } | 104 | } |
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig index b3f0affb..528b055c 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig | |||
@@ -33,7 +33,7 @@ | |||
33 | <table class="striped"> | 33 | <table class="striped"> |
34 | <tr> | 34 | <tr> |
35 | <td>{{ 'developer.existing_clients.field_id'|trans }}</td> | 35 | <td>{{ 'developer.existing_clients.field_id'|trans }}</td> |
36 | <td><strong><code>{{ client.id }}_{{ client.randomId }}</code></strong></td> | 36 | <td><strong><code>{{ client.clientId }}</code></strong></td> |
37 | </tr> | 37 | </tr> |
38 | <tr> | 38 | <tr> |
39 | <td>{{ 'developer.existing_clients.field_secret'|trans }}</td> | 39 | <td>{{ 'developer.existing_clients.field_secret'|trans }}</td> |
diff --git a/src/Wallabag/UserBundle/Entity/User.php b/src/Wallabag/UserBundle/Entity/User.php index ed6ce331..5c75846f 100644 --- a/src/Wallabag/UserBundle/Entity/User.php +++ b/src/Wallabag/UserBundle/Entity/User.php | |||
@@ -6,6 +6,7 @@ use Doctrine\Common\Collections\ArrayCollection; | |||
6 | use Doctrine\ORM\Mapping as ORM; | 6 | use Doctrine\ORM\Mapping as ORM; |
7 | use JMS\Serializer\Annotation\Groups; | 7 | use JMS\Serializer\Annotation\Groups; |
8 | use JMS\Serializer\Annotation\XmlRoot; | 8 | use JMS\Serializer\Annotation\XmlRoot; |
9 | use JMS\Serializer\Annotation\Accessor; | ||
9 | use Scheb\TwoFactorBundle\Model\Email\TwoFactorInterface; | 10 | use Scheb\TwoFactorBundle\Model\Email\TwoFactorInterface; |
10 | use Scheb\TwoFactorBundle\Model\TrustedComputerInterface; | 11 | use Scheb\TwoFactorBundle\Model\TrustedComputerInterface; |
11 | use FOS\UserBundle\Model\User as BaseUser; | 12 | use FOS\UserBundle\Model\User as BaseUser; |
@@ -36,7 +37,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf | |||
36 | * @ORM\Id | 37 | * @ORM\Id |
37 | * @ORM\GeneratedValue(strategy="AUTO") | 38 | * @ORM\GeneratedValue(strategy="AUTO") |
38 | * | 39 | * |
39 | * @Groups({"user_api"}) | 40 | * @Groups({"user_api", "user_api_with_client"}) |
40 | */ | 41 | */ |
41 | protected $id; | 42 | protected $id; |
42 | 43 | ||
@@ -45,21 +46,21 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf | |||
45 | * | 46 | * |
46 | * @ORM\Column(name="name", type="text", nullable=true) | 47 | * @ORM\Column(name="name", type="text", nullable=true) |
47 | * | 48 | * |
48 | * @Groups({"user_api"}) | 49 | * @Groups({"user_api", "user_api_with_client"}) |
49 | */ | 50 | */ |
50 | protected $name; | 51 | protected $name; |
51 | 52 | ||
52 | /** | 53 | /** |
53 | * @var string | 54 | * @var string |
54 | * | 55 | * |
55 | * @Groups({"user_api"}) | 56 | * @Groups({"user_api", "user_api_with_client"}) |
56 | */ | 57 | */ |
57 | protected $username; | 58 | protected $username; |
58 | 59 | ||
59 | /** | 60 | /** |
60 | * @var string | 61 | * @var string |
61 | * | 62 | * |
62 | * @Groups({"user_api"}) | 63 | * @Groups({"user_api", "user_api_with_client"}) |
63 | */ | 64 | */ |
64 | protected $email; | 65 | protected $email; |
65 | 66 | ||
@@ -68,7 +69,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf | |||
68 | * | 69 | * |
69 | * @ORM\Column(name="created_at", type="datetime") | 70 | * @ORM\Column(name="created_at", type="datetime") |
70 | * | 71 | * |
71 | * @Groups({"user_api"}) | 72 | * @Groups({"user_api", "user_api_with_client"}) |
72 | */ | 73 | */ |
73 | protected $createdAt; | 74 | protected $createdAt; |
74 | 75 | ||
@@ -77,7 +78,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf | |||
77 | * | 78 | * |
78 | * @ORM\Column(name="updated_at", type="datetime") | 79 | * @ORM\Column(name="updated_at", type="datetime") |
79 | * | 80 | * |
80 | * @Groups({"user_api"}) | 81 | * @Groups({"user_api", "user_api_with_client"}) |
81 | */ | 82 | */ |
82 | protected $updatedAt; | 83 | protected $updatedAt; |
83 | 84 | ||
@@ -97,7 +98,8 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf | |||
97 | private $authCode; | 98 | private $authCode; |
98 | 99 | ||
99 | /** | 100 | /** |
100 | * @var bool Enabled yes/no | 101 | * @var bool |
102 | * | ||
101 | * @ORM\Column(type="boolean") | 103 | * @ORM\Column(type="boolean") |
102 | */ | 104 | */ |
103 | private $twoFactorAuthentication = false; | 105 | private $twoFactorAuthentication = false; |
@@ -112,6 +114,14 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf | |||
112 | */ | 114 | */ |
113 | protected $clients; | 115 | protected $clients; |
114 | 116 | ||
117 | /** | ||
118 | * @see getFirstClient() below | ||
119 | * | ||
120 | * @Groups({"user_api_with_client"}) | ||
121 | * @Accessor(getter="getFirstClient") | ||
122 | */ | ||
123 | protected $default_client; | ||
124 | |||
115 | public function __construct() | 125 | public function __construct() |
116 | { | 126 | { |
117 | parent::__construct(); | 127 | parent::__construct(); |
@@ -288,4 +298,18 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf | |||
288 | { | 298 | { |
289 | return $this->clients; | 299 | return $this->clients; |
290 | } | 300 | } |
301 | |||
302 | /** | ||
303 | * 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). | ||
304 | * | ||
305 | * @return Client | ||
306 | */ | ||
307 | public function getFirstClient() | ||
308 | { | ||
309 | if (empty($this->clients)) { | ||
310 | return $this->clients; | ||
311 | } | ||
312 | |||
313 | return $this->clients->first(); | ||
314 | } | ||
291 | } | 315 | } |
diff --git a/tests/Wallabag/ApiBundle/Controller/UserRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/UserRestControllerTest.php index 5735bc58..9f01a976 100644 --- a/tests/Wallabag/ApiBundle/Controller/UserRestControllerTest.php +++ b/tests/Wallabag/ApiBundle/Controller/UserRestControllerTest.php | |||
@@ -61,10 +61,16 @@ class UserRestControllerTest extends WallabagApiTestCase | |||
61 | $this->assertArrayHasKey('username', $content); | 61 | $this->assertArrayHasKey('username', $content); |
62 | $this->assertArrayHasKey('created_at', $content); | 62 | $this->assertArrayHasKey('created_at', $content); |
63 | $this->assertArrayHasKey('updated_at', $content); | 63 | $this->assertArrayHasKey('updated_at', $content); |
64 | $this->assertArrayHasKey('default_client', $content); | ||
64 | 65 | ||
65 | $this->assertEquals('wallabag@google.com', $content['email']); | 66 | $this->assertEquals('wallabag@google.com', $content['email']); |
66 | $this->assertEquals('google', $content['username']); | 67 | $this->assertEquals('google', $content['username']); |
67 | 68 | ||
69 | $this->assertArrayHasKey('client_secret', $content['default_client']); | ||
70 | $this->assertArrayHasKey('client_id', $content['default_client']); | ||
71 | |||
72 | $this->assertEquals('Default client', $content['default_client']['name']); | ||
73 | |||
68 | $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); | 74 | $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); |
69 | 75 | ||
70 | $this->client->getContainer()->get('craue_config')->set('api_user_registration', 0); | 76 | $this->client->getContainer()->get('craue_config')->set('api_user_registration', 0); |
@@ -90,10 +96,16 @@ class UserRestControllerTest extends WallabagApiTestCase | |||
90 | $this->assertArrayHasKey('username', $content); | 96 | $this->assertArrayHasKey('username', $content); |
91 | $this->assertArrayHasKey('created_at', $content); | 97 | $this->assertArrayHasKey('created_at', $content); |
92 | $this->assertArrayHasKey('updated_at', $content); | 98 | $this->assertArrayHasKey('updated_at', $content); |
99 | $this->assertArrayHasKey('default_client', $content); | ||
93 | 100 | ||
94 | $this->assertEquals('wallabag@google.com', $content['email']); | 101 | $this->assertEquals('wallabag@google.com', $content['email']); |
95 | $this->assertEquals('google', $content['username']); | 102 | $this->assertEquals('google', $content['username']); |
96 | 103 | ||
104 | $this->assertArrayHasKey('client_secret', $content['default_client']); | ||
105 | $this->assertArrayHasKey('client_id', $content['default_client']); | ||
106 | |||
107 | $this->assertEquals('Default client', $content['default_client']['name']); | ||
108 | |||
97 | $this->assertEquals('application/json', $client->getResponse()->headers->get('Content-Type')); | 109 | $this->assertEquals('application/json', $client->getResponse()->headers->get('Content-Type')); |
98 | 110 | ||
99 | $client->getContainer()->get('craue_config')->set('api_user_registration', 0); | 111 | $client->getContainer()->get('craue_config')->set('api_user_registration', 0); |