1
0
Fork 0
mirror of https://github.com/wallabag/wallabag.git synced 2025-07-27 17:28:39 +00:00

Set a starred_at field when an entry is starred.

This date is used to sort starred entries.

Can not use Entry::timestamps method otherwise starred_at will be updated each time entry is updated.
Add an updateStar method into Entry class
A migration script has been added in order to set starred_at field.
This commit is contained in:
François D 2017-08-23 23:06:40 +02:00
parent 2490f61dca
commit a991c46eed
6 changed files with 124 additions and 7 deletions

View file

@ -361,7 +361,7 @@ class EntryRestController extends WallabagRestController
}
if (null !== $data['isStarred']) {
$entry->setStarred((bool) $data['isStarred']);
$entry->updateStar((bool) $data['isStarred']);
}
if (!empty($data['tags'])) {
@ -464,7 +464,7 @@ class EntryRestController extends WallabagRestController
}
if (null !== $data['isStarred']) {
$entry->setStarred((bool) $data['isStarred']);
$entry->updateStar((bool) $data['isStarred']);
}
if (!empty($data['tags'])) {

View file

@ -333,6 +333,7 @@ class EntryController extends Controller
$this->checkUserAction($entry);
$entry->toggleStar();
$entry->updateStar($entry->isStarred());
$this->getDoctrine()->getManager()->flush();
$message = 'flashes.entry.notice.entry_unstarred';

View file

@ -142,6 +142,15 @@ class Entry
*/
private $publishedBy;
/**
* @var \DateTime
*
* @ORM\Column(name="starred_at", type="datetime", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
private $starredAt = null;
/**
* @ORM\OneToMany(targetEntity="Wallabag\AnnotationBundle\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"})
* @ORM\JoinTable
@ -475,6 +484,44 @@ class Entry
return $this->updatedAt;
}
/**
* @return \DateTime|null
*/
public function getStarredAt()
{
return $this->starredAt;
}
/**
* @param \DateTime|null $starredAt
*
* @return Entry
*/
public function setStarredAt($starredAt = null)
{
$this->starredAt = $starredAt;
return $this;
}
/**
* update isStarred and starred_at fields.
*
* @param bool $isStarred
*
* @return Entry
*/
public function updateStar($isStarred = false)
{
$this->setStarred($isStarred);
$this->setStarredAt(null);
if ($this->isStarred()) {
$this->setStarredAt(new \DateTime());
}
return $this;
}
/**
* @return ArrayCollection<Annotation>
*/

View file

@ -65,7 +65,7 @@ class EntryRepository extends EntityRepository
public function getBuilderForStarredByUser($userId)
{
return $this
->getBuilderByUser($userId)
->getBuilderByUser($userId, 'starredAt', 'desc')
->andWhere('e.isStarred = true')
;
}
@ -401,15 +401,16 @@ class EntryRepository extends EntityRepository
/**
* Return a query builder to used by other getBuilderFor* method.
*
* @param int $userId
* @param int $userId
* @param string $sortBy
* @param string $direction
*
* @return QueryBuilder
*/
private function getBuilderByUser($userId)
private function getBuilderByUser($userId, $sortBy = 'createdAt', $direction = 'desc')
{
return $this->createQueryBuilder('e')
->andWhere('e.user = :userId')->setParameter('userId', $userId)
->orderBy('e.createdAt', 'desc')
;
->orderBy(sprintf('e.%s', $sortBy), $direction);
}
}