X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2FWallabag%2FCoreBundle%2FEntity%2FEntry.php;h=4acec2618eb5f3e457d55f7bbc67f3b6eb144cc3;hb=488e3d7a915dcdce37fe4af14f33293edcb4fbdb;hp=24b24dbb13dc6ac29cc6a5fd736367cf26d72387;hpb=1930c19d8214c05ceefac5ac011a6b6e7e4a983d;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php index 24b24dbb..4acec261 100644 --- a/src/Wallabag/CoreBundle/Entity/Entry.php +++ b/src/Wallabag/CoreBundle/Entity/Entry.php @@ -5,9 +5,15 @@ namespace Wallabag\CoreBundle\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; use Hateoas\Configuration\Annotation as Hateoas; +use JMS\Serializer\Annotation\Exclude; use JMS\Serializer\Annotation\Groups; +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\VirtualProperty; use JMS\Serializer\Annotation\XmlRoot; use Symfony\Component\Validator\Constraints as Assert; +use Wallabag\AnnotationBundle\Entity\Annotation; +use Wallabag\CoreBundle\Helper\EntityTimestampsTrait; +use Wallabag\CoreBundle\Helper\UrlHasher; use Wallabag\UserBundle\Entity\User; /** @@ -15,12 +21,27 @@ use Wallabag\UserBundle\Entity\User; * * @XmlRoot("entry") * @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\EntryRepository") - * @ORM\Table(name="`entry`") + * @ORM\Table( + * name="`entry`", + * options={"collate"="utf8mb4_unicode_ci", "charset"="utf8mb4"}, + * indexes={ + * @ORM\Index(name="created_at", columns={"created_at"}), + * @ORM\Index(name="uid", columns={"uid"}), + * @ORM\Index(name="hashed_url_user_id", columns={"user_id", "hashed_url"}, options={"lengths"={null, 40}}), + * @ORM\Index(name="hashed_given_url_user_id", columns={"user_id", "hashed_given_url"}, options={"lengths"={null, 40}}), + * @ORM\Index(name="user_language", columns={"language", "user_id"}), + * @ORM\Index(name="user_archived", columns={"user_id", "is_archived", "archived_at"}), + * @ORM\Index(name="user_created", columns={"user_id", "created_at"}), + * @ORM\Index(name="user_starred", columns={"user_id", "is_starred", "starred_at"}) + * } + * ) * @ORM\HasLifecycleCallbacks() * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())") */ class Entry { + use EntityTimestampsTrait; + /** @Serializer\XmlAttribute */ /** * @var int @@ -33,6 +54,15 @@ class Entry */ private $id; + /** + * @var string + * + * @ORM\Column(name="uid", type="string", length=23, nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $uid; + /** * @var string * @@ -43,6 +73,8 @@ class Entry private $title; /** + * Define the url fetched by wallabag (the final url after potential redirections). + * * @var string * * @Assert\NotBlank() @@ -52,18 +84,67 @@ class Entry */ private $url; + /** + * @var string + * + * @ORM\Column(name="hashed_url", type="string", length=40, nullable=true) + */ + private $hashedUrl; + + /** + * From where user retrieved/found the url (an other article, a twitter, or the given_url if non are provided). + * + * @var string + * + * @ORM\Column(name="origin_url", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $originUrl; + + /** + * Define the url entered by the user (without redirections). + * + * @var string + * + * @ORM\Column(name="given_url", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $givenUrl; + + /** + * @var string + * + * @ORM\Column(name="hashed_given_url", type="string", length=40, nullable=true) + */ + private $hashedGivenUrl; + /** * @var bool * + * @Exclude + * * @ORM\Column(name="is_archived", type="boolean") * * @Groups({"entries_for_user", "export_all"}) */ private $isArchived = false; + /** + * @var \DateTime + * + * @ORM\Column(name="archived_at", type="datetime", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $archivedAt = null; + /** * @var bool * + * @Exclude + * * @ORM\Column(name="is_starred", type="boolean") * * @Groups({"entries_for_user", "export_all"}) @@ -80,31 +161,57 @@ class Entry private $content; /** - * @var date + * @var \DateTime * * @ORM\Column(name="created_at", type="datetime") * - * @Groups({"export_all"}) + * @Groups({"entries_for_user", "export_all"}) */ private $createdAt; /** - * @var date + * @var \DateTime * * @ORM\Column(name="updated_at", type="datetime") * - * @Groups({"export_all"}) + * @Groups({"entries_for_user", "export_all"}) */ private $updatedAt; /** - * @var string + * @var \DateTime * - * @ORM\Column(name="comments", type="text", nullable=true) + * @ORM\Column(name="published_at", type="datetime", nullable=true) * - * @Groups({"export_all"}) + * @Groups({"entries_for_user", "export_all"}) + */ + private $publishedAt; + + /** + * @var array + * + * @ORM\Column(name="published_by", type="array", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $publishedBy; + + /** + * @var \DateTime + * + * @ORM\Column(name="starred_at", type="datetime", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) */ - private $comments; + private $starredAt = null; + + /** + * @ORM\OneToMany(targetEntity="Wallabag\AnnotationBundle\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"}) + * @ORM\JoinTable + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $annotations; /** * @var string @@ -118,7 +225,7 @@ class Entry /** * @var string * - * @ORM\Column(name="language", type="text", nullable=true) + * @ORM\Column(name="language", type="string", length=20, nullable=true) * * @Groups({"entries_for_user", "export_all"}) */ @@ -127,11 +234,11 @@ class Entry /** * @var int * - * @ORM\Column(name="reading_time", type="integer", nullable=true) + * @ORM\Column(name="reading_time", type="integer", nullable=false) * * @Groups({"entries_for_user", "export_all"}) */ - private $readingTime; + private $readingTime = 0; /** * @var string @@ -152,15 +259,26 @@ class Entry private $previewPicture; /** - * @var bool + * @var string * - * @ORM\Column(name="is_public", type="boolean", nullable=true, options={"default" = false}) + * @ORM\Column(name="http_status", type="string", length=3, nullable=true) * - * @Groups({"export_all"}) + * @Groups({"entries_for_user", "export_all"}) */ - private $isPublic; + private $httpStatus; /** + * @var array + * + * @ORM\Column(name="headers", type="array", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $headers; + + /** + * @Exclude + * * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="entries") * * @Groups({"export_all"}) @@ -169,16 +287,22 @@ class Entry /** * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"}) - * @ORM\JoinTable - * - * @Groups({"entries_for_user", "export_all"}) + * @ORM\JoinTable( + * name="entry_tag", + * joinColumns={ + * @ORM\JoinColumn(name="entry_id", referencedColumnName="id", onDelete="cascade") + * }, + * inverseJoinColumns={ + * @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="cascade") + * } + * ) */ private $tags; /* * @param User $user */ - public function __construct(\Wallabag\UserBundle\Entity\User $user) + public function __construct(User $user) { $this->user = $user; $this->tags = new ArrayCollection(); @@ -228,6 +352,7 @@ class Entry public function setUrl($url) { $this->url = $url; + $this->hashedUrl = UrlHasher::hashUrl($url); return $this; } @@ -256,6 +381,44 @@ class Entry return $this; } + /** + * update isArchived and archive_at fields. + * + * @param bool $isArchived + * + * @return Entry + */ + public function updateArchived($isArchived = false) + { + $this->setArchived($isArchived); + $this->setArchivedAt(null); + if ($this->isArchived()) { + $this->setArchivedAt(new \DateTime()); + } + + return $this; + } + + /** + * @return \DateTime|null + */ + public function getArchivedAt() + { + return $this->archivedAt; + } + + /** + * @param \DateTime|null $archivedAt + * + * @return Entry + */ + public function setArchivedAt($archivedAt = null) + { + $this->archivedAt = $archivedAt; + + return $this; + } + /** * Get isArchived. * @@ -266,9 +429,19 @@ class Entry return $this->isArchived; } + /** + * @VirtualProperty + * @SerializedName("is_archived") + * @Groups({"entries_for_user", "export_all"}) + */ + public function is_Archived() + { + return (int) $this->isArchived(); + } + public function toggleArchive() { - $this->isArchived = $this->isArchived() ^ 1; + $this->updateArchived($this->isArchived() ^ 1); return $this; } @@ -297,6 +470,16 @@ class Entry return $this->isStarred; } + /** + * @VirtualProperty + * @SerializedName("is_starred") + * @Groups({"entries_for_user", "export_all"}) + */ + public function is_Starred() + { + return (int) $this->isStarred(); + } + public function toggleStar() { $this->isStarred = $this->isStarred() ^ 1; @@ -337,7 +520,49 @@ class Entry } /** - * @return string + * @VirtualProperty + * @SerializedName("user_name") + */ + public function getUserName() + { + return $this->user->getUserName(); + } + + /** + * @VirtualProperty + * @SerializedName("user_email") + */ + public function getUserEmail() + { + return $this->user->getEmail(); + } + + /** + * @VirtualProperty + * @SerializedName("user_id") + */ + public function getUserId() + { + return $this->user->getId(); + } + + /** + * Set created_at. + * Only used when importing data from an other service. + * + * @param \DateTime $createdAt + * + * @return Entry + */ + public function setCreatedAt(\DateTime $createdAt) + { + $this->createdAt = $createdAt; + + return $this; + } + + /** + * @return \DateTime */ public function getCreatedAt() { @@ -345,7 +570,7 @@ class Entry } /** - * @return string + * @return \DateTime */ public function getUpdatedAt() { @@ -353,32 +578,57 @@ class Entry } /** - * @ORM\PrePersist - * @ORM\PreUpdate + * @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 timestamps() + public function updateStar($isStarred = false) { - if (is_null($this->createdAt)) { - $this->createdAt = new \DateTime(); + $this->setStarred($isStarred); + $this->setStarredAt(null); + if ($this->isStarred()) { + $this->setStarredAt(new \DateTime()); } - $this->updatedAt = new \DateTime(); + return $this; } /** - * @return string + * @return ArrayCollection */ - public function getComments() + public function getAnnotations() { - return $this->comments; + return $this->annotations; } /** - * @param string $comments + * @param Annotation $annotation */ - public function setComments($comments) + public function setAnnotation(Annotation $annotation) { - $this->comments = $comments; + $this->annotations[] = $annotation; } /** @@ -430,27 +680,26 @@ class Entry } /** - * @return bool + * @return ArrayCollection */ - public function isPublic() + public function getTags() { - return $this->isPublic; + return $this->tags; } /** - * @param bool $isPublic + * @VirtualProperty + * @SerializedName("tags") + * @Groups({"entries_for_user", "export_all"}) */ - public function setIsPublic($isPublic) + public function getSerializedTags() { - $this->isPublic = $isPublic; - } + $data = []; + foreach ($this->tags as $tag) { + $data[] = $tag->getLabel(); + } - /** - * @return ArrayCollection - */ - public function getTags() - { - return $this->tags; + return $data; } /** @@ -470,13 +719,34 @@ class Entry } } - $this->tags[] = $tag; + $this->tags->add($tag); $tag->addEntry($this); } + /** + * Remove the given tag from the entry (if the tag is associated). + * + * @param Tag $tag + */ public function removeTag(Tag $tag) { + if (!$this->tags->contains($tag)) { + return; + } + $this->tags->removeElement($tag); + $tag->removeEntry($this); + } + + /** + * Remove all assigned tags from the entry. + */ + public function removeAllTags() + { + foreach ($this->tags as $tag) { + $this->tags->removeElement($tag); + $tag->removeEntry($this); + } } /** @@ -526,4 +796,201 @@ class Entry { return $this->language; } + + /** + * @return string|null + */ + public function getUid() + { + return $this->uid; + } + + /** + * @param string $uid + * + * @return Entry + */ + public function setUid($uid) + { + $this->uid = $uid; + + return $this; + } + + public function generateUid() + { + if (null === $this->uid) { + // @see http://blog.kevingomez.fr/til/2015/07/26/why-is-uniqid-slow/ for true parameter + $this->uid = uniqid('', true); + } + } + + public function cleanUid() + { + $this->uid = null; + } + + /** + * Used in the entries filter so it's more explicit for the end user than the uid. + * Also used in the API. + * + * @VirtualProperty + * @SerializedName("is_public") + * @Groups({"entries_for_user"}) + * + * @return bool + */ + public function isPublic() + { + return null !== $this->uid; + } + + /** + * @return string + */ + public function getHttpStatus() + { + return $this->httpStatus; + } + + /** + * @param string $httpStatus + * + * @return Entry + */ + public function setHttpStatus($httpStatus) + { + $this->httpStatus = $httpStatus; + + return $this; + } + + /** + * @return \Datetime + */ + public function getPublishedAt() + { + return $this->publishedAt; + } + + /** + * @param \Datetime $publishedAt + * + * @return Entry + */ + public function setPublishedAt(\Datetime $publishedAt) + { + $this->publishedAt = $publishedAt; + + return $this; + } + + /** + * @return array + */ + public function getPublishedBy() + { + return $this->publishedBy; + } + + /** + * @param array $publishedBy + * + * @return Entry + */ + public function setPublishedBy($publishedBy) + { + $this->publishedBy = $publishedBy; + + return $this; + } + + /** + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * @param array $headers + * + * @return Entry + */ + public function setHeaders($headers) + { + $this->headers = $headers; + + return $this; + } + + /** + * Set origin url. + * + * @param string $originUrl + * + * @return Entry + */ + public function setOriginUrl($originUrl) + { + $this->originUrl = $originUrl; + + return $this; + } + + /** + * Get origin url. + * + * @return string + */ + public function getOriginUrl() + { + return $this->originUrl; + } + + /** + * Set given url. + * + * @param string $givenUrl + * + * @return Entry + */ + public function setGivenUrl($givenUrl) + { + $this->givenUrl = $givenUrl; + $this->hashedGivenUrl = UrlHasher::hashUrl($givenUrl); + + return $this; + } + + /** + * Get given url. + * + * @return string + */ + public function getGivenUrl() + { + return $this->givenUrl; + } + + /** + * @return string + */ + public function getHashedUrl() + { + return $this->hashedUrl; + } + + /** + * @param mixed $hashedUrl + * + * @return Entry + */ + public function setHashedUrl($hashedUrl) + { + $this->hashedUrl = $hashedUrl; + + return $this; + } }