Listing entries can now be filtered by “public”.
Creating or patching an entry can now set is to public or remove the public.
Entry response now include “is_public” boolean field
* {"name"="perPage", "dataType"="integer", "required"=false, "format"="default'30'", "description"="results per page."},
* {"name"="tags", "dataType"="string", "required"=false, "format"="api,rest", "description"="a list of tags url encoded. Will returns entries that matches ALL tags."},
* {"name"="since", "dataType"="integer", "required"=false, "format"="default '0'", "description"="The timestamp since when you want entries updated."},
+ * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0, all entries by default", "description"="filter by entries with a public link"},
* }
* )
*
$isArchived = (null === $request->query->get('archive')) ? null : (bool) $request->query->get('archive');
$isStarred = (null === $request->query->get('starred')) ? null : (bool) $request->query->get('starred');
+ $isPublic = (null === $request->query->get('public')) ? null : (bool) $request->query->get('public');
$sort = $request->query->get('sort', 'created');
$order = $request->query->get('order', 'desc');
$page = (int) $request->query->get('page', 1);
$since = $request->query->get('since', 0);
/** @var \Pagerfanta\Pagerfanta $pager */
- $pager = $this->getDoctrine()
- ->getRepository('WallabagCoreBundle:Entry')
- ->findEntries($this->getUser()->getId(), $isArchived, $isStarred, $sort, $order, $since, $tags);
+ $pager = $this->get('wallabag_core.entry_repository')->findEntries(
+ $this->getUser()->getId(),
+ $isArchived,
+ $isStarred,
+ $isPublic,
+ $sort,
+ $order,
+ $since,
+ $tags
+ );
$pager->setMaxPerPage($perPage);
$pager->setCurrentPage($page);
[
'archive' => $isArchived,
'starred' => $isStarred,
+ 'public' => $isPublic,
'sort' => $sort,
'order' => $order,
'page' => $page,
* {"name"="preview_picture", "dataType"="string", "required"=false, "description"="Preview picture of the entry"},
* {"name"="published_at", "dataType"="datetime|integer", "format"="YYYY-MM-DDTHH:II:SS+TZ or a timestamp", "required"=false, "description"="Published date of the entry"},
* {"name"="authors", "dataType"="string", "format"="Name Firstname,author2,author3", "required"=false, "description"="Authors of the entry"},
+ * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0", "description"="will generate a public link for the entry"},
* }
* )
*
* {"name"="preview_picture", "dataType"="string", "required"=false, "description"="Preview picture of the entry"},
* {"name"="published_at", "dataType"="datetime|integer", "format"="YYYY-MM-DDTHH:II:SS+TZ or a timestamp", "required"=false, "description"="Published date of the entry"},
* {"name"="authors", "dataType"="string", "format"="Name Firstname,author2,author3", "required"=false, "description"="Authors of the entry"},
+ * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0", "description"="will generate a public link for the entry"},
* }
* )
*
$tags = $request->request->get('tags', []);
$isArchived = $request->request->get('archive');
$isStarred = $request->request->get('starred');
+ $isPublic = $request->request->get('public');
$content = $request->request->get('content');
$language = $request->request->get('language');
$picture = $request->request->get('preview_picture');
$this->get('wallabag_core.tags_assigner')->assignTagsToEntry($entry, $tags);
}
+ if (!is_null($isPublic)) {
+ $entry->cleanUid();
+
+ if (true === (bool) $isPublic && null === $entry->getUid()) {
+ $entry->generateUid();
+ }
+ }
+
$em = $this->getDoctrine()->getManager();
$em->persist($entry);
$em->flush();
/**
* Used in the entries filter so it's more explicit for the end user than the uid.
*
+ * @VirtualProperty
+ * @SerializedName("is_public")
+ * @Groups({"entries_for_user"})
+ *
* @return bool
*/
public function isPublic()
* @param int $userId
* @param bool $isArchived
* @param bool $isStarred
+ * @param bool $isPublic
* @param string $sort
* @param string $order
* @param int $since
*
* @return array
*/
- public function findEntries($userId, $isArchived = null, $isStarred = null, $sort = 'created', $order = 'ASC', $since = 0, $tags = '')
+ public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'ASC', $since = 0, $tags = '')
{
$qb = $this->createQueryBuilder('e')
->leftJoin('e.tags', 't')
->where('e.user =:userId')->setParameter('userId', $userId);
if (null !== $isArchived) {
- $qb->andWhere('e.isArchived =:isArchived')->setParameter('isArchived', (bool) $isArchived);
+ $qb->andWhere('e.isArchived = :isArchived')->setParameter('isArchived', (bool) $isArchived);
}
if (null !== $isStarred) {
- $qb->andWhere('e.isStarred =:isStarred')->setParameter('isStarred', (bool) $isStarred);
+ $qb->andWhere('e.isStarred = :isStarred')->setParameter('isStarred', (bool) $isStarred);
+ }
+
+ if (null !== $isPublic) {
+ $qb->andWhere('e.uid IS '.(true === $isPublic ? 'NOT' : '').' NULL');
}
if ($since > 0) {
'perPage' => 2,
'tags' => 'foo',
'since' => 1443274283,
+ 'public' => 0,
]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$this->assertContains('order=asc', $content['_links'][$link]['href']);
$this->assertContains('tags=foo', $content['_links'][$link]['href']);
$this->assertContains('since=1443274283', $content['_links'][$link]['href']);
+ $this->assertContains('public=0', $content['_links'][$link]['href']);
+ }
+
+ $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
+ }
+
+ public function testGetEntriesPublicOnly()
+ {
+ $entry = $this->client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneByUser(1);
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ // generate at least one public entry
+ $entry->generateUid();
+
+ $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
+ $em->persist($entry);
+ $em->flush();
+
+ $this->client->request('GET', '/api/entries', [
+ 'public' => 1,
+ ]);
+
+ $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
+
+ $content = json_decode($this->client->getResponse()->getContent(), true);
+
+ $this->assertGreaterThanOrEqual(1, count($content));
+ $this->assertArrayHasKey('items', $content['_embedded']);
+ $this->assertGreaterThanOrEqual(1, $content['total']);
+ $this->assertEquals(1, $content['page']);
+ $this->assertEquals(30, $content['limit']);
+ $this->assertGreaterThanOrEqual(1, $content['pages']);
+
+ $this->assertArrayHasKey('_links', $content);
+ $this->assertArrayHasKey('self', $content['_links']);
+ $this->assertArrayHasKey('first', $content['_links']);
+ $this->assertArrayHasKey('last', $content['_links']);
+
+ foreach (['self', 'first', 'last'] as $link) {
+ $this->assertArrayHasKey('href', $content['_links'][$link]);
+ $this->assertContains('public=1', $content['_links'][$link]['href']);
}
$this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
'language' => 'de',
'published_at' => '2016-09-08T11:55:58+0200',
'authors' => 'bob,helen',
+ 'public' => 1,
]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$this->assertCount(2, $content['published_by']);
$this->assertContains('bob', $content['published_by']);
$this->assertContains('helen', $content['published_by']);
+ $this->assertTrue($content['is_public'], 'A public link has been generated for that entry');
}
public function testPostSameEntry()
'preview_picture' => 'http://preview.io/picture.jpg',
'authors' => 'bob,sponge',
'content' => 'awesome',
+ 'public' => 0,
]);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode());
$this->assertContains('sponge', $content['published_by']);
$this->assertContains('bob', $content['published_by']);
$this->assertEquals('awesome', $content['content']);
+ $this->assertFalse($content['is_public'], 'Entry is no more shared');
}
public function testPatchEntryWithoutQuotes()