X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2FWallabag%2FCoreBundle%2FEntity%2FEntry.php;h=61d01bdcdadd5f0a52ceb3e66f08ae1eb0228cb9;hb=efeaadcf9dade0fe43e4bb35e6f64b493d5fa09a;hp=937213b4477b85f294bf143529eaf38d032672e0;hpb=89c03230c3d51e618608b044b0e3f45cf0c06a11;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php index 937213b4..61d01bdc 100644 --- a/src/Wallabag/CoreBundle/Entity/Entry.php +++ b/src/Wallabag/CoreBundle/Entity/Entry.php @@ -2,32 +2,66 @@ 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\UserBundle\Entity\User; /** - * Entry + * Entry. * + * @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\HasLifecycleCallbacks() - * + * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())") */ class Entry { + use EntityTimestampsTrait; + + /** @Serializer\XmlAttribute */ /** - * @var integer + * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") + * + * @Groups({"entries_for_user", "export_all"}) */ private $id; + /** + * @var string + * + * @ORM\Column(name="uid", type="string", length=23, nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $uid; + /** * @var string * * @ORM\Column(name="title", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) */ private $title; @@ -36,69 +70,110 @@ class Entry * * @Assert\NotBlank() * @ORM\Column(name="url", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) */ private $url; /** - * @var boolean + * @var bool + * + * @Exclude * * @ORM\Column(name="is_archived", type="boolean") + * + * @Groups({"entries_for_user", "export_all"}) */ private $isArchived = false; /** - * @var boolean + * @var bool + * + * @Exclude * * @ORM\Column(name="is_starred", type="boolean") - */ - private $isStarred = false; - - /** - * @var boolean * - * @ORM\Column(name="is_deleted", type="boolean") + * @Groups({"entries_for_user", "export_all"}) */ - private $isDeleted = false; + private $isStarred = false; /** * @var string * * @ORM\Column(name="content", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) */ private $content; /** - * @var date + * @var \DateTime * * @ORM\Column(name="created_at", type="datetime") + * + * @Groups({"entries_for_user", "export_all"}) */ private $createdAt; /** - * @var date + * @var \DateTime * * @ORM\Column(name="updated_at", type="datetime") + * + * @Groups({"entries_for_user", "export_all"}) */ private $updatedAt; /** - * @var string + * @var \DateTime + * + * @ORM\Column(name="published_at", type="datetime", nullable=true) + * + * @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; + + /** + * @ORM\OneToMany(targetEntity="Wallabag\AnnotationBundle\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"}) + * @ORM\JoinTable * - * @ORM\Column(name="comments", type="text", nullable=true) + * @Groups({"entries_for_user", "export_all"}) */ - private $comments; + private $annotations; /** * @var string * * @ORM\Column(name="mimetype", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) */ private $mimetype; /** - * @var integer + * @var string + * + * @ORM\Column(name="language", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + private $language; + + /** + * @var int + * + * @ORM\Column(name="reading_time", type="integer", nullable=true) * - * @ORM\Column(name="reading_type", type="integer", nullable=true) + * @Groups({"entries_for_user", "export_all"}) */ private $readingTime; @@ -106,33 +181,74 @@ class Entry * @var string * * @ORM\Column(name="domain_name", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) */ private $domainName; /** - * @var boolean + * @var string * - * @ORM\Column(name="is_public", type="boolean", nullable=true, options={"default" = false}) + * @ORM\Column(name="preview_picture", type="text", nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) */ - private $isPublic; + private $previewPicture; /** - * @ORM\ManyToOne(targetEntity="User", inversedBy="entries") + * @var string + * + * @ORM\Column(name="http_status", type="string", length=3, nullable=true) + * + * @Groups({"entries_for_user", "export_all"}) + */ + 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"}) */ private $user; + /** + * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"}) + * @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(User $user) { $this->user = $user; + $this->tags = new ArrayCollection(); } /** - * Get id + * Get id. * - * @return integer + * @return int */ public function getId() { @@ -140,9 +256,10 @@ class Entry } /** - * Set title + * Set title. + * + * @param string $title * - * @param string $title * @return Entry */ public function setTitle($title) @@ -153,7 +270,7 @@ class Entry } /** - * Get title + * Get title. * * @return string */ @@ -163,9 +280,10 @@ class Entry } /** - * Set url + * Set url. + * + * @param string $url * - * @param string $url * @return Entry */ public function setUrl($url) @@ -176,7 +294,7 @@ class Entry } /** - * Get url + * Get url. * * @return string */ @@ -186,9 +304,10 @@ class Entry } /** - * Set isArchived + * Set isArchived. + * + * @param bool $isArchived * - * @param string $isArchived * @return Entry */ public function setArchived($isArchived) @@ -199,15 +318,25 @@ class Entry } /** - * Get isArchived + * Get isArchived. * - * @return string + * @return bool */ public function isArchived() { 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; @@ -216,9 +345,10 @@ class Entry } /** - * Set isStarred + * Set isStarred. + * + * @param bool $isStarred * - * @param string $isStarred * @return Entry */ public function setStarred($isStarred) @@ -229,15 +359,25 @@ class Entry } /** - * Get isStarred + * Get isStarred. * - * @return string + * @return bool */ public function isStarred() { 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; @@ -246,9 +386,10 @@ class Entry } /** - * Set content + * Set content. + * + * @param string $content * - * @param string $content * @return Entry */ public function setContent($content) @@ -259,7 +400,7 @@ class Entry } /** - * Get content + * Get content. * * @return string */ @@ -277,64 +418,77 @@ class Entry } /** - * @return string + * @VirtualProperty + * @SerializedName("user_name") */ - public function isDeleted() + public function getUserName() { - return $this->isDeleted; + return $this->user->getUserName(); } /** - * @param string $isDeleted + * @VirtualProperty + * @SerializedName("user_email") */ - public function setDeleted($isDeleted) + public function getUserEmail() { - $this->isDeleted = $isDeleted; + return $this->user->getEmail(); } /** - * @return string + * @VirtualProperty + * @SerializedName("user_id") */ - public function getCreatedAt() + public function getUserId() { - return $this->createdAt; + return $this->user->getId(); } /** - * @return string + * Set created_at. + * Only used when importing data from an other service. + * + * @param \DateTime $createdAt + * + * @return Entry */ - public function getUpdatedAt() + public function setCreatedAt(\DateTime $createdAt) { - return $this->updatedAt; + $this->createdAt = $createdAt; + + return $this; } /** - * @ORM\PrePersist - * @ORM\PreUpdate + * @return \DateTime */ - public function timestamps() + public function getCreatedAt() { - if (is_null($this->createdAt)) { - $this->createdAt = new \DateTime(); - } + return $this->createdAt; + } - $this->updatedAt = new \DateTime(); + /** + * @return \DateTime + */ + public function getUpdatedAt() + { + return $this->updatedAt; } /** - * @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; } /** @@ -386,18 +540,248 @@ class Entry } /** - * @return boolean + * @return ArrayCollection + */ + public function getTags() + { + return $this->tags; + } + + /** + * @VirtualProperty + * @SerializedName("tags") + * @Groups({"entries_for_user", "export_all"}) + */ + public function getSerializedTags() + { + $data = []; + foreach ($this->tags as $tag) { + $data[] = $tag->getLabel(); + } + + return $data; + } + + /** + * @param Tag $tag + */ + public function addTag(Tag $tag) + { + if ($this->tags->contains($tag)) { + return; + } + + // check if tag already exist but has not yet be persisted + // it seems that the previous condition with `contains()` doesn't check that case + foreach ($this->tags as $existingTag) { + if ($existingTag->getLabel() === $tag->getLabel()) { + return; + } + } + + $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); + } + } + + /** + * Set previewPicture. + * + * @param string $previewPicture + * + * @return Entry + */ + public function setPreviewPicture($previewPicture) + { + $this->previewPicture = $previewPicture; + + return $this; + } + + /** + * Get previewPicture. + * + * @return string + */ + public function getPreviewPicture() + { + return $this->previewPicture; + } + + /** + * Set language. + * + * @param string $language + * + * @return Entry + */ + public function setLanguage($language) + { + $this->language = $language; + + return $this; + } + + /** + * Get language. + * + * @return string + */ + public function getLanguage() + { + return $this->language; + } + + /** + * @return string + */ + 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 $this->isPublic; + return null !== $this->uid; + } + + /** + * @return string + */ + public function getHttpStatus() + { + return $this->httpStatus; } /** - * @param boolean $isPublic + * @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 setPublic($isPublic) + public function setPublishedAt(\Datetime $publishedAt) { - $this->isPublic = $isPublic; + $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; } }