commit 9efaedf8a56285993cd42deb9b64defd3fbaa013
parent 6157592681bc88ba1b6c3ebf464d5d889c32a523
Author: Felicitus <felicitus@felicitus.org>
Date: Tue, 8 Mar 2016 16:16:02 +0100
Merge remote-tracking branch 'origin/master'
Diffstat:
4 files changed, 69 insertions(+), 5 deletions(-)
diff --git a/src/PartKeepr/AuthBundle/Action/DeleteUserAction.php b/src/PartKeepr/AuthBundle/Action/DeleteUserAction.php
@@ -6,6 +6,7 @@ use Dunglas\ApiBundle\Exception\RuntimeException;
use Dunglas\ApiBundle\Model\DataProviderInterface;
use PartKeepr\AuthBundle\Entity\User;
use PartKeepr\AuthBundle\Exceptions\UserProtectedException;
+use PartKeepr\AuthBundle\Services\UserPreferenceService;
use PartKeepr\AuthBundle\Services\UserService;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -27,16 +28,25 @@ class DeleteUserAction
*/
private $userService;
- public function __construct(DataProviderInterface $dataProvider, UserService $userService)
- {
+ /**
+ * @var UserPreferenceService
+ */
+ private $userPreferenceService;
+
+ public function __construct(
+ DataProviderInterface $dataProvider,
+ UserService $userService,
+ UserPreferenceService $userPreferenceService
+ ) {
$this->dataProvider = $dataProvider;
$this->userService = $userService;
+ $this->userPreferenceService = $userPreferenceService;
}
/**
* Returns an item to delete.
*
- * @param Request $request
+ * @param Request $request
* @param string|int $id
*
* @return mixed
@@ -59,6 +69,7 @@ class DeleteUserAction
}
$this->userService->deleteFOSUser($item);
+ $this->userPreferenceService->deletePreferences($item);
return $item;
diff --git a/src/PartKeepr/AuthBundle/Resources/config/actions.xml b/src/PartKeepr/AuthBundle/Resources/config/actions.xml
@@ -34,6 +34,7 @@
<service id="partkeepr.user.delete" class="PartKeepr\AuthBundle\Action\DeleteUserAction">
<argument type="service" id="api.data_provider"/>
<argument type="service" id="partkeepr.userservice"/>
+ <argument type="service" id="partkeepr.user_preference_service"/>
</service>
<service id="partkeepr.auth.login" class="PartKeepr\AuthBundle\Action\LoginAction">
<argument type="service" id="partkeepr.userservice"/>
diff --git a/src/PartKeepr/AuthBundle/Services/UserPreferenceService.php b/src/PartKeepr/AuthBundle/Services/UserPreferenceService.php
@@ -132,4 +132,19 @@ class UserPreferenceService
$query->execute();
}
+ /**
+ * Removes all preferences for specific user. This is usually used when removing the user.
+ *
+ * @param \PartKeepr\AuthBundle\Entity\User $user The user to delete the preference for
+ */
+ public function deletePreferences(User $user)
+ {
+ $dql = "DELETE FROM PartKeepr\AuthBundle\Entity\UserPreference up WHERE up.user = :user";
+
+ $query = $this->entityManager->createQuery($dql);
+ $query->setParameter("user", $user);
+
+ $query->execute();
+ }
+
}
diff --git a/src/PartKeepr/AuthBundle/Tests/UserTest.php b/src/PartKeepr/AuthBundle/Tests/UserTest.php
@@ -157,8 +157,8 @@ class UserTest extends WebTestCase
$iri = $iriConverter->getIriFromItem($user);
$data = [
- "username" => "foo"
- ];
+ "username" => "foo",
+ ];
$client->request("PUT", $iri, array(), array(), array(), json_encode($data));
$response = json_decode($client->getResponse()->getContent());
@@ -194,4 +194,41 @@ class UserTest extends WebTestCase
$this->assertFalse($user->isProtected());
}
+
+ /**
+ * Tests the proper user deletion if user preferences exist.
+ *
+ * Unit test for Bug #569
+ *
+ * @see https://github.com/partkeepr/PartKeepr/issues/569
+ */
+ public function testUserWithPreferencesDeletion()
+ {
+ $client = static::makeClient(true);
+
+ $data = array(
+ "username" => "preferenceuser",
+ "newPassword" => "1234",
+ );
+
+ $client->request("POST", "/api/users", array(), array(), array(), json_encode($data));
+
+ $userPreferenceService = $this->getContainer()->get("partkeepr.user_preference_service");
+ $userService = $this->getContainer()->get("partkeepr.userservice");
+
+ /**
+ * @var User $user
+ */
+ $user = $userService->getProxyUser("preferenceuser", $userService->getBuiltinProvider(), true);
+
+ $userPreferenceService->setPreference($user, "foo", "bar");
+
+ $iriConverter = $this->getContainer()->get("api.iri_converter");
+ $iri = $iriConverter->getIriFromItem($user);
+
+ $client->request("DELETE", $iri);
+
+ $this->assertEquals(204, $client->getResponse()->getStatusCode());
+ $this->assertEmpty($client->getResponse()->getContent());
+ }
}