From: Jérémy Benoist Date: Mon, 25 Feb 2019 09:56:07 +0000 (+0100) Subject: Merge pull request #3887 from wallabag/issue-3711 X-Git-Tag: 2.3.7~6 X-Git-Url: https://git.immae.eu/?a=commitdiff_plain;h=4de99d1ab161fc378e0f7cc121c60396f86bc577;hp=b1992b340e21b6846a1ec2ae6ddd7217f3b24fb5;p=github%2Fwallabag%2Fwallabag.git Merge pull request #3887 from wallabag/issue-3711 Add support of expect parameter to change return object when deleting entry --- diff --git a/src/Wallabag/ApiBundle/Controller/EntryRestController.php b/src/Wallabag/ApiBundle/Controller/EntryRestController.php index b2bad406..33b75665 100644 --- a/src/Wallabag/ApiBundle/Controller/EntryRestController.php +++ b/src/Wallabag/ApiBundle/Controller/EntryRestController.php @@ -570,18 +570,31 @@ class EntryRestController extends WallabagRestController * @ApiDoc( * requirements={ * {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"} + * }, + * parameters={ + * {"name"="expect", "dataType"="string", "required"=false, "format"="id or entry", "description"="Only returns the id instead of the deleted entry's full entity if 'id' is specified. Default to entry"}, * } * ) * * @return JsonResponse */ - public function deleteEntriesAction(Entry $entry) + public function deleteEntriesAction(Entry $entry, Request $request) { + $expect = $request->query->get('expect', 'entry'); + if (!\in_array($expect, ['id', 'entry'], true)) { + throw new BadRequestHttpException(sprintf("expect: 'id' or 'entry' expected, %s given", $expect)); + } $this->validateAuthentication(); $this->validateUserAccess($entry->getUser()->getId()); - // We copy $entry to keep id in returned object - $e = $entry; + $response = $this->sendResponse([ + 'id' => $entry->getId(), + ]); + // We clone $entry to keep id in returned object + if ('entry' === $expect) { + $e = clone $entry; + $response = $this->sendResponse($e); + } $em = $this->getDoctrine()->getManager(); $em->remove($entry); @@ -590,7 +603,7 @@ class EntryRestController extends WallabagRestController // entry deleted, dispatch event about it! $this->get('event_dispatcher')->dispatch(EntryDeletedEvent::NAME, new EntryDeletedEvent($entry)); - return $this->sendResponse($e); + return $response; } /** diff --git a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php index 2a1d2e15..46b5f460 100644 --- a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php +++ b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php @@ -400,29 +400,71 @@ class EntryRestControllerTest extends WallabagApiTestCase public function testDeleteEntry() { - $entry = $this->client->getContainer() - ->get('doctrine.orm.entity_manager') - ->getRepository('WallabagCoreBundle:Entry') - ->findOneByUser(1, ['id' => 'asc']); + $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); + $entry = new Entry($em->getReference(User::class, 1)); + $entry->setUrl('http://0.0.0.0/test-delete-entry'); + $entry->setTitle('Test delete entry'); + $em->persist($entry); + $em->flush(); - if (!$entry) { - $this->markTestSkipped('No content found in db.'); - } + $em->clear(); - $this->client->request('DELETE', '/api/entries/' . $entry->getId() . '.json'); + $e = [ + 'title' => $entry->getTitle(), + 'url' => $entry->getUrl(), + 'id' => $entry->getId(), + ]; + + $this->client->request('DELETE', '/api/entries/' . $e['id'] . '.json'); $this->assertSame(200, $this->client->getResponse()->getStatusCode()); $content = json_decode($this->client->getResponse()->getContent(), true); - $this->assertSame($entry->getTitle(), $content['title']); - $this->assertSame($entry->getUrl(), $content['url']); - $this->assertSame($entry->getId(), $content['id']); + $this->assertSame($e['title'], $content['title']); + $this->assertSame($e['url'], $content['url']); + $this->assertSame($e['id'], $content['id']); // We'll try to delete this entry again - $this->client->request('DELETE', '/api/entries/' . $entry->getId() . '.json'); + $client = $this->createAuthorizedClient(); + $client->request('DELETE', '/api/entries/' . $e['id'] . '.json'); + + $this->assertSame(404, $client->getResponse()->getStatusCode()); + } - $this->assertSame(404, $this->client->getResponse()->getStatusCode()); + public function testDeleteEntryExpectId() + { + $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); + $entry = new Entry($em->getReference(User::class, 1)); + $entry->setUrl('http://0.0.0.0/test-delete-entry-id'); + $em->persist($entry); + $em->flush(); + + $em->clear(); + + $id = $entry->getId(); + + $this->client->request('DELETE', '/api/entries/' . $id . '.json?expect=id'); + + $this->assertSame(200, $this->client->getResponse()->getStatusCode()); + + $content = json_decode($this->client->getResponse()->getContent(), true); + + $this->assertSame($id, $content['id']); + $this->assertArrayNotHasKey('url', $content); + + // We'll try to delete this entry again + $client = $this->createAuthorizedClient(); + $client->request('DELETE', '/api/entries/' . $id . '.json'); + + $this->assertSame(404, $client->getResponse()->getStatusCode()); + } + + public function testDeleteEntryExpectBadRequest() + { + $this->client->request('DELETE', '/api/entries/1.json?expect=badrequest'); + + $this->assertSame(400, $this->client->getResponse()->getStatusCode()); } public function testPostEntry()